volatile uint8_t second;
Wenn eine ISR auf eine Variable zugreift sollte diese volatile sein.
Hallo,
nachdem ich von Bascom auf C umgestiegen bin stehe ich wieder vor wahrscheinlich normalen anfänglichen Problemen.
Für eine digital Uhr benötige ich einen Timer, der (genau) jede Sekunde die ISR ausführt.
Ich habe schon die Wiki durchgeschaut, die dort angegebenen Beispiel laufen bei mir nicht.
Jetzt habe ich ein anderes Beispiel gefunden:
Es werden beim Compilieren zwar keine Fehler gefunden, aber meine Sekunden werden trotzdem nicht erhöht. Hoffe ihr wisst Rat.Code://---------------------------------------------------- // Set up timer 1 to generate an interrupt every 1 ms //---------------------------------------------------- TCCR1A = 0x00; TCCR1B = (_BV(WGM12) | _BV(CS12)); OCR1A = 71; TIMSK1 = _BV(OCIE1A); ISR(TIMER1_COMPA_vect) { second++; }
zusätzliche Infos:
µController: AT mega168
Compiler: AVR Studio (mit Win AVR für C)
volatile uint8_t second;
Wenn eine ISR auf eine Variable zugreift sollte diese volatile sein.
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Danke für den Hinweis, aber der Codeausschnitt ist wirklich nur ein Ausschnitt. weiter oben im Programm steht bereits volatile int second
Hübsches Ratespiel der Art: ich verstecke den größten Teil meines geheimen Codes, bitte sucht den Fehler.Zitat von phyroEine alte indische Programmiererweisheit lautet: selbst ist der Programmierer. Ne andere ist eher kryptisch: RTFM.Zitat von phyro
Die Basis für einen genauen Timer ist der Quarztakt. Ohne dessen Wert zu kennen müsste ich zusammen mit der Bedeutung des "_BV" auch hier etwas raten. "TCCR1A = 0x00;" halte ich für ein eher unsinniges Codestück, da beim CTC mit OCR1A zumindest WGM01 gesetzt sein muss. Soweit ich mich an die Dokumentation erinnere.Zitat von phyro
Ciao sagt der JoeamBerg
Sorry, ich habe gedacht es währe übersichtlicher, wenn ich nur das poste, was auch mit dem Timer zu tun hat. Den übrigen Teil habe ich zuvor schon getestet und der tut was er soll.Zitat von oberallgeier
Übrigens, der Ton macht die Musik!
Und wie gesagt, den Timer habe ich in Bascom schon einmal erfolgreich umgesetzt, ich will zunächst mal, dass der Timer überhaupt erstmal läuft, die passende Geschwindigkeit kann ich dann hinterher immer noch einstellen. Darum geht es mir hier nicht.
Und hier noch mal der gesamte Code:
Und der Controller wird über einen Quarz mit 16 Mhz versorgtCode:#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> void anzeige(int A1, int A2, int A3, int P); volatile int second = 0; volatile int minute = 0; volatile int hour = 0; int P = 0; int main (void) { //---------------------------------------------------- // Set up timer 1 to generate an interrupt every 1 ms //---------------------------------------------------- TCCR1A = 0x00; TCCR1B = (_BV(WGM12) | _BV(CS12)); OCR1A = 71; TIMSK1 = _BV(OCIE1A); DDRB = 0xff; // PortB als Ausgang DDRC = 0b001111; // PortC.0 bis C.3 als Ausgang while(1) { anzeige(hour,minute,second,0); } return 0; } /* Die Funkton Anzeige kümmert sich darum, die in A1, A2 und A3 abgelegten Zahlen auf den Sechs 7-Segment Anzeigen dar zu stellen, P ist für die Sekunden Punkte zuständig */ void anzeige(int A1, int A2, int A3, int P) { PORTB = 0b000001; PORTC = A1/10 ; _delay_ms(3); PORTB = 0b000010; PORTC = A1%10 ; _delay_ms(3); PORTB = 0b000100; PORTC = A2/10 ; _delay_ms(3); PORTB = 0b001000; PORTC = A2%10 ; _delay_ms(3); PORTB = 0b010000; PORTC = A3/10 ; _delay_ms(3); PORTB = 0b100000; PORTC = A3%10 ; _delay_ms(3); } ISR(TIMER1_COMPA_vect) { second++; if (second>59) { second=0; minute++; } if (minute>59) { minute=0; hour++; } if (hour>23) { hour =0; } }
Und wie stellst du jetzt fest, dass second nicht richtig hochgezählt wird?
MfG
Stefan
oh sry, hatte noch ne Dreher im Programm, weil ich nachher noch was dran gemacht hatte, zum testen war im Hauptprogramm nur die fkt Anzeige aufgerufen worden. Hab es im vorherigen Post geändert.
Zitat von phyroZitat von phyroZitat von phyro
Ciao sagt der JoeamBerg
Achso, jetzt wird mir alles klar!!!
Wo liegt denn das Problem, dass ich, nachdem ich hier das erste mal nachgefragt habe, noch selbst am Programm rumgewerkelt habe?
Du musst mir ja nicht helfen wenn du nicht willst? Aber was genau stört dich daran? Das ich hier frage wenn ich mal nicht weiter weiß?
Wenn das alles an Code ist, fehlt wohl das sei().
Lesezeichen