Hi, ich habe ein Problem mit einer Interrupt-Routine. Und zwar soll bei jeder fallenden Flanke an einem Pin (kommt von einer Nulldurchgangserkennung) eine Variable hochgezählt werden. Innerhalb der IR-Routine wird die Variable auch korrekt hochgezählt (zaehler++, wird durch das Blinken einer LED bestätigt), ausserhalb ist und bleibt sie aber Null. :-( Ich habe "zaehler" als globale Variable volatile char zaehler; deklariert. Irgendwelche Ideen, was ich falsch mache?
Hier ist der Code-Ausschnitt mit der IR-Routine: #include <msp430x14x.h> char temp_str[]="0000"; char uhr_str[]="00"; volatile char zaehler; int main(void) { // ... divereses anderes Zeug, unwichtig ... _BIS_SR(GIE); // allgemeiner interrupt-enable P1IE=0x10; // pin 16 interrupt-faehig machen (wg. 100Hz-erkennung) P1IES=0x10; // interrupt auf pin 16 ausloesen bei high->low - uebergang // ... divereses anderes Zeug, unwichtig ... IntToString(uhr_str, zaehler, 2, 0); // macht aus dem char einen string, fuer LCD-ausgabe } #pragma vector=PORT1_VECTOR __interrupt void Port1_Interrupt (void) { if (P1IFG&0x10) // 0x10 ist pin 16 { if (!((++zaehler)%50)) { zaehler = 0; P1OUT^=0x01; // LED toggeln, jede Sekunde } } }
Und wie gesagt: Die LED toggelt korrekt, nur die IntToString-Funktion in der main() bekommt immer eine Null rein und gibt auch eine Null auf einem LCD aus. :-(
Ich kann das hier leider nicht nachvollziehen. Dein Code sieht sehr nach IAR aus, richtig?
Jep, so ist es. Was meinst du mit nicht navollziehen? Kannst du den Kram nicht kompilieren oder tritt der Fehler so bei dir nicht auf?
Wäre es nicht einfach Du würdest Deine Zählervariable als Integer deklarieren? Ich erkenne nicht den Sinn, diese als char zu bauen. Marc
Der Sinn ist nur Speicherplatz. Da der IR wie gesagt von einer Nulldurchgangserkennung kommt, wird er im deutschen Netz mit 50Hz folglich 50 mal pro Sekunde ausgelöst. Danach setze ich den Zähler ja wieder auf Null zurück. Folglich wäre INT eine Verschwendung, weil die Variable ja niemals größer als 50 werden kann.
Hi, mal angenommen du hast in deinem Code oben wirklich nur das unwichtige rausgeschnitten ... Wo ist dann deine Hauptschleife die dafuer sorgt, dass diese IntToString() Funktion ueberhaupt ausgefuert wird? Gruß Tobias
Oh, klar. Ich habe aus Versehen die Zeile davor auch noch mitgelöscht. Korrekt muss es natürlich lauten: for (;;) { IntToString(uhr_str, zaehler, 2, 0); } Die IntToString wird also immer wieder aufgerufen.
In der Intotostring-Funktion muß die Variable für zaehler als volatile deklariert werden. Die IAR-Compiler behandeln alle Variablen als volatile (deshalb kennen die kein restrict), so dass man das beim Portieren beachten muß. Besser als call by value wäre aber call by reference.
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.