Hallo, ich muss gerade recht schnell ne kleine Demo auf nem Mega8 zum laufen bringen. Kenne mich aber mit Atmels und Programmieren allgemein nicht sonderlich gut aus. Zur Verfügung steht mir das AVR-Starterkit. Programmieren tue ich in C mit AVR-Studio-4. Aktuell habe ich ein Problem mit Timer0 und nem dazu gehörigen Interrupt. Was mache ich da falsch im Code? #include <avr/io.h> #include <avr/interrupt.h> int main (void) { cli(); //Register Ein- / Ausgänge definieren DDRD = 0xFF; //alle Ausgang DDRB = 0x03; //PB0 & PB1 Ausgang //Startzustände definieren PORTB |= (1 << PB0); //Transistor aus PORTB &= ~(1 << PB1); //Transistor ein PORTD |= (1 << PD0); //Segment aus PORTD |= (1 << PD1); //Segment aus PORTD |= (1 << PD2); //Segment aus PORTD |= (1 << PD3); //Segment aus PORTD |= (1 << PD4); //Segment aus PORTD |= (1 << PD5); //Segment aus PORTD |= (1 << PD6); //Segment aus PORTD |= (1 << PD7); //Segment aus // Timer 0 konfigurieren TCCR0 |= (1 << CS00); //Prescaler // Overflow Interrupt erlauben TIMSK |= (1 << TOIE0); // Global Interrupts aktivieren sei(); for(;;) { PORTD &= ~(1 << PD2); //Segment ein } } //Interrupt Routinen ISR(TIMER0_OVF_vect) { PORTD &= ~(1 << PD0); //Segment ein }
Michael schrieb: > Aktuell habe ich ein Problem mit Timer0 und nem dazu gehörigen > Interrupt. Was mache ich da falsch im Code? Was hast du denn für ein Problem? und das > for(;;) > { > > PORTD &= ~(1 << PD2); //Segment ein > > } solltest du nicht machen. Warum willst du den Port alle paar ns wieder auf 0 setzen? Macht doch gar keinen Sinn.
Die Frage ist, was genau willst du mit deinem Code erreichen und was genau passiert, wenn du es laufen lässt?
Also so wie ich das sehe, sollte die ISR(TIMER0_OVF_vect) bei F_CPU=1MHz nach 1e6/256 = 256µs eingeschaltet werden. Also Quasi sofort. Wenn es das ist was du willst, ist es ja OK :D
Das der aktuelle Code noch nicht viel Sinn ergibt ist klar, der ist nur zu Testzwecken. Ich hab 2 7-Segment-Anzeigen welche ich multiplexen will. Die Segmente sind an Port D angeschlossen. Zwei Transistoren zum umschalten an PB0 und PB1. Das lässt sich auch alles so Problemlos ansteuern. Jetzt möchte ich gerne das Umschalten der Transistoren zyklisch durch nen Timer geschehen lassen. Und die Anzeigen sollen dann erstmal einfach von 0-99 zählen. Zum Testen möchte ich jetzt erstmal einfach in der ISR ein Segment einschalten um zu sehen ob da überhaupt reingesprungen wird. Da passiert aber nix und das ist das aktuelle Problem. Gruß Michael
Timmo H. schrieb: > Also so wie ich das sehe, sollte die ISR(TIMER0_OVF_vect) bei F_CPU=1MHz > nach 1e6/256 = 256µs eingeschaltet werden. Also Quasi sofort. Wenn es > das ist was du willst, ist es ja OK :D dazu benötigt man aber kein Timer :D
Muss man da vielleicht noch irgendwelche von den Fuses richtig setzen? Habe die Taktquelle beispielsweise aktuell auf den internent Takt von 1MHz mit 64ms Startup gestellt. Gruß Michael
Hab mittlerweile rausgefunden, dass es nicht am Timer liegt. Der läuft, habe dazu in der main einfach mal ne Abfrage auf den aktuelle Timerwert eingebaut. Daher muss es wohl am Interrupt liegen, habe ich denn da was falsch gemacht?
Michael schrieb: > Daher muss es wohl am Interrupt liegen, habe ich denn da was falsch > gemacht? Nein, Interrupt funktioniert, Ergebnis nach einem Überlauf: PB0 = 1, PB1 = 0, PD0 = 0, PD2 = 0 Also Hardware und Kontrollerdefinition überprüfen.
Hmm, bei mir läufts leider nicht. Was genau meinst du mit "Hardware und Kontrollerdefinition überprüfen? Habe nen Mega8 und das auch in AVR-Studio so eingestellt.
Michael schrieb: > Was genau meinst du mit "Hardware und Kontrollerdefinition überprüfen? Überprüfen ob die Signale so wie ich sie schrieb an den µC-Pins anliegen und ob da auch ATmega8 im Projekt drinsteht. Nicht daß das .hex für 'nen anderen Typen erzeugt wird. Kannst auch im Projekt --> default-Ordner das dort enthaltene Makefile im Texteditor öffnen um da zusätzlich sicher zu gehen. Anbei das erzeugte .hex, kannst ja mal testen.
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.