Hallo, war schon einmal mit dem LCD-Display-Thema hier im Forum (serielles LCD-Display nach U. Radig), das ging nicht. Habe mir jetzt die Schaltung versuchsweise einmal nach dem "AVR-GCC-Tutorial/LCD-Ansteuerung" http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung aufgebaut und die Software nach der Seite "Erweiterte LCD-Ansteuerung" in meinen Atmega32 geflasht. Das hat auf Anhieb funktioniert!, Jetzt das "Aber". Die Software verwendet in der lcd-routines.h den PORTD. Der Port ist bei mir belegt. Wollte auf PORTC, oder PORTA ausweichen. Habe in lcd-routines.h aus dem "D" jeweils ein "C" bzw. "A" gemacht (PORTD --> PORTC, DDRD --> DDRC, PD3 --> PC5, etc.). Für PORTC habe ich auch das JTAG abgeschaltet und Verfügbarkeit der Pins geprüft. Es wird nichts wie auf PORTD angezeigt. Muss ich da noch mehr umstellen? Hat das schon jemand einmal probiert?
Poste den (kompletten) Quellcode, dann kann Dir geholfen werden... Hardware ist soweit ok?
Hinweis PD3-PD5 reicht nicht. Es werden PD0-PD5 = PC0-PC5 benutzt!
@ Rolf Degen: Dass (fast) der gesamte PORTC notwendig ist, ist mir schon klar. Ich hatte angenommen, wenn ich als erstes PORTD und DDRD auf C umstellen, zus. zu PD2 - 4 auf PC2 - 4 (hatte mich vertan, ist PD2 - 4, nicht 3 - 5), dann ist das i.O. Offenbar aber nicht. Bitte mal den für Pete geposteten Code ansehen. @ Pete K. hier mal der Quellcode von lcd-routines.h (ist halt etwas viel):
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
Gast
#1683220
Der "Fehler" sollte in der Routine LCD_init liegen. Die ist glaube ich nicht für den Portwechsel (bzw. Pinwechsel) geeignet. Poste mal deine Routine + Portwunsch (C oder A). avr
@ AVR Hier mal den Code lcd-routines.c, in der die Funktion lcd_init enthalten ist. Es gibt außer einem kleinen main.c nur die beiden lcd-routines.c und .h. Der Portwunsch wäre PORTC, Pins wie im Original bei PORTD.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
79 | |
80 | |
81 | |
82 | |
83 | |
84 | |
85 | |
86 | |
87 | |
88 | |
89 | |
90 | |
91 | |
92 | |
93 | |
94 | |
95 | |
96 | |
97 | |
98 | |
99 | |
100 | |
101 | |
102 | |
103 | |
104 | |
105 | |
106 | |
107 | |
108 | |
109 | |
110 | |
111 | |
112 | |
113 | |
114 | |
115 | |
116 | |
117 | |
118 | |
119 | |
120 | |
121 | |
122 | |
123 | |
124 | |
125 | |
126 | |
127 | |
128 | |
129 | |
130 | |
131 | |
132 | |
133 | |
134 | |
135 | |
136 | |
137 | |
138 | |
139 | |
140 | |
141 | |
142 | |
143 | |
144 | |
145 | |
146 | |
147 | |
148 | |
149 | |
150 | |
151 | |
152 | |
153 | |
154 | |
155 | |
156 | |
157 | |
158 | |
159 | |
160 | |
161 | |
Gast
#1683365
Die Routinen scheinen OK. Hier für EN an PORTC PC3, RS an PORTC PC2 und Daten 4-7 an PORTC PC 4-7. wenn die verdrahtung stimmt sollte es gehn. (JTAG ist ja aus)
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
avr
Genauso hatte ich es gemacht und es ging leider nicht. JTAG hatte ich mit 2 x MCUCSR |= (1<<JTD); // JTAG (PORTC) abgeschaltet. Die Pins an PORTC sind danach schaltbar, habe es überprüft. PORTA bringt leider auch kein Ergebnis. Verdrahtung stimmt, PORTD geht ja. Noch eine Idee?
Gast
#1683472
Also in den Programmausschnitten ist nichts zu sehen. Gibt es im Programm noch Routinen die auf Port A bzw. C zugreifen bzw. Sonderfunktionen an den Pins aktivieren? Evtl. JTAG mal über die Fuses abschalten (wenn du ISP programmierst natürlich). avr
Nein, ich habe bewußt nur die LCD-Routine ein ein Mini-main.c zum Probieren:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
Die Fuses habe ich auch schon über das Makefile gesetzt.
benutze einen oder mehrere 74HC573 Latch parallel an einem Port, dann kannst du Daten Ausgeben und dem entsprechendem Latch sagen für wen Sie sind. Ich hatte damit schon einen EEPROM Programmierer gebaut da ich hier sehr viele Adress, Daten- und Steuerleitungen brauchte und zusätzlich ein LCD angeschlossen habe.
@ Thomas: Danke für die Info. Gibt es dazu evtl. auch noch ein Schaltplan als Beispiel und vor allen Dingen C-Software Beispiele? Bin ja schon mit der Schaltung von Ulrich Radig nicht klar gekommen.
ließ dir mal das Datenblatt durch wie alles funktioniert. Im Prinzip gibts du die Daten an einen Port aus und musst dann über einen anderen Port ein paar Steuerleitungen ändern. Daten vom Eingang einlesen und Daten aus dem Latch an den Ausgang geben, dann Eingänge wieder hochohmig schalten und der Latch hält das gespeicherte Signal an den Ausgängen vor. Dann gibts noch einen Transparenten Modus Eingang=Ausgang Wie man einen Ausgang ansteuerst kannst du dir im AVR Tutorial anschauen.
Danke Thomas, werde mir das einmal zu Gemüte führen.
Parallele Latches sind nur sinnvoll an größeren MCs mit externem Adreß-Datenbus. Und sie benötigen eine ganz erhebliche Layoutarbeit, um die vielen Leitungen zu routen. MCs ohne externen Bus erweitert man besser per SPI (74HC165/74HC595). Die sind außerdem kaskadierbar, d.h. man benötigt keine separaten Enable für jedes Register. Und das Layout wird auch deutlich einfacher. Peter
Die meisten LCD-Routinen haben das Problem, daß sie an vielen verschiedenen Stellen auf das LCD zugreifen. Vergißt man dann nur eine Stelle zu ändern, krachts. Macht man dagegen eine einzige Nibble-Funktion und ruft nur diese auf, ist das Ändern der Pins ganz easy und sicher: http://www.mikrocontroller.net/attachment/30300/lcd_drv.zip Peter
Hallo Peter, danke für den C-Code. Du ziehst verschiedene Ports an. Kann ich alles auf einen Port legen, z.B. PortC (muss dann natürlich JTAG abschalten)? Gruß Dietmar
Hier eine Lösung,um mit möglich wenig Portpins ein LC-Display mit einem ATmega anzusteuern: http://www.cczwei-forum.de/cc2/thread.php?postid=23657#post23657
Hallo Rolf, danke für die Info. Hardware verstanden, wo finde ich den C-Code dafür. Ein Tausch auf Atmega 32 dürfte ja wohl problemlos sein. Gruß Dietmar
Dietmar P. schrieb: > Du ziehst verschiedene Ports an. Kann ich alles auf einen Port legen, Ausnahmslos jede 6 IOs gehen, nur die Defines anpassen. Die LCD.C bleibt unverändert. Oder LCD mit einem Pin: Beitrag "LCD über nur einen IO-Pin ansteuern" Peter
@ Peter Dannegger (peda) >Macht man dagegen eine einzige Nibble-Funktion und ruft nur diese auf, >ist das Ändern der Pins ganz easy und sicher: Richtig, aber das ist im Code im Tutorial auch so. MfG Falk
Dietmar P. schrieb: > Hallo Rolf, > > danke für die Info. > > Hardware verstanden, wo finde ich den C-Code dafür. > Ein Tausch auf Atmega 32 dürfte ja wohl problemlos sein. > > Gruß > Dietmar Hier: http://www.cczwei-forum.de/cc2/thread.php?postid=24510#post24510 Gruß Rolf
Falk Brunner schrieb: > Richtig, aber das ist im Code im Tutorial auch so. http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung#Die_LCD_Routinen Also ich sehe da sogar 6 Nibble-Routinen, die alle geändert werden müssen bei Pinumordnung (beliebige Pins). Je 2 in lcd_data, lcd_command und lcd_init. Peter
@ Peter Dannegger (peda) >Also ich sehe da sogar 6 Nibble-Routinen, die alle geändert werden >müssen bei Pinumordnung (beliebige Pins). Eben DAS ist vom OP gar nicht gefordert bzw. nötig. "Die Software verwendet in der lcd-routines.h den PORTD. Der Port ist bei mir belegt. Wollte auf PORTC, oder PORTA ausweichen. Habe in lcd-routines.h aus dem "D" jeweils ein "C" bzw. "A" gemacht (PORTD --> PORTC, DDRD --> " Und genau das sollte funktionieren. Warum es bei ihm nicht geht, weiß der Geier. MFG Falk
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
