www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zeichenkette funktion übergeben


Autor: *Michael* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich habe diverse Probleme mit einer einfachen ausgabe an ein Display.

Ich Programiere in C mit MPLAB C18 den pic 18F2550.

void printLCD (char * write)
{
  RE = 1;  
  RW = 0; // LCD im Schreiben-Mode
  RS = 1; // LCD im Daten-Mode
  while (!RE);      // Verzögerung bis ausgang 1 ist

  for (; *write != '\0', *write != 0; *write++)
  {

    LCD_DATA (*write);
    RE = 0;           // Enable (LCD)
    while (RE);          // Verzögerung bis ausgang 0 ist
    RE = 1;           // toggeln

  }
}

int main (void)
{
        // config des Displays....
        printLCD ("bla");
}


Auf dem Display erscheint allerdings:
.....................
.....................
.......<   ö>

so tuts aber:
int main (void)
{
        char text[] = "bla";
        // config des Displays....
        printLCD (text);
}

Jedes mal eine Variable für eine Ausgabe zu erstellen ist 1. 
verschwenderisch 2. dumm zum programieren 3. geht es ja auch anders.


Kann jemand bitte den Ziegelstein der auf meiner Leitung steht aufheben? 
;)

Autor: Tom M. (tomm) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:

>   for (; *write != '\0', *write != 0; *write++)

Igitt, sieht wüst aus, ist doppelmoppelt und schwer verständlich. 
while() ist dein Freund.


>         printLCD ("bla");
...
>         char text[] = "bla";
>         // config des Displays....
>         printLCD (text);

Die PICs kenn ich nicht, gibt's da Unterschiede in der Adressierung? 
Anders gefragt, wo wird der erste "bla" String abgelegt (Program 
Memory?), wo der zweite (Kopie vom Program Memory ins SRAM?). Kompilier 
doch mal beides mit ein und schau ins Assembler listing.

Hoffe das hilft. :)

Autor: Tom K. (ez81)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> *write++
Was wird hier um 1 erhöht?

Autor: *Michael* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tom M. schrieb:
> Michael schrieb:
>
>>   for (; *write != '\0', *write != 0; *write++)
>
> Igitt, sieht wüst aus, ist doppelmoppelt und schwer verständlich.
> while() ist dein Freund.
:D


aber wo find ich den asm text?

Autor: Michael H. (morph1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das liegt eindeutig daran, dass du "bla" im program-memory stehen hast, 
das gehört dann anders angesprochen bzw benötigt einen anderen zeiger

Autor: Tom M. (tomm) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Matthias schrieb:
>> *write++
> Was wird hier um 1 erhöht?

Postinkrement (bla++) hat höhere Prio als (*bla) Dereferenzierung.

Frau Google meldet bookmark-verdächtige Seiten bei der Suche nach "c 
operator precedence table". :)


Michael schrieb:
> aber wo find ich den asm text?

Keine Ahnung, hast kein Handbuch zu deinem Compiler? Find ich immer 
wieder mal hilfreich in Listing reinzuschauen, was der Compiler so 
fabriziert und was bei den unterschiedlichen Optimierungsstufen so 
rauskommt.

Autor: J. M. (Firma: OCL) (lorcan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie Michael H. schon meinte, es wird an der Variable 'write' liegen.
Versuch es mal mit 'write++' statt '*write++'. Und wenn das 
funktioniert, nimm dir ein Buch über C und lies über Pointer Arithmetic 
nach.
Z.B. http://openbook.galileocomputing.de/c_von_a_bis_z/

PS.: Du erhöst den Wert und nicht den Pointer.

Autor: *Michael* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okok,
ich hab viel rumgemacht, in einen andern code reingeschnüffelt, und auch 
kopiert. hätte ich selber drauf kommen sollen.

Jetzt kommt aber garnichts mehr-.-
void printLCD (char * write)
{
  RE = 1;  
  RW = 0; // LCD im Schreiben-Mode
  RS = 1; // LCD im Daten-Mode
  while (!RE);      // Verzögerung bis ausgang 1 ist

  for (; *write; write++)
  {

    LCD_DATA (*write);
    RE = 0;           // Enable (LCD)
    while (RE);          // Verzögerung bis ausgang 0 ist
    RE = 1;
    //write++;
  }
}

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>while (!RE);      // Verzögerung bis ausgang 1 ist
>while (RE);          // Verzögerung bis ausgang 0 ist

Sind PICs so schnarchlangsam, das man darauf warten muss?

MfG Spess

Autor: *Michael* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
spess53 schrieb:
> Hi
>
>>while (!RE);      // Verzögerung bis ausgang 1 ist
>>while (RE);          // Verzögerung bis ausgang 0 ist
>
> Sind PICs so schnarchlangsam, das man darauf warten muss?
>
> MfG Spess

ansonsten gibts probleme, ich glaub weil er die anderen ausgänge mit dem 
gleihen takt verändert. Ich muss verzögern, sonst kommt müll ;)

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Versuch es mal mit 'write++' statt '*write++'. Und wenn das
>funktioniert, nimm dir ein Buch über C und lies über Pointer Arithmetic
>nach.
>Z.B. http://openbook.galileocomputing.de/c_von_a_bis_z/

>PS.: Du erhöst den Wert und nicht den Pointer.
@lorcan
hast du das Buch wirklich gelesen,
entweder du hast nicht oder das Buch ist falsch ...

Autor: *Michael* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab im buch gelesen.
auch viel aus dem Buch übernommen, bzw ausprobiert, es funzt aber 
trotzdem net. wenn jemand den fehler findet dann bitte zeigen!
void printLCD (char * write)
{
  RE = 1;  
  RW = 0; // LCD im Schreiben-Mode
  RS = 1; // LCD im Daten-Mode
  while (!RE);      // Verzögerung bis ausgang 1 ist

  for (; *write; write++)
  {
    LCD_DATA (*write);
    RE = 0;           // Enable (LCD)
    while (RE);          // Verzögerung bis ausgang 0 ist
    RE = 1;
  }
}

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn es so
>        char text[] = "bla";
>        // config des Displays....
>        printLCD (text);
funktioniert und im anderen Fall nicht, dann taugt der Compiler nicht,
der String liegt dann z.B. im Programmemory auf das anders zugegriffen 
werden muss.
Wie schon jemand empfohlen hat:
schau dir das Assmeblerlisting an

Autor: *Michael* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Walter schrieb:
> wenn es so
>>        char text[] = "bla";
>>        // config des Displays....
>>        printLCD (text);
> funktioniert und im anderen Fall nicht, dann taugt der Compiler nicht,
> der String liegt dann z.B. im Programmemory auf das anders zugegriffen
> werden muss.
> Wie schon jemand empfohlen hat:
> schau dir das Assmeblerlisting an

:P
wie ich schonmal gefrag habe: Wo find ich den? (MPLAB C18)

Autor: *Michael* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
GEFUNDEN :D
---  C:\MCC18\src\traditional\delays\d10ktcyx.asm  -----------------------------------------------
  025E    0EFF     MOVLW 0xff
  0260    50E3     MOVF 0xfe3, W, ACCESS
  0262    6E05     MOVWF 0x5, ACCESS
  0264    0EEF     MOVLW 0xef
  0266    D001     BRA 0x26a
  0268    0EF3     MOVLW 0xf3
  026A    6EE7     MOVWF 0xfe7, ACCESS
  026C    2EE7     DECFSZ 0xfe7, F, ACCESS
  026E    EF36     GOTO 0x26c
  0270    F001     NOP
  0272    0E0C     MOVLW 0xc
  0274    6E04     MOVWF 0x4, ACCESS
  0276    6AE7     CLRF 0xfe7, ACCESS
  0278    2EE7     DECFSZ 0xfe7, F, ACCESS
  027A    EF3C     GOTO 0x278
  027C    F001     NOP
  027E    2E04     DECFSZ 0x4, F, ACCESS
  0280    EF3B     GOTO 0x276
  0282    F001     NOP
  0284    2E05     DECFSZ 0x5, F, ACCESS
  0286    EF34     GOTO 0x268
  0288    F001     NOP
  028A    0012     RETURN 0
---  C:\MCC18\src\traditional\proc\p18F2550.asm  -------------------------------------------------
  028C    0E00     MOVLW 0
  028E    6EF3     MOVWF 0xff3, ACCESS
  0290    EE00     LFSR 0, 0
  0292    F000     NOP
  0294    0E04     MOVLW 0x4
  0296    D801     RCALL 0x29a
  0298    0012     RETURN 0
  029A    60EA     CPFSLT 0xfea, ACCESS
  029C    D002     BRA 0x2a2
  029E    6AEE     CLRF 0xfee, ACCESS
  02A0    D7FC     BRA 0x29a
  02A2    50F3     MOVF 0xff3, W, ACCESS
  02A4    60E9     CPFSLT 0xfe9, ACCESS
  02A6    0012     RETURN 0
  02A8    6AEE     CLRF 0xfee, ACCESS
  02AA    D7FC     BRA 0x2a4
---  C:\MCC18\src\traditional\startup\c018i.c  ---------------------------------------------------
  0000    EF56     GOTO 0x2ac
  0002    F001     NOP
  0004    0012     RETURN 0
  02AC    EE13     LFSR 0x1, 0x300
  02AE    F000     NOP
  02B0    EE23     LFSR 0x2, 0x300
  02B2    F000     NOP
  02B4    6AF8     CLRF 0xff8, ACCESS
  02B6    9C01     BCF 0x1, 0x6, ACCESS
  02B8    ECE0     CALL 0x1c0, 0
  02BA    F000     NOP
  02BC    EC64     CALL 0x2c8, 0
  02BE    F001     NOP
  02C0    ECB3     CALL 0x166, 0
  02C2    F000     NOP
  02C4    D7FB     BRA 0x2bc
  02C6    0012     RETURN 0
  01C0    0E06     MOVLW 0x6
  01C2    6EF6     MOVWF 0xff6, ACCESS
  01C4    0E00     MOVLW 0
  01C6    6EF7     MOVWF 0xff7, ACCESS
  01C8    0E00     MOVLW 0
  01CA    6EF8     MOVWF 0xff8, ACCESS
  01CC    0100     MOVLB 0
  01CE    0009     TBLRD*+
  01D0    50F5     MOVF 0xff5, W, ACCESS
  01D2    6F65     MOVWF 0x65, BANKED
  01D4    0009     TBLRD*+
  01D6    50F5     MOVF 0xff5, W, ACCESS
  01D8    6F66     MOVWF 0x66, BANKED
  01DA    E103     BNZ 0x1e2
  01DC    6765     TSTFSZ 0x65, BANKED
  01DE    D001     BRA 0x1e2
  01E0    D03D     BRA 0x25c
  01E2    0009     TBLRD*+
  01E4    50F5     MOVF 0xff5, W, ACCESS
  01E6    6F60     MOVWF 0x60, BANKED
  01E8    0009     TBLRD*+
  01EA    50F5     MOVF 0xff5, W, ACCESS
  01EC    6F61     MOVWF 0x61, BANKED
  01EE    0009     TBLRD*+
  01F0    50F5     MOVF 0xff5, W, ACCESS
  01F2    6F62     MOVWF 0x62, BANKED
  01F4    0009     TBLRD*+
  01F6    0009     TBLRD*+
  01F8    50F5     MOVF 0xff5, W, ACCESS
  01FA    6EE9     MOVWF 0xfe9, ACCESS
  01FC    0009     TBLRD*+
  01FE    50F5     MOVF 0xff5, W, ACCESS
  0200    6EEA     MOVWF 0xfea, ACCESS
  0202    0009     TBLRD*+
  0204    0009     TBLRD*+
  0206    0009     TBLRD*+
  0208    50F5     MOVF 0xff5, W, ACCESS
  020A    6F63     MOVWF 0x63, BANKED
  020C    0009     TBLRD*+
  020E    50F5     MOVF 0xff5, W, ACCESS
  0210    6F64     MOVWF 0x64, BANKED
  0212    0009     TBLRD*+
  0214    0009     TBLRD*+
  0216    CFF6     MOVFF 0xff6, 0x67
  0218    F067     NOP
  021A    CFF7     MOVFF 0xff7, 0x68
  021C    F068     NOP
  021E    CFF8     MOVFF 0xff8, 0x69
  0220    F069     NOP
  0222    C060     MOVFF 0x60, 0xff6
  0224    FFF6     NOP
  0226    C061     MOVFF 0x61, 0xff7
  0228    FFF7     NOP
  022A    C062     MOVFF 0x62, 0xff8
  022C    FFF8     NOP
  022E    0100     MOVLB 0
  0230    5363     MOVF 0x63, F, BANKED
  0232    E102     BNZ 0x238
  0234    5364     MOVF 0x64, F, BANKED
  0236    E007     BZ 0x246
  0238    0009     TBLRD*+
  023A    50F5     MOVF 0xff5, W, ACCESS
  023C    6EEE     MOVWF 0xfee, ACCESS
  023E    0763     DECF 0x63, F, BANKED
  0240    E2F8     BC 0x232
  0242    0764     DECF 0x64, F, BANKED
  0244    D7F9     BRA 0x238
  0246    C067     MOVFF 0x67, 0xff6
  0248    FFF6     NOP
  024A    C068     MOVFF 0x68, 0xff7
  024C    FFF7     NOP
  024E    C069     MOVFF 0x69, 0xff8
  0250    FFF8     NOP
  0252    0100     MOVLB 0
  0254    0765     DECF 0x65, F, BANKED
  0256    0E00     MOVLW 0
  0258    5B66     SUBWFB 0x66, F, BANKED
  025A    D7BF     BRA 0x1da
  025C    0012     RETURN 0
---  C:\MCC18\src\traditional\stdclib\__init.c  --------------------------------------------------
  02C8    0012     RETURN 0
---  C:\Users\michael\Documents\MPLAB\Display-LM75-EEPROM-18F2550-Platine\LCD.c  -----------------
1:                 # include "LCD.h"
2:                 
3:                 void LCD_DATA (char);
4:                 void cls_LCD (void);
5:                 void printLCD (char []);
6:                 
7:                 
8:                 
9:                 void LCD_DATA (char x)
  0008    CFD9     MOVFF 0xfd9, 0xfe6
  000A    FFE6     NOP
  000C    CFE1     MOVFF 0xfe1, 0xfd9
  000E    FFD9     NOP
  0010    0E02     MOVLW 0x2
  0012    26E1     ADDWF 0xfe1, F, ACCESS
10:                {
11:                  char Er_1 = 0x00;
  0014    6ADF     CLRF 0xfdf, ACCESS
12:                  char Er_2 = 0x00;
  0016    0E01     MOVLW 0x1
  0018    6ADB     CLRF 0xfdb, ACCESS
13:                
14:                  Er_1 = LATA & 0xE0; // A5 - A7 aufheben
  001A    0EE0     MOVLW 0xe0
  001C    1489     ANDWF 0xf89, W, ACCESS
  001E    6EDF     MOVWF 0xfdf, ACCESS
15:                  Er_2 = x & 0x1F;    // Daten für A0 - A4 filtern
  0020    0EFE     MOVLW 0xfe
  0022    50DB     MOVF 0xfdb, W, ACCESS
  0024    0B1F     ANDLW 0x1f
  0026    6EE7     MOVWF 0xfe7, ACCESS
  0028    0E01     MOVLW 0x1
  002A    CFE7     MOVFF 0xfe7, 0xfdb
  002C    FFDB     NOP
16:                  LATA = Er_1 | Er_2;
  002E    50DB     MOVF 0xfdb, W, ACCESS
  0030    10DF     IORWF 0xfdf, W, ACCESS
  0032    6E89     MOVWF 0xf89, ACCESS
17:                
18:                  Er_1 = LATB & 0x1F;  // B0 - B4 aufheben
  0034    0E1F     MOVLW 0x1f
  0036    148A     ANDWF 0xf8a, W, ACCESS
  0038    6EDF     MOVWF 0xfdf, ACCESS
19:                  Er_2 = x & 0xE0;  // Daten für B5 - B7 filtern
  003A    0EFE     MOVLW 0xfe
  003C    50DB     MOVF 0xfdb, W, ACCESS
  003E    0BE0     ANDLW 0xe0
  0040    6EE7     MOVWF 0xfe7, ACCESS
  0042    0E01     MOVLW 0x1
  0044    CFE7     MOVFF 0xfe7, 0xfdb
  0046    FFDB     NOP
20:                  LATB = Er_1 | Er_2;
  0048    50DB     MOVF 0xfdb, W, ACCESS
  004A    10DF     IORWF 0xfdf, W, ACCESS
  004C    6E8A     MOVWF 0xf8a, ACCESS
21:                }
  004E    0E02     MOVLW 0x2
  0050    5CE1     SUBWF 0xfe1, W, ACCESS
  0052    E202     BC 0x58
  0054    6AE1     CLRF 0xfe1, ACCESS
  0056    52E5     MOVF 0xfe5, F, ACCESS
  0058    6EE1     MOVWF 0xfe1, ACCESS
  005A    52E5     MOVF 0xfe5, F, ACCESS
  005C    CFE7     MOVFF 0xfe7, 0xfd9
  005E    FFD9     NOP
  0060    0012     RETURN 0
22:                
23:                void cls_LCD (void)
24:                {
25:                  
26:                  RE = 1;  
  0062    888A     BSF 0xf8a, 0x4, ACCESS
27:                  RS = 0;
  0064    948A     BCF 0xf8a, 0x2, ACCESS
28:                  RW = 0;
  0066    968A     BCF 0xf8a, 0x3, ACCESS
29:                  LCD_DATA (0x01);
  0068    0E01     MOVLW 0x1
  006A    6EE6     MOVWF 0xfe6, ACCESS
  006C    DFCD     RCALL 0x8
  006E    52E5     MOVF 0xfe5, F, ACCESS
30:                  RE = 0;
  0070    988A     BCF 0xf8a, 0x4, ACCESS
31:                  while (RE);
  0072    B88A     BTFSC 0xf8a, 0x4, ACCESS
  0074    D7FE     BRA 0x72
32:                  RE = 1;
  0076    888A     BSF 0xf8a, 0x4, ACCESS
33:                }
  0078    0012     RETURN 0
34:                
35:                void config_LCD (void)
36:                {  
37:                  RE = 1;  
  007A    888A     BSF 0xf8a, 0x4, ACCESS
38:                  RS = 0;
  007C    948A     BCF 0xf8a, 0x2, ACCESS
39:                  RW = 0;
  007E    968A     BCF 0xf8a, 0x3, ACCESS
40:                
41:                  LCD_DATA (0x34);  // 8-bit Datenlänge, RE = 1
  0080    0E34     MOVLW 0x34
  0082    6EE6     MOVWF 0xfe6, ACCESS
  0084    DFC1     RCALL 0x8
  0086    52E5     MOVF 0xfe5, F, ACCESS
42:                  RE = 0;
  0088    988A     BCF 0xf8a, 0x4, ACCESS
43:                  while (RE);        // Verzögerung bis ausgang 0 ist
  008A    B88A     BTFSC 0xf8a, 0x4, ACCESS
  008C    D7FE     BRA 0x8a
44:                  RE = 1;
  008E    888A     BSF 0xf8a, 0x4, ACCESS
45:                  LCD_DATA (0x09);  // 4 Zeilen Modus
  0090    0E09     MOVLW 0x9
  0092    6EE6     MOVWF 0xfe6, ACCESS
  0094    DFB9     RCALL 0x8
  0096    52E5     MOVF 0xfe5, F, ACCESS
46:                  RE = 0;
  0098    988A     BCF 0xf8a, 0x4, ACCESS
47:                  while (RE);        // Verzögerung bis ausgang 0 ist
  009A    B88A     BTFSC 0xf8a, 0x4, ACCESS
  009C    D7FE     BRA 0x9a
48:                  RE = 1;
  009E    888A     BSF 0xf8a, 0x4, ACCESS
49:                  LCD_DATA (0x30);  // 8-bit Datenlänge, RE = 0
  00A0    0E30     MOVLW 0x30
  00A2    6EE6     MOVWF 0xfe6, ACCESS
  00A4    DFB1     RCALL 0x8
  00A6    52E5     MOVF 0xfe5, F, ACCESS
50:                  RE = 0;
  00A8    988A     BCF 0xf8a, 0x4, ACCESS
51:                  while (RE);        // Verzögerung bis ausgang 0 ist
  00AA    B88A     BTFSC 0xf8a, 0x4, ACCESS
  00AC    D7FE     BRA 0xaa
52:                  RE = 1;
  00AE    888A     BSF 0xf8a, 0x4, ACCESS
53:                  LCD_DATA (0x0F);  // Display ein, Curser ein, Curser blinkt
  00B0    0E0F     MOVLW 0xf
  00B2    6EE6     MOVWF 0xfe6, ACCESS
  00B4    DFA9     RCALL 0x8
  00B6    52E5     MOVF 0xfe5, F, ACCESS
54:                  RE = 0;
  00B8    988A     BCF 0xf8a, 0x4, ACCESS
55:                  while (RE);        // Verzögerung bis ausgang 0 ist
  00BA    B88A     BTFSC 0xf8a, 0x4, ACCESS
  00BC    D7FE     BRA 0xba
56:                  RE = 1;
  00BE    888A     BSF 0xf8a, 0x4, ACCESS
57:                  LCD_DATA (0x06);  // Curser Auto Increment
  00C0    0E06     MOVLW 0x6
  00C2    6EE6     MOVWF 0xfe6, ACCESS
  00C4    DFA1     RCALL 0x8
  00C6    52E5     MOVF 0xfe5, F, ACCESS
58:                  RE = 0;
  00C8    988A     BCF 0xf8a, 0x4, ACCESS
59:                  Delay10KTCYx(30);
  00CA    0E1E     MOVLW 0x1e
  00CC    6EE6     MOVWF 0xfe6, ACCESS
  00CE    EC2F     CALL 0x25e, 0
  00D0    F001     NOP
  00D2    52E5     MOVF 0xfe5, F, ACCESS
60:                  while (RE);        // Verzögerung bis ausgang 0 ist
  00D4    B88A     BTFSC 0xf8a, 0x4, ACCESS
  00D6    D7FE     BRA 0xd4
61:                  RE = 1;
  00D8    888A     BSF 0xf8a, 0x4, ACCESS
62:                  cls_LCD ();
  00DA    DFC3     RCALL 0x62
63:                  RE = 1;  
  00DC    888A     BSF 0xf8a, 0x4, ACCESS
64:                  RW = 0; // LCD im Schreiben-Mode
  00DE    968A     BCF 0xf8a, 0x3, ACCESS
65:                  RS = 1; // LCD im Daten-Mode
  00E0    848A     BSF 0xf8a, 0x2, ACCESS
66:                }
  00E2    0012     RETURN 0
67:                
68:                
69:                void printLCD (char write[])
  00E4    CFD9     MOVFF 0xfd9, 0xfe6
  00E6    FFE6     NOP
  00E8    CFE1     MOVFF 0xfe1, 0xfd9
  00EA    FFD9     NOP
  00EC    0E02     MOVLW 0x2
  00EE    26E1     ADDWF 0xfe1, F, ACCESS
70:                {
71:                  int i = 1;
  00F0    0E01     MOVLW 0x1
  00F2    6EDE     MOVWF 0xfde, ACCESS
  00F4    6ADD     CLRF 0xfdd, ACCESS
72:                
73:                
74:                  RE = 1;  
  00F6    888A     BSF 0xf8a, 0x4, ACCESS
75:                  RW = 0; // LCD im Schreiben-Mode
  00F8    968A     BCF 0xf8a, 0x3, ACCESS
76:                  RS = 1; // LCD im Daten-Mode
  00FA    848A     BSF 0xf8a, 0x2, ACCESS
77:                  while (!RE);      // Verzögerung bis ausgang 1 ist
  00FC    A88A     BTFSS 0xf8a, 0x4, ACCESS
  00FE    D7FE     BRA 0xfc
78:                
79:                
80:                  for (i = 0; write[i] != '\0';i++)
  0100    6ADE     CLRF 0xfde, ACCESS
  0102    6ADD     CLRF 0xfdd, ACCESS
  0104    0EFD     MOVLW 0xfd
  0106    CFDB     MOVFF 0xfdb, 0x2
  0108    F002     NOP
  010A    0EFE     MOVLW 0xfe
  010C    CFDB     MOVFF 0xfdb, 0x3
  010E    F003     NOP
  0110    50DE     MOVF 0xfde, W, ACCESS
  0112    2402     ADDWF 0x2, W, ACCESS
  0114    6EE9     MOVWF 0xfe9, ACCESS
  0116    50DD     MOVF 0xfdd, W, ACCESS
  0118    2003     ADDWFC 0x3, W, ACCESS
  011A    6EEA     MOVWF 0xfea, ACCESS
  011C    50EF     MOVF 0xfef, W, ACCESS
  011E    E019     BZ 0x152
  0148    2ADF     INCF 0xfdf, F, ACCESS
  014A    0E01     MOVLW 0x1
  014C    E301     BNC 0x150
  014E    2ADB     INCF 0xfdb, F, ACCESS
  0150    D7D9     BRA 0x104
81:                  {
82:                    LCD_DATA (write[i]);
  0120    0EFD     MOVLW 0xfd
  0122    CFDB     MOVFF 0xfdb, 0x2
  0124    F002     NOP
  0126    0EFE     MOVLW 0xfe
  0128    CFDB     MOVFF 0xfdb, 0x3
  012A    F003     NOP
  012C    50DE     MOVF 0xfde, W, ACCESS
  012E    2402     ADDWF 0x2, W, ACCESS
  0130    6EE9     MOVWF 0xfe9, ACCESS
  0132    50DD     MOVF 0xfdd, W, ACCESS
  0134    2003     ADDWFC 0x3, W, ACCESS
  0136    6EEA     MOVWF 0xfea, ACCESS
  0138    50EF     MOVF 0xfef, W, ACCESS
  013A    6EE6     MOVWF 0xfe6, ACCESS
  013C    DF65     RCALL 0x8
  013E    52E5     MOVF 0xfe5, F, ACCESS
83:                    RE = 0;           // Enable (LCD)
  0140    988A     BCF 0xf8a, 0x4, ACCESS
84:                    while (RE);          // Verzögerung bis ausgang 0 ist
  0142    B88A     BTFSC 0xf8a, 0x4, ACCESS
  0144    D7FE     BRA 0x142
85:                    RE = 1;
  0146    888A     BSF 0xf8a, 0x4, ACCESS
86:                  }
87:                }
  0152    0E02     MOVLW 0x2
  0154    5CE1     SUBWF 0xfe1, W, ACCESS
  0156    E202     BC 0x15c
  0158    6AE1     CLRF 0xfe1, ACCESS
  015A    52E5     MOVF 0xfe5, F, ACCESS
  015C    6EE1     MOVWF 0xfe1, ACCESS
  015E    52E5     MOVF 0xfe5, F, ACCESS
  0160    CFE7     MOVFF 0xfe7, 0xfd9
  0162    FFD9     NOP
  0164    0012     RETURN 0
---  C:\Users\michael\Documents\MPLAB\Display-LM75-EEPROM-18F2550-Platine\main.c  ----------------
1:                 # include <p18f2550.h>
2:                 # include <stdlib.h>
3:                 # include <delays.h>
4:                 # include <i2c.h>
5:                 
6:                 # pragma config FOSC = HS    // Mit 20MHz Quartz
7:                 # pragma config PWRT = ON
8:                 # pragma config BOR = OFF
9:                 # pragma config WDT = OFF
10:                # pragma config LVP = OFF
11:                # pragma config MCLRE= ON // MASTER Clear Reset enable
12:                
13:                # include "LCD.c"
14:                
15:                
16:                
17:                
18:                void main (void)
  0166    CFD9     MOVFF 0xfd9, 0xfe6
  0168    FFE6     NOP
  016A    CFE1     MOVFF 0xfe1, 0xfd9
  016C    FFD9     NOP
  016E    0E04     MOVLW 0x4
  0170    26E1     ADDWF 0xfe1, F, ACCESS
19:                {
20:                  char txt[] = "bla";
  0172    CFD9     MOVFF 0xfd9, 0xfe9
  0174    FFE9     NOP
  0176    CFDA     MOVFF 0xfda, 0xfea
  0178    FFEA     NOP
  017A    0E62     MOVLW 0x62
  017C    6EEE     MOVWF 0xfee, ACCESS
  017E    0E6C     MOVLW 0x6c
  0180    6EEE     MOVWF 0xfee, ACCESS
  0182    0E61     MOVLW 0x61
  0184    6EEE     MOVWF 0xfee, ACCESS
  0186    6AEE     CLRF 0xfee, ACCESS
21:                  TRISA = 0x00;    // PORT A ist ein Ausgang
  0188    6A92     CLRF 0xf92, ACCESS
22:                  TRISB = 0x00;    // PORT B ist ein Ausgang
  018A    6A93     CLRF 0xf93, ACCESS
23:                  
24:                  LATA = 0x00;
  018C    6A89     CLRF 0xf89, ACCESS
25:                  LATB = 0x00;
  018E    6A8A     CLRF 0xf8a, ACCESS
26:                
27:                  config_LCD();
  0190    DF74     RCALL 0x7a
28:                  Delay10KTCYx(5);
  0192    0E05     MOVLW 0x5
  0194    6EE6     MOVWF 0xfe6, ACCESS
  0196    EC2F     CALL 0x25e, 0
  0198    F001     NOP
  019A    52E5     MOVF 0xfe5, F, ACCESS
29:                
30:                
31:                
32:                  printLCD(txt);
  019C    CFD9     MOVFF 0xfd9, 0xfe6
  019E    FFE6     NOP
  01A0    CFDA     MOVFF 0xfda, 0xfe6
  01A2    FFE6     NOP
  01A4    DF9F     RCALL 0xe4
  01A6    52E5     MOVF 0xfe5, F, ACCESS
  01A8    52E5     MOVF 0xfe5, F, ACCESS
33:                  while (1);
  01AA    D7FF     BRA 0x1aa
34:                }
  01AC    0E04     MOVLW 0x4
  01AE    5CE1     SUBWF 0xfe1, W, ACCESS
  01B0    E202     BC 0x1b6
  01B2    6AE1     CLRF 0xfe1, ACCESS
  01B4    52E5     MOVF 0xfe5, F, ACCESS
  01B6    6EE1     MOVWF 0xfe1, ACCESS
  01B8    52E5     MOVF 0xfe5, F, ACCESS
  01BA    CFE7     MOVFF 0xfe7, 0xfd9
  01BC    FFD9     NOP
  01BE    0012     RETURN 0


Autor: Master Snowman (snowman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du musst unterscheiden, ob deine zeichenkette im programspreicher steht 
(ROM) oder im arbeitsspeicher (RAM).


void DisplayTextFromRAM(unsigned char *Zeichenkette) {
  while(*Zeichenkette != '\0') {
    // schreibe ein zeichen auf das display
    Zeichenkette++;
  }
}

void DisplayTextFromROM(rom unsigned char *Zeichenkette) {
  while(*Zeichenkette != '\0') {
    // schreibe ein zeichen auf das display
    Zeichenkette++;
  }
}

unsigned char Text[] = "hallo welt 1";

DisplayTextFromRAM(Text); // funktioniert
DisplayTextFromROM(Text); // funktioniert nicht
DisplayTextFromRAM("hallo welt 2"); // funktioniert nicht
DisplayTextFromROM("hallo welt 2"); // funktioniert


obwohl in beiden funktionen das gleiche stehet, so beachte, dass bei der 
zweiten funktion ein 'rom' drin steht. dadurch macht der C18 ein anderer 
pointer und zwar in den programspeicher und nicht in den arbeitsspeicher 
(salopp gesagt). "hallo welt 1" liegt im RAM und "hallo welt 2" im ROM, 
daher funktioniert einmal die eine funktion ein andermal die andere ;-)

Autor: *Michael* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Master Snowman schrieb:
> du musst unterscheiden, ob deine zeichenkette im programspreicher steht
> (ROM) oder im arbeitsspeicher (RAM).
>
>
> void DisplayTextFromRAM(unsigned char *Zeichenkette) {
>   while(*Zeichenkette != '\0') {
>     // schreibe ein zeichen auf das display
>     Zeichenkette++;
>   }
> }
>
> void DisplayTextFromROM(rom unsigned char *Zeichenkette) {
>   while(*Zeichenkette != '\0') {
>     // schreibe ein zeichen auf das display
>     Zeichenkette++;
>   }
> }
>
> unsigned char Text[] = "hallo welt 1";
>
> DisplayTextFromRAM(Text); // funktioniert
> DisplayTextFromROM(Text); // funktioniert nicht
> DisplayTextFromRAM("hallo welt 2"); // funktioniert nicht
> DisplayTextFromROM("hallo welt 2"); // funktioniert
>
>
> obwohl in beiden funktionen das gleiche stehet, so beachte, dass bei der
> zweiten funktion ein 'rom' drin steht. dadurch macht der C18 ein anderer
> pointer und zwar in den programspeicher und nicht in den arbeitsspeicher
> (salopp gesagt). "hallo welt 1" liegt im RAM und "hallo welt 2" im ROM,
> daher funktioniert einmal die eine funktion ein andermal die andere ;-)

Danke Tut :D
Mein Retter :P

Ich wünsch dir noch schöne Feiertage!


PS: Benutzt hier sonst keiner C18?

Autor: Master Snowman (snowman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> PS: Benutzt hier sonst keiner C18?
viele hier benutzen AVRs und deshalb gebrauchen sie eine andere 
entwicklungsumgebung als MPLAB und C18. sie sind oft der meinung, dass 
PICs schlecht sind und daher zu verpönen wären (meist basiert ihre 
meinung auf den alten 16er-PICs), womit sie immer wieder mal die 
PIC-freunde hier als ungebetene gäste ausladen... einige sind neutraler 
und helfen trotzdem so gut sie können. das einzige forum nur für PICs 
wäre: http://www.fernando-heitor.de ich brauche dieses forum vor allem 
bei fragen zu PICs, weil ich einer glaubensdiskussion, ob jetzt AVRs 
oder PICs besser sind, aus dem weg gehen will. und 
www.mikrocontroller.net brauche ich eher für allgemeine fragen, weil 
hier mehr leute versammelt sind.
ps: musst gucken, der eine oder andere wird das oben geschriebene nicht 
auf sich sitzen lassen...

Autor: Manuel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich nutze MPLAB mit dem C30 Compiler weil ich mit PIC24 und dsPIC33 
arbeite. Haben deinen Code auf dem C30 ausprobiert und er funktioniert 
ohne das Schlüsselwort "rom". Um solchen Problemen zu Analysieren 
benutze ich oft den Simulator zusammen mit dem Watchfenster im MPLAB 
damit kann man alle Variablen, Programmcounter, Adressen, Register, ... 
kontrolieren. Man kann auch beim Steppen vom C Code auf Assembler 
wechseln, einfach ins entsprechende Fenster wechseln.

Weiterhin viel erfolg bei deinem Programm.

Gruss Manuel

Autor: Michael H. (morph1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ manuel: der c30 compiler ist auch eine andere baustelle, das ist ein 
gcc. der c18 ist selbstgebastelt von microchip.

folglich muss man dem zeug sagen ob etwas im ram oder rom liegt, der ist 
nicht so "schlau" das selbst festzustellen bzw die pointer reichen nicht 
weit genug.

das ist halt eine feinheit die man beim 18er pic beachten muss.

@ treadstarter: wie ist RE definiert? über die LAT oder PORT register?

ich trau mich wetten PORT, anders wäre das rücklesen sinnfrei.

schau dir doch mal das datenblatt an: für ausgänge sind LAT register zu 
nutzen. LATBbits.LATB6 z.b.

dann hast du deine probleme auch nicht mehr...

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.