Bascom DOGM163 SPI Bascom spinnt

fofi1

Mitglied
09. Jan. 2010
116
1
18
Sprachen
Servus,

ich will hier so ein nettes kleines DOGM 163 (3x16 Zeichen) über SPI ansteuern. Nun hab ich aber (nachdem ich mir 2 Stunden hunderte Seitden Datenblätter reingezogen habe ;) ) ein Problem: Der Chip hängt sich auf. Leider habe ich am Wochenende keinen Logic Analyser zur Verfügung um zu schauen was aufm Bus los ist, aber vllt sitz ich auch nur aufm Schlauch.

Sorry, der Code sieht leicht unübersichtlich aus wegen der ganzen Debugversuche, aber man verstehts recht schnell. Die letzte Ausgabe die ich bekomme ist: "Pins gesetzt" . Danach hängt er, also wohl der SPI Befehl.

Code:
$regfile= "m168def.dat"
$crystal=  8000000
$baud = 19200
$hwstack = 40
$swstack = 32
$framesize = 60


'*************************************LCD***************************************
Config Spi = Hard , Interrupt = Off , Data_order = Msb , Master = Yes , Polarity = High , Phase = 0 , Clockrate = 16 , Noss = 1 , Spiin = 0

Print "spi conf fertig"


'*************************************VAR***************************************
Dim Spi_temp As Byte

'*************************************I/O***************************************

Config Portd.5 = Output                                     'Summer
Summer alias Portd.5

Config Portd.6 = Output                                     'Led_links
Led_links alias Portd.6

Config Portd.7 = Output                                     'Led rechts
led_Rechts alias Portd.7

Config Portc.3 = Output                                     ' Interrupt Pin
Int_Pin alias Portc.3

Config Portc.2 = Output
Rs485_dir Alias Portc.3

Config Portb.1 = Output                                     '0=Schreiben
Rs Alias Portb.1

Config Portb.2 = Output
Inv_cs Alias Portb.2


Config Pinc.1 = Input                                       'Optokopplerstufe
Opto Alias Pinc.1

Config Pind.2 = Input
Enc_links Alias Pind.2

Config Pind.3 = Input
Enc_rechts Alias Pind.3




'***********************************LCD_INIT************************************
Reset Rs
Reset Inv_cs

Print "Pins gesetzt"

Spi_temp=&H39
Spiout Spi_temp , 1                                         '8 Bit, 3 zeilen-->Instruction Table1
Print "1"

Waitms 2

Spi_temp = &H1D
Spiout Spi_temp , 1                                         ' 3-Zeilen
Print "2"

Waitms 2

Spi_temp = &H50
Spiout Spi_temp , 1                                         'Booster aus
Print "3"

Waitms 2

Spi_temp = &H6C
Spiout Spi_temp , 1                                         'Spannungsfolger
Print "4"

Waitms 2

Spi_temp = &H7C
Spiout Spi_temp , 1                                         'Kontrast
Print "5"

Waitms 2

Spi_temp = &H38
Spiout Spi_temp , 1                                         'Zurück zur Instruction Table0
Print "6"

Waitms 2

Spi_temp = &H0F
Spiout Spi_temp , 1                                         'LCD an, Cursor blinken
Print "7"

Waitms 2

Spi_temp = &H01
Spiout Spi_temp , 1                                         'CLS LCD, HOME
Print "8"

Waitms 2

Spi_temp = &H06
Spiout Spi_temp , 1                                         'Auto Increment Cursor

Print "LCD INIT OFF"


'###############################################################################
'#############################   MAIN  #########################################
'###############################################################################

Do

Toggle Summer
Waitms 500
Print "Main"

Loop
End


Ich wäre euch echt super dankbar falls ihr mir auf die Sprünge helft, ich bin nach 3 Stunden versuchen am Ende.

EDIT: ARGH!"!! Ich fress 5 Besen auf einmal! Hab ich doch den SPIinit vergessen....Boah bin ich blöd. Wenn noch fragen kommen sollten stelle ich sie hier rein, also bitte trotzdem offen lassen ;)

Mfg,
Flo
 
Ok Fehlentwarnung :p . Wäre auch zu schön gewesen. Also das Programm läuft jetzt (oh Wunder) durch. Aber ich bekomm das LCD nicht zum sprechen. Ich initialisiere es nach der Vorgabe des Datenblattes von EA ( http://www.lcd-module.de/pdf/doma/dog-m.pdf ). Danach versuche ich es mit Text zu füttern wie im Datenblatt des verbauten LCD-IC beschrieben: http://www.lcd-module.de/eng/pdf/zubehoer/st7036.pdf .

Ich fahre erst das Register 00 im DDRAM an und dann schreibe ich den Buchstaben P (laut Liste &B00000101) hinein. Angezeigt bekomme ich ihn aber nicht. Ich denke sogar dass der Grundinit nicht passt. Die Wartezeiten zwischen den SPI Befehlen sind überall im Datenblatt verstreut und ich habe mich daher auf eine ausreichende zeit von 2ms zwischen den Befehlen entschieden. Da muss das LCD dann wirklich alles verarbeitet haben ;) .

Code:
Reset Rs
Reset Inv_cs

Print "Pins gesetzt"

Spi_temp=&H39
Spiout Spi_temp , 1                                         '8 Bit, 3 zeilen-->Instruction Table1

Waitms 5

Spi_temp = &H1D
Spiout Spi_temp , 1                                         ' 3-Zeilen

Waitms 5

Spi_temp = &H50
Spiout Spi_temp , 1                                         'Booster aus

Waitms 5

Spi_temp = &H6C
Spiout Spi_temp , 1                                         'Spannungsfolger

Waitms 5

Spi_temp = &H7C
Spiout Spi_temp , 1                                         'Kontrast

Waitms 5

Spi_temp = &H38
Spiout Spi_temp , 1                                         'Zurück zur Instruction Table0

Waitms 5

Spi_temp = &H0F
Spiout Spi_temp , 1                                         'LCD an, Cursor blinken

Waitms 2

Spi_temp = &H01
Spiout Spi_temp , 1                                         'CLS LCD, HOME

Waitms 5

Spi_temp = &H06
Spiout Spi_temp , 1                                         'Auto Increment Cursor

Print "LCD INIT OFF"

Waitms 5



Spi_temp = &B10000000                                       'Nun kommt Register0
Spiout Spi_temp , 1

Set Rs
Waitms 5

Spi_temp = &B00000101                                       ' Schreibe ein P in Register0
Spiout Spi_temp , 1

Hat wer ne Idee warums nicht geht?
 
Hallo fofi,

sieh dir mal die Projekte von Markus an. Der hat eigentlich immer die Displays von ElectronicAssembly verwendet. eventuell hilft dir das ja weiter. Ich hab hier zwar auch ein 3zeiliges und ein GLCD in gleicher Größe rumliegen (als Testobjekt mal besorgt) aber noch nicht in Betrieb gehabt.

Gruß
Dino
 
Hi Dino,

danke für den Tipp, aber anscheinend hat er sie nur im 4 bit parallel Modus angesteuert.

Mfg,
Flo
 
Fehler gefunden...mein Hirn. Das DOGM will für verschiedene Einstellungen auch verschiedene R/S Taktwechsel. Jetzt gehts problemlos:p
 
Ein Beispiel..

Hallo Flo,

schoen, dass Du es am Ende zum laufen bekommen hast.
Aber waere es Dir moeglich mal die komplette Ansteuerung als kleines Beispiel Programm reinzustellen.
Das wuerde vielen eine gewisse Erleichterung bringen.
Ich selbst habe hier einige EA-Dog's im Regal, aber bisher noch nicht damit gearbeitet...wuerde mich auch mal interessieren...:p

Bisher habe ich immer mit den DEM's meine Projecte realisiert....aber da die langsam knapp werden bei mir und ich wie gesagt die anderen im Regal habe
wuerde ich mich persoenlich auch ueber, ein kleines (gut Kommentiertes), Beispiel von Dir freuen.

LG aus Addis Ababa


Klaus
 
Hi,

ich hab leider alles schon zu fertigen Routinen verarbeitet mit denen ihr definitiv wenig anfangen könnt, da sie sehr speziell sind.
Ich beschreibs daher in "Halbcode" ;) . GAAAAANZ wichtig ist dass man dem LCD Zeit lässt nachm "Strom geben" . Also 10-20ms braucht es zum "hochfahren" sonst schreibt es Müll.

Es gibt zwei Arten Daten zu schicken: Als Instruktion und als normaler Datensatz.


Instruktion (z.B der komplette Init besteht daraus):
Code:
Sub Dogm_schreibe_Instruktion(instruktion)
Cs = 0                                                   'Chip Selektiert                  
Rs = 0                                                    'Initialisierung
Beliebig = Spimove(instruktion)                           'dogm_spiin wird nicht weiter verwendet
Cs = 1                                                   'Chip nicht selektiert
Waitus 500                                             'lieber mehr als weniger
End sub
Der CS=0 zu CS=1 wechsel muss bei jedem einzelnen gesendeten byte geschehen.



Daten (in diesem Fall zwei Buchstaben):
Code:
Sub DOGM_schreibe(buchstabe1,buchstabe2,adresse)

Call dogm_schreibe_instruktion(adresse)       'Speicherregister ausgewählt
CS=0                                                     'Auswählen
RS=1                                                     'Schreiben

Beliebig=spimove(buchstabe1)                    'z.B in Adresse &H01
Waitus 50                                               'DRINGEND warten
Beliebig=spimove(buchstabe2)                    'nächste adresse (z.B:&H02)

CS=1                                                     'chipselect aus
end sub

Das kann man natürlich für Texte dann in ne for-next schleife packen.

Man sieht jetzt klar den unterschied zwischen beiden befehlen : bei der Instruktion ist RS=0 und nach jedem byte muss der CS auf 1. Beim Text ist RS=1 und CS muss erst zum beenden des sendens auf 1
 
Lieben Dank

Hallo Flo,

ersteinmal vielen lieben Dank fuer die erweitereten Ausfuehrungen.

Ich werde mal einen Testaufbau machen und schauen ob ich damit klar komme - falls nicht, werde ich Dich einfach noch einmal belaestigen:p

Aber prima, dass Du direkt geantwortet hast....


LG

Klaus
 

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