Datum:
Hallo zusammen, ich bin noch relativ neu und unerfahren im Bereich Programmierung. Da ich es aber lernen möchte, will ich eine kleine Uhr mit einem MSP430G programmieren. Ich dachte mir ich löse einfach jede Sekunde einen Timer-interrupt aus und setzt dann die Sekunden-Variable um eins nach oben. Minuten und Stunden wollte ich einfachen mit If-Anweisungen machen. So weit so gut. Jetzt hab ich leider das kleines Problem, das es irgendwie ein Problem mit den Variablen gibt.
#include <msp430g2232.h> #include "init.h" unsigned short ush_RTCsec = 0; unsigned short ush_RTCmin = 0; unsigned short ush_RTChour = 0; void main(void) { init_main(); while (1) { _delay_cycles(40000); } } #pragma vector=TIMER0_A0_VECTOR __interrupt void TIMER0_A0_ISR (void) { TACTL &= ~TAIE; if (ush_RTCsec >= 59 ) { if (ush_RTCmin >= 59) } if (ush_RTChour >= 23) } ush_RTChour = 0; } else { ush_RTChour ++; } } else { ush_RTCsec = 0; ush_RTCmin **; } } else { ush_RTCsec ++; } |
Ich benutze Code Composer Studio von TI als Compailer und finde leider das Problem nicht. Danke für eure Hilfe!
Datum:
Was ist die Fehlermeldung? Und was soll die Zeile hier: ush_RTCmin **; darstellen?
Datum:
> ush_RTCmin **;
Was macht diese Zeile?
Datum:
Wenn main() bzw. der Nicht-Interrupthandler-Code mehr Funktionalität erhält wird es ein Problem geben, weil die ush_RTC Variablen nicht volatile definiert: Warum das dann nötig ist, siehe Artikel Interrupt).
Datum:
definiert => definiert sind
Datum:
Mit der Klammerung bei den ifs stimmt auch was nicht.
Datum:
Mark Brandis schrieb: > Was ist die Fehlermeldung? Und was soll die Zeile hier: > > ush_RTCmin **; > > darstellen? Das war ein schreibfehler es sollte ++ heißen.
Beitrag #2640382 wurde vom Autor gelöscht.
Datum:
ok hab den Fehler gefunden, die if-Klammern waren schuld. Danke für die schnelle Antwort!
Datum:
@ Jonas Enderlin (joenten) >ok hab den Fehler gefunden, die if-Klammern waren schuld. Nicht nur. Es fehlt volatile, siehe Artikel Interrupt. MFG Falk
Datum:
Jonas Enderlin schrieb: > Mark Brandis schrieb: >> Was ist die Fehlermeldung? Und was soll die Zeile hier: >> >> ush_RTCmin **; >> >> darstellen? > > Das war ein schreibfehler es sollte ++ heißen. Dir ist klar, dass man sich mit Code, den man extra fürs Forum noch einmal neu tippt, enorm unbeliebt machen kann? Es ist praktisch kaum zu vermeiden, dass man da Tippfehler einbaut, die im realen Code nicht vorhanden sind. Die regelmässigen Helfer hier haben dann eine Riesenfreude, wenn sie dich auf Fehler aufmerksam machen, die in deinem realen Code gar nicht enthalten sind. Dreh deine Logik in der Interrupt Routine ein wenig um. Das ist ein wenig arg vewrwirrend, was du da machst. Erhöhe die jeweilige Variable und danach siehst du nach, ob du damit übers Ziel hinausgeschossen bist und korrigierst das entsprechend, indem du zb wieder bei 0 Sekunden anfängst und dafür 1 Minute mehr zählst. Sind die Minuten bei 60, dann gehen die wieder auf 0 und dafür wird 1 Stunde mehr gezählt ....
... ush_RTCsec++; if( ush_RTCsec == 60 ) { ush_RTCsec = 0; ush_RTCmin++; if( ush_RTCmin == 60 ) { ush_RTCmin = 0; ush_RTChour++; if( ush_RTChour == 24 ) ush_RTChour = 0; } } ... |
siehst du um wieviel einfacher und durchschaubarer diese Logik ist? Bei deiner Logik muss man erst mal alle Möglichkeite in Gedanken abklappern, die du da mit den if's und else's aufgebaut hast um sich davon zu überzeugen, dass in allen Fällen auch wirklich das Richtige passiert.
Datum:
ja du hast recht, das ist echt viel übersichtlicher. Danke für den guten Rat :-) das mit dem abgetippten Code, werd ich mir zu Herzen nehmen.