Atmega8 - HD44780 nur ein schwarzer Balken

Gast #1696175
Lesenswert?

Hallo
Ich versuch mich gerade daran ein LCD(HD44780) mit dem ATMega8 
anzusprechen! Ich hab folgenden Code
1
.include "m8def.inc"
2
.include "lcd_functions.asm"
3

4
main:
5
  ldi r16, LOW(RAMEND)
6
  out SPL, r16
7
  ldi r16, HIGH(RAMEND)
8
  out SPH, r16
9

10
  
11
  
12
  ldi r16, 0xFF
13
  out DDRB, r16
14

15
  rcall lcd_init
16
  rcall lcd_clear
17

18
  loop: 
19
    rjmp loop
led_functions.asm:
1
.equ LCD_PORT = PORTB
2
.equ PIN_E = 5
3
.equ PIN_RS = 4
4
// PD4-7 an PORTB 0-3
5

6
delay5ms:   /// Für 16 mhz ca. 5,02 ms
7
  ldi r16, 80      
8

9
  delay5ms_loop1: 
10
    ldi r17, 250
11
    delay5ms_loop2: 
12
      dec r17
13
      nop
14
      brne delay5ms_loop2
15
    dec r16        // 1 Cycle = 0,25us
16
    brne delay5ms_loop1      // 2 Cycle = 0,5 us
17
  ret
18

19
delay100us:
20
  ldi r16, 200
21
  delay100us_loop:
22
    nop
23
    nop
24
    nop
25
    nop
26
    nop
27
    dec r16
28
    brne delay100us_loop
29
  ret
30

31
enable:
32
  sbi LCD_PORT, PIN_E
33
  ldi r16, 0x04
34
  enable_loop: 
35
    dec r16
36
    brne enable_loop
37
  cbi LCD_PORT, PIN_E
38
  ret
39

40
lcd_init:
41
  rcall delay5ms
42
  rcall delay5ms
43
  rcall delay5ms
44
  ldi r16, 0b00000011    // $3
45
  out LCD_PORT, r16      // in PORTD ausgeben
46
  rcall enable      // Enable Bit setzen 1. mal
47
  rcall delay5ms      // min. 4,1 ms warten
48
  rcall enable      // Enable Bit setzen 2. mal
49
  rcall delay5ms      // min. 4,1 ms warten
50
  rcall enable      // Enable Bit setzen 3. mal
51
  rcall delay5ms      // min. 4,1 ms warten
52
  ldi r16, 0b00000010    // auf 4-Bit Modus umstellen
53
  out LCD_PORT, r16      
54
  rcall enable
55
  rcall delay5ms
56

57
  ldi r20, 0b00101000    // 4-Bit Modus, 2-Zeilig, 5*7 Pixel
58
  rcall lcd_command
59
  ldi r20, 0b00001111    // Display/Curser(-blinken) ein
60
  rcall lcd_command
61
  ldi r20, 0b00010100
62

63
  ret
64

65
lcd_command:         // Befehl in r20
66
  mov r21, r20
67
  swap r20
68
  andi r20, 0b00001111
69

70
  out LCD_PORT, r20
71
  rcall enable
72

73
  andi r21, 0b00001111
74
  out LCD_PORT, r21
75
  rcall enable
76
  
77
  rcall delay100us
78
  ret
79

80
lcd_data:
81
  mov r21, r20    
82
  swap r20
83
  andi r20, 0b00001111
84
  sbr r20, (1<<PIN_RS)    // RS auf Daten umstellen (1)
85

86
  out LCD_PORT, r20
87
  rcall enable
88

89
  andi r21, 0b00001111
90
  sbr r21, (1<<PIN_RS)    // RS auf Daten umstellen (1)
91
  out LCD_PORT, r21
92
  rcall enable
93

94
  rcall delay100us
95
  rcall delay100us
96
  ret
97

98
lcd_clear:
99
  ldi r20, 0b00000001
100
  rcall lcd_command
101
  rcall delay5ms
102
  ret
Ist im grunde der aus dem Tutorial nur etwas verändert...
Gibt es hier drin i-einen Fehler? Habs eig gestern schon mal geschaft 
etwas anzuzeigen aber jetzt gehts nichtmehr!? Hab nur am Code bischenwas 
verändert aber eig nur Makros eingefügt und so... Die Schaltung hab ich 
auch nochmal neu aufgebaut! Hab hier im Forum was gelesen, dass diese 
Controller sehr anfällig gegen elektrostatische Aufladung sind oder so.. 
Kann das sein das ich den zerstört hab?
PS. verwende wie man sieht 4-Bit Modus und 16 MHz Quarz
#1696186
Lesenswert?

@lcd display (Gast)

>Ich versuch mich gerade daran ein LCD(HD44780) mit dem ATMega8
>anzusprechen! Ich hab folgenden Code

>Ist im grunde der aus dem Tutorial nur etwas verändert...

Warum? Wenn du Anfänger bist solltest du dich erstmal zu 100% ans 
Tutorial halten. Nimm also den Code UNVERÄNDERT aus dem Tutorial und 
dann sehen wir weiter.

MfG
Falk
Gast #1696329
Lesenswert?

solange die lcd_funtions.asm vor main eingebunden wird, durchläuft das 
programm erst dise einbindung.
entweder einen sprung nach reset zu main oder:
1
.include "m8def.inc"
2

3

4
main:
5
  ldi r16, LOW(RAMEND)
6
  out SPL, r16
7
  ldi r16, HIGH(RAMEND)
8
  out SPH, r16
9

10
  
11
  
12
  ldi r16, 0xFF
13
  out DDRB, r16
14

15
  rcall lcd_init
16
  rcall lcd_clear
17

18
  loop: 
19
    rjmp loop
20

21
.include "lcd_functions.asm"
Gast #1696387
Lesenswert?

@Michael Leusink
lcd_clear ist doch sowieso der letzte befehl und danach kommt gar nichts 
mehr... der hat ja sowieso solang zeit wie er gerade braucht!
@max power
Hab ich geändert funktioniert aber immer noch nicht

Ist es theoretisch möglich das der Controller defekt ist? Kann man das 
testen? Es wird einfach nur noch eine Zeile mit schwarzen Kästchen 
angezeigt!
#1696392
Lesenswert?

lcd display schrieb:

> Ist es theoretisch möglich das der Controller defekt ist? Kann man das
> testen?

Sicher.
Ein bischen Phantasie!

LEd anhängen und nachsehen ob man die zum Leuchten bringt.
Dann Gegentest: per Programm nicht leuchten lassen
Wer will kann dann, zur Übung, noch einen drauf setzen: LED blinken 
lassen.

Spätestens wenns blinkt steht zweifelsfrei fest: Der µC arbeitet.

Aber wenn man ehrlich ist:
In den seltensten Fällen ist es ein Hardware-Defekt. In den meisten 
Fällen ist es ein Programmfehler :-)
Was allerdings vorkommt: Kabl ist aus seiner Halterung gerutscht oder 
überhaupt abgerissen (vor allen an den Enden, an denen das Lot die 
Kabelenden sperrig macht)
Gast #1696408
Lesenswert?

>Ist es theoretisch möglich das der Controller defekt ist? Kann man das
>testen? Es wird einfach nur noch eine Zeile mit schwarzen Kästchen
>angezeigt!

Brenn mal die HEX-Datei aus dem Anhang. Wenns damit nicht geht
stimmt was mit der Hardware nicht. Ist für ein 2x16 LCD compiliert.
Angehängte Dateien:

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