Code:
// Tonerzeugung am RP6-Base mit beep() aus der M32-Library 9.1.2010 mic
// Der Speaker hängt an PC0(SCL)
// https://www.roboternetz.de/phpBB2/viewtopic.php?t=52013
#define ton_c 255-(15625/264)
#define ton_d 255-(15625/297)
#define ton_e 255-(15625/330)
#define ton_f 255-(15625/352)
#define ton_g 255-(15625/396)
#define ton_a 255-(15625/440)
#define ton_h 255-(15625/495)
#define ton_c1 255-(15625/528)
#define ganzton 400
#include "RP6RobotBaseLib.h"
void beep(uint8_t pitch, uint16_t time) // aus der Lib des M32
{
//controlStatus.beep = true;
//sound_timer = time;
OCR2 = 255-pitch;
// CTC-Mode, toggle OC2, prescaler /256
TCCR2 = (1 << WGM21) | (1 << COM20) | (1 << CS22) | (1 << CS21);
setStopwatch1(0);
DDRD |= (1<<PD7); // OC2-Pin auf Ausgang für Timer2 ;)
while(getStopwatch1()<time)
{
if(PIND & (1<<PD7)) PORTC |= 1; else PORTC &= ~1; // SCL mit OC2 togglen ;)
}
TCCR2 = 0; // Ton aus
DDRD &= ~(1<<PD7); // OC2-Pin auf Eingang ;)
PORTD &= ~(1<<PD7); // damit die IR-Comm-LED nicht durchbrennt
PORTC &= ~1; // Lautsprecher aus
mSleep(ganzton/10); // Trennung zwischen den Tönen
}
int main(void)
{
initRobotBase();
DDRC |= 1; // SCL auf Ausgang und Low Der Speaker
PORTC &= ~1;
DDRD &= ~(1<<PD7); // OC2-Pin auf Eingang
PORTD &= ~(1<<PD7); // ohne PullUp
startStopwatch1();
beep(ton_c, ganzton); // Tonleiter rauf
beep(ton_d, ganzton);
beep(ton_e, ganzton);
beep(ton_f, ganzton);
beep(ton_g, ganzton);
beep(ton_a, ganzton);
beep(ton_h, ganzton);
beep(ton_c1, ganzton);
mSleep(1000);
beep(ton_c1, ganzton/2); // und wieder runter
beep(ton_h, ganzton/2);
beep(ton_a, ganzton/2);
beep(ton_g, ganzton/2);
beep(ton_f, ganzton/2);
beep(ton_e, ganzton/2);
beep(ton_d, ganzton/2);
beep(ton_c, ganzton/2);
mSleep(2000);
while(1)
{
//Ode an die Freude (http://www.doktus.de/dok/25443/ode-an-die-freude.html)
beep(ton_e, ganzton);
beep(ton_e, ganzton);
beep(ton_f, ganzton);
beep(ton_g, ganzton);
beep(ton_g, ganzton);
beep(ton_f, ganzton);
beep(ton_e, ganzton);
beep(ton_d, ganzton);
beep(ton_c, ganzton);
beep(ton_c, ganzton);
beep(ton_d, ganzton);
beep(ton_e, ganzton);
beep(ton_e, ganzton+ganzton/2);
beep(ton_d, ganzton/2);
beep(ton_d, ganzton*2);
beep(ton_e, ganzton);
beep(ton_e, ganzton);
beep(ton_f, ganzton);
beep(ton_g, ganzton);
beep(ton_g, ganzton);
beep(ton_f, ganzton);
beep(ton_e, ganzton);
beep(ton_d, ganzton);
beep(ton_c, ganzton);
beep(ton_c, ganzton);
beep(ton_d, ganzton);
beep(ton_e, ganzton);
beep(ton_d, ganzton+ganzton/2);
beep(ton_c, ganzton/2);
beep(ton_c, ganzton*2);
beep(ton_d, ganzton);
beep(ton_d, ganzton);
beep(ton_e, ganzton);
beep(ton_c, ganzton);
beep(ton_d, ganzton);
beep(ton_e, ganzton/2);
beep(ton_f, ganzton/2);
beep(ton_e, ganzton);
beep(ton_c, ganzton);
beep(ton_d, ganzton);
beep(ton_e, ganzton/2);
beep(ton_f, ganzton/2);
beep(ton_e, ganzton);
beep(ton_d, ganzton);
beep(ton_c, ganzton);
beep(ton_d, ganzton);
mSleep(ganzton*2);
beep(ton_e, ganzton);
beep(ton_e, ganzton);
beep(ton_f, ganzton);
beep(ton_g, ganzton);
beep(ton_g, ganzton);
beep(ton_f, ganzton);
beep(ton_e, ganzton);
beep(ton_d, ganzton);
beep(ton_c, ganzton);
beep(ton_c, ganzton);
beep(ton_d, ganzton);
beep(ton_e, ganzton);
beep(ton_d, ganzton+ganzton/2);
beep(ton_c, ganzton/2);
beep(ton_c, ganzton*2);
mSleep(2000);
}
return(0);
}
Die Formel habe ich an die 8MHz des Base angepasst. Warum die Stopwatch() gelegentlich "stolpert" habe ich noch nicht rausbekommen, aber als Demo scheint mir das schon recht nett :)
Lesezeichen