Bascom Mehrere LCDs über Bus ansteuern

M@rco

Neues Mitglied
30. Juli 2011
30
0
0
Sprachen
  1. BascomAVR
  2. ANSI C
Hallo,

ich baue zur Zeit einen Midi-Footcontroller für meine Effektgeräte (19" Rack). Dabei habe ich an einem Atmega162 9 LCDs hängen.
Die Displays sind alle über Bustreiber (74HC245) parallel am AVR. Dieser kann über je eine Control-Leitung das jeweilige LCD anwählen und auf den Bus legen um es zu beschreiben. Alle anderen Bustreiber sind während dessen hochohmig.

Das ganze funktioniert auch fast :D

Folgendes Problem: wenn ich das Gerät einschalte, funktionieren alle Dieplays perfekt, es werden nur zwei oder drei (welches Display nicht funktioniert, scheint zufällig zu sein) nicht richtig initialisiert (der schwarze Balken wird angezeigt). Jetzt habe ich schon überall wo es was bringen könnte, kleine waitms eingebaut. Gebessert hat sich nicht viel, aber zuvor ging nur etwa die Hälfte der Displays.

Ich gehe schwer davon aus, dass ich nicht richtig initialisiere und somit die etwas langsameren Displays nicht richtig beschrieben werden. Habt ihr einen Lösungsvorschlag für mich?

Code:
$regfile = "m162def.dat"
$crystal = 1000000
$baud = 31250

'Ein- und Ausgänge definieren
Config Portb.4 = Output
Config Portb.5 = Output
Config Portb.6 = Output
Config Portd.5 = Output
Config Portb.1 = Output
Config Portb.0 = Output
Config Portd.4 = Output
Config Porta.3 = Output
Config Portb.7 = Output

Config Portc.3 = Input
Config Porta.6 = Input
Config Portc.7 = Input
Config Portc.4 = Input
Config Portc.6 = Input
Config Porta.7 = Input
Config Portc.5 = Input
Config Portc.2 = Input
Config Portc.1 = Input
Config Porta.5 = Input
Config Porta.4 = Input


'Alle LCD-Enables auf high
Portb.4 = 1
Portb.5 = 1
Portb.6 = 1
Portd.5 = 1
Portb.1 = 1
Portb.0 = 1
Portd.4 = 1
Porta.3 = 1
Portb.7 = 1

Dim Xnow As Byte
Dim Xold As Byte

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.6 , Db5 = Portc.0 , Db6 = Porta.2 , Db7 = Portd.7 , E = Porta.1 , Rs = Porta.0

Waitms 200

Gosub Lcd_cls

Waitms 200                                                  'LCDs löschen

Xold = 1
                                                   'Bei Start immer Bank1
Gosub Lcd_bank1

Waitms 100

'#########Hauptschleife##########

Do


If Pina.5 = 1 Then                                          'aktuelle Bank prüfen
   Xnow = 1
Elseif Pina.4 = 1 Then
   Xnow = 2
End If


If Xnow = Xold Then

   If Xnow = 1 Then
      Gosub Bank1_loop
   Elseif Xnow = 2 Then
      Gosub Bank2_loop
   End If

Else

   If Xnow = 1 Then
      Gosub Lcd_bank1
      Gosub Bank1_loop
   Elseif Xnow = 2 Then
      Gosub Lcd_bank2
      Gosub Bank2_loop
   End If

   Xold = Xnow
End If


Loop

End


Lcd_cls:                                                    'Alle LCDs löschen
Portb.4 = 0
Cursor Off
Cls
Portb.4 = 1
Waitms 50
Portb.5 = 0
Cursor Off
Cls
Portb.5 = 1
Waitms 50
Portb.6 = 0
Cursor Off
Cls
Portb.6 = 1
Waitms 50
Portd.5 = 0
Cursor Off
Cls
Portd.5 = 1
Waitms 50
Portb.1 = 0
Cursor Off
Cls
Portb.1 = 1
Waitms 50
Portb.0 = 0
Cursor Off
Cls
Portb.0 = 1
Waitms 50
Portd.4 = 0
Cursor Off
Cls
Portd.4 = 1
Waitms 50
Porta.3 = 0
Cursor Off
Cls
Porta.3 = 1
Waitms 50
Portb.7 = 0
Cursor Off
Cls
Portb.7 = 1
Waitms 50
Return


Lcd_bank1:

Gosub Lcd_cls
Portb.4 = 0
   Lcd "patch1.1"
   Waitms 50
Portb.4 = 1
Portb.5 = 0
   Lcd "patch1.2"
   Waitms 50
Portb.5 = 1
Portb.6 = 0
   Lcd "patch1.3"
   Waitms 50
Portb.6 = 1
Portd.5 = 0
   Lcd "patch1.4"
   Waitms 50
Portd.5 = 1
Portb.1 = 0
   Lcd "patch1.5"
   Waitms 50
Portb.1 = 1
Portb.0 = 0
   Lcd "patch1.6"
   Waitms 50
Portb.0 = 1
Portd.4 = 0
   Lcd "patch1.7"
   Waitms 50
Portd.4 = 1
Porta.3 = 0
   Lcd "patch1.8"
   Waitms 50
Porta.3 = 1
Portb.7 = 0
   Lcd "patch1.9"
   Waitms 50
Portb.7 = 1
Return


Lcd_bank2:

Gosub Lcd_cls
Portb.4 = 0
   Lcd "patch2.1"
   Waitms 50
Portb.4 = 1
Portb.5 = 0
   Lcd "patch2.2"
   Waitms 50
Portb.5 = 1
Portb.6 = 0
   Lcd "patch2.3"
   Waitms 50
Portb.6 = 1
Portd.5 = 0
   Lcd "patch2.4"
   Waitms 50
Portd.5 = 1
Portb.1 = 0
   Lcd "patch2.5"
   Waitms 50
Portb.1 = 1
Portb.0 = 0
   Lcd "patch2.6"
   Waitms 50
Portb.0 = 1
Portd.4 = 0
   Lcd "patch2.7"
   Waitms 50
Portd.4 = 1
Porta.3 = 0
   Lcd "patch2.8"
   Waitms 50
Porta.3 = 1
Portb.7 = 0
   Lcd "patch2.9"
   Waitms 50
Portb.7 = 1
Return


Bank1_loop:

    'Für dieses Verhalten unwichtig, hier stehen nur ein paar Print-Befehle

Return


Bank2_loop:

    'Für dieses Verhalten unwichtig, hier stehen nur ein paar Print-Befehle

Return
 
Also soweit ich weiß bietet Bascom die Möglichkeit ja berreits...
Die Bustreiber solltest weglassen können, außer es sind sehr viele Displays,
das Umschalten macht man eigentlich direct über die CS-Leitung, dann hast du das unten genannt
Problem nicht.

Das die Displays nicht richtig funzen könnte daran liegen, dass die gerade Abgeschalteten
Pins, durch den hochomigen Bustreiber "in der Luft liegen", du solltest also Pulldowns einsetzten...

Ich würde also an deiner Stelle die Bustreiber auf dauer an stellen, und nur als Bustreiber,
nicht zum Umschalten verwenden - das Umschalten erfolgt dann über die Steuerleitungen...

Ich hoffe ich konnte dir helfen!
 
Danke für deine schnelle Antwort.

Aber ich glaube nicht, dass Bascom von Haus aus neun LCDs ansteuern kann. Soweit ich weiß gibt es bloß ne Lib für 2 Displays, welche dann über die E Leitung gewählt werden?!

Mit meiner Schaltung bin ich mir eigentlich sicher. Denn wenn der µC was mit einem Display macht, dann ist auf jeden Fall ein Bustreiber aktiv und die Leitung hängt nicht in der Luft.

So langsam glaube ich, der µC hat einen Schuss. Beim proggen krieg ich jedes zweite Mal einen Fehler und vorhin hatte er bei einem Testprogramm Funktionen gezeigt (von Programm zuvor), die er eigentlich nicht mehr haben dürfte.

Oh mann, das hab ich mir einfacher vorgestellt. Am Samstag brauch ich das Teil und mein µC ist im A...., toll :(
 
Ich bin jetzt kein Bascom Experte (mehr) aber gab es nicht auch ein LCD Init Befehl?
Denn kanns der Lib ja sch.. egal sein wie viele LCDs da dran sitzen, zumindest solange die Bus Treiber genügend Strom liefern. Eigentllich müsste der AVR selber aber genug Power haben um 9 LCDs mit Daten zu versorgen. Ich meine das man in Bascom die interne Enable Handling abschalten konnte. Kannste ja von Hand machen.

Vorsicht, Pseudocode:
Code:
PORTC = 0b00000001 ' LCD1 wählen
LCD_INIT
PORTC = 0b00000010 ' LCD2 wählen
LCD_INIT
...
' und so in der Art beim Schreiben
PORTC = 0b01000000 ' 7. LCD wählen
Print("Hallo Welt")


Mit dem programmieren des Chips, senk mal die ISP Frequenz.
Wenn alles auf den Defaults ist sind die 100dickemilch KHz schon etwas knapp. Soll ja µC Frequenz (per Default 8MHz / 8) / 8 sein. Maximal. Weniger ist nie ein Problem, dauert das Programmieren nur vielleicht ne Sekunde länger.
 
Hi Marco,

laß die Waits doch mal weg und sag Bascom über "$crystal = 1100000" das der Atmel mit 1,1MHz läuft. Damit wird das Timing im Programm langsamer da ja der Atmel in Wirklichkeit immer noch mit 1MHz läuft. Dann sieh dir mal an ob damit alle LCDs sauber initialisiert werden.

Ein anderes Problem können evtl lange Kabelverbindungen sein die dir die Signale zu manchen LCDs schreddern. Das könnte man aber nur auf nem Foto vom Aufbau sehen.

Gruß
Dino
 
Danke für eure Tipps!

Die ISP-Frequenz hab ich bereits runtergesetzt, ich glaube der µC hat wirklich einen weg gehabt.

Ich bin jetzt auch den Mega8 umgestiegen, bei dem kenn ich mich wenigstens sicher dran aus.
Testweise hab ich mal das Display mit dem längsten Kabelweg angesprochen (alleine, alle anderen LCDs wurden vom Bus abgesteckt).

Jetzt habe ich eine Do-Loop-Schleife, welche das LCD beschreibt und 1sec wartet. Wenn ich den Enable vom Bustreiber (der 74HC245) VOR der Schleife aktiviere, dieser also Dauer-on ist, dann funktioniert alles bestens. Wenn ich aber den Enable IN der Schleife aktiviere, also da wo ich es auch benötige, dann geht nichts und der schwarze Balken in der ersten Zeile kommt. Die Kabellänge macht also nichts, es muss irgendwas anderes sein.

Das bringt mich jetzt völlig zur Verzweiflung. Dafür hab ich wirklich keine Erklärung. Höchstens Bascom hat mit dem Displaychip ein Problem, das ist der SPLC780.

Habt ihr noch ne Idee, was das sein könnte?
 
Hi Marco,

Die ISP-Frequenz hab ich bereits runtergesetzt, ich glaube der µC hat wirklich einen weg gehabt.
ich habe nicht von der ISP-Frequenz (für die Programmierung) gesprochen sondern vom Prozessortakt. Du benutzt scheinbar den internen Oszillator mit 1MHz. Wenn man das so läßt und Bascom mitteilt das der Prozessor mit 1,1MHz läuft, dann berechnet Bascom auf Basis der 1,1MHz das gesamte Timing. Da du aber nur mit 1MHz versorgst wird nun alles etwas langsamer ablaufen. Auf die Art und Weise kann man Timing-Probleme erkennen.

Jetzt habe ich eine Do-Loop-Schleife, welche das LCD beschreibt und 1sec wartet. Wenn ich den Enable vom Bustreiber (der 74HC245) VOR der Schleife aktiviere, dieser also Dauer-on ist, dann funktioniert alles bestens. Wenn ich aber den Enable IN der Schleife aktiviere, also da wo ich es auch benötige, dann geht nichts und der schwarze Balken in der ersten Zeile kommt. Die Kabellänge macht also nichts, es muss irgendwas anderes sein.

Das bringt mich jetzt völlig zur Verzweiflung. Dafür hab ich wirklich keine Erklärung. Höchstens Bascom hat mit dem Displaychip ein Problem, das ist der SPLC780.

Habt ihr noch ne Idee, was das sein könnte?

Ja. ;) Ich hab da noch ne Menge Ideen.

1. Timing auf deinen Leitungen zum Display.
Wenn du die Bustreiber abschaltest bzw anschaltest, dann benötigen sie ein wenig Zeit um komplett durchzuschalten und auch erstmal die Last der Eingänge des Displays aufzunehmen. Also direkt nach dem aktivieren oder deaktivieren so etwa 50µs warten. Die Zeit kann man durch Trial-n-Error etwas anpassen oder durch Messungen. Eine Messung verändert aber deine Signalsituation da du es im Tri-State-Zustand der Treiber mit "hochohmigen Leitungen" zu tun hast.

2. Die hochohmigen Leitungen spucken dir in die Suppe. Wenn die Bustreiber auf Tri-State stehen, dann könnten die Displays sich irgendwelchen Schmuzt an den Pins einfangen. Leg die Pins der Displays mal auf definierte Pegel. Vor allem den E-Pin (oder EX oder wie auch immer). Da ein High-Pegel am E-Pin das LCD aktiviert würde ich einfach mal nen 100kOhm oder 1MOhm von E nach GND legen um ein Einfangen von Störungen zu verhindern.

Soweit als erstes.

Noch was .... haben die Treiber UND die Displays Abblockkondensatoren (100nF) von Vcc nach GND? Gern gesehener Fehler wenn die fehlen. Kann funktionieren, muß aber nicht.

Ich würde einen Bustreiber benutzen um die Daten/Steuerleitungen aller LCDs dauerhaft zu versorgen (also D4-7 und RS für 4Bit-Betrieb) und nur die E-Leitung der einzelnen LCDs einzeln durchschalten. Das liefert stabilere Zustände auf den Leitungen.

Gruß
Dino
 
ich habe nicht von der ISP-Frequenz (für die Programmierung) gesprochen sondern vom Prozessortakt. Du benutzt scheinbar den internen Oszillator mit 1MHz. Wenn man das so läßt und Bascom mitteilt das der Prozessor mit 1,1MHz läuft, dann berechnet Bascom auf Basis der 1,1MHz das gesamte Timing. Da du aber nur mit 1MHz versorgst wird nun alles etwas langsamer ablaufen. Auf die Art und Weise kann man Timing-Probleme erkennen.
Dino

Das war auch auf TommyB's Antwort bezogen. Das mit dem Takt hab ich probiert, da hat sich nix gebessert.

Mittlerweile bin ich immerhin so weit, dass ich auf allen Displays zuverlässig das gleiche anzeigen kann. Also wenn alle Bustreiber aktiv sind. Daraus schließe ich, dass du wahrscheinlich Recht hast und die LCDs den Tristate Zustand nicht mögen. Ich probier das gleich mal mit nem Pulldown an E. Mal sehen obs dann geht :)

Blockkondensatoren hab ich dran, aber nur einen da der Bustreiber direkt huckepack auf dem jeweiligen LCD sitzt. Da sind nur ~1cm draht dazwischen, das sollte ausreichen.

Vielen Dank für die Tipps ;)

Gruß Marco
 
Also das Teil läuft endlich :) Vielen Dank für eure Hilfe!
 
Ja, es waren wirklich die Pullups an E.

Das Ergebnis will ich natürlich auch nicht vorenthalten. Wie schon beschrieben ist es ein Floorboard für Gitarristen, um Rack-Geräte per Midi zu steuern. Es gibt zwei Bänke mit je 9 Presets.
Die Fontplatte ist übrigens auf meiner Käsefräse (http://www.avr-praxis.de/forum/showthread.php?2794-CNC-Fr%E4se-aus-Multiplex) entstanden :)
 

Anhänge

  • image.jpg
    image.jpg
    242,6 KB · Aufrufe: 17
Hi Marco,

Ja, es waren wirklich die Pullups an E.
jaja ... offene Eingänge können wie Antennen arbeiten. :rolleyes:

Glückwunsch zum Endergebnis. Sieht doch garnicht schlecht aus. :tee:

Der Rahmen sieht nach Buche aus. Das Brettchen unter dem Hauptschalter? Nußbaum oder sowas?
Und die Front sieht ja auch irgendwie neckisch aus :cool: Irgendwo hab ich das Holzmuster auch mal gesehen.

Na dann arbeitet die Fräse ja auch zur vollen Zufriedenheit ;)

Gruß
Dino
 
Jawoll, die Fräse läuft super. Echt praktisch, das Ding :)

Zum Holz:
Der Rahmen ist Buche. Die Frontplatte selbst ist aus Spanplatte, furniert mit Vogelaugenahorn. Und das Brettchen unter dem Hauptschalter ist Zebrano.

Grüße Marco
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)