Forum: Mikrocontroller und Digitale Elektronik Mikrocontroller LCD - ASCII Codierung falsch


von A. B. (developer_x)


Lesenswert?

Sehr geehrtes Forum,
ich habe folgendes Programm geschrieben, welches einen im FLASH 
gespeicherten String ausliest, und Zeichen für Zeichen auf dem Display 
angibt, dabei achtet es auf die Null Terminierung am Ende des Strings, 
und auf ein Zeilenumbruchszeichen "#".
1
.include "M48PAdef.inc"
2
3
; //////////////////////////////////////////////////////////////
4
;  SPEICHER
5
;  Kevin Riehl - 28.03.2013
6
;  
7
;  Dieses Programm läd Zeichenketten / Texte in den FLASH,
8
;   liest diese dann wieder aus und stellt sie auf dem LCD dar
9
;  
10
; //////////////////////////////////////////////////////////////
11
; /////// Defintionen
12
; //////////////////////////////////////////////////////////////
13
14
.DEF STACK_LOW = R16
15
.DEF STACK_HIG = R17
16
17
; //////////////////////////////////////////////////////////////
18
; Stackpointerinitialisierung
19
  LDI STACK_LOW, LOW(RAMEND)    ;Stackpointer initialisieren
20
  OUT SPL, STACK_LOW
21
  LDI STACK_HIG, HIGH(RAMEND)   ;Stackpointer initialisieren
22
  OUT SPH, STACK_HIG
23
; //////////////////////////////////////////////////////////////
24
25
RCALL Wait1000MS
26
RCALL LCD_INIT
27
28
29
b:
30
RCALL LCD_HOME
31
32
LDI ZL,LOW (text*2)
33
LDI ZH,HIGH(text*2)
34
35
loop:
36
  LPM
37
38
; Testen ob Zeilenumbruch
39
  MOV R28,R0
40
  CPI R28,'#'
41
  BREQ l
42
43
; Testen ob Ende
44
  TST R0
45
  BREQ a
46
47
; Zeichen ausgegeben
48
  MOV INFO,R0
49
  RCALL LCD_DATA
50
51
; Zeiger auf nächstes Byte setzen
52
  ADIW ZL,1
53
  RCALL Wait1000MS
54
  RJMP loop
55
56
a :
57
  RJMP b 
58
59
l :
60
  RCALL LCD_LINE2
61
  ADIW ZL,1
62
  RJMP loop
63
; //////////////////////////////////////////////////////////////
64
65
.include "LCD_Lib.asm"
66
67
text: .DB "Schön jemacht#weiter so DDX!",0

Komisch ist nun, dass auf dem Display nicht "Schön jemacht#weiter so 
DDX!"
angezeigt wird, sondern "SchΣn..." ankommt.

Dasselbe Problem, kann ich mich erinnern, hatte ich auch in meiner Zeit, 
als ich mit C++ gearbeitet habe.

Hat das vielleicht was mit meinem Editor / meiner IDE zu tun, oder was 
ist das falsch?

(Ich habe AVR Studio 4.x)

m.f.G. Developer_X

von mr. mo (Gast)


Lesenswert?

Vermutlich kennt dein Display das "Ö" nicht? In dem Datenblatt sind doch 
immer so schöne Tabellen drin.

von Eumel (Gast)


Lesenswert?

Schau halt mal in das Datenblatt deines Displays ob da überhaupt ein Ö 
im Zeichensatz ist.

von Bernd S. (bernds1)


Lesenswert?

Ein "Ö" bzw. die Umlaute werden schon drin sein, aber eben an anderer 
Stelle.
Die normalen Buchstaben und Ziffern werden mit ASCII-Code dargestellt, 
aber für alles andere schau mal in die Zeichentabelle deines Display's. 
Da steht dann auch die Codierung der einzelnen Zeichen. Meist kann man 
auch noch ein paar selbst definieren, schau mal in's Datenblatt vom 
Display.

von A. B. (developer_x)


Lesenswert?

ja da is eins drin, steht im Datenblatt, kann es sein dass es am Editor 
liegt?

von A.H. (Gast)


Lesenswert?

Die Frage ist nicht, ob es drin steht, sondern ob es auch an der 
richtigen Stelle steht.

In Latin-1 Codierung ist ein 'ö' dem Code 0xF6 zugeordnet. In meinem 
HD44780 Datasheet stehen zwei mögliche Tabellen. In der ersten steht an 
der Stell 0xF6 so ein Summenzeichen. In der zweiten Tabelle steht bei 
0xF6 ein 'ö'.

Ergo hast du wohl ein Display mit Asiatischen Encoding.

von troll (Gast)


Lesenswert?

Aus der Zeichentabelle den passenden Code raussuchen, einsetzen
>text: .DB "Sch",42,"n jemacht#weiter so DDX!",0
fertig. Notfalls benutzerdefinierte Zeichen.

von Mystik (Gast)


Lesenswert?

troll schrieb:
> Aus der Zeichentabelle den passenden Code raussuchen, einsetzen
>>text: .DB "Sch",42,"n jemacht#weiter so DDX!",0
> fertig. Notfalls benutzerdefinierte Zeichen.

....oder während der Ausgabe einfach auf Umlaute prüfen und ggf. 
ASCII-Code automatisch anpassen bevor ausgegeben wird....quasi so wie es 
jeder macht....;-)

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.