LCD-Modul TG12864B-03

AtmegaBremen

Neues Mitglied
26. Mai 2009
2
0
0
Sprachen
Moin Leute,

ich experimentier gerade mit dem LCD von Pollin (http://www.pollin.de/shop/shop.php?cf=detail.php&pg=OA==&a=NTc1OTc4OTk=&w=OTg4OTk4&ts=20) und ich hab das auch so gemacht wie in dem Tutorial von Cassio (http://www.avr-praxis.de/forum/showthread.php?t=488) zweites Display.
Mein Problem tritt zum Beispiel bei diesem Code auf:
...
for y=0 to 63
line(0,y)-(127,y),1
waitms 25
next

for y=63 to 0 step -1
line(0,y)-(127,y),0
waitms 25
next
.....

das ist also quasi ein vorhang der zugeht und dann wieder auf. das klappt auch. jedoch ist die rechte hälfte des displays (wird ja durch eigenen controller angesteuert) einen Pixel weiter unten und oben fehlt die oberste Reihe. Wenn die For-schleife jedoch durch ist, also alles schwarz ist, dann stellt sich das Display wieder ein. Kann mir da jemand weiterhelfen. Zudem lasse ich dann etwas weiter im code einen Timer anzeigen, dieser wird fein angezeigt bis er 5 erreicht, dann verschiebt sich das Display, wahlweise 20 nach uten, oder mal 15 nach ober. Total zufällig. Woran kann sowas liegen?

Viel Dank schon mal
 
Hi AtmegaBremen!

Erst einmal Hallo und Willkommen im AVR-Praxis-Forum. :ciao:


Deine Anzeigenprobleme kann ich gerade nicht nachvollziehen... :hmmmm:

Bist du sicher, dass die Hardware ordnungsgemäß angeschlossen ist? Kein Wackelmann oder gebrochene Ader oder ähnliches?

Sollte nach gründlicher Überprüfung (z.B. Durchmessen der Adern zum Display) keine Fehler festzustellen sein, dann möchte ich dich einfach mal um den Code bitten.



Vielleicht wäre es auch mal ganz nett, wenn du dich hier kurz vorstellen würdest.
So können wir dich und deinen Wissensstand zum Thema BASCOM und Mikrocontroller besser einschätzen..... und damit meist auch geziehlter helfen! ;)

Schöne Grüße,
Cassio


EDIT:
Die Sache mit dem Timer hatte ich erst falsch verstanden....
Der Timer macht also keine Probleme, sondern lediglich die Anzeige für den Timerwert ist verschoben.
Dann würde ich auch dabei mal auf die Verdrahtung tippen.
 
HI,
dann stell ich mich mal eben vor.
Also ich komme aus Bremen und studiere Maschinenbau. Ich bearbeite gerade ein Mechatronik Projekt in meinem Studium. Da ich der einzige aus unserer Gruppe mit Programmiererfahrungen bin und auch schonmal mit einem Mikrocontroller gearbeitet habe ist das halt mein Part.
Der Wissensstand ist mittelmässig was die Elektronik angeht, bin halt Maschinenbauer und kein Elektriker. Ich programmiere mit Bascom und da würde ich sagen ich bin fortgeschritten.
Soviel zu mir.
Ich habe schon alles durchgemessen. Komisch ist halt das alle Pixel funktionieren, sie jedoch in der rechten Display Hälfte einen Pixel nach unten verschoben sind. Auch wenn ich schreibe.
Ich hab gerade noch einen Test gemacht. Also der Timer beieinflusst nur die zeichnenden Befehle wie Line und Circle, aber halt nicht den Text.
Ich benutze die ganz normale Font datei die bei Bascom dabei war. ich programmier mit 1.11.9.0
Vielen Dank schon Mal
 
Hallo AtmegaBremen!

Mach doch einfach mal nen "Trick"....

Vertausch doch mal die beiden Leitungen für die Controller am Display. ;)
OK, die Anzeige ist dann "seitenverkehrt", aber......

Sollte das Display (bzw. der eine Controller auf dem Display) Probleme haben, dann müsste der Effekt bleiben.
Sollte jedoch plötzlich die andere Hälfte versetzt sein, dann stimmt etwas anderes nicht und das Display ist OK.

Ich wüsste momentan nicht, wie es sonst zu so einem Effekt kommen könnte. :hmmmm:

Gruß,
Cassio
 
Hallo Cassio und AtmegaBremen,
habe bei dem Display auch diesen Versatz um einen Pixel in Y-Achse in der zweiten Hälfte. Setzt man "End" nach der Main-Schleife, klapps dann plötzlich.:confused:
Denke, das hängt mit einer unsauberen Initialisierung zusammen.
Gruß Rolf
 
Setzt man "End" nach der Main-Schleife, klapps dann plötzlich.:confused:


Hallo Rolf!

Ich kann deine Aussage gerade nicht nachvollziehen.

Welches Programm meinst du?
Kannst du das Programm hier mal einstellen oder einen Link einfügen?
Mit welcher BASCOM-Version hast du das Programm denn jetzt erstellt?

Grüße,
Cassio
 
Hallo Cassio,
also ich progge mit Version 1.11.9.8
hab heute nochmal rumgespielt mit dem Display......also manchmal hat es den Pixelversatz und zwar wenn man den Wertebereich nicht richtig angibt.
setz hier mal bei Lcdat 0,0,.... ein, dann springt erstmal die Zahl rum und beim reinitialisieren verhauts das Gitternetz um einen Pixel (neben sonstigen eigenartigen aktionen) habs mal markiert ...sorry für den langen Code:adore:...
Code:
'*******************************************************************************
'*     Testprogramm für GLCD Von Pollin TG12864B-03                            *
'* Bascom Version 1.11.9.8 ATMega 128                                          *
'* Fusbits von: Jtag aus                                                       *
'* und 103 Compartibilität aus                                                 *
'* externer Quartz 3,686 MHz                                                   *
'* von Rolf Möbert-Karge                                                       *
'*******************************************************************************
'-----------------------------------------------------------------------------
'Prozessor und Quartz

$regfile = "m128def.dat"                                    'Register-Datei für ATmega 128
$crystal = 3.686e6                                          'Frequenz externer Quarz

'*******************************************************************************
'*i/o Port Festlegung                                                          *
'*******************************************************************************
'Datenport für GLCD; alle auf Ausgang
 Ddra = &B1111_1111
Porta = &B0000_0000
'Controlport für GLCD (Ausgänge) und Phase A(PB.7) und B(PB.6) für Drehgeber(Eingänge)
 Ddrb = &B0011_1111
'Pullup's für Eingänge Phase a und b setzen
Portb = &B1100_0000

'Taster von Drehgeber (Eingang;PD.4) und Steuerungs-Bit für Backlight(Ausgang;PD.5) setzen
 Ddrd = &B0010_0000
'Pullup's für Eingänge setzen
Portd = &B1101_1111
'*******************************************************************************

'*******************************************************************************
'* GLCD-Routine für GLCD von Pollin TG12864B-03                                *
'*******************************************************************************
'Configurieren des GLCD mit KS108 Controler
'Einige der Routinen zur Kontrolle des Displays befinden sich in dem glcdKS108.Libary
'Einbinden des Libary
$lib "glcdKS108.lbx"
'Definition des GLCD mit 128 x 64 Pixel

Config Graphlcd = 128 * 64sed , Dataport = Porta , Controlport = Portb , Cd = 5 , Rd = 4 , Ce = 1 , Ce2 = 2 , Enable = 3 , Reset = 0
'Port A wird für die Datenleitung definiert D0=PA 0....D7=PA
'Port B wird für die Steuerleitungen zum GLCD benutzt
'Wobei PortB.5= D/I =Cd ist
'PortB.4= R/W =Rd ist
'PortB.1= CE =CS1; Chip select von Controller 1(erste hälfte Display)
'PortB.2= CE =CS2; Chip select von Controller 2 (zweite hälfte Display)
'PortB.3= ENABLE= E;Chip Enable ansteuern
'PortB.0= RESET = RES;Reset

'
'
'Variabeln Zur Ansteuerung der Befehle des GLCD
Dim X1 As Byte
Dim Y1 As Integer
Dim Z1 As Byte
Dim Z2 As Byte
Dim Flag As Bit
'Zeichensatz einladen (hier den Namen des Zeichensatzes eingeben; mit Editor nachschauen)
Setfont Font5x5
'Diplay Löschen und initialisieren
Gosub Lcd_cls2
Wait 1
'*******************************************************************************

'*******************************************************************************
'*Timer 1 Configuration                                                        *
'*******************************************************************************
'System-Timer für periodische Encoder-Abfrage
'FQuarz/Prescale/2=3686000/8/2=230375Hz/1000Hz(500Hz=2ms will ich)=460
'Also muss bis ca.4600 zählen => 65535-460= also bis 65075 zählen dann überlauf
Config Timer1 = Timer , Prescale = 8
On Timer1 Isr_timer1
Enable Timer1
'zähler für Auslösen eines Messintervalls
Dim Mess_zaehler As Word
Dim Mess_flag As Bit
'Const Timer1_reload = 65305                                 'Wert für 1ms
Config Porte = Output
Porte.6 = 1
Porte.7 = 0
Enable Interrupts

'*******************************************************************************

'*******************************************************************************
'*Drehgeber                                                                    *
'*******************************************************************************
'Globale Variablen für Drehgeber:
Dim Pwmzaehler As Long
Dim Enc_status As Integer
Dim Status_alt As Integer
Dim Enc_max As Integer
Dim Enc_min As Integer
Dim Phase_b_vorher As Bit
Dim Taster As Byte
Dim Licht As Bit
Dim Strhilf As String * 4
Dim Strh As String * 3

'Wertebereich des Drehgebers für Test (maximal von -32768 bis +327670)
 Enc_max = 31
 Enc_min = -31
 Enc_status = Enc_min
'Backlight aus
 Licht = 0
 X1 = 6
'*******************************************************************************

'*******************************************************************************
'*Hauptschleife                                                                *
'*******************************************************************************
 '
Gosub Lcd_cls2
Gosub _gitter

 Do

 If Flag = 1 Then
 'Gosub _gitter
 Y1 = 31 - Enc_status
 Strh = Str(y1)
 Strh = Format(strh , "000")
Lcdat 1 , 1 , Strh '<--------------hier meine ich
 Pset X1 , Y1 , 1

 Flag = 0
 End If

 Loop


'*******************************************************************************
End                                                         'end program
'*******************************************************************************

'*******************************************************************************
'*Subroutinen                                                                  *
'*******************************************************************************

'*******************************************************************************
'*Timer Interupt                                                                 *
'*******************************************************************************
'interrupt bei Überlauf Timer1
Isr_timer1:
Timer1 = 65535 - 460

Gosub _encoder
Gosub _licht

 Return
'*******************************************************************************


'*******************************************************************************
'*Drehgebersubroutine                                                          *
'*******************************************************************************
_encoder:

  Dim Phase_a As Bit
  Dim Phase_b As Bit


  'ohne Entprellen(hier bitte auskommentieren)
  'Phase_b = Pinb.6
  'Phase_a = Pinb.7

  'mit Entprellen des Drehgebers über Software Flipflop(aktuel aktiv)
  If Pinb.6 = 1 And Pinb.7 = 1 Then Phase_b = 1
  If Pinb.6 = 0 And Pinb.7 = 0 Then Phase_b = 0
  If Pinb.6 = 0 And Pinb.7 = 1 Then Phase_a = 1
  If Pinb.6 = 1 And Pinb.7 = 0 Then Phase_a = 0

  'Auswertung des Drehgebers
  If Phase_b <> Phase_b_vorher Then
  If Phase_b = 1 And Phase_a = 1 Then Enc_status = Enc_status + 1
  If Phase_b = 0 And Phase_a = 0 Then Enc_status = Enc_status + 1
  If Phase_b = 1 And Phase_a = 0 Then Enc_status = Enc_status - 1
  If Phase_b = 0 And Phase_a = 1 Then Enc_status = Enc_status - 1

  'Wertebereich halten mit Rücksprung
  If Enc_status > Enc_max Then Enc_status = Enc_min
  If Enc_status < Enc_min Then Enc_status = Enc_max

  'Wertebereich halten mit stop
  'If Enc_status > Enc_max Then Enc_status = Enc_max
  'If Enc_status < Enc_min Then Enc_status = Enc_min

  Phase_b_vorher = Phase_b
  End If
  Strh = Str(enc_status)
  Strhilf = Format(strh , "00")
  If Enc_status <> Status_alt Then
  'Lcdat 1 , 0 , Strhilf
    Licht = 1
    Flag = 1
  Pwmzaehler = 0
      X1 = X1 + 1
      If X1 > 127 Then
       X1 = 6
    Gosub Lcd_cls2
      Gosub _gitter
      End If
  End If



  Status_alt = Enc_status
 If Pind.4 = 0 Then
 'Lcdat 2 , 0 , Strhilf
  End If
  Return

'-----------------------------------------------------------------------------
_licht:

'Backlight schalten
If Licht = 1 Then Portd.5 = 1 Else Portd.5 = 0

'Beleuchtungsdauer
If Licht = 1 Then Incr Pwmzaehler
If Pwmzaehler = 32000 Then
Licht = 0
Pwmzaehler = 0
End If
Return
'*******************************************************************************

'*******************************************************************************
'*Initialisierung des Displays                                                 *
'*******************************************************************************
Lcd_cls2:
'Beide Controler aus
Glcdcmd &H3E , 1 : Glcdcmd &H3E , 2
Cls
'Beide Controler an
Glcdcmd &H3F , 1 : Glcdcmd &H3F , 2
Return

'*******************************************************************************
'*Anzeigesubroutine                                                            *
'*******************************************************************************
 _gitter:
  'Horizontale Punktlinien
For Z2 = 2 To 62 Step 10
   For Z1 = 6 To 127 Step 2
   Pset Z1 , Z2 , 1
   Next Z1
Next Z2
'Vertikale Punktlinien
For Z2 = 2 To 62 Step 2
   For Z1 = 6 To 127 Step 10
   Pset Z1 , Z2 , 1
   Next Z1
Next Z2
For Z1 = 0 To 5 Step 2
    Pset Z1 , 32 , 1
Next Z1
 Return
'*******************************************************************************




'*******************************************************************************
'*Einbinden des Zeichensatzes                                                  *
'*******************************************************************************
'hier den Dateinamen des Zeichensatzes eingeben
$include "Sfont5x5.font"

'*******************************************************************************

gruß Rolf
 
Hallo Rolf!

Nur mal auf die Schnelle......
Hast du den gleichen Effekt denn auch, wenn du eine 8x8 bzw. 16x16 Font verwendest.

Könnte mir vorstellen, dass du mit der 5x5Font Probleme bekommst....... gerade beim "Übergang" vom ersten zum zweiten Displaycontroller.

Eine 5-Pixel breite Font ist nicht gerade passend zu 128x64 Pixel. :wink:


Grüße,
Cassio
 

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