Forum: Mikrocontroller und Digitale Elektronik Problem Bascom / LCD mit Atmega16


von Peter Fuller (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin gerade dabei mir ein AVR Programm via Bascom
für den Atmega16 zu stricken, das einen Output am
LCD erzeugen soll. Mit AVRStudio klappt die Ausgabe
von "Hallo" ohne Probleme am LCD (s.Codelisting im Anhang)
aber ich versuche seit 2 Tagen ohne Erfolg via Bascom
mein LCD zur Anzeige zu bewegen. Man sieht aber nur schwarze
Blöcke in der ersten Reihe vom LCD - egal was man macht.

Die Konfiguration: 16x2 LCD, 4-Bit Ansteuerung,
alles auf Port C. PC0-PC3 = Data, PC4: RS, PC6: Enable

Hier ist mein Code:

$regfile = "M16def.DAT"
$crystal = 4000000

Config Lcd = 16 * 2
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 ,
Db7 = Portc.3 , E = Portc.6 , Rs = Portc.4

Cls
Lcd "Hallo"

End

Ich habe auch schon die Fusebits für JTag auf Disabled
gestellt, mit Xtal Clockspeed experimentiert und alles
mögliche probiert. Auch versuchsweise alles in den Optionen
eingestellt anstelle es im Code zu definieren. Da es mit AVRStudio
klappt, müsste es sich um irgendeinen Fehler handeln.
Was kann ich da falsch gemacht haben? Vielen Dank für Eure Tipps!

Gruss,

Peter

von HansHans (Gast)


Lesenswert?

Hallo,
wenn nur die erste Zeile  schwarzen ist
wird das LCD nicht initialisiert.

nimm mal das :
 Config Lcdbus = 4
ersatzlos raus, das gehört beim Pin mode da nicht rein.

ansonsten messe mal ob du überhaupt einen  Datenfluss auf den Leitungen
zum Lcd hast .

Gruß HH

von Christian (Gast)


Lesenswert?

Hallo,

HansHans hat recht. Du musst das LCD noch initialisieren! Vor deinem
"CLS" muss noch ein "Initlcd" rein. Dann müsste es klappen!

Gruß,
Christian

von Peter Fuller (Gast)


Lesenswert?

Hallo Christian und HansHans,

leider funktioniert es immer noch nicht...

Was könnte man noch probieren? Ich habe es gerade
mit AVRStudio wieder getestet - alles klappt.
Mit Bascom komme ich einfach nicht zum Ziel.

Gruss,

Peter

von stromi (Gast)


Lesenswert?

@Peter
nimm doch einmal das LCD-Demo Programm aus der Hilfe, setze deine
Pin-Belegung Prozessor- Quarz-daten rein und teste mal. das sollte
immer gehen.
MfG

von Andi (Gast)


Lesenswert?

Obwohl ich kein Freund von BASCOM bin habe ich das gerade nachvollzogen
und es funtzt.
Einfach unter Options -> Compiler -> LCD den Pin-Mode und die Port-Pins
für die 6 Signale einstellen.
Die 3 Config-Zeilen braucht man dann nicht angeben aber das InitLCD ist
wichtig.
Habe mir den Code im Debugger von AVR-Studio angesehen. Ist zwar nicht
gerade optimal aufgebaut aber es läuft.

MfG
Andi

von Peter Fuller (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Andi und stromi,

es ist wirklich zum verzweifeln...

Geht noch immer nicht. Hier ist der Screenshot meines
Option Menüs und hier der verwendete Code:

$regfile = "M16def.DAT"
$crystal = 1000000

Initlcd
Cls
Lcd "Hallo"

End

Es kommen immer nur schwarze Balken auf dem Display
und ich kann mir nicht die Ursache erklären.

Gruss,

Peter

von stromi (Gast)


Lesenswert?

@Peter
warum nimmst du nicht das beispiel, da werden die Pin's richtig
angegeben. In deinem Screenshot ist Bus UND Pin-Modus aufgeführt. In
deinem Source erklärst du nicht was du nun willst. Gib die config-
zeile für LCDPIN an :
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 ,
Db7 = Portc.3 , E = Portc.6 , Rs = Portc.4
MfG

von stromi (Gast)


Lesenswert?

@Peter
Ich vergas: du solltest dem Compiler auch noch von deinem LCD-Display
erzählen: zB.:
Config Lcd = 16 * 2
MfG

von stromi (Gast)


Lesenswert?

Das sollte laufen:
In der Config LCDPIN-Zeile den Umbruch rausnehmen !!


$regfile = "M16def.DAT"
$crystal = 1000000
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 ,
Db7 = Portc.3 , E = Portc.6 , Rs = Portc.4
Config Lcd = 16 * 2



Initlcd
Cls
Lcd "Hallo"

End

von Peter Fuller (Gast)


Lesenswert?

Hallo stromi,

leider immer das selbe Resultat :(

Ich komme einfach nicht dahinter. Wenn es mit meinem
Assemblercode läuft, muss es ja im Prinzip in dieser
Konfiguration auch laufen, oder?

Gruss,

Peter

von Andi (Gast)


Lesenswert?

Hast Du in Options > Compiler > Chip Deinen µC richtig eingestellt?
Wie flasht Du den µC? Mit BASCOM oder einem anderen Programmer wie z.
B. Pony-Prog?
Wenn mit anderem, benutzt Du den dann für Codes vom AVR-Studio und
BASCOM?

MfG
Andi

von HansHans (Gast)


Lesenswert?

Ich halte zwar nix vom Simulator ,
aber in dem Fall .... Zeigt das Lcd im
Simulator Fenster was an ?

hänge mal dein Programm als  xxx.bas
in den Anhang vielleicht ist da ein
Fehler in „Detail“

von HansHans (Gast)


Lesenswert?

Läuft den ein anderes Bascom Programm richtig ?
LED Blinken oder so ....

von Peter Fuller (Gast)


Angehängte Dateien:

Lesenswert?

Hallo HansHans, Andi und stromi,

nett, dass ihr mir (trotz später Stunde) helfen wollt.
Der Code ist im Anhang. Ich habe einen eigengen ISP
Adapter, flashe mit Bascom. Habe auch schon Ponyprog2000
versucht - gleiches Ergebnis. Der Programmer funktioniert
auf jeden Fall, da ich mir heute zum Spass eine LED
Laufanzeige mit Bascom programmiert habe (LEDs auf Port A)
Funktioniert ohne Probleme alles perfekt auf Anhieb. Das Problem tritt
nur mit dem LCD auf. Ich bin mit meinem Latein schon
ziemlich am Ende. Habe auch die Datenleitungen durchgemessen.
Seltsam (und unlogisch) ist nur, dass der Assemblercode
von AVRStudio funktioniert (gleiche Konfiguration).
Der Simulator von Bascom zeigt mir ein hübsches "Hallo"
am virtuellen Display. Funktioniert nur leider nicht
auf dem echten Display...

Gruss,

Peter

von stromi (Gast)


Lesenswert?

1 MHz Quarz und alles andere wie bei AVR-Sudio angeschlossen?
R/W vom Display an Masse ?

von Andi (Gast)


Lesenswert?

@stromi: Habe mit den AVR´s bisher nur in ASM was gemacht und jetzt
einfach mehr aus Neugier meine Basic-Erfahrung mit BASCOM
ausgebuddelt.
Komm mir vor wie damals zu den ZX81-Zeiten :-)
Habe aber ein kleines Problem mit folgendem Code:

Dim N as Byte
Cls
For N = 0 To 12
   Locate 1 , 2
   Lcd N;
   Wait 1
Next N

Dieses kleine Prog zeigt mir an Position 1,2 im LCD die Zahlen 0 bis 12
an im Abstand von einer Sekunde.
Komisch ist dabei, das wenn die 10 angezeigt werden soll der AVR,
M8535, einen Reset macht und von vorne (0) beginnt.
Setze ich die For-Schleife nur bis 8 dann kommt der AVR zum Ende und es
bleibt bei der 8.
Was muß man zur Ausgabe von Variablen auf das LCD beachten damit das
richtig funtzt?
Ne andere LCD-Lib oder ist der Bin to ASCII-Konverter fehlerhaft?

MfG
Andi

von Andi (Gast)


Lesenswert?

Shit, jetzt funtzt es!
Man nuß eine Variable zur LCD-Ausgabe vorher mit Str(n) in einen String
umwandeln.

Dim N as Byte
Dim A as String * 1

For N = 0 To 12
   Locate 1 , 2
   A = Str(n)
   Lcd A;
   Wait 1
Next N

BASCOM ist wohl doch etwas anders als Basic-Interpreter/Kompiler für PC
etc.

MfG
Andi

von stromi (Gast)


Lesenswert?

@Andi
so viel Ahnung habe ich nun auch nicht, ausser daß du du die
Formatanweisung bei Ziffern über 9 (oder unter 10) benutzen könntest,
wüsste ich nicht warum der ab geht. habe ich so auch schon gemacht...

von HansHans (Gast)


Lesenswert?

@Peter
Das Programm ist OK, das läuft im meinem
Mega16 mit LCD 16x2
nach anpassen auf meine Hardware mit
$crystal = 4000000
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 ,
Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2

von stromi (Gast)


Lesenswert?

@hanshans
ich schätze r/w nicht auf Masse.... ist mir auch schon passiert.

von Andi (Gast)


Lesenswert?

Wenn r/w am µC angeschlossen ist, z. B. an PortD.6, läßt sich das wie
folgt lösen:

 sbi ddrd,6   'r/w-Pin als Ausgang setzen
 cbi portd,6  'und auf GND ziehen
 InitLCD      'Erst danach das LCD-Initiallisieren

Hatte früher in ASM das LCD mit Busy-Abfrage betrieben und bin jetzt
wegen ISR-Ausgabe davon weg gekommen.
Mußte das jetzt also auch so machen.

MfG
Andi

von stromi (Gast)


Lesenswert?

@andi
jo. aber in diesem Fall wird R/W nicht gebraucht, also an Masse.
Hast du noch so'n ZX81 ? Das war'n noch Zeiten....... Ja Ja..

von Andi (Gast)


Lesenswert?

@stromi: Kann man in BASCOM die Ausgabe auf das LCD eigentlich timen z.
B. auf 16 mal je Sekunde damit der µC weniger mit der LCD-Ausgabe
beschäftigt ist?
Ich denke da an Buffer-Betrieb etc.

MfG
Andi

von Andi (Gast)


Lesenswert?

@stromi: GND ist doch Masse, cbi portd,6 = Port-Pin D6 auf Masse
schalten = Write-Mode.

MfG
Andi

von HansHans (Gast)


Lesenswert?

Ich habe noch einen ZX81 im Schrank stehen ....
lang lange  her
Nacht ....
HH

von stromi (Gast)


Lesenswert?

@Andi
ich würde eine Sekunde immer mit Timerinterupt machen, die LCD-Ausgabe
ohne CLS machen. Nur beim Programmstart und bei Menue-Wechssel. Alles
mit Locate-Befehlen. Da flackert die LCD-Anzeige nicht rum. Dafür muss
man natürlich immer wissen was da vorkommen kann, nicht das da alte
Textteile im Display stehen weil der neue Text kleiner ist. Den dann
mit Leerzeichen auffüllen.
Aber jeder wie er es mag. Die Fehler suchen ist immer noch am
aufwendigsten. Dann fällt es wie Schuppen aus den Haaren... wie konntst
du das verdaddeln...
MfG

von Ratber (Gast)


Lesenswert?

@Peter Fuller


Nochmal langsam zum mitschreiben.


Du hast bei Bascom im Grunde Zwei Möglichkeiten das LCD zu
konfigurieren.

Entweder in den Compilereinstellungen oder im Quellcode.
Was davon nun Sinvoller ist will ich hier nicht diskutieren.
Das muß jeder selber entscheiden.
Auf jedenfall ist nur eine Methode zulässig da du sonst gefahr läufst
gegensätzliche Anweisungen zu geben.



Nun fasse ich mal zusammen was du geäußert haat.

Du hast mit Bascom und einigen LED's ein Lauflicht zum laufen gebracht
also schließe ich daraus das der Controller und Bascom schonmal
zusammenarbeiten.

Desweiteren hast du in den Compilereinstellungen und den Fusebits
rumexperimentiert also schließe ich daraus das du weißt was du tust.

Bleibt also nur ein einfacher Fehler in der Logik.



Ich nutze mein LCD (Und noch andere Sachen wie Tastaturen usw.) seit
geraumer Zeit fast nur noch über I2C um Ports zu sparen also weiß ich
nicht mehr genau wie ich es anfangs gemacht habe aber ich meine ich
hätte den Port C mit "Config Portc = Output" definiert bevor ich die
einzelene Pins für das LCD angegeben habe um das Problem an Port C mit
dem Jtag zu umgehen.

Also mal eben diese Zeile zwischen "$Crystal...."  und "Config
Lcdpin....." setzen und schauen obs das ist.
Kostet nur einige Sekunden Arbeit.

Inzwischen versuch ich mal ein altews Listing rauszukramen wo ich das
LCD noch direkt angesteuert habe


Ratber

von Peter Fuller (Gast)


Lesenswert?

ES FUNKTIONIERT!!!!!!!!!!!!!!!!!!!!!!!!!!

Danke Ratber! Config Portc = Output war die Lösung

Danke auch an alle vom Herzen für die Tipps!

Ich gehe jetzt schlafen.

Grüsse,

Peter

von Ratber (Gast)


Lesenswert?

Aha,hat sich die Buddel Tai Ginseng letztens doch noch rentiert. gg

von Soulmaster (Gast)


Lesenswert?

Habe mit den gleichen Problemen gekämpft. Vielen Dank auch von mir. Ich 
denke die BASCOM LCD-DEMOS sollten mal für Port C überarbeitet werden.

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.