Hallo alle zusammen, Ich habe ein LCD (4x20, HD44780) an ein STK500 mit nem ATMEGA163L an Port D angeschlossen. Ich möchte das Display in C mit CodeVisonAVR im 4-Bit-Mode programmieren bzw ansteuern. Meine Pin-Belegung ist wie folgt: LCD-Pin 1 --> GND (VSS) LCD-Pin 2 --> VTG +5V (VDD) LCD-Pin 3 --> GND (VEE) LCD-Pin 4 --> PORT D0 (RS) LCD-Pin 5 --> PORT D1 (R/W) LCD-Pin 6 --> PORT D2 (E) LCD-DPin 7 LCD-DPin 8 LCD-DPin 9 LCD-DPin 10 LCD-DPin 11 --> PORT D4 LCD-DPin 12 --> PORT D5 LCD-DPin 13 --> PORT D6 LCD-DPin 14 --> PORT D7 Diese Belegung schreibt der CodeWizard im CodeVision vor und unterscheidet sich mit der Belegung hier im Tutorial. Daher meine erste Frage: Warum die unterschiedliche Belegung wenn ich in C progen will und "nicht" in Assembler? 2. Im Anhang ist ein kleines C-Programm welches aber nicht zu funktionieren scheint. Das Display zeigt immer nur die 2 typischen schwarze Balken in der 1. und 3. Reihe, selbst wenn das Flash gelöscht wurde. Das Display wird irgendwie nicht initialisiert. Ich sitz jetzt schon 2 tage dran, hab dieses Forum schon durchforstet aber es hat nix gebracht. Das mit dem 10k Poti hab ich auch schon versucht aber vergeblich die balken werden lediglich ein bisi grauer. 3. Dann hab ich da noch eine Frage: ist es möglich eine ältere Firmware auf dn STK500 zu laden ? Wenn ja dann wie und wo bekomm ich ne ältere version her? Bei ATMEL hab ich schon geschaut
Sorry hier nochmal der source code: ----------------------------------------------- #include <mega163.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x12 ;PORTD #endasm #include <lcd.h> // Declare your global variables here void main(void) { // Declare your local variables here // Input/Output Ports initialization // Port A initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00; // Port D initialization // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0 PORTD=0x00; DDRD=0xFF; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped TCCR0=0x00; TCNT0=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2 output: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off GIMSK=0x00; MCUCR=0x00; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; UBRRHI=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off // Analog Comparator Output: Off ACSR=0x80; SFIOR=0x00; // LCD module initialization lcd_init(20); lcd_gotoxy(0,0); lcd_putsf("Hello"); while (1); } ------------------------------------------------------------
zu1: erstmal ist die Belegung völlig wurscht, die 4 Datenleitungen sollten aber aus Gründen eines einfacheren und schnelleren Programms in einem Nibble bleiben. Wenn du Routinen des Compilers diese Belegung voraussetzen, musst du es auch so anschliessen (oder selbst neue Routinen hinzufügen). zu2: ich kenne den Meaga163 nicht, folgende Möglichkeiten fallen mir auf die Schnelle ein: -freigegebene Sonderfunktionen des PORTD? (beim Mega16 ist. z.B. JTAG auf PortC eine beliebte Anfängerfalle) -hat der Mega163 getrennte Einstellung des I/O-Clock? Wenn ja, überprüfen, sonst stimmt das Timing nicht. zu3: Warum willst du das tun? Zu jeder Version von AVRStudio gehört die entsprechende Board-Software und kann von da aus geladen werden.
ich kenn mich mit dem ganzen leider nicht so gut aus aber das hier ist alles was ich über den Port D des ATMEGA163L gefunden habe: Port D is an 8 bit bi-directional I/O port with internal pull-up resistors. Three I/O memory address locations are allocated for Port D, one each for the Data Register PORTD, $12($32), Data Direction Register DDRD, $11($31) and the Port D Input Pins PIND, $10($30). The Port D Input Pins address is read only, while the Data Register and the Data Direction Register are read/write. The Port D output buffers can sink 20 mA. As inputs, Port D pins that are externally pulled low will source current if the pull-up resistors are activated. ------------------------------------ Port Pin | Alternate Function ------------------------------------ PD0 | RXD (UART Input Pin) PD1 | TXD (UART Output Pin) PD2 | INT0 (External Interrupt 0 Input) PD3 | INT1 (External Interrupt 1 Input) PD4 | OC1B (Timer/Counter1 Output CompareB Match Output) PD5 | OC1A (Timer/Counter1 Output CompareA Match Output) PD6 | ICP (Timer/Counter1 Input Capture Pin) PD7 | OC2 (Timer/Counter2 Output Compare Match Output) ---------------------------------------------------------------- The Port D Input Pins Address PIND is not a register, and this address enables access to the physical value on each Port D pin. When reading PORTD, the PORTD Data Latch is read, and when reading PIND, the logical values present on the pins are read. Port D as General Digital I/O PDn, General I/O pin: The DDDn bit in the DDRD Register selects the direction of this pin. If DDDn is set (one), PDn is configured as an output pin. If DDDn is cleared (zero), PDn is configured as an input pin. If PDn is set (one) when configured as an input pin the MOS pull up resistor is activated. To switch the pull up resistor off the PDn has to be cleared (zero), the pin has to be configured as an output pin, or the PUD bit has to be set. The Port D pins are tri-stated when a reset condition becomes active, even if the clock is not running. ------------------------------------------------------------------ weiss nicht ob das etwas hilft, mir sagt das nicht viel :(
Hey, also ich denk ich hann dir da weiterhelfen. Hab das selbe Problem mit meinem diaplay gehabt! Beimir ist sogar die Pinbelegung die selbe wie bei dir und ich verwende auch einen Mega16. Also wenn du willst kannst ich dir mein ASM-File geben, dann hast was das funktioniert. Zu deinem Problem, du musst nachdem du das Display intitalisiert hast 50ms warten, bis du das erste Zeichen in den Display RAM schreibst, sonst übernimmt er's nicht, bin selber 2 stunden wie doof vor dem Ding gesessen grr würd mich über eine Rückmeldung freuen, weil ich selber noch ein paar mysterien lösen möchte ;-) hth Joe
gibt es hier denn niemanden der mir hier weiterhelfen kann? Jemand der schon mal ein 4x20 LCD (HD44780) an ein STK500 angeschlossen hat (4-bit-mode) und mit codevisionAVR programmiert hat könnte mir ein funktionierendes Code-Beispiel schicken. Damit wär ich schon zufrieden. Ich sitz schon den dritten tag an dem ganzen mist hier und komm einfach nicht weiter :(( Also erbarmt Euch meiner plz
könnte ich machen, aber ob es dir viel helfen würde?? Das meiste bleibt ja sowieso in den Tiefen des Compilers verborgen. Einzige Unterschied bei mir: PortD=0x00, DDRD=0x08 (Bit3 benutze ich als Ausgang für die Beleuchtung des Displays) Kommt ja dann sicher auch auf die Compilerversion an. Welche hast du denn? An sich funktionieren die LCD-Routinen von CV problemlos. Ist denn das Display wirklich i.O.?
Das Display ist nagelneu und funktioniert auch, ich hab es mal geschafft das zumindest mal der Cursor oben links bzw. unten rechts zu sehen war, aber das war mit Assembler und bevor ich die neue Firmware draufgespielt habe. Deshalb anfangs meine frage wegen der alten Firmware. Ich benutze CodVisionAVR Verison 1.24.2c keine ahnung, welche version der compiler hat.
meine belegung der pins hab ich doch schon im threadanfang aufgeführt, bei mir liegen pin1(GND-Display) und pin3(Contrast-Displayspannung) vom display auf GND
Hi! Ja, aber zu den d0-d3 hast du nichts besonderes geschrieben, wenn das heissen soll das die nicht angeschlossen sind, dann solltest du diese mit GND verbinden. MFG Nik
stimmt, genau das hab ich gemeint, wenn D0-D3 nicht auf GND liegen, dann hast 4 undefinierte Datenleitungen und der Controller vom Display weiß nicht wie das zu interpretieren ist!
das ist mir neu, das hab ich bis jetzt in keinem Tutorial gelesen, aber gut ich hab die freien DatenPins auf GND gelegt. Nach wie vor keine Veränderung
Also ich hab bis jetzt nur ein 2x16 LCD am STK500 bzw. STK501 betrieben. Allerdings hab ich das Display am PortC. Hast du`s mal an einem anderen Port versucht?
Hi! Ich hatte mal ein Problem mit dem einsgestellten Jtag-Flag. Dies hatte zur folge das der Controller nur noch ca. 2volt maximal rauslies. Somit reichte dies dann nicht für einen high pegel(TTL). Dieses Fusebit war übrigens schon eingestellt, als ich den Controller geliefert bekam. Vieleicht ist dies bei dir ja auch der Fall. Nik
Hab schon alle Ports ausprobiert, ohne Erfolg das mit dem Jtag-flag ist es auch nicht, hab die spannungen am Diplay und am Port gemessen, ist jedesmal 5V bzw 4,95V DDRD=0x00 hab ich versucht, geht auch nicht auf 0xFF hab ich angegeben weil ich die PINs 0-7 am PORT auf out gestellt habe, schien mir logisch zu sein.
kann mir jemand die LCD-Routinen vom Tutorial (bzw die Routinen die das AVR Studio benutzt) so um schreiben das ich mit meiner Pinbelegung auch mit Assembler bzw AVR Studio progn kann? thx
Ich hab dein Programm mal für meinen mega128 modifiziert und ausprobiert und es funktioniert. Hast du im Codevision unter <Projekt><Configure> alle Einstellungen überprüft?
ich denke schon das ich das gemacht habe, aber du kannst mir gern mal deine einstellungen durchgeben. hast du dein display auch am portD angeschlossen ? wie stellst du deine Pins am Port ein, welche auf out und welche auf in?
hey, ja wennst das Busy Bit nicht abfragen willt, dann kannst alle PINs immer auf Out als DDRB = 0xFF einstellen ;-) hth Joe
Moin, hab das Display sowohl an PortD als auch an PortC angeschlossen und getestet.Funktioniert bei beiden. Die Initialisierung von DDRD ist auch egal. Es klappt mit 0x00 und auch mit 0xFF. Ich hab mal meine Einstellungen im Anhang. Kannst Du dir ja mal anschauen.
danke für Deine Mühen, meine Einstllung unterscheidet sich in ein paar punkten von Deinen. 1. ich hab 4MHz eingestellt anstatt 16, aber das liegt warscheinlich daran das dDu nen ATMega128 hast und ich nen ATMega163L 2. ich hab bei "After Make" nícht das "Merge Data from a.ROM...." eingestellt, weiss auch nicht wozu. 3. Ist mehr ne Frage: Warum hast du bei "Chip Programming Options" , "Programming_disabled" eingestellt? Dann kann ich ja den Chip garnicht neu programmieren, oder seh ich das falsch?
1.die Einstellung ist vom Quarz abhängig.Da ich nen 16MHz-Quarz an meinem ATmega128 habe, muss ich auch 16MHz Clock einstellen. 2.das hab ich auch nur mal testweise gemacht.Wenn ich das richtig verstanden habe,dann wird beim aktivieren dieser Option der Inhalt der vom Compiler erzeugten .ROM-File mit der .Rom-File im angegebenen Pfad vermischt. Das soll z.B. beim Einsatz eines Bootloaders nützlich sein. Hab ich aber auch nur mal testweise aktiviert. Hat für die Funktion deines Programmes keine Auswirkungen gehabt. 3.Diese Option kann man aktivieren damit niemand anderes dein Programm ändern kann. Hat aber für die Funktion keinen Einfluss. Hab jetzt im Moment aber auch keine Idee mehr weshalb es bei dir nicht funktioniert.
So ich nochmal. Hab mir nochmal deine Pinbelegung vom Display angesehen. Ich weiß jetzt nicht wie das bei deinem Display ist, aber bei meinem liegt Pin 3 nicht direkt auf Masse, sondern dort stell ich über nen Poti den Kontrast ein. Kann natürlich sein, dass das bei Deinem Typ wieder anders ist. Aber schau vorsichtshalber nochmal nach. Ich hab dir mal ne Skizze angehangen,wie das in meinem Fall ist.
Hallo Da ich das STK 500 nicht so genau kenne frage ich einfach mal. Wie sieht deine Spannungsversorgung aus? STK500 und LCD haben aber die selbe Masse. Es auch ein beliebter Fehler am Anfang. MFG Dieter
@Dieter der STK500 wird mit 12V versorgt, das Display mit 5V. @Roc das mit dem Poti hab ich schon versucht, ich hab den verdacht das es etwas mit dem FirmwareUpdate zu tun hat welches ich letzte Woche vorgenommen habe. Denn davor konnt ich zumindest den Cursor blinken sehn, aber jetzt geht garnix mehr. Kann es sein das beim update was schief gelaufen ist?
naja, aber die Firmware des STK hat nichts mit dem Funktionieren eines Programms in einem MC zu tun, der da drauf steckt.
Ich hab eine 4x20 DOTMATRIX LCD - Blau Negativ mit weisser LED von Electronic Assembly. Das Datenblatt ist im Anhang.
Mein Display ist auch von EA. Hast du gelesen,das bei deinem Typ der Kontrast gegen VDD geregelt wird und nicht gegen Masse?
Ne hab ichnicht gelesen? Wo steht das denn? Was heisst das wenn der Kontrast gegen VDD geregelt wird und nicht gegen Masse?
Oh, sorry. Hab wahrscheinlich das falsche Datenblatt gelesen. Schreib mal bitte die genaue Typbezeichnung und am besten noch deine Schaltung dazu, wie Du das Display angeschlossen hast.
Das Datenblatt von meinem Display ist im Anhang LCD.zip (siehe Thread weiter oben: 28.04.2004 13:32), die Schaltung ist ganz am anfang vom Thread, mit dem Unterschied das D0-D3 jetzt auch auf GND liegen.
ich glaub langsam echt das display ist kaputt, ich hab jetzt alles versucht, avrStudio, CodeVisionAVR und zu guter letzt Bascom und nicht einmal hier tut sich was. Das Display zeigt immer nur die 2 schwarzen Balken egal was ich mach, aaaargh.
Hallo Silas 2 schwarze Balken sind doch schonmal nicht schlecht. Ich vermute immer noch einen Hardware Fehler bei dir. Du sagst dein STK500 wird mit 12 Volt versorgt und das LCD mit 5 Volt. Hast du die beiden Minus Pole der beiden Spannungsquellen verbunden ? Sonst wird das nichts. MFG Dieter
@Dieter Welche beiden Spannungsquellen? meinst du jetzt das board mit den 12v und das Display mit den 5v? Das Board gibt die 5V auf den Port andem das Display hängt. Welche beiden Minus Pole meinst Du?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.