Forum: Mikrocontroller und Digitale Elektronik Zeichenkette funktion übergeben


von *Michael* (Gast)


Lesenswert?

Hallo,
Ich habe diverse Probleme mit einer einfachen ausgabe an ein Display.

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

1
void printLCD (char * write)
2
{
3
  RE = 1;  
4
  RW = 0; // LCD im Schreiben-Mode
5
  RS = 1; // LCD im Daten-Mode
6
  while (!RE);      // Verzögerung bis ausgang 1 ist
7
8
  for (; *write != '\0', *write != 0; *write++)
9
  {
10
11
    LCD_DATA (*write);
12
    RE = 0;           // Enable (LCD)
13
    while (RE);          // Verzögerung bis ausgang 0 ist
14
    RE = 1;           // toggeln
15
16
  }
17
}
18
19
int main (void)
20
{
21
        // config des Displays....
22
        printLCD ("bla");
23
}
Auf dem Display erscheint allerdings:
1
.....................
2
.....................
3
.......<   ö>

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

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? 
;)

von Tom M. (tomm) Benutzerseite


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. :)

von Tom K. (ez81)


Lesenswert?

> *write++
Was wird hier um 1 erhöht?

von *Michael* (Gast)


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?

von Michael H. (morph1)


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

von Tom M. (tomm) Benutzerseite


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.

von J. M. (Firma: OCL) (lorcan)


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.

von *Michael* (Gast)


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-.-
1
void printLCD (char * write)
2
{
3
  RE = 1;  
4
  RW = 0; // LCD im Schreiben-Mode
5
  RS = 1; // LCD im Daten-Mode
6
  while (!RE);      // Verzögerung bis ausgang 1 ist
7
8
  for (; *write; write++)
9
  {
10
11
    LCD_DATA (*write);
12
    RE = 0;           // Enable (LCD)
13
    while (RE);          // Verzögerung bis ausgang 0 ist
14
    RE = 1;
15
    //write++;
16
  }
17
}

von spess53 (Gast)


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

von *Michael* (Gast)


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 ;)

von Walter (Gast)


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 ...

von *Michael* (Gast)


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!
1
void printLCD (char * write)
2
{
3
  RE = 1;  
4
  RW = 0; // LCD im Schreiben-Mode
5
  RS = 1; // LCD im Daten-Mode
6
  while (!RE);      // Verzögerung bis ausgang 1 ist
7
8
  for (; *write; write++)
9
  {
10
    LCD_DATA (*write);
11
    RE = 0;           // Enable (LCD)
12
    while (RE);          // Verzögerung bis ausgang 0 ist
13
    RE = 1;
14
  }
15
}

von Walter (Gast)


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

von *Michael* (Gast)


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)

von *Michael* (Gast)


Lesenswert?

GEFUNDEN :D
1
---  C:\MCC18\src\traditional\delays\d10ktcyx.asm  -----------------------------------------------
2
  025E    0EFF     MOVLW 0xff
3
  0260    50E3     MOVF 0xfe3, W, ACCESS
4
  0262    6E05     MOVWF 0x5, ACCESS
5
  0264    0EEF     MOVLW 0xef
6
  0266    D001     BRA 0x26a
7
  0268    0EF3     MOVLW 0xf3
8
  026A    6EE7     MOVWF 0xfe7, ACCESS
9
  026C    2EE7     DECFSZ 0xfe7, F, ACCESS
10
  026E    EF36     GOTO 0x26c
11
  0270    F001     NOP
12
  0272    0E0C     MOVLW 0xc
13
  0274    6E04     MOVWF 0x4, ACCESS
14
  0276    6AE7     CLRF 0xfe7, ACCESS
15
  0278    2EE7     DECFSZ 0xfe7, F, ACCESS
16
  027A    EF3C     GOTO 0x278
17
  027C    F001     NOP
18
  027E    2E04     DECFSZ 0x4, F, ACCESS
19
  0280    EF3B     GOTO 0x276
20
  0282    F001     NOP
21
  0284    2E05     DECFSZ 0x5, F, ACCESS
22
  0286    EF34     GOTO 0x268
23
  0288    F001     NOP
24
  028A    0012     RETURN 0
25
---  C:\MCC18\src\traditional\proc\p18F2550.asm  -------------------------------------------------
26
  028C    0E00     MOVLW 0
27
  028E    6EF3     MOVWF 0xff3, ACCESS
28
  0290    EE00     LFSR 0, 0
29
  0292    F000     NOP
30
  0294    0E04     MOVLW 0x4
31
  0296    D801     RCALL 0x29a
32
  0298    0012     RETURN 0
33
  029A    60EA     CPFSLT 0xfea, ACCESS
34
  029C    D002     BRA 0x2a2
35
  029E    6AEE     CLRF 0xfee, ACCESS
36
  02A0    D7FC     BRA 0x29a
37
  02A2    50F3     MOVF 0xff3, W, ACCESS
38
  02A4    60E9     CPFSLT 0xfe9, ACCESS
39
  02A6    0012     RETURN 0
40
  02A8    6AEE     CLRF 0xfee, ACCESS
41
  02AA    D7FC     BRA 0x2a4
42
---  C:\MCC18\src\traditional\startup\c018i.c  ---------------------------------------------------
43
  0000    EF56     GOTO 0x2ac
44
  0002    F001     NOP
45
  0004    0012     RETURN 0
46
  02AC    EE13     LFSR 0x1, 0x300
47
  02AE    F000     NOP
48
  02B0    EE23     LFSR 0x2, 0x300
49
  02B2    F000     NOP
50
  02B4    6AF8     CLRF 0xff8, ACCESS
51
  02B6    9C01     BCF 0x1, 0x6, ACCESS
52
  02B8    ECE0     CALL 0x1c0, 0
53
  02BA    F000     NOP
54
  02BC    EC64     CALL 0x2c8, 0
55
  02BE    F001     NOP
56
  02C0    ECB3     CALL 0x166, 0
57
  02C2    F000     NOP
58
  02C4    D7FB     BRA 0x2bc
59
  02C6    0012     RETURN 0
60
  01C0    0E06     MOVLW 0x6
61
  01C2    6EF6     MOVWF 0xff6, ACCESS
62
  01C4    0E00     MOVLW 0
63
  01C6    6EF7     MOVWF 0xff7, ACCESS
64
  01C8    0E00     MOVLW 0
65
  01CA    6EF8     MOVWF 0xff8, ACCESS
66
  01CC    0100     MOVLB 0
67
  01CE    0009     TBLRD*+
68
  01D0    50F5     MOVF 0xff5, W, ACCESS
69
  01D2    6F65     MOVWF 0x65, BANKED
70
  01D4    0009     TBLRD*+
71
  01D6    50F5     MOVF 0xff5, W, ACCESS
72
  01D8    6F66     MOVWF 0x66, BANKED
73
  01DA    E103     BNZ 0x1e2
74
  01DC    6765     TSTFSZ 0x65, BANKED
75
  01DE    D001     BRA 0x1e2
76
  01E0    D03D     BRA 0x25c
77
  01E2    0009     TBLRD*+
78
  01E4    50F5     MOVF 0xff5, W, ACCESS
79
  01E6    6F60     MOVWF 0x60, BANKED
80
  01E8    0009     TBLRD*+
81
  01EA    50F5     MOVF 0xff5, W, ACCESS
82
  01EC    6F61     MOVWF 0x61, BANKED
83
  01EE    0009     TBLRD*+
84
  01F0    50F5     MOVF 0xff5, W, ACCESS
85
  01F2    6F62     MOVWF 0x62, BANKED
86
  01F4    0009     TBLRD*+
87
  01F6    0009     TBLRD*+
88
  01F8    50F5     MOVF 0xff5, W, ACCESS
89
  01FA    6EE9     MOVWF 0xfe9, ACCESS
90
  01FC    0009     TBLRD*+
91
  01FE    50F5     MOVF 0xff5, W, ACCESS
92
  0200    6EEA     MOVWF 0xfea, ACCESS
93
  0202    0009     TBLRD*+
94
  0204    0009     TBLRD*+
95
  0206    0009     TBLRD*+
96
  0208    50F5     MOVF 0xff5, W, ACCESS
97
  020A    6F63     MOVWF 0x63, BANKED
98
  020C    0009     TBLRD*+
99
  020E    50F5     MOVF 0xff5, W, ACCESS
100
  0210    6F64     MOVWF 0x64, BANKED
101
  0212    0009     TBLRD*+
102
  0214    0009     TBLRD*+
103
  0216    CFF6     MOVFF 0xff6, 0x67
104
  0218    F067     NOP
105
  021A    CFF7     MOVFF 0xff7, 0x68
106
  021C    F068     NOP
107
  021E    CFF8     MOVFF 0xff8, 0x69
108
  0220    F069     NOP
109
  0222    C060     MOVFF 0x60, 0xff6
110
  0224    FFF6     NOP
111
  0226    C061     MOVFF 0x61, 0xff7
112
  0228    FFF7     NOP
113
  022A    C062     MOVFF 0x62, 0xff8
114
  022C    FFF8     NOP
115
  022E    0100     MOVLB 0
116
  0230    5363     MOVF 0x63, F, BANKED
117
  0232    E102     BNZ 0x238
118
  0234    5364     MOVF 0x64, F, BANKED
119
  0236    E007     BZ 0x246
120
  0238    0009     TBLRD*+
121
  023A    50F5     MOVF 0xff5, W, ACCESS
122
  023C    6EEE     MOVWF 0xfee, ACCESS
123
  023E    0763     DECF 0x63, F, BANKED
124
  0240    E2F8     BC 0x232
125
  0242    0764     DECF 0x64, F, BANKED
126
  0244    D7F9     BRA 0x238
127
  0246    C067     MOVFF 0x67, 0xff6
128
  0248    FFF6     NOP
129
  024A    C068     MOVFF 0x68, 0xff7
130
  024C    FFF7     NOP
131
  024E    C069     MOVFF 0x69, 0xff8
132
  0250    FFF8     NOP
133
  0252    0100     MOVLB 0
134
  0254    0765     DECF 0x65, F, BANKED
135
  0256    0E00     MOVLW 0
136
  0258    5B66     SUBWFB 0x66, F, BANKED
137
  025A    D7BF     BRA 0x1da
138
  025C    0012     RETURN 0
139
---  C:\MCC18\src\traditional\stdclib\__init.c  --------------------------------------------------
140
  02C8    0012     RETURN 0
141
---  C:\Users\michael\Documents\MPLAB\Display-LM75-EEPROM-18F2550-Platine\LCD.c  -----------------
142
1:                 # include "LCD.h"
143
2:                 
144
3:                 void LCD_DATA (char);
145
4:                 void cls_LCD (void);
146
5:                 void printLCD (char []);
147
6:                 
148
7:                 
149
8:                 
150
9:                 void LCD_DATA (char x)
151
  0008    CFD9     MOVFF 0xfd9, 0xfe6
152
  000A    FFE6     NOP
153
  000C    CFE1     MOVFF 0xfe1, 0xfd9
154
  000E    FFD9     NOP
155
  0010    0E02     MOVLW 0x2
156
  0012    26E1     ADDWF 0xfe1, F, ACCESS
157
10:                {
158
11:                  char Er_1 = 0x00;
159
  0014    6ADF     CLRF 0xfdf, ACCESS
160
12:                  char Er_2 = 0x00;
161
  0016    0E01     MOVLW 0x1
162
  0018    6ADB     CLRF 0xfdb, ACCESS
163
13:                
164
14:                  Er_1 = LATA & 0xE0; // A5 - A7 aufheben
165
  001A    0EE0     MOVLW 0xe0
166
  001C    1489     ANDWF 0xf89, W, ACCESS
167
  001E    6EDF     MOVWF 0xfdf, ACCESS
168
15:                  Er_2 = x & 0x1F;    // Daten für A0 - A4 filtern
169
  0020    0EFE     MOVLW 0xfe
170
  0022    50DB     MOVF 0xfdb, W, ACCESS
171
  0024    0B1F     ANDLW 0x1f
172
  0026    6EE7     MOVWF 0xfe7, ACCESS
173
  0028    0E01     MOVLW 0x1
174
  002A    CFE7     MOVFF 0xfe7, 0xfdb
175
  002C    FFDB     NOP
176
16:                  LATA = Er_1 | Er_2;
177
  002E    50DB     MOVF 0xfdb, W, ACCESS
178
  0030    10DF     IORWF 0xfdf, W, ACCESS
179
  0032    6E89     MOVWF 0xf89, ACCESS
180
17:                
181
18:                  Er_1 = LATB & 0x1F;  // B0 - B4 aufheben
182
  0034    0E1F     MOVLW 0x1f
183
  0036    148A     ANDWF 0xf8a, W, ACCESS
184
  0038    6EDF     MOVWF 0xfdf, ACCESS
185
19:                  Er_2 = x & 0xE0;  // Daten für B5 - B7 filtern
186
  003A    0EFE     MOVLW 0xfe
187
  003C    50DB     MOVF 0xfdb, W, ACCESS
188
  003E    0BE0     ANDLW 0xe0
189
  0040    6EE7     MOVWF 0xfe7, ACCESS
190
  0042    0E01     MOVLW 0x1
191
  0044    CFE7     MOVFF 0xfe7, 0xfdb
192
  0046    FFDB     NOP
193
20:                  LATB = Er_1 | Er_2;
194
  0048    50DB     MOVF 0xfdb, W, ACCESS
195
  004A    10DF     IORWF 0xfdf, W, ACCESS
196
  004C    6E8A     MOVWF 0xf8a, ACCESS
197
21:                }
198
  004E    0E02     MOVLW 0x2
199
  0050    5CE1     SUBWF 0xfe1, W, ACCESS
200
  0052    E202     BC 0x58
201
  0054    6AE1     CLRF 0xfe1, ACCESS
202
  0056    52E5     MOVF 0xfe5, F, ACCESS
203
  0058    6EE1     MOVWF 0xfe1, ACCESS
204
  005A    52E5     MOVF 0xfe5, F, ACCESS
205
  005C    CFE7     MOVFF 0xfe7, 0xfd9
206
  005E    FFD9     NOP
207
  0060    0012     RETURN 0
208
22:                
209
23:                void cls_LCD (void)
210
24:                {
211
25:                  
212
26:                  RE = 1;  
213
  0062    888A     BSF 0xf8a, 0x4, ACCESS
214
27:                  RS = 0;
215
  0064    948A     BCF 0xf8a, 0x2, ACCESS
216
28:                  RW = 0;
217
  0066    968A     BCF 0xf8a, 0x3, ACCESS
218
29:                  LCD_DATA (0x01);
219
  0068    0E01     MOVLW 0x1
220
  006A    6EE6     MOVWF 0xfe6, ACCESS
221
  006C    DFCD     RCALL 0x8
222
  006E    52E5     MOVF 0xfe5, F, ACCESS
223
30:                  RE = 0;
224
  0070    988A     BCF 0xf8a, 0x4, ACCESS
225
31:                  while (RE);
226
  0072    B88A     BTFSC 0xf8a, 0x4, ACCESS
227
  0074    D7FE     BRA 0x72
228
32:                  RE = 1;
229
  0076    888A     BSF 0xf8a, 0x4, ACCESS
230
33:                }
231
  0078    0012     RETURN 0
232
34:                
233
35:                void config_LCD (void)
234
36:                {  
235
37:                  RE = 1;  
236
  007A    888A     BSF 0xf8a, 0x4, ACCESS
237
38:                  RS = 0;
238
  007C    948A     BCF 0xf8a, 0x2, ACCESS
239
39:                  RW = 0;
240
  007E    968A     BCF 0xf8a, 0x3, ACCESS
241
40:                
242
41:                  LCD_DATA (0x34);  // 8-bit Datenlänge, RE = 1
243
  0080    0E34     MOVLW 0x34
244
  0082    6EE6     MOVWF 0xfe6, ACCESS
245
  0084    DFC1     RCALL 0x8
246
  0086    52E5     MOVF 0xfe5, F, ACCESS
247
42:                  RE = 0;
248
  0088    988A     BCF 0xf8a, 0x4, ACCESS
249
43:                  while (RE);        // Verzögerung bis ausgang 0 ist
250
  008A    B88A     BTFSC 0xf8a, 0x4, ACCESS
251
  008C    D7FE     BRA 0x8a
252
44:                  RE = 1;
253
  008E    888A     BSF 0xf8a, 0x4, ACCESS
254
45:                  LCD_DATA (0x09);  // 4 Zeilen Modus
255
  0090    0E09     MOVLW 0x9
256
  0092    6EE6     MOVWF 0xfe6, ACCESS
257
  0094    DFB9     RCALL 0x8
258
  0096    52E5     MOVF 0xfe5, F, ACCESS
259
46:                  RE = 0;
260
  0098    988A     BCF 0xf8a, 0x4, ACCESS
261
47:                  while (RE);        // Verzögerung bis ausgang 0 ist
262
  009A    B88A     BTFSC 0xf8a, 0x4, ACCESS
263
  009C    D7FE     BRA 0x9a
264
48:                  RE = 1;
265
  009E    888A     BSF 0xf8a, 0x4, ACCESS
266
49:                  LCD_DATA (0x30);  // 8-bit Datenlänge, RE = 0
267
  00A0    0E30     MOVLW 0x30
268
  00A2    6EE6     MOVWF 0xfe6, ACCESS
269
  00A4    DFB1     RCALL 0x8
270
  00A6    52E5     MOVF 0xfe5, F, ACCESS
271
50:                  RE = 0;
272
  00A8    988A     BCF 0xf8a, 0x4, ACCESS
273
51:                  while (RE);        // Verzögerung bis ausgang 0 ist
274
  00AA    B88A     BTFSC 0xf8a, 0x4, ACCESS
275
  00AC    D7FE     BRA 0xaa
276
52:                  RE = 1;
277
  00AE    888A     BSF 0xf8a, 0x4, ACCESS
278
53:                  LCD_DATA (0x0F);  // Display ein, Curser ein, Curser blinkt
279
  00B0    0E0F     MOVLW 0xf
280
  00B2    6EE6     MOVWF 0xfe6, ACCESS
281
  00B4    DFA9     RCALL 0x8
282
  00B6    52E5     MOVF 0xfe5, F, ACCESS
283
54:                  RE = 0;
284
  00B8    988A     BCF 0xf8a, 0x4, ACCESS
285
55:                  while (RE);        // Verzögerung bis ausgang 0 ist
286
  00BA    B88A     BTFSC 0xf8a, 0x4, ACCESS
287
  00BC    D7FE     BRA 0xba
288
56:                  RE = 1;
289
  00BE    888A     BSF 0xf8a, 0x4, ACCESS
290
57:                  LCD_DATA (0x06);  // Curser Auto Increment
291
  00C0    0E06     MOVLW 0x6
292
  00C2    6EE6     MOVWF 0xfe6, ACCESS
293
  00C4    DFA1     RCALL 0x8
294
  00C6    52E5     MOVF 0xfe5, F, ACCESS
295
58:                  RE = 0;
296
  00C8    988A     BCF 0xf8a, 0x4, ACCESS
297
59:                  Delay10KTCYx(30);
298
  00CA    0E1E     MOVLW 0x1e
299
  00CC    6EE6     MOVWF 0xfe6, ACCESS
300
  00CE    EC2F     CALL 0x25e, 0
301
  00D0    F001     NOP
302
  00D2    52E5     MOVF 0xfe5, F, ACCESS
303
60:                  while (RE);        // Verzögerung bis ausgang 0 ist
304
  00D4    B88A     BTFSC 0xf8a, 0x4, ACCESS
305
  00D6    D7FE     BRA 0xd4
306
61:                  RE = 1;
307
  00D8    888A     BSF 0xf8a, 0x4, ACCESS
308
62:                  cls_LCD ();
309
  00DA    DFC3     RCALL 0x62
310
63:                  RE = 1;  
311
  00DC    888A     BSF 0xf8a, 0x4, ACCESS
312
64:                  RW = 0; // LCD im Schreiben-Mode
313
  00DE    968A     BCF 0xf8a, 0x3, ACCESS
314
65:                  RS = 1; // LCD im Daten-Mode
315
  00E0    848A     BSF 0xf8a, 0x2, ACCESS
316
66:                }
317
  00E2    0012     RETURN 0
318
67:                
319
68:                
320
69:                void printLCD (char write[])
321
  00E4    CFD9     MOVFF 0xfd9, 0xfe6
322
  00E6    FFE6     NOP
323
  00E8    CFE1     MOVFF 0xfe1, 0xfd9
324
  00EA    FFD9     NOP
325
  00EC    0E02     MOVLW 0x2
326
  00EE    26E1     ADDWF 0xfe1, F, ACCESS
327
70:                {
328
71:                  int i = 1;
329
  00F0    0E01     MOVLW 0x1
330
  00F2    6EDE     MOVWF 0xfde, ACCESS
331
  00F4    6ADD     CLRF 0xfdd, ACCESS
332
72:                
333
73:                
334
74:                  RE = 1;  
335
  00F6    888A     BSF 0xf8a, 0x4, ACCESS
336
75:                  RW = 0; // LCD im Schreiben-Mode
337
  00F8    968A     BCF 0xf8a, 0x3, ACCESS
338
76:                  RS = 1; // LCD im Daten-Mode
339
  00FA    848A     BSF 0xf8a, 0x2, ACCESS
340
77:                  while (!RE);      // Verzögerung bis ausgang 1 ist
341
  00FC    A88A     BTFSS 0xf8a, 0x4, ACCESS
342
  00FE    D7FE     BRA 0xfc
343
78:                
344
79:                
345
80:                  for (i = 0; write[i] != '\0';i++)
346
  0100    6ADE     CLRF 0xfde, ACCESS
347
  0102    6ADD     CLRF 0xfdd, ACCESS
348
  0104    0EFD     MOVLW 0xfd
349
  0106    CFDB     MOVFF 0xfdb, 0x2
350
  0108    F002     NOP
351
  010A    0EFE     MOVLW 0xfe
352
  010C    CFDB     MOVFF 0xfdb, 0x3
353
  010E    F003     NOP
354
  0110    50DE     MOVF 0xfde, W, ACCESS
355
  0112    2402     ADDWF 0x2, W, ACCESS
356
  0114    6EE9     MOVWF 0xfe9, ACCESS
357
  0116    50DD     MOVF 0xfdd, W, ACCESS
358
  0118    2003     ADDWFC 0x3, W, ACCESS
359
  011A    6EEA     MOVWF 0xfea, ACCESS
360
  011C    50EF     MOVF 0xfef, W, ACCESS
361
  011E    E019     BZ 0x152
362
  0148    2ADF     INCF 0xfdf, F, ACCESS
363
  014A    0E01     MOVLW 0x1
364
  014C    E301     BNC 0x150
365
  014E    2ADB     INCF 0xfdb, F, ACCESS
366
  0150    D7D9     BRA 0x104
367
81:                  {
368
82:                    LCD_DATA (write[i]);
369
  0120    0EFD     MOVLW 0xfd
370
  0122    CFDB     MOVFF 0xfdb, 0x2
371
  0124    F002     NOP
372
  0126    0EFE     MOVLW 0xfe
373
  0128    CFDB     MOVFF 0xfdb, 0x3
374
  012A    F003     NOP
375
  012C    50DE     MOVF 0xfde, W, ACCESS
376
  012E    2402     ADDWF 0x2, W, ACCESS
377
  0130    6EE9     MOVWF 0xfe9, ACCESS
378
  0132    50DD     MOVF 0xfdd, W, ACCESS
379
  0134    2003     ADDWFC 0x3, W, ACCESS
380
  0136    6EEA     MOVWF 0xfea, ACCESS
381
  0138    50EF     MOVF 0xfef, W, ACCESS
382
  013A    6EE6     MOVWF 0xfe6, ACCESS
383
  013C    DF65     RCALL 0x8
384
  013E    52E5     MOVF 0xfe5, F, ACCESS
385
83:                    RE = 0;           // Enable (LCD)
386
  0140    988A     BCF 0xf8a, 0x4, ACCESS
387
84:                    while (RE);          // Verzögerung bis ausgang 0 ist
388
  0142    B88A     BTFSC 0xf8a, 0x4, ACCESS
389
  0144    D7FE     BRA 0x142
390
85:                    RE = 1;
391
  0146    888A     BSF 0xf8a, 0x4, ACCESS
392
86:                  }
393
87:                }
394
  0152    0E02     MOVLW 0x2
395
  0154    5CE1     SUBWF 0xfe1, W, ACCESS
396
  0156    E202     BC 0x15c
397
  0158    6AE1     CLRF 0xfe1, ACCESS
398
  015A    52E5     MOVF 0xfe5, F, ACCESS
399
  015C    6EE1     MOVWF 0xfe1, ACCESS
400
  015E    52E5     MOVF 0xfe5, F, ACCESS
401
  0160    CFE7     MOVFF 0xfe7, 0xfd9
402
  0162    FFD9     NOP
403
  0164    0012     RETURN 0
404
---  C:\Users\michael\Documents\MPLAB\Display-LM75-EEPROM-18F2550-Platine\main.c  ----------------
405
1:                 # include <p18f2550.h>
406
2:                 # include <stdlib.h>
407
3:                 # include <delays.h>
408
4:                 # include <i2c.h>
409
5:                 
410
6:                 # pragma config FOSC = HS    // Mit 20MHz Quartz
411
7:                 # pragma config PWRT = ON
412
8:                 # pragma config BOR = OFF
413
9:                 # pragma config WDT = OFF
414
10:                # pragma config LVP = OFF
415
11:                # pragma config MCLRE= ON // MASTER Clear Reset enable
416
12:                
417
13:                # include "LCD.c"
418
14:                
419
15:                
420
16:                
421
17:                
422
18:                void main (void)
423
  0166    CFD9     MOVFF 0xfd9, 0xfe6
424
  0168    FFE6     NOP
425
  016A    CFE1     MOVFF 0xfe1, 0xfd9
426
  016C    FFD9     NOP
427
  016E    0E04     MOVLW 0x4
428
  0170    26E1     ADDWF 0xfe1, F, ACCESS
429
19:                {
430
20:                  char txt[] = "bla";
431
  0172    CFD9     MOVFF 0xfd9, 0xfe9
432
  0174    FFE9     NOP
433
  0176    CFDA     MOVFF 0xfda, 0xfea
434
  0178    FFEA     NOP
435
  017A    0E62     MOVLW 0x62
436
  017C    6EEE     MOVWF 0xfee, ACCESS
437
  017E    0E6C     MOVLW 0x6c
438
  0180    6EEE     MOVWF 0xfee, ACCESS
439
  0182    0E61     MOVLW 0x61
440
  0184    6EEE     MOVWF 0xfee, ACCESS
441
  0186    6AEE     CLRF 0xfee, ACCESS
442
21:                  TRISA = 0x00;    // PORT A ist ein Ausgang
443
  0188    6A92     CLRF 0xf92, ACCESS
444
22:                  TRISB = 0x00;    // PORT B ist ein Ausgang
445
  018A    6A93     CLRF 0xf93, ACCESS
446
23:                  
447
24:                  LATA = 0x00;
448
  018C    6A89     CLRF 0xf89, ACCESS
449
25:                  LATB = 0x00;
450
  018E    6A8A     CLRF 0xf8a, ACCESS
451
26:                
452
27:                  config_LCD();
453
  0190    DF74     RCALL 0x7a
454
28:                  Delay10KTCYx(5);
455
  0192    0E05     MOVLW 0x5
456
  0194    6EE6     MOVWF 0xfe6, ACCESS
457
  0196    EC2F     CALL 0x25e, 0
458
  0198    F001     NOP
459
  019A    52E5     MOVF 0xfe5, F, ACCESS
460
29:                
461
30:                
462
31:                
463
32:                  printLCD(txt);
464
  019C    CFD9     MOVFF 0xfd9, 0xfe6
465
  019E    FFE6     NOP
466
  01A0    CFDA     MOVFF 0xfda, 0xfe6
467
  01A2    FFE6     NOP
468
  01A4    DF9F     RCALL 0xe4
469
  01A6    52E5     MOVF 0xfe5, F, ACCESS
470
  01A8    52E5     MOVF 0xfe5, F, ACCESS
471
33:                  while (1);
472
  01AA    D7FF     BRA 0x1aa
473
34:                }
474
  01AC    0E04     MOVLW 0x4
475
  01AE    5CE1     SUBWF 0xfe1, W, ACCESS
476
  01B0    E202     BC 0x1b6
477
  01B2    6AE1     CLRF 0xfe1, ACCESS
478
  01B4    52E5     MOVF 0xfe5, F, ACCESS
479
  01B6    6EE1     MOVWF 0xfe1, ACCESS
480
  01B8    52E5     MOVF 0xfe5, F, ACCESS
481
  01BA    CFE7     MOVFF 0xfe7, 0xfd9
482
  01BC    FFD9     NOP
483
  01BE    0012     RETURN 0

von Master S. (snowman)


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 ;-)

von *Michael* (Gast)


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?

von Master S. (snowman)


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...

von Manuel (Gast)


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

von Michael H. (morph1)


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...

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.