TIMSK0|=(1<<TOIE0);// Interrupt für TimerOverflow aktivieren
15
sei();// Interrupts global aktivieren
16
17
PORTC=0x00;// Alle LEDS an
18
19
return(0);
20
}
21
22
23
ISR(TIMER0_OVF_vect){// Timer InterruptHandler, Ausführung 30.5 mal pro Sekunden
24
25
counter++;
26
27
if(counter>=5){
28
29
switch(PORTC){
30
31
case0x00:
32
33
PORTC=0xFF;
34
35
case0xFF:
36
37
PORTC=0x00;
38
39
}
40
41
counter=0;
42
43
}
44
}
Ich habs jetzt schon so oft kontrolliert aber ich find den Fehler nicht.
Die Leds bleiben einfach an, da tut sich nichts. Sollten eigentlich so
ca. 6 mal pro Sekunde wechseln. Das CKDIV8 Fuse ist nicht gesetzt.
Thx
Hi,
Dein main() läuft 1x bis zum "return" und dann? Also
int main(void){
// Initialisierung etc.
sei;
while (1) {};
return 1; // nur um den Compiler glücklich zu machen....
}
Gruß
Fred
Im Anhang ein Schnipsel aus dem Datenbatt:
PORTC hat nur 7 Bits, dass höchstwertige (8te) Bit ist immer 0.
d.H. dein Vergleich PORTC==0xFF kann nie wahr werden.
An die Drei "while(1)"-Poster:
Das brauchts nicht wirklich, diese Enlosschleife ist in der avr-libc
(Startupcode) mit drinnen, falls man wirklich aus der main returned:
Hallo Ernst,
> Das brauchts nicht wirklich, diese Enlosschleife ist in der avr-libc> (Startupcode) mit drinnen, falls man wirklich aus der main returned:
...danke, das hatte ich nicht gewusst!
Gruß
Fred
Das ist auch Unsinn. Hinter dem while(1) fehlt ein Semikolon. Das return
kann man sich dann komplett schenken. Abgesehen davon gehören keine
Klammern um das "Argument" von return. Wenn schon, dann
Hallo Gast!
Du hast die Initialiesierungen alle man in der Main-Funktion drinne.
Die gehören davor, da diese eigentlich nur einmal aufgerufen werden
sollen.
Karsten B. wrote:
> Hallo Gast!> Du hast die Initialiesierungen alle man in der Main-Funktion drinne.> Die gehören davor, da diese eigentlich nur einmal aufgerufen werden> sollen.>
>TIMSK0|=(1<<TOIE0);// Interrupt für TimerOverflow
5
>aktivieren
6
>sei();// Interrupts global aktivieren
7
>PORTC=0x00;// Alle LEDS an
>> Der ganze Kram muss VOR die Main-Funktion stehen.> Dann sollte es klappen ;-)> MFG K-Duke
Vor der main()-Funktion dürfen überhaupt keine Initialisierungen
stehen! Lies Dir mal ein C-Buch durch, bevor Du hier so einen Unfug
erzählst! In C darf Code nur innerhalb von Funktionen stehen.
Der ganze Kram steht da schon richtig.
@ Gast:
Karlheinz hat natürlich völlig recht: solange immer noch das unsinnige
und so wie es da steht nicht funktionierende switch-case da steht,
kann es nicht funktionieren! Nimm eine der beiden von mir weiter oben
geposteten Versionen. Die funktionieren sicher!
EDIT: Sehe grad, dass Du auf PORTD gewechselt hast. Sollte dann zwar
eigentlich funktionieren, aber ist trotzdem unsinnig.
Gast wrote:
> Warum funktioniert die Switch Anweisung so nicht?
Unter anderem, weil wir alle bis auf einen gewissen Relaxxo übersehen
haben, dass Du die breaks vergessen hast! Zumindest nach dem ersten
case muss ein break stehen!
Gast wrote:
> Mit:>> PORTD ~= PORTD;>> bekomm ich nen: ../LED_Strobo.c:34: error: expected ';' before '~' token
Das kann eigentlich nicht sein, wenn vorher alles stimmt. Ich vermute
mal, Du hast in der Zeile davor einen Bock drin (eben z.B. ein
vergessenes ";").
Siehst Du jetzt, warum switch an so einer Stelle völliger Unsinn ist?
Erstens ist es fehleranfällig, zweitens macht switch nur dann Sinn,
wenn man deutlich mehr als zwei Fälle unterscheiden muss und drittens
gibt es grad in diesem Fall mehrere Varianten, das ganze einzeilig zu
schreiben.
Wenn man schon eine Verzweigung mit zwei Möglichkeiten machen will, dann
in so einem Fall ein if-else