Problem mit AVR-Tutorial im LCD-Teil

#2710392
Lesenswert?

Hallo,

Ich bin gerade dabei das AVR-Tutorial durchzuarbeiten, bisher 
funktioniert auch alles. Nun bin ich bei dem Teil mit dem LCD, aber ich 
bekomme einfach nichts angezeigt denn auf dem Display ist nur wie 
beschrieben die Eine Zeile Schwarz. Wisst ihr woran das liegen könnte ? 
Ich habe zig mal den Anschluss durchgemessen, alles ist Richtig 
angeschlossen. Ich nutze einen ATMega auf einem Atmel Evaluationsboard 
von Pollin. Wie gesagt bisher hat alles funktioniert (Mit den Leds, 
Tastern usw.) Woran könnte es liegen das mein LCD die Buchstaben 'Test' 
die in dem Code geschrieben sind nicht ausgibt? Könnte es daran liegen 
das ich das Falsche Quarz habe, denn auf dem Atmelboard ist ja ein 16Mhz 
Quarz, wenn ich aber in der LCD-Routine.asm XTAL auf 16000000 stellen 
möchte sagt er mir beim Erstellen "Operand(s) out of range in 'ldi 
r16,0x10a'. Eigentlich müsste das mein Problem sein denn sonst ist alles 
wie im Tutorial beschrieben.

Ich hoffe ihr könnt mir helfen.

MFG Moritz S.
#2710411
Lesenswert?

Aber wieso tritt der Fehler nur auf wenn ich die 16Mhz (16000000) 
einstellen möchte? Wenn ich das Standart lasse lässt es sich Compilieren 
aber das Display bleibt nach wie vor Leer. Wie ihr bestimmt schon 
gemerkt habt bin ich ein absoluter Anfänger, und habe keine Ahnung wie 
ich dies:

spess53 schrieb:
>>"Operand(s) out of range in 'ldi r16,0x10a'
>
> 0x10A passt nicht in ein 8 Bit Register.

beheben kann.

Könntet ihr mir Helfen?

MFG
#2710429
Lesenswert?

Also in der LCD-Routines Datei gibt es eine Stelle die lautet so:
1
 
2
; Pause nach jeder Übertragung
3
delay50us:                              ; 50us Pause
4
           ldi  temp1, ( XTAL * 50 / 3 ) / 1000000
5
delay50us_:
6
           dec  temp1
7
           brne delay50us_
8
           ret                          ; wieder zurück

Laut der Fehlermeldung (Operand(s) out of range in 'ldi
r16,0x10a') sollte es genau in diesen Zeilen irgendwo liegen.

Hier zeige ich nochmal wie ich den Quarztakt eingestellt habe:
1
.ifndef XTAL
2
.equ XTAL = 16000000
3
.endif
Dies steht ganz am Anfang der LCD-Routines Datei. Selbstverständlich 
habe ich das Externe Quarz eingestellt (Fuses).

MFG
Gast #2710443
Lesenswert?

Hi

Dann rechne doch mal '( XTAL * 50 / 3 ) / 1000000' mal per Hand aus.


Das sollte funktionieren:
1
delay50us:                              ; 50us Pause
2
           ldi  temp1, ( XTAL * 25 / 3 ) / 1000000
3
delay50us_:
4
           nop 
5
           dec  temp1
6
           brne delay50us_
7
           ret                          ; wieder zurück


MfG Spess
#2710454
Lesenswert?

Hallo Moritz,

anscheinend hast Du das Tutorial nicht richtig gelesen, da steht nämlich 
unter den Delayfunktionen:
--Zitat--
1
Ein kleines Problem kann bei der Verwendung dieses Verfahrens entstehen:
2
Bei hohen Taktfrequenzen und großen Wartezeiten kann der berechnete Wert größer als 255
3
werden und man bekommt die Fehlermeldung "Operand(s) out of range" beim Assemblieren. 
4
Dieser Fall tritt zum Beispiel für obige Konstruktion bei einer Taktfrequenz von 16 MHz ein
5
(genauer gesagt ab 15,3 MHz), während darunter XTAL beliebig geändert werden kann.
6
Als einfachste Lösung bietet es sich an, die Zahl der Takte pro Schleifendurchlauf
7
durch das Einfügen von nop zu erhöhen und die Berechnungsvorschrift anzupassen.
--Zitat-Ende--

Die Berechnung des 8-Bit Schleifenparameters im Unterprogramm delay50us 
gibt bei Taktfrequenzen 15,3 MHz einen Wert größer 0xFF, der dann 
natürlich nicht in ein 8-Bit-Register geladen werden kann und zum 
besagten Fehler führt.

Du mußt die Verzögerungsschleife schon anpassen, wenn sie mit 16 MHz 
funktionieren soll.

Gruß,
Thorsten
Gast #2710456
Lesenswert?

Hi

>Das sollte funktionieren:

Da fehlten leider noch zwei 'nop':
1
delay50us:                              ; 50us Pause
2
           ldi  temp1, ( XTAL * 25 / 3 ) / 1000000
3
delay50us_:
4
           nop
5
           nop
6
           nop 
7
           dec  temp1
8
           brne delay50us_
9
           ret                          ; wieder zurück

MfG Spess
Gast #2710518
Lesenswert?

Ich hatte gerade das selbe Problem.
Da ich nur drei verschieden farbige Litzen hatte, ist mir der Fehler 
unterlaufen die 4 Datenleitungen falsch herum anzuschließen.
Eventuell solltest du dort mal einen Blick drauf werfen.
Gast #2710541
Lesenswert?

Hi

>Darum wundert es mich das es nicht funktioniert.

Deswegen auch meine Frage. Am PortD können auf dem Pöllin-Board lt. 
Schaltplan Leds, Taster, RS232 und Lautsprecher über Jumper angeklemmt 
werden. Sind alle Jumper entfernt?

MfG Spess
#2711309
Lesenswert?

Hallo Moritz,

alles deutet darauf hin, daß Dein Display-Controller komplett 
uninitialisiert bleibt. Dann zeigt das LCD in der ersten Zeile einen 
dunkleren Balken...
Wenn Du also keine Falschbeschaltung vorliegen hast, kann es eigentlich 
nur am Timing des Enable-Signals liegen.


Hast Du auch die Anmerkungen im Unterprogramm "lcd_enable" umgesetzt?
Hab ich in Deinem Code jetzt nicht gesehen...
1
; Bei höherem Takt (>= 8 MHz) kann es notwendig sein, 
2
; vor dem Enable High 1-2 Wartetakte (nop) einzufügen. 
3
; Siehe dazu http://www.mikrocontroller.net/topic/81974#685882
4
lcd_enable:
5
           sbi LCD_PORT, PIN_E          ; Enable high
6
           nop                          ; 3 Taktzyklen warten
7
           nop
8
           nop
9
           cbi LCD_PORT, PIN_E          ; Enable wieder low
10
           ret                          ; Und wieder zurück

Sollte dann also für 16 MHz so aussehen:
1
lcd_enable:
2
           nop                          ; zusätzlich 2 Taktzyklen warten
3
           nop
4
           sbi LCD_PORT, PIN_E          ; Enable high
5
           nop                          ; 3 Taktzyklen warten
6
           nop
7
           nop
8
           cbi LCD_PORT, PIN_E          ; Enable wieder low
9
           ret                          ; Und wieder zurück

probier das mal und berichte ...

Gruß,
Thorsten

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren