Forum: Mikrocontroller und Digitale Elektronik LCD und STK500


von Silas (Gast)


Lesenswert?

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

von Silas (Gast)


Angehängte Dateien:

Lesenswert?

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);

}
------------------------------------------------------------

von crazy horse (Gast)


Lesenswert?

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.

von Silas (Gast)


Lesenswert?

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 :(

von Joe (Gast)


Lesenswert?

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

von Silas (Gast)


Lesenswert?

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

von crazy horse (Gast)


Lesenswert?

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

von Silas (Gast)


Lesenswert?

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.

von Joe (Gast)


Angehängte Dateien:

Lesenswert?

probiers mal damit!

bitte sag mir, ob es dann funktioniert!

von Silas (Gast)


Lesenswert?

habs probiert aber das display zeigt weiterhin nur die 2 schwarzen
Balken :(

von Joe (Gast)


Lesenswert?

ja hast du die bits D0 - D3 auf GND gelegt?

von Silas (Gast)


Lesenswert?

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

von Nik Bamert (Gast)


Lesenswert?

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

von Joe (Gast)


Lesenswert?

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!

von Silas (Gast)


Lesenswert?

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

von Roc (Gast)


Lesenswert?

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?

von Nik Bamert (Gast)


Lesenswert?

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

von Roc (Gast)


Lesenswert?

Hallo ich nochmal. Wieso steht bei dir DDRD=0xFF?? Versuchs mal mit
DDRD=0x00

von Silas (Gast)


Lesenswert?

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.

von Silas (Gast)


Lesenswert?

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

von RoC (Gast)


Lesenswert?

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?

von Silas (Gast)


Lesenswert?

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?

von Joe (Gast)


Lesenswert?

hey,

ja wennst das Busy Bit nicht abfragen willt, dann kannst alle PINs
immer auf Out als DDRB = 0xFF einstellen ;-)

hth Joe

von RoC (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Silas (Gast)


Lesenswert?

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?

von RoC (Gast)


Lesenswert?

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.

von RoC (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Dieter B (Gast)


Lesenswert?

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

von Silas (Gast)


Lesenswert?

@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?

von RoC (Gast)


Lesenswert?

Das kann natürlich immer passieren.Was hast du denn genau für ein
Display?

von crazy horse (Gast)


Lesenswert?

naja, aber die Firmware des STK hat nichts mit dem Funktionieren eines
Programms in einem MC zu tun, der da drauf steckt.

von Silas (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab eine 4x20 DOTMATRIX LCD - Blau Negativ mit weisser LED von
Electronic Assembly.
Das Datenblatt ist im Anhang.

von RoC (Gast)


Lesenswert?

Mein Display ist auch von EA. Hast du gelesen,das bei deinem Typ der
Kontrast gegen VDD geregelt wird und nicht gegen Masse?

von Silas (Gast)


Lesenswert?

Ne hab ichnicht gelesen? Wo steht das denn? Was heisst das wenn der
Kontrast gegen VDD geregelt wird und nicht gegen Masse?

von RoC (Gast)


Lesenswert?

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.

von Silas (Gast)


Lesenswert?

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.

von Silas (Gast)


Lesenswert?

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.

von Dieter B (Gast)


Lesenswert?

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

von Silas (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.