Forum: Mikrocontroller und Digitale Elektronik DOG-M .asm Initialisierung geht, aber wo bleibt mein Test?


von Sirko P. (poehli)


Lesenswert?

Hallo,

nachdem ich mit Hilfe der Artikel aus dem Forum mein DOGM 163 
erfolgreich initialisiert habe ( in Assambler, an 5V,Hardware-SPI, 
ATMEGA16) verzweifel ich seit einem Tag an der Textausgabe, obwohl das 
doch kein Problem sein dürfte. Ich greife da ebenfalls auf Routinen hier 
aus dem Forum zurück.

Ich poste mal den Code, lass aber die Init weg weil die geht ja. ( Ich 
sehe einen blinkenden Cursor vor mir)

Obwohl ich versuche ein Zeichen zu senden sehe ich weiter hin nur den 
blinkenden Cursor. Könnte es sein das ich vergesse eine Freigabe zu 
setzen?
1
; bis hierher geht die funktionierende Initialisierung
2
3
Loop:
4
rcall  delay50ms
5
6
  ldi    r24,0b00000000    ; Adresse
7
  ldi    r25,0x53                ; Zeichen
8
  rcall  wrddram
9
  rjmp Loop
10
11
;--------------------------------------------------------------------------------------
12
;        Write DDRAM - Schreiben auf DDRAM Adresse
13
;        in : r25 = Datenbyte
14
;           r24 = Adresse (7bit)
15
;         changed : -
16
wrddram:
17
  ori  r24,$80    ; Bit 7 setzen ( Befehl Adresse schreiben)
18
  rcall  wrcmd    ; zur LCD
19
  mov  r24,r25    ; Daten
20
  rcall  wrdat    ; zur LCD
21
  ret
22
;--------------------------------------------------------------------------------------
23
;        Write Command - Kommandos schreiben
24
;        in: r24  Kommando
25
wrcmd:
26
  cbi   PortB,RS        ; RS = 0 -> Kommando/Adresse schreiben
27
  rcall  spi_out
28
  rcall  delay50us
29
  ret
30
;--------------------------------------------------------------------------------------
31
;        Write Data - Daten schreiben
32
;        in : r24 Datenbyte
33
34
wrdat:
35
  sbi PortB,RS            ; RS = 1 -> Daten schreiben
36
  rcall  spi_out
37
  rcall  delay50us
38
  ret
39
40
;--------------------------------------------------------------------------------------
41
;      Byte über SPI ausgeben
42
;       in: r24  Datenbyte
43
;      changed: -
44
spi_out:  
45
  push  r24
46
  out  SPDR,r24  ; start transmission of data
47
spi_out10:
48
  in  r24,SPSR  ; Wait for transmission complete
49
  sbrs  r24,SPIF
50
  rjmp  spi_out10
51
  pop  r24
52
  ret

von shorsh (Gast)


Lesenswert?

Hi,

gibts zu dem Problem "schon" eine Lösung ? Ich hänge am gleichen 
Problem...

Danke,
shorsh

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>>  push  r24

Wofür soll das gut sein?

>  out  SPDR,r24  ; start transmission of data
>spi_out10:
>  in  r24,SPSR  ; Wait for transmission complete
>  sbrs  r24,SPIF
>  rjmp  spi_out10


>>  pop  r24

Und das hier?

von AndreasU (Gast)


Lesenswert?

Wenn ihr es so net hinbekommt macht es doch in C! Die Files hierzu sind 
super.

von Roman (Gast)


Lesenswert?

Ich habe zwei Tipps, die mir jeweils geholfen haben die Zeichen aufs 
Display zu bringen:
1. Die Pause nach der Initialisation vergrössern, z.B. > 200ms
2. Schreibt einfach mal Zeichen ins Display, ohne die DDRAM Adresse neu 
zu schreiben. Dann sollte ja (je nach Initialisierung) der Cursor für 
jedes neue Zeichen um eine Stelle nach rechts rücken.

Also in obigem Code z.B.:

Loop:
rcall  delay50ms

  ldi    r24,0x53                ; Zeichen Buchstabe S
  rcall  wrdat
  rjmp Loop


Dies sollte das ganze Display mit dem Zeichen füllen.

Es ist eben möglich, dass nach einer nicht perfekten Initialisierung die 
Zeichenadresse 0x00 aus dem sichtbaren Bereich hinausgescrollt ist 
(siehe Datenblatt des Kontrollers Seite 19). Die DOG-M sind in Sachen 
Timing sehr empfindlich meiner Meinung nach.

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.