Forum: Mikrocontroller und Digitale Elektronik M16C verschluckt Interrupts


von Benedikt (Gast)


Lesenswert?

Die Software lief einwandfrei, dann habe ich versehentlich den Rebuild
Butten beim NC30 Compiler gedrückt und seitdem geht (fast) garnichts
mehr:
Beim Lesen eines LM92 I2C Temperatursensors bleibt plötzlich alles
hängen, das Lesen aus dem EEPROM funktioniert aber, und liefert sogar
die richtigen Werte.
Weiterhin hängt sich der uC beim Senden über den UART auf, hier ein
Codeausschnitt.
Message sendet einen mit Null termierten String über den UART. Nach
jedem Byte wird ein Busyflag gesetzt, das in der UART Interruptroutine
zurückgesetzt wird.
Der erste Sendevorgang funktioniert, danach hängt der Controller, da
das Busyflag anscheinend nicht zurückgesetzt wird.
Lasse ich die zweite Message weg, hängt er daher bei der dritten.
Hänge ich die erste und zweite Message direkt hintereinander, also ohne
die LoadPic Routine geht es dagegen wieder.
Weiterhin ändern sich Variablen von selbst: Am PC erscheint A01, so wie
es auch sein sollte. Auf dem Display jedoch B55. PicMem ist eine
Konstante und hat den Wert 16. Da PicNum 1 ist, so wie es auch am PC
ausgegeben wird, müsste der Vergleich mit PicMem+1 wahr sein, und daher
A01 auf dem Display erscheinen. Aber aus irgendeinem, mir unerklärlichen
Grund hat sich der Wert PicNum plötzlich auf 55 geändert ! Und das
obwohl dieser Wert nirgends in einem Interrupt vorkommt.
Wenn ich alle LM92 und alle UART Routinen entferne funktioniert der
Rest der Software (Menüstruktur usw.) fehlerfrei. Und das obwohl das
Display controllerlos ist, der M16 also die Daten Interruptgesteuert
ausgibt.
Ich verstehe echt nicht mehr, wie sowas gehn kann...

temps[0]=65;
temps[1]=PicArea+48;
temps[2]=PicNum+48;
temps[3]=0;
Message (temps);

    LoadPic(PicNum-1);

temps[0]=66;
temps[1]=PicArea+48;
temps[2]=PicNum+48;
temps[3]=0;
Message (temps);
    if ((Panel.special==0)&&(Panel.Panelcon==0))
       {if (PicNum<(PicsMem+1))                          //Display
PicNumber
           {ShowTXT6x8 (0, 13, "A");
            DispBCD (0, 14, 2, PicNum);}
        else
           {ShowTXT6x8 (0, 13, "B");
            DispBCD (0, 14, 2, PicNum-(PicsMem-MaxNum)); }}

temps[0]=67;
temps[1]=PicArea+48;
temps[2]=PicNum+48;
temps[3]=0;
Message (temps);

von Judge (Gast)


Lesenswert?

Das Phänomen das sich Variablen ändern hatte ich auch mal mit dem NC308
(ist auch ganz plötzlich aufgetreten). Woran das gelegen hat kann ich
Dir leider nicht sagen (evtl. eine Einstellung beim Kompilieren,
Start-Up-Dateien,...?), jedenfalls konnte ich das "beheben" indem ich
jede Variable mit irgendeinem Wert vorinitialisiert und Arrays mit einer
geraden Anzahl von Bytes verwendet habe.
Die Ursache würde mich auch mal interessieren. Ich hatte mich aus
Zeitgründen noch nicht näher damit befasst.

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
Noch kein Account? Hier anmelden.