hi, zur ansteuerung einer RGBLED hab ich für die PWM den Timer 1 genommen, für die Blinkfrequenz hab ich den Timer 3 genommen der beim Vergleichswert von OCR3A toggelt (atmel can 128). Mein Problem ist jetzt, wie kann ich das codieren das die ausgänge von Timer 1 (OC1A, OC1B, OC1C) mit der Frequenz von Timer 3 an und ausgehen. ich hab das mal mit if else anweisungen versucht zu probieren wenn z.b. 0C3B an ist sollen auch die ausgänge von Timer 1 an sein, aber das funzt alles nicht so, muss ich das mit dem interrupt steuern? hab den noch nie benutzt.
mazell schrieb: > muss ich das mit dem interrupt steuern? Wahrscheinlich. > hab den noch nie benutzt. Na dann schau mal hier: http://www.atmel.com/dyn/resources/prod_documents/doc7679.pdf AVR-GCC-Tutorial: Programmieren mit Interrupts Gruß Skriptkiddy
TCCR3A = (0<<WGM31) | (0<<WGM30) | (1<<COM3B0) | (0<<COM3B1) |
(1<<COM3C0) | (0<<COM3C1);
TCCR3B = (1<<CS32) | (0<<CS31) | (1<<CS30) |(0<<WGM33) | (1<<WGM32) ;
TIMSK3 = (1<<OCIE3A) | (0<<ICIE3) ;
hab den TIMSK3 so belegt.
int blinken(float f)
{
OCR3A = (F_CPU /(2 1024 f) ) -1 ;
}
ISR(TIMER3_COMPA_vect)
{
Farbe(255,0,0);
}
nur fürs verständnis, wenn der Vergleichswert erreicht wird sollte doch
das interrupt jetzt starten, und eigentlich müsste er mir die farbe
(rot) ausspucken!? (macht er nicht ;) )
Aus diesen unkommentierten Fragmenten wird niemand, ohne Aufwand zu betreiben, schlau. Poste bitte mal den ganzen Code (als Anhang). Gruß Skriptkiddy
hab das mal als C datei angehangen
#define ROT OCR1A
#define GRUEN OCR1B
#define BLAU OCR1C
// Funktion zur Einstellung der Farben
int Farbe( int r, int g, int b)
{
ROT = r;
GRUEN = g;
BLAU = b;
}
//Funktion zur Einstellung der Blinkfrequenz
int blinken(float f)
{
OCR3A = (F_CPU /(2 1024 f) ) -1 ;
}
ISR(TIMER3_COMPA_vect)
{
if (DDB5 == 1 )
{
DDRB |= (0<<DDB5); //ausgang der roten LED
}
else
{
DDRB |= (1<<DDB5);
}
}
int main(void)
{
DDRA &= ~(1<<DDA2) | ~(1<<DDA0) | ~(1<<DDA4);
DDRA |= (1<<DDA6);
DDRB |= (1<<DDB7) | (1<<DDB5) | (1<<DDB6) | (1<<DDB4);
DDRC &= ~(1<<DDC0) | ~(1<<DDC2) | (1<<DDC4) | (1<<DDC6);
DDRE = (1<<DDE4) | (1<<DDE5);
TCCR3A = (0<<WGM31) | (0<<WGM30) | (1<<COM3B0) | (0<<COM3B1);
TCCR3B = (1<<CS32) | (0<<CS31) | (1<<CS30) |(0<<WGM33) | (1<<WGM32) ;
TIMSK3 = (1<<OCIE3A) | (0<<ICIE3) ;
TCCR1A = (1<<WGM10) | (1<<COM1A1) | (1<<COM1B1) | (1<<COM1C1) ;
TCCR1B = (1<<CS11) | (1<<CS10) ;
PORTA |= (1<<PA2) | (1<<PA0) | (1<<PA4) ; // Eingänge/Ausgänge
PORTA &= ~(1<<PA6);
PORTC |= (1<<PC0) | (1<<PC2); //endlagen
//PORTE &= ~(1<<PE4); //gelbe LED
while (1)
{
Farbe(255,255,255);
blinken(2);
}
das ist so das wichtige
also der interrupt funktioniert auch, ich würde jetzt einfach "nur" ;)
wissen wollen wie ich an T1 rangehe sodass der mit der Blinkfrequenz von
T3 blinkt.
ne der interrupt funzt doch noch nicht, hab das mal mit der led auf dem controller ausprobiert
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.