Forum: Mikrocontroller und Digitale Elektronik LCD an PORTC  ATmega8


von Lukas G. (lukas88)


Lesenswert?

Hallo users,

Bastle momentan etwas mit LCD's rum. Klappt soweit gut. Nun habe zurzeit 
das Problem, das mein LCD an PORTD tadellos  funktioniert, sobald ich 
aber auf das PORTC oder auch PORTB wechsle, bleibt die Anzeige auf dem 
Dislay aus. Von den Pinnummern her wurde nichts geändert. Den Quellcode 
ist eine Kopie vom LCD Tutorial (mikrocontroller.net)

Möchte das LCD an PORTC oder B betreiben, da ich PD2 /PD 3 brauche für 
Interrupts.

Zitat:

"Natürlich kann man die LCD-Ansteuerung auch an einen anderen Port des 
Mikrocontrollers "verschieben": Wenn das LCD z. B. an Port B 
angeschlossen ist, dann reicht es, im Programm alle "PORTD" durch 
"PORTB" und "DDRD" durch "DDRB" zu ersetzen."

Genau so gemacht, leider keine Anzeige bei PORTC/B. Und ja kontrastpoti 
wurde auch schon probiert, leider auch nichts.

ADC ist übrigens bei  dieser Anwendung( noch) nicht in gebrauch.

 Woran könnte es (noch) liegen?

Kontroller: Atmega8
LCD: AV1624 
(http://www.produktinfo.conrad.com/datenblaetter/175000-199999/183342-da-01-ml-LCD_Modul_16x2_Zeichen_de_en.pdf)

lukas88

von STK500-Besitzer (Gast)


Lesenswert?

Zeig dein Programm! Da es nicht funktioniert. ALles andere ist nur 
Kristallkugelmurmeln.

von Gasst (Gast)


Lesenswert?

Lukas G. schrieb:
> Bastle momentan etwas mit LCD's rum.
-------------------------------^------
--> http://www.deppenapostroph.info

von Karl H. (kbuchegg)


Lesenswert?

Lukas G. schrieb:

> Zitat:
>
> "Natürlich kann man die LCD-Ansteuerung auch an einen anderen Port des
> Mikrocontrollers "verschieben": Wenn das LCD z. B. an Port B
> angeschlossen ist, dann reicht es, im Programm alle "PORTD" durch
> "PORTB" und "DDRD" durch "DDRB" zu ersetzen."

Was ist denn das für ein Ansteuercode?

Ein ordentlicher Code hat das bereits erledigt und es gibt nur eine 
einzige Stelle, an der man seine Portbezeichnung einträgt. Wenn der 
Ansteuercode es verträgt, dann können es unter Umständen auch mehrere 
sein, weil die Steuerleitungen auf einem anderen Port liegen können.
Aber wie auch immer: die Portumstellung wird nicht im Code selber 
gemacht, indem man im C Code rumfuhrwerkt, sondern an einer einzigen 
Stelle, der normalerweise ein #define ist.

Von einem Code, bei dem das nicht so gemacht ist, sondern ich direkt in 
den C-Anweisungen die Portbezeichnungen ändern muss, würde ich schon mal 
grundsätzlich die Finger lassen.

> Genau so gemacht, leider keine Anzeige bei PORTC/B. Und ja kontrastpoti
> wurde auch schon probiert, leider auch nichts.

Wenn das LCD an einem Port funktioniert, dann stimmt auch der Kontrast. 
Der ändert sich nicht, wenn du an einen anderen Port gehst

>  Woran könnte es (noch) liegen?

Du könntest irgendwo ein PORTB oder ein PINB gegen den entsprechend 
anderen Portnamen auszutauschen vergessen haben.
Du kannst aber auch einen Fehler in der Verkabelung haben. Der Port B 
ist beim Mega8 ja schon ganz schön verstreut, weil da ja auch die 
Anschlüsse für einen Quarz drauf sind. Und am Port C gibt es noch die 
Möglichkeit, dass du AVcc nicht angeschlossen hast.

von Dieter F. (Gast)


Lesenswert?

Schon mal aufs Pinout geschaut? Welche Pins verwendest Du denn? Sind die 
auf C und D auch nutzbar - bzw. überhaupt da? ATMega8 hat nur eine 
begrenzte Anzahl von Pins ... oder?

von Lukas G. (lukas88)


Lesenswert?

1
.nolist
2
.include "/home/lukas/Dokumente/AVR/includes/m8def.inc"
3
.list
4
5
; .def definiert ein Synonym (Namen) für ein µC Register
6
.def   z  = r20
7
.def   up = r21
8
.def temp1 = r16
9
.def temp2 = r17
10
.def temp3 = r18
11
.def temp4 = r19
12
13
14
.org 0x0000
15
  rjmp  conf
16
17
.org 0x0009
18
    rjmp  timer0_overflow
19
20
21
22
timer0_overflow:
23
24
  inc      z
25
  reti
26
27
z_zero:
28
29
  clr      z
30
  ret
31
32
33
lcd_number:
34
    mov    temp1,up
35
        push    temp2               ; register sichern,
36
                                    ; wird für Zwsichenergebnisse gebraucht     
37
        ldi     temp2, '0'         
38
lcd_number_10:                
39
        subi    temp1, 10           ; abzählen wieviele Zehner in
40
        brcs    lcd_number_1        ; der Zahl enthalten sind
41
        inc     temp2
42
        rjmp    lcd_number_10
43
lcd_number_1:
44
        push    temp1               ; den Rest sichern (http://www.mikrocontroller.net/topic/172026)
45
        mov     temp1,temp2         ; 
46
        rcall   lcd_data            ; die Zehnerstelle ausgeben
47
        pop     temp1               ; den Rest wiederherstellen
48
        subi    temp1, -10          ; 10 wieder dazuzählen, da die
49
                                    ; vorhergehende Schleife 10 zuviel
50
                                    ; abgezogen hat
51
                                    ; das Subtrahieren von -10
52
                                    ; = Addition von +10 ist ein Trick
53
                                    ; da kein addi Befehl existiert
54
        ldi     temp2, '0'          ; die übrig gebliebenen Einer
55
        add     temp1, temp2        ; noch ausgeben
56
        rcall   lcd_data
57
 
58
        pop     temp2               ; Register wieder herstellen
59
        ret
60
  
61
62
conf:
63
 
64
           ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten RAM-Adresse
65
           out SPL, temp1
66
           ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten RAM-Adresse
67
           out SPH, temp1
68
69
70
          
71
 
72
      ldi      temp1,0xFF
73
    out      DDRC,temp1
74
75
           
76
77
           ldi       temp1,0b00000101     ; CS00 setzen: Teiler 1
78
           out       TCCR0, temp1
79
 
80
           ldi       temp1, (1<<TOIE0)      ; TOIE0: Interrupt bei Timer Overflow
81
           out       TIMSK, temp1
82
              
83
           rcall lcd_init     ; Display initialisieren
84
           rcall lcd_clear    ; Display löschen
85
    sei
86
87
main:
88
89
  clr      up
90
  rcall    z_zero
91
92
zahlen:
93
94
  cpi      z,15
95
  breq    up_one
96
  rjmp    zahlen
97
98
up_one:
99
100
  cpi      up,50
101
  breq    main
102
  inc      up
103
  rcall    lcd_clear
104
  ldi      temp1,'S'
105
  rcall    lcd_data
106
  ldi      temp1,':'
107
  rcall    lcd_data
108
  rcall    lcd_number
109
  rcall    z_zero
110
  rjmp    zahlen
111
112
  
113
114
115
  
116
  
117
  
118
  
119
  
120
  
121
122
.include "funk_lcd.asm"

: Bearbeitet durch User
von Lukas G. (lukas88)


Lesenswert?

1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                 LCD-Routinen                ;;
3
;;                 ============                ;;
4
;;              (c)andreas-s@web.de            ;;
5
;;                                             ;;
6
;; 4bit-Interface                              ;;
7
;; DB4-DB7:       PD0-PD3                      ;;
8
;; RS:            PD4                          ;;
9
;; E:             PD5                          ;;
10
;;                                             ;;
11
;; Takt:          4 MHz                        ;;
12
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
13
 
14
 
15
 
16
 ;sendet ein Datenbyte an das LCD
17
lcd_data:
18
19
       
20
       push  temp2
21
           mov temp2, temp1             ; "Sicherungskopie" für
22
                                        ; die Übertragung des 2.Nibbles
23
           swap temp1                   ; Vertauschen
24
           andi temp1, 0b00001111       ; oberes Nibble auf Null setzen
25
           sbr temp1, 1<<4              ; entspricht 0b00010000 (Anm.1)
26
           out PORTC, temp1             ; ausgeben
27
           rcall lcd_enable             ; Enable-Routine aufrufen
28
                                        ; 2. Nibble, kein swap da es schon
29
                                        ; an der richtigen stelle ist
30
           andi temp2, 0b00001111       ; obere Hälfte auf Null setzen 
31
           sbr temp2, 1<<4              ; entspricht 0b00010000
32
           out PORTC, temp2             ; ausgeben
33
           rcall lcd_enable             ; Enable-Routine aufrufen
34
           rcall delay50us
35
           pop  temp2             ; Delay-Routine aufrufen
36
           ret                          ; zurück zum Hauptprogramm
37
 
38
 ; sendet einen Befehl an das LCD
39
lcd_command:
40
       push temp2; wie lcd_data, nur RS=0
41
           mov temp2, temp1
42
           swap temp1
43
           andi temp1, 0b00001111
44
           out PORTC, temp1
45
           rcall lcd_enable
46
           andi temp2, 0b00001111
47
           out PORTC, temp2
48
           rcall lcd_enable
49
           rcall delay50us
50
           pop  temp2
51
           ret
52
 
53
 ; erzeugt den Enable-Puls
54
 ;
55
 ; Bei höherem Takt (>= 8 MHz) kann es notwendig sein, 
56
 ; vor dem Enable High 1-2 Wartetakte (nop) einzufügen. 
57
 ; Siehe dazu http://www.mikrocontroller.net/topic/81974#685882
58
lcd_enable:
59
           sbi PORTC, 5                 ; Enable high
60
           nop                          ; mindestens 3 Taktzyklen warten
61
           nop
62
           nop
63
           cbi PORTC, 5                 ; Enable wieder low
64
           ret                          ; Und wieder zurück                     
65
 
66
 ; Pause nach jeder Übertragung
67
delay50us:                              ; 50µs Pause (bei 4 MHz)
68
           ldi  temp1, $42
69
delay50us_:dec  temp1
70
           brne delay50us_
71
           ret                          ; wieder zurück
72
 
73
 ; Längere Pause für manche Befehle
74
delay5ms:                               ; 5ms Pause (bei 4 MHz)
75
           ldi  temp1, $21
76
WGLOOP0:   ldi  temp2, $C9
77
WGLOOP1:   dec  temp2
78
           brne WGLOOP1
79
           dec  temp1
80
           brne WGLOOP0
81
           ret                          ; wieder zurück
82
 
83
 ; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
84
lcd_init:
85
           ldi  temp3,6
86
powerupwait:
87
           rcall  delay5ms
88
           dec  temp3
89
           brne powerupwait
90
           ldi temp1, 0b00000011        ; muss 3mal hintereinander gesendet
91
           out PORTC, temp1             ; werden zur Initialisierung
92
           rcall lcd_enable             ; 1
93
           rcall delay5ms
94
           rcall lcd_enable             ; 2
95
           rcall delay5ms
96
           rcall lcd_enable             ; und 3!
97
           rcall delay5ms
98
           ldi temp1, 0b00000010        ; 4bit-Modus einstellen
99
           out PORTC, temp1
100
           out PORTC, temp1
101
           rcall lcd_enable
102
           rcall delay5ms
103
           ldi temp1, 0b00101000        ; 4Bit / 2 Zeilen / 5x8
104
           rcall lcd_command
105
           ldi temp1, 0b00001100        ; Display ein / Cursor aus / kein Blinken
106
           rcall lcd_command
107
           ldi temp1, 0b00000100        ; inkrement / kein Scrollen
108
           rcall lcd_command
109
           ret
110
 
111
 ; Sendet den Befehl zur Löschung des Displays
112
lcd_clear:
113
       push  temp1
114
           ldi temp1, 0b00000001   ; Display löschen
115
           rcall lcd_command
116
           rcall delay5ms
117
           pop   temp1
118
           ret
119
 
120
 ; Sendet den Befehl: Cursor Home
121
lcd_home:
122
           ldi temp1, 0b00000010   ; Cursor Home
123
           rcall lcd_command
124
           rcall delay5ms
125
           ret

: Bearbeitet durch User
von Lukas G. (lukas88)


Lesenswert?

Ja ok LCDs

von Karl H. (kbuchegg)


Lesenswert?

Die Portbezeichnungen scheinen alle angepasst worden zu sein.

Kommen wir zur Hardware:
Verkabelung stimmt? (Ist mir auch schon passiert, dass ich mich in den 
Pinbezeichnungen geirrt habe)
AVcc ist angeschlossen?

von Lukas G. (lukas88)


Lesenswert?

Hallo kbuchegg,

Verkabelung sollte stimmen, soweit.

Mit AVcc hab schon probiert, sowie ich mich informiert habe sollte 
dieser Auf GND gezogen werden!? Hat aber nicht wirklich funktioniert. 
Kann morgen noch ein Bild zur Verkabelung reinstellen. Für heute ist 
schluss, sollte morgen noch Arbeiten...

mfg

von Karl H. (kbuchegg)


Lesenswert?

Lukas G. schrieb:
> Hallo kbuchegg,
>
> Verkabelung sollte stimmen, soweit.
>
> Mit AVcc hab schon probiert, sowie ich mich informiert habe sollte
> dieser Auf GND gezogen werden!?

Äh nein,
AVcc ist die Versorgungsspannung dieses Ports. Der hat seine eigene, 
weil dort der ADC beheimatet ist.

d.h. der wird mit 5V verbunden.
Und noch ein 100nF Kondensator nach GND

von Forist (Gast)


Lesenswert?

Lukas G. schrieb:
> Mit AVcc hab schon probiert, sowie ich mich informiert habe sollte
> dieser Auf GND gezogen werden!?

Wer hat dir denn diesen Bären aufgebunden?

Was meinst du, was im Datenblatt auf S. 6 der Satz
1
It [AVCC] should be externally connected to VCC, even if the ADC is not used.
und auf S. 248 die Zeile
1
Symbol Parameter Condition    Min(1)       Typ(1) Max(1)       Units
2
AVCC   Analog Supply Voltage  VCC - 0.3(2)        VCC + 0.3(3) V
und die Fußnoten 2 und 3
1
Notes: ...
2
2. Minimum for AVCC is 2.7V.
3
3. Maximum for AVCC is 5.5V.
bedeuten?

von Michael (Gast)


Lesenswert?

An PortD läufts problemlos aber an Port B und Port C nicht? Sind auch 
wirklich alles Pins richtig eingestellt? Port D unterscheidet sich von 
Port B und Port C in der weise, dass hier kein Sonderpin im Spiel ist. 
Bei Port C hat man z.B. PC6 der der Resetpin ist. Da muss man etwas mehr 
einstellen als bei anderen, "einfachen", Pins um den als IO nutzen zu 
können. Bei Port B fällt mir da spontan PB6 und PB7 ein, die 
Oszilatorpins. Auch hier ist etwas mehr Justage nötig um die als 
gewöhnliche IOs nutzen zu können. (nutzt du einen Quartz-Oszilator?)
Mit Assembler kenne ich mich leider nicht so dolle aus aber schau 
einfach mal ob du diese Pins auch wirklich richtig initialisiert hast. 
Bei deinem Beispielcode mit Port C wäre hier die Frage ob du das 
FUSE-BIT entsprechend gesetzt hast damit PC6 auch als IO-Pin nutzbar 
ist.
Und wie ist deine Clocksource für den Atmega eingestellt? Das hat 
Einfluss auf die Funktion von PB6 und PB7.
Und natürlich prüfen ob man auch wirklich alle Verbinungen richtig 
verdrahtet hat, also das Pin-out auch wirklich stimmt und man keinen 
Kabelbruch hat. Insbesondere bei letzterem hab ich mir bei einem LCD 
auch schon mal nen Wolf gesucht weil es nicht funktionierte (kalte 
Lötstelle wars bei mir an DB1, hat mich fast nen ganze Tag gekostet 
diesen Fehler zu finden)

von Karl H. (kbuchegg)


Lesenswert?

Michael schrieb:

> Bei deinem Beispielcode mit Port C wäre hier die Frage ob du das
> FUSE-BIT entsprechend gesetzt hast damit PC6 auch als IO-Pin nutzbar
> ist.


NEIN! Nicht!

Einem Anfänger zu empfehlen, sich den Reset Pin wegzufusen ist grob 
fahrlässig! Ohne High-Volt Programmer kann er den Mega danach wegwerfen.


Er braucht 6 Pins zur Ansteuerung. PC0 bis PC3 für die Daten. PC4 und 
PC5 für die Steuerleitungen. PC6 braucht er nicht.

: Bearbeitet durch User
von Michael (Gast)


Lesenswert?

Karl H. schrieb:
> Einem Anfänger zu empfehlen, sich den Reset Pin wegzufusen ist grob
> fahrlässig! Ohne High-Volt Programmer kann er den Mega danach wegwerfen.

Oh, nicht falsch verstehen. Ich empfehle ihm das nicht, ich weise nur 
darauf hin. Er könnte auch weiterhin Port D für das LCD benutzen, 
immerhin kann jeder Pin als externer Interrupt benutzt werden, nicht nur 
PD2 und PD3. Aber weil du es grade sagst (das fiel mir gar nicht auf, 
dass er nur 6 Leitungen fürs LCD benutzt): Was ist denn mit dem RW-Pin 
des LCDs? Auch sicher auf Low gezogen?

von Lukas G. (lukas88)


Lesenswert?

Werd heute abend mal versuchen, das ganze mit dem stk500 aufzubauen. 
Falls es funktioniert, hab ich was falsches verdratet oder vergessen. Da 
ich bis jetzt immer mit dem stk500 garbeitet habe , könnte es gut sein 
dass ich was hardwaremässig nicht ganz richtig konfiguriert habe!

von oldmax (Gast)


Lesenswert?

Hi
Hab nur mal kurz reingeschaut. Dabei ist mir aufgefallen, das du das 
Register r20 als Z deklarierst. Klar, kann man machen, aber Z ist in der 
m8def.inc ein Doppelregister aus r30 und r31, soweit ich es in 
Erinnerung habe. Mit deiner Deklaration machst du diese zunichte und 
wenn du später mal die Doppelregister X, Y und Z einsetzen willst, 
kommen neue interessante Fehler auf dich zu.
So, jetzt sehe ich mir den Rest an.
Gruß oldmax

von oldmax (Gast)


Lesenswert?

Hi
Ok, soweit für einen Anfänger erst mal ok, dennoch erlaube mir ein paar 
Hinweise:
Einrücken ist ok, aber setz den Rücksprungbefehl ruhig wieder an den 
Anfang einer Zeile. So finsest du leichter das Ende einer Sub.
Du hast den Timer aktiviert. Gut, aber warum nicht gleich in den 
Compare-Mode. So kannst du dir eine Zeitbasis schaffen und auf die 
üblichen Programmbremsen (delays) verzichten.
Statt Push und POP sind u.U. Variablen sinnvoll. In einfachen 
Subroutinen muss man nicht unbedingt die Register retten. Nur wenn du 
diese in Interruptrotinen aufrufst ist es zwingend notwendig. Der SRAM 
ist groß genug, um Variablen darin abzulegen. Nebenbei, wenn du dir dann 
ein kleines Programm schaffst welches dir den Variablenbereich im Block 
an den PC sendet, kannst du die Inhalte leicht überprüfen. Irgendwann 
hab ich mal "OpenEye" für diesen Zweck geschrieben und hier 
veröffentlicht. Ist aber schon ein paar Jahre her.
Gruß oldmax

von Lukas G. (lukas88)


Angehängte Dateien:

Lesenswert?

Hab jetzt mal ein paar Bilder gemacht, vielleicht könnt ihr ein Problem 
erkennen! STK500 hat es übrigens auch nicht funktioniert, scheint also 
eventuell ein Konfigurations Problem zu sein.

von Strabe (Gast)


Lesenswert?

sieht aus wie das Standard 2x16 LCD (Pollin?). müssen da auf der Platine 
rechts nicht noch A und K angeschlossen werden ?

von Lukas G. (lukas88)


Lesenswert?

Ja theoretisch schon, für die Hintergrundbeleuchtung. Benötige ich aber 
nicht, darum hab ichs ausgelassen!

von Karl H. (kbuchegg)


Lesenswert?

Jetzt mal abgesehen von den fehlenden Blockkondensatoren kann ich auf 
den Bildern nichts erkennen, was falsch verdrahtet wäre.

Hast du schon mal durchgeklingelt, ob irgendein Kabel zum LCD einen 
schlechten Kontakt hat?

Ich würde jetzt erst mal zum Plan B greifen und mir ein Programm 
schreiben, welche am PortC 1 Pin auf High setzt und dann nachmessen, ob 
am LCD auch wirklich an der richtigen Stelle ein High auftaucht.
Dann den nächsten Pin.

Denn: Da das Programm mit einer Belegung am Port D funktioniert und du 
soweit ich sehen kann tatsächlich alle Erwähnungen von Port D gegen Port 
C ausgetauscht hast (DDR natürlich auch), müsste das eigentlich 
funktionieren. Selbst wenn du mit dem fehlerhaften Anlegen von GND an 
AVcc den Port C komplett geschossen hast, sollte eigentlich der Port B 
immer noch funktionieren.

Aber sollte ist Konjunktiv. Nachmessen ist immer besser.

von Karl H. (kbuchegg)


Lesenswert?

Und steck noch 2 100nF Kondensatoren an die Versorgungspins des Mega8. 
Jeweils einer der Vcc bzw. AVcc mit dem GND Pin auf der jeweiligen Seite 
verbindet. Kondensatoren dicht an den µC ran.

Es wurde schon von den tollsten Effekten berichtet, die dann mit dem 
Einfügen dieser Blockkondensatoren plötzlich verschwunden sind.

von Dieter F. (Gast)


Lesenswert?

Steck das Ganze doch mal so 10 Reihen weiter ... ich habe mittlerweile 3 
Breadboards entsorgt, da die schlicht nicht zuverlässig waren. Ich traue 
den Dingern nicht mehr - wenn ich Probleme habe stecke ich erstmal um 
und dann auf ein anderes Breadboard, um Breadboard-Fehler 
auszuschliessen. Habe mir schon einen Wolf gesucht und dann war es am 
Ende ein Kontaktproblem im Breadboard.

von Lukas G. (lukas88)


Lesenswert?

Schon versucht, leider auch nichts! Paradoxerweise funktioniert das 
LCD ausschließlich auf Port D.


Und durchprobiert/gemessen, ob die Pins strom ein/aus schalten hab ich 
auch schon. Hab sogar den Atmega ausgewechselt gegen einen neuen!


Muss mich wohl langsam damit abfinden, da mir langsam die Ideen 
ausgehen.... Obwohl es mich natürlich schon wunder nehmen würde wieso..

von Heinz V. (heinz_v)


Lesenswert?

Lukas G. schrieb:
>
1
> .......
2
>  ;sendet ein Datenbyte an das LCD
3
> lcd_data:
4
> 
5
> 
6
>        push  temp2
7
>            mov temp2, temp1             ; "Sicherungskopie" für
8
> .......
9
>

Ähm, wo wird denn das DDRC auf Output geschaltet?

von Kast (Gast)


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Heinz V. schrieb:
> Lukas G. schrieb:
>>
1
>> .......
2
>>  ;sendet ein Datenbyte an das LCD
3
>> lcd_data:
4
>>
5
>>
6
>>        push  temp2
7
>>            mov temp2, temp1             ; "Sicherungskopie" für
8
>> .......
9
>>
>
> Ähm, wo wird denn das DDRC auf Output geschaltet?

Im Hauptprogramm.
Beitrag "Re: LCD an PORTC  ATmega8"
1
conf:
2
 
3
           ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten RAM-Adresse
4
           out SPL, temp1
5
           ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten RAM-Adresse
6
           out SPH, temp1
7
8
9
          
10
 
11
      ldi      temp1,0xFF
12
    out      DDRC,temp1

Ja ich weiss. Ist scheisse gemacht und sollte eigentlich mit in die Init 
Funktion. Aber: das ist nicht das Problem. Leider.

von Karl H. (kbuchegg)


Lesenswert?

Kast schrieb:
> Könnte das helfen?
>
> Beitrag "ATMega16 und PORTC / JTAG Fuse"

Der Mega8 hat kein JTAG

von Lukas G. (lukas88)


Lesenswert?

Hier: 

conf:

           ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten 
RAM-Adresse
           out SPL, temp1
           ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten 
RAM-Adresse
           out SPH, temp1




      ldi      temp1,0xFF   <=======
    out      DDRC,temp1     <=======



           ldi       temp1,0b00000101     ; CS00 setzen: Teiler 1
           out       TCCR0, temp1

           ldi       temp1, (1<<TOIE0)      ; TOIE0: Interrupt bei Timer 
Overflow
           out       TIMSK, temp1

           rcall lcd_init     ; Display initialisieren
           rcall lcd_clear    ; Display löschen
    sei

main:

von Lukas G. (lukas88)


Lesenswert?

Kurze Frage: 


Von euch hat nicht zufälligerweise jemand ein kleines Projekt zur 
Verfügung, das man 1:1 nachbauen könnte die andere PORTS als D benutzen.

Suche morgen selber  noch im netz, aber vielleicht hat jemand grad eins 
zur hand. Ne einfache Uhr oder so... Inklusive schaltplan und Quellcode.

Damit ich Etwas testen kann, wo ich weiß ,dass Hard/Software 
konfiguration schon irgendwo funktioniert haben! 

mfg

von Peter D. (peda)


Lesenswert?

Lukas G. schrieb:
> Von euch hat nicht zufälligerweise jemand ein kleines Projekt zur
> Verfügung, das man 1:1 nachbauen könnte die andere PORTS als D benutzen.

http://www.avrfreaks.net/forum/tutc-lcd-tutorial-1001

In Assembler hat man einfach zuviele Fehlermöglichkeiten.

von chris (Gast)


Lesenswert?

mmmhh wenn du wirklich auf Portc das so machst

Lukas G. schrieb:
> ldi      temp1,0xFF   <=======
>     out      DDRC,temp1     <=======

schiest du den Controller ausm Leben und sperrst dich aus denn damit 
wird PC6 als Ausgang konfiguriert wo bekanntlich ja der Rest zu hause 
ist...
besser wär

ldi     temp1,$3f


In meiner Anfangszeit hatte ich ähnliche Probleme da 1 Port 
funktionierte und die anderen beiden beim M8 nicht wollten lag an der 
Verkabelung und der SW.

Kann dir empfehlen das du in der LCD Routine alle PortC/B/D durch ein 
Pseudonym ersetzt wie LCD_Portx/LCD_ddrx und am Anfang der Hauptdatei

.equ LCD_portx = PortC
.equ LCD_ddrx  = DDRC
.equ LCD_RS    = 4
.equ LCD_E     = 5

ersetz. Dadurch hast du nur eine Quelle wo man was ändern müsste und es 
kann dir nicht passieren das du evtl was in der LCDRoutine ein 
Portumbenennung vergisst was dir gerade diesen Ärger einhandelt. ;-)

von Karl H. (kbuchegg)


Lesenswert?

chris schrieb:
> mmmhh wenn du wirklich auf Portc das so machst
>
> Lukas G. schrieb:
>> ldi      temp1,0xFF   <=======
>>     out      DDRC,temp1     <=======
>
> schiest du den Controller ausm Leben und sperrst dich aus denn damit
> wird PC6 als Ausgang konfiguriert wo bekanntlich ja der Rest zu hause
> ist...
> besser wär
>
> ldi     temp1,$3f

besser wäre es zweifellos.
Allerdings wär mir das neu, dass man den Reset so ansprechen kann. Wenn 
der Pin auf seiner Standardeinstellung eingestellt ist und als Reset 
konfiguriert ist, dann ist er vom Port Register getrennt. Was immer dort 
auch passiert, es löst keinen Reset aus.

von chris (Gast)


Lesenswert?

Karl H. schrieb:
> Allerdings wär mir das neu, dass man den Reset so ansprechen kann. Wenn
> der Pin auf seiner Standardeinstellung eingestellt ist und als Reset
> konfiguriert ist, dann ist er vom Port Register getrennt.

Das war wie gesagt zu meiner Anfangszeit mit dem M8 und auch noch 
Ponyprog. Auf jeden Fall hatte ich mich bei 2-3 Testobjekten ausgesperrt 
gehabt und nur mit nen STK500 über HighvoltageProgrammierung 
zurückgesetzt bekommen. Seit dem lasse ich das mit einem doppel belegten 
Pin IO/Reset und lasse ihn als Reset beschaltet ohne Probleme.

Wo ist eigentlich der TO hin???

von Ralf G. (ralg)


Lesenswert?

Lukas G. schrieb:
> Von euch hat nicht zufälligerweise jemand ein kleines Projekt zur
> Verfügung

Ich schlage vor, du kümmerst dich um die Grundlagen. Die Ansteuerung 
eines Pins mit LED dran zum Testen dürfte ein guter Einstieg sein.

von Lukas G. (lukas88)


Lesenswert?

Hab mein Problem endlich lösen können, naja fast zumindest.

Scheinbar lag es daran, dass ich Funktionen/labels in eine externe Datei 
verlagert habe und per .include einbunden habe.

Hab die Labels in die Haupdatei kopiert, und lief danach ohne Probleme, 
auch über verschieden Ports hinweg.

Offenbar geht irgendwo ein Registerwert verloren, oder wird verfälscht. 
Ev. Stackpointer?? Wieso genau müsste ich noch einmal den Code intensiv 
Studieren... Aber nach 1 Woche rumprobieren lass ich das momentan sein. 
Jetzt kann ich endlich weiter mit meinem Projekt.

Danke für eure Zahlreichen Ratschläge und inputs.

lukas88

von Peter D. (peda)


Lesenswert?

Include bedeutet eine direkte Texteinfügung. Daher ist oft auch die 
Stelle entscheidend, wo die Inlcude-Anweisung steht. In der Regel ist zu 
Anfang der Programmdatei die optimale Stelle.
Enthält das Include Code, dann darf es aber erst nach der Vektortabelle 
includiert werden.

von Bernd (Gast)


Lesenswert?

> Scheinbar lag es daran, ...

Und woran hat es tatsächlich gelegen?

von Dieter F. (Gast)


Lesenswert?

Bernd schrieb:
> Und woran hat es tatsächlich gelegen

Am breadboard :-) ? Der Include war doch sicher schon auch bei der 
PortD-Variante im Spiel ...

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.