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
Gast
#4264551
Zeig dein Programm! Da es nicht funktioniert. ALles andere ist nur Kristallkugelmurmeln.
Gast
#4264556
Lukas G. schrieb: > Bastle momentan etwas mit LCD's rum. -------------------------------^------ --> http://www.deppenapostroph.info
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.
Gast
#4264570
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?
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 | |
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 | |
Ja ok LCDs
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?
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
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
Gast
#4264654
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 | |
und auf S. 248 die Zeile
1 | |
2 | |
und die Fußnoten 2 und 3
1 | |
2 | |
3 | |
bedeuten?
Gast
#4264756
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)
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.
Gast
#4264823
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?
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!
Gast
#4265237
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
Gast
#4265258
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
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.
Gast
#4266043
sieht aus wie das Standard 2x16 LCD (Pollin?). müssen da auf der Platine rechts nicht noch A und K angeschlossen werden ?
Ja theoretisch schon, für die Hintergrundbeleuchtung. Benötige ich aber nicht, darum hab ichs ausgelassen!
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.
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.
Gast
#4266121
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.
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..
Lukas G. schrieb: >
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
Ähm, wo wird denn das DDRC auf Output geschaltet?
Gast
#4266163
Könnte das helfen? Beitrag "ATMega16 und PORTC / JTAG Fuse"
Heinz V. schrieb: > Lukas G. schrieb: >>
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
> > Ähm, wo wird denn das DDRC auf Output geschaltet? Im Hauptprogramm. Beitrag "Re: LCD an PORTC ATmega8"
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
Ja ich weiss. Ist scheisse gemacht und sollte eigentlich mit in die Init Funktion. Aber: das ist nicht das Problem. Leider.
Kast schrieb: > Könnte das helfen? > > Beitrag "ATMega16 und PORTC / JTAG Fuse" Der Mega8 hat kein JTAG
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:
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
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.
Gast
#4266358
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. ;-)
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.
Gast
#4266489
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???
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.
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
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.
Gast
#4270847
> Scheinbar lag es daran, ...
Und woran hat es tatsächlich gelegen?
Gast
#4270852
Bernd schrieb: > Und woran hat es tatsächlich gelegen Am breadboard :-) ? Der Include war doch sicher schon auch bei der PortD-Variante im Spiel ...
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.


