Forum: Mikrocontroller und Digitale Elektronik PIC18 mit MCC18 Problem mit TableRead


von Matthias P. (Firma: privat) (sogge)


Lesenswert?

Hi Leute,

habe seit Tagen ein Problem und finde den Fehler einfach nicht.

Es handelt sich um eine einfache Text Ausgabe an einem LCD.

Das Gerät läuft über Stunden und Funktioniert.
Irgendwann nach X-Stunden wenn die Funktion LcdPrintString() aufgerufen 
wird, kommt das Programm nicht mehr über die while(tempChar) bedingung 
"drüber". Da nach tempChar = s[x]  0x00 in tempChar steht.

Obwohl ich beim Debuggen an der Stelle s[x] einen gültigen ASCII sehe.

Ich kenne mich leider im ASM nicht "so" gut aus.
Aber ich glaube das Problem liegt im Bereich

0xB626: TBLRD*
0xB628: MOVLW 0x4
0xB62A: MOVFF TABLAT, PLUSW2

Ich glaube das es was mit dem TBLRD* zu tun hat.
Obwohl ich nicht genau verstehe was er da exakt macht (Table Read).
Ich vermute das er an dieser Stelle das Byte an der Adresse von (TBLPTRH 
und TBLPTRL) lesen will.
Diese Beiden Pointer TBLPTRH+TBLPTRL haben aber die richtige Addresse 
vom Speicherort, wo auch das ASCII Zeichen stehen soll (was es auch tut 
laut Speicher Beobachtung)


Was ich einfach nicht verstehe ist das, dass Programm über Stunden 
funktioniert und auf einmal den CHAR nicht mehr aus dem "speicher" lesen 
kann.

Bitte um Hilfe!


µC: Pic18F8722
Compiler: mcc18 v3.46
Umgebung: MPLAB X 1.95


//C-Funktion
1
void LcdPrintString(const rom char *s,
2
                      unsigned char positionX,
3
                      unsigned char positionY,
4
                      unsigned char FontStyle,
5
                      unsigned char offset)
6
{
7
    
8
    int i=0,x=0;
9
    char tempChar=0;
10
11
    tempChar = s[x];
12
    
13
    while(tempChar)
14
    {
15
      blabla schreibe s[x] an display
16
    c++
17
    }
18
}

//Funktion in ASM Code//
1
!    tempChar = s[c];
2
0xB60A: MOVLW 0x2
3
0xB60C: MOVFF PLUSW2, __tmp_0
4
0xB60E: NOP
5
0xB610: MOVLW 0x3
6
0xB612: MOVFF PLUSW2, digit_cnt
7
0xB614: NOP
8
0xB616: MOVLW 0xFD
9
0xB618: MOVF PLUSW2, W, ACCESS
10
0xB61A: ADDWF __tmp_0, W, ACCESS
11
0xB61C: MOVWF TBLPTRL, ACCESS
12
0xB61E: MOVLW 0xFE
13
0xB620: MOVF PLUSW2, W, ACCESS
14
0xB622: ADDWFC digit_cnt, W, ACCESS
15
0xB624: MOVWF TBLPTRH, ACCESS
16
0xB626: TBLRD*
17
0xB628: MOVLW 0x4
18
0xB62A: MOVFF TABLAT, PLUSW2
19
0xB62C: NOP
20
!    while(tempChar)
21
0xB62E: MOVLW 0x4
22
0xB630: MOVF PLUSW2, W, ACCESS
23
0xB632: BNZ 0xB636                <---- Springe an richtige stelle 
24
0xB634: BRA 0xB730                <---- Springe raus da kein Char vorhanden
25
0xB72E: BRA 0xB62E

von Matthias P. (Firma: privat) (sogge)


Lesenswert?

Ach ja.
Wenn ich das Gerät Aus/Ein Schalte dann läuft er erneut für X-Stunden 
und der Fehler kommt erneut

von Max H. (hartl192)


Lesenswert?

Matthias P. schrieb:
> blabla schreibe s[x] an display
>     c++
Wie wärs mit einem vollständigen Code?
Zum Beispiel den Inhalt der while();


> tempChar = s[x];
>
>     while(tempChar)
>     {
>       blabla schreibe s[x] an display
>     c++
>     }
Wenn  s[x] != 0 und  "tempChar" in der while nicht geändert wird, wird 
die Schleife für immer laufen.

: Bearbeitet durch User
von Matthias P. (Firma: privat) (sogge)


Lesenswert?

ist doch völlig schnuppe was in der While() steht.
Er kommt ja garnicht rein da in TempChar anscheinend 0x00 steht wo 
eigentlich ein ASCII geladen wird (der ja auch an der stelle s[x] steht.

Bin mir mittlerweile ziemlich sicher das es am ASM-Befehel

0xB626: TBLRD*
0xB628: MOVLW 0x4
0xB62A: MOVFF TABLAT, PLUSW2

liegt.

Da er an einer anderen Stelle im Code, im Fehlerfall, nach dem TBLRD* im 
register TABLAT nichts steht. Obwohl dort etwas stehen sollte.

Sollte ja dann ein Controller Fehler sein oder ??? evtl Compiler?

Ist dieser Fehler irgend jemandem bekannt? Hab dazu nichts gefunden.

Oder weiß jemand wie man diesen Fehler beheben kann?

von Dieter Werner (Gast)


Lesenswert?

Zeigt denn der TBLPTR vor dem TBLRD* auf die richtige Adresse im 
Flash?

von Matthias P. (Firma: privat) (sogge)


Lesenswert?

Das kann ich jetzt gerade nicht mit 100% sicherheit sagen (da gerade 
kein Fehler anliegt) aber ich glaube ja.

Was wäre wenn nicht?

die Register TBLPTRL und TBLPTRH haben aber sicher die richtige Addresse 
im Bauch

von Matthias P. (Firma: privat) (sogge)


Lesenswert?

Ich könnte mir hald vorstellen das ich irgendwo im Programm mir den 
TBLPTR kaputt mache. Die frage ist nur wie ich das mache ^^
Da ja bei einem Chipreset (im debugg oder spg aus/ein) wieder alles 
läuft für x-Stunden

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.