@Krampfda
Wo liegt wirklich dein Problem, dein ursprüngliches Programm funktioniert doch. Ich habe das auf meinem Testboard ausprobiert. Wenn bei dir die LED nicht leuchtet dann hast du eher ein Hardwareproblem.
Hallo,
mit:
TIFR = (1<<TOV0);
kannst du eigentlich nur das Interrupt Flag löschen, eigentlich wird dies automatisch gemacht, aber man kann dies auch manuel durchführen.
also testest nachher nur, od du wirklich das Flag gelöscht hast....
lg michael
@Krampfda
Wo liegt wirklich dein Problem, dein ursprüngliches Programm funktioniert doch. Ich habe das auf meinem Testboard ausprobiert. Wenn bei dir die LED nicht leuchtet dann hast du eher ein Hardwareproblem.
Bei mir blinkt die LED auch fleissig. Dazu eine kleine Verständnisfrage: Wieso geht die LED eigentlich wieder aus? Sie wird doch beim Interupt nur eingeschaltet, ich sehe keinen Grund wieso sie wieder ausgehen sollte und somit blinkt *verwirrt ist*. Müsste die led nicht eigentlich konstant leuchten?
EDIT:
streicht meinen Beitrag, ich hab ja in dem Code auch PORTB ^= (1 << PB0); stehen, daher geht das Ding halt an und aus. Wenn ich nur PORTB = (1 << PB0); setze, dann leuchtet die LED konstant.
genau da liegt mein problem: alle sagen, das programm sei korrekt (was ich auch glaube), aber der interrupt scheint nicht zu funktionieren.Zitat von Hubert.G
die LED funktioniert einwandfrei an dem port (wenn ich die anders ansteuer),
der timer funktioniert ebenfalls.
ausserdem habe ich auch schon einen anderen controller ausprobiert.
ich habe keine ahnung, wo das problem genau sitzt ^^
Ich auch nicht. Habe den Code jetzt auch mal probiert, was soll ich schreiben, es geht.Zitat von Krampfda
Mit if(TCNT0==0xff) hast du bewiesen, dass der Zähler hoch läuft. Da TOV0 nicht gesetzt wird, scheint es ein Problem beim Überlauf zu geben. Das Flag wird aber erst mit dem Wechsel von 0xff zu 0x00 gesetzt. Wenn du Lust hast, kannst du der Sache mit folgendem Code auf den Grund gehen. Es wird dir bei der Lösung aber wohl nicht weiter helfen.
Leuchtet die LED findet ein Überlauf statt. Das Flag TOV0 müsste gesetzt sein.Code:int main(void) { DDRB = 0x01; TCCR0 = (1<<CS02)|(1<<CS00); TIMSK = (1<<TOIE0); //sei(); ist nur ein Test Nix mit Interrupt TCNT0 = 0x01; //Wir wollen Prüfen, ob 0x00 wieder erreicht wird while(1) { if(TCNT0==0x00) { PORTB = 0x01; } } /* Wird nie erreicht */ return 0; }
Wie hilft dir das? Keine Ahnung. Sorry.
Hardewar? Okay, schließt du aus.
Gruß
Jens
edit:Mir ist noch eine Möglichkeit eingefallen. Schau mal ob du auch die richtigen Headerdateien, die vom Atmega8, einbindest. Nicht das der Interruptvektor weißdergeier wohin zeigt.
Also der Interrupt funktioniert sicher, sonst würde die LED bei mir nicht blinken, die wird nur in der ISR angesteuert.
"karmek" hat ebenfalls geschrieben das die LED blinkt.
Bei mir funktioniertes auch. Nur beim op wohl nicht.Zitat von Hubert.G
![]()
Oder habe ich da etwas überlesen? Er hat schon einen anderen ATMega8 probiert. Die LED soll an dem Port auch leuchten, wenn er sie ohne Interrupt anspricht. Hardware? Mir fällt kein passendes Scenario ein.
Nehmen wir mal an, er hat die Headerdatei vom AtMegaXX eingebunden. Dann ist TIMER_OVF_vect nicht mehr 5 sondern 8 (Werte ausgedacht, nicht nachgeschaut).
Gruß
Jens
in meinem ersten beitrag siehst du, wie ich den code compiliert und geflasht habe.Zitat von McJenso
habe immer den controllertyp mit angegeben, wo es wichtig ist, meine ich, aber ggf kannst du da was finden.
gruß
krampfda
![]()
![]()
Jetzt wo du es schreibst ....
Probier mal ob du meinen Code laden kannst
Lesezeichen