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
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.
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?
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
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
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.
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!
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
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.
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.
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..
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
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.
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.