Hallo,
ich steige gerade von Picaxe µC auf Atmel um. Ich möchte in C
programmieren, da ich hier Grundkenntnisse besitze. Ich habe ein
Evolution Board bei Pollin bestellt, welches in den Grundzügen auch
funktionieren sollte. Testprogramme konnte ich aufspielen. Als
Programmierumgebung nutze ich WinAVR und PonyProg zur Übertragung des
hex-files.
Ich möchte ein LCD Display ansteuern im 4 Bit Modus und habe dazu
folgende Verschaltung gewählt. Wie im Link
http://www.pocketmagic.net/?p=447
Dort kann man sich auch den Quellcode runterladen. Einzige Abweichung
zur Verschaltung ist, dass ich den Port D gewählt hab und er Port C. In
der Lcd.h habe ich #define LCD_PORT PORTD geändert.
Danach erstelle ich mit mfile ein makefile. Hier bin ich mir schon nicht
sicher bei der Vorgehensweise. Ich vergebe den Namen des mainfilenames
ATMegatest.c, als programmer hab ich bis jetzt pony-stk200 gewählt. Das
Board hab ich über ISP am COM 1 des PC hängen. Muss ich jetzt dort noch
die C Sourcesfiles für die lcd.h (also lcd.c) einbinden? Ok dann
makefile in den Ordner wo die mainfile ist abspeichern und dann wieder
zurück zum Programmer Notepad und unter Tools - Make All compilieren.
Dann hexfile mit ponyprog übertragen und es zeigt wie zuvor schon nur
schwarze Kästchen.
Ich bitte um Starthilfe soweit möglich. Hab diverse Interseiten schon
durchforstet und die oben aufgeführte schon als Einsteigerfreundlichste
empfunden.
Grüße
imidin schrieb:> ich steige gerade von Picaxe µC auf Atmel um.
Gut.
> Ich möchte in C> programmieren, da ich hier Grundkenntnisse besitze.
Auch gut.
imidin schrieb:> Evolution
Evaluation?
imidin schrieb:> Ich möchte ein LCD Display ansteuern im 4 Bit Modus und habe dazu> folgende Verschaltung gewählt. Wie im Link> http://www.pocketmagic.net/?p=447>> Dort kann man sich auch den Quellcode runterladen.
Wo?
Ein Link dazu würde die Suche sparen.
Außerdem gibt es auch hier im AVR-C-Tutorial ein LCD-Beispiel.
Nachdem das hier besser bekannt ist, wäre es sinnvoll wenn du es damit
versuchst, dann findet man hier auch leichter Hilfe.
> Einzige Abweichung> zur Verschaltung ist, dass ich den Port D gewählt hab und er Port C.
Warum?
Beim mega8 liegt auf Port D auch RxD und TxD. Damit es da keine
Kollisionen gibt, muß man natürlich die Jumper für die serielle
Schnittstelle abziehen.
imidin schrieb:> als programmer hab ich bis jetzt pony-stk200 gewählt.
Dann wundert es mich, daß es schon mal mit anderen Programmen
funktioniert haben soll.
War stk 200 nicht ein Parallelport-Programmierer?
Beim avrdude hieße das serielle Gemauschel des Pollin-Boards siprog.
Aber wenn du sicher bist, daß du so schon andere Programme flashen
konntest, soll es mir auch recht sein.
imidin schrieb:> n> der Lcd.h habe ich #define LCD_PORT PORTD geändert.
Anstatt einen Quelltext suchen zu müssen, den du eh nch geändert hast,
wäre es sinnvoller, deinen Quelltext zu zeigen.
Oder wie gesagt, du könntest gleich den von hier nehmen, der hat schon
oft funktioniert und ist gut bekannt.
imidin schrieb:> Das Board hab ich über ISP am COM 1 des PC hängen.
Das hat bei mir manchmal funktioniert, manchmal nicht.
Hauptsächlich abhängig vom PC, aber auch von der Windrichtung und
Mondstand.
Ein vernünftiger ISP-Programmierer ist keine Verschwendung und kostet
auch nicht die Welt; z.B. AVRISPmkII 40.00.
imidin schrieb:> Muss ich jetzt dort noch> die C Sourcesfiles für die lcd.h (also lcd.c) einbinden?
Die lcd.c ja, die lcd.h nicht.
Aber auch da kann man über dein Makefile nur spekulieren.
imidin schrieb:> Dann hexfile mit ponyprog übertragen und es zeigt wie zuvor schon nur> schwarze Kästchen.
Welches LCD? Wieviele Zeilen?
Wenn mehr als 1 Zeile: alle Zeilen mit schwarzen Kästchen, oder nur die
1. oder 1.+3.?
imidin schrieb:> Hab diverse Interseiten schon durchforstet
Das hiesige Tutorial wohl noch nicht... :-)
Außerdem wäre eine ordentliche Beschreibung deiner Verkabelung sinnvoll,
u.a. weil das Pollin-Board eine nicht gerade übersichtliche Nummerierung
der Pins hat.
So habe mir jetzt im Tutorial angepriesene Beispiel angeschaut und
irgendwie bekomm ich das auch nicht hin.
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
Habe die Dateien erstellt wie dort beschrieben.
- lcd-routines.h
- lcd-routines.c
- LCD_Test.c
Kompilieren bringt auch keine Fehler, aber nach erfolgreicher
Übertragung mit Ponyprog immer noch nur Balken. Im Übrigen ist auch hier
im Tutorial der Port D zum Einsatz gekommen. Bild zum Einstellungen in
AVR Studio habe ich eingefügt. Auch die Optimierung habe ich
eingeschaltet, wie im Tutorial beschrieben. Im Übrigen ist die
Beschaltung auch wie dort aufgeführt.
Ich bitte um Unterstützung.
So hier nochmal die Beschaltung des LCD. Eigentlich wie im Tutorial.
Einzige Abweichung ist, dass die Datenbits DB0 - DB3 auf GND gelegt
sind, damit sie ein definiertes Potential haben. Beim Picaxe war dies
nötig für das Display, da sonst gar nichts angezeigt wurde.
Die Jumper JP1 und JP2 sind für die RS232, da ich dort nichts
angeschlossen habe, sollte da auch nichts passieren. JP3 - JP8 sind für
die LED´s und Taster, liegen also parallel zur Wannenbuchse J4. Solange
ich kein Taster betätige, sollte dort doch kein Problem auftauchen. Und
JP9 - JP12 sind wohl für den EEPROM, der auch nicht bestückt ist. Ich
habe es allerdings auch schon mit allen Jumpern entfernt probiert. Kein
Erfolg.
Achso Entschuldigung, zur Erklärung des Schaltplanes. ATMEGA8 auf
Wannenbuchse JP4 (Tippfehler) und dann von Wannenbuchse JP1 (ist
Wannenbuchse JP4) auf das LCD Display. Als Verbindungskabel hab ich ein
40 pol Flachbandkabel aus dem PC genommen, die sollten ja 1:1 aufgebaut
sein.
Auf den ersten Blick sehe ich da keinen Fehler.
Die D0-D3 am LCD lasse ich immer offen.
Ob es stört, sie auf GND zu legen weiß ich nicht. Viele probieren es so
und scheitern, aber da man hier von den gescheiterten Versuchen hört,
kann es sein, daß es klappt.
- Hast du alle Verbindungen kontrolliert, ob sie
a) Durchgang haben (am besten vom AVR-Pin zum LCD) und
b) nicht mit Nachbarleitungen verbunden sind?
- Wo setzt du welche Frequenz (F_CPU) und wie ist dein AVR
wirklich getaktet?
Man kann leicht ein kleines Testprogramm brennen in der Art:
1
...
2
DDRD=0xff;
3
while("lockt das Weib")
4
{
5
PORTD=0xFF;
6
_delay_ms(500);
7
PORTD=0x00;
8
_delay_ms(500);
9
}
10
...
und an einem Pin von PORTD eine LED mit Vorwiderstand anschließen; dann
sollte die jede Sekunde einmal an- und ausgehen.
Wenn der Takt richtig daneben liegt, merkt man das damit schnell.
imidin schrieb:> Als Verbindungskabel hab ich ein> 40 pol Flachbandkabel aus dem PC genommen, die sollten ja 1:1 aufgebaut> sein.
Ja, die gehen.
Wenn man sie richtig rum nimmt.
Ausnahme: manche haben einen Pin blockiert im Stecker als
Verpolungsschutz. Dann sollten sie nicht in die Buchse passen.
Klaus Wachtler schrieb:> Man kann leicht ein kleines Testprogramm brennen in der Art:
... "flashen" fehlt hier noch.
Für diesen Schnelltest brauchst du gar kein eigenes Programm machen; man
kann diese Schleife einfach vor die sonstige Hauptschleife in deinem
Programm setzen und nach dem Test wieder löschen oder auskommentieren.
imidin schrieb:> Einzige Abweichung ist, dass die Datenbits DB0 - DB3 auf GND gelegt
Und was passiert, wenn Daten vom Display gelesen werden? Da werden die
Treiber auf DB[0..3] gar nicht mit einverstanden sein. Entscheidend ist,
was das Datenblatt sagt.
Hi
>Einzige Abweichung ist, dass die Datenbits DB0 - DB3 auf GND gelegt>sind, damit sie ein definiertes Potential haben.
Lass den Blödsinn. Der Displaycontroller hat interne
Pull-Up-Widerstände.
MfG Spess
Michael schrieb:> Und was passiert, wenn Daten vom Display gelesen werden? Da werden die> Treiber auf DB[0..3] gar nicht mit einverstanden sein. Entscheidend ist,> was das Datenblatt sagt.
Da ich RW auch dauerhaft auf GND gelegt hab und beabsichtige nur Daten
an das Display zu senden, sollte das uninteressant sein. Mit einen
Picaxe Controller hat es jedenfalls auf diese Art immer gut funktioniert
:)
Display ist ein LCD TC1602E-01 (Pollin).
Klaus Wachtler schrieb:> - Hast du alle Verbindungen kontrolliert, ob sie> a) Durchgang haben (am besten vom AVR-Pin zum LCD) und> b) nicht mit Nachbarleitungen verbunden sind?
Habe ich soeben extra nochmal gemacht. Direkt von Evalutionsboard bis
direkt zum LCD. Ebenso auch die benachbarten Pins geprüft. Nichts
gefunden, alles hatte durchgang wie nach Schaltplan gewollt.
Klaus Wachtler schrieb:> - Wo setzt du welche Frequenz (F_CPU) und wie ist dein AVR> wirklich getaktet?
Mit der Frage könnt ich etwas Hilfe benötigen :) Ich kann bei AVR Studio
bei General Options eine Frequenz einstellen, wo ich auch den
Controllertyp auswähle. Aber welche für den Atmega 8-16PU
Aber für das LCD würde ich den anderen Kram wie RxD und TxD und LEDs
komplett abklemmen.
Wie soll man denn Fehler finden, wenn keiner weiß, was du auf deinem
Board wie gemacht hast?
// Hier die verwendete Taktfrequenz in Hz eintragen, wichtig!
2
3
#ifndef F_CPU
4
#define F_CPU 3686400
5
#endif
Diese Option konnt ich bis jetzt noch nicht anpassen. Ich weiß leider
nicht ob der Atmega8 auf dem Evalutionsboard mit internen oder externen
Takt läuft und welche Frequenz eingestellt ist. Kann mir hier jemand
weiterhelfen? Auf welche F_CPU muss ich das im lcd-routines.h anpassen?
Im PonyProg hab ich die Configuration und Securitybits ausgelesen und
die sagen:
CKSEL3 -> x
CKSEL2 -> x
CKSEL1 -> x
CKSEL0 ->
Steht der Haken jetzt für 0 oder 1?
Im Datenblatt Atmeg8 steht für
0001 -> 1 Mhz
0010 -> 2 Mhz
0011 -> 4 Mhz
0100 -> 8 Mhz
Kann ich davon ausgehen das mein Controller moment mit 1Mhz Takt läuft?
charly98 schrieb:> so viel ich weiss ist auf dem pollin board ein 12 MHz quarz eingebaut.> du solltest mal kontrollieren, welche fuses gesetzt sind.
Ne ein 8 Mhz und zwei 16 Mhz Quarze.
jeder quarz ist für den zugehörigen sockel vorgesehen. wenn du den avr
in 1 MHz laufen lässt, läuft er mit eingebauten rc-kreis (d.h. der quarz
würde gar nicht benötigt).
schau dir mal an :
http://www.mikrocontroller.net/articles/AVR_Fuses
charly98 schrieb:> jeder quarz ist für den zugehörigen sockel vorgesehen. wenn du den avr> in 1 MHz laufen lässt, läuft er mit eingebauten rc-kreis (d.h. der quarz> würde gar nicht benötigt).> schau dir mal an :> http://www.mikrocontroller.net/articles/AVR_Fuses
Genau ich wollt ja auch nur erstmal den internen Clock benutzen. Da
spielen die Quarze keine Rolle.
Aus dem Datenblatt des Atmega8 hab ich folgendes entnommen.
> For resonators, the maximum frequency is 8MHz with CKOPT unprogrammed and >
16MHz with CKOPT programmed.
Ich möchte jetzt gerne mal auf die 16 Mhz umschalten und möchte
diesmbezüglich die Fuses ändern. Für 8 Mhz würde ich CKSEL 3...1 auf 111
und und CKSEL0 auf 1 oder 0 (je nach start up time) ändern. CKOPT auf 1.
Wie sieht das aber für 16 Mhz aus?
Die Einstellungen sind bei PonyProg etwas gewöhnungsbedürftig (Häkchen =
0)
Ich verwende den mySmartUSB - Programmer. Kann ich nur empfehlen. Damit
kann man direkt aus Bascom, AVR Studio, oder WINAVR programmieren und
bei den beiden Ersteren auch die Fuses auslesen oder setzen. Ein Kontext
über die Bedeutung der jeweiligen Einstellungen wird dann angezeigt.