www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik M16C verschluckt Interrupts


Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Judge (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.