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
|