Bascom EA-DOG Display anzeigefehler nach µC-Tausch

AVRuser

Neues Mitglied
20. Apr. 2011
217
0
0
Niedersachsen
Sprachen
  1. BascomAVR
  2. ANSI C
Hallo Leute,

Erstmal an alle die mir damals geholfen haben:
Danke,habe nun meine beiden EA-DOG-lcds erfolgreich am laufen.

Nun zu meinem eigl. Problem:

Das ganze lief bis jetzt auf einem Atmega644, bis ich jetzt trotz zahlreicher
Optimierungsversuche über die 64k Flash gekommen bin.
Also wollte ich einen Atmega1284p (nur der ist noch in DIP) einsetzen,
welcher schließlich bis auf den 2, USI und den doppelten Speicher kompatibel sein sollte.

Doch wenn ich das ganze anschalte kommt auf dem DOGL128 zwar das Bitmap korrekt,
der Text jedoch ist verpixelt und falsch!
(Der Text ist nicht im Bitmap enthalten sonder wird über LCDAT eingesetzt).
Auch einzelndes Resetten des LCD's oder des µC's bringt nichts...

Mein erster Gedanke war das es am 2. UART der p-Reihe liegt, jedoch funzt es mit einem
Atmega644p problemlos.

Fuses alle mehrmals kontrolliert, überall gleich, habe aber auch schon einiges erfolglos rumprobiert.

Der Takt kommt über den XTAL1 mit 16MHz vom Taktausgang eines anderen µC's...

PS: Der oben beschriebene Fehler trat auch mit dem Atmega644(p) auf, jedoch nur äußerst
selten und scheinbar bei "unsauberen" einschalten.

Ich hoffe ihr könnt mir helfen und bedanke mich im Vorraus!

Gruß:
AVRuser
 
Hallo,

Doch wenn ich das ganze anschalte kommt auf dem DOGL128 zwar das Bitmap korrekt,
der Text jedoch ist verpixelt und falsch!
(Der Text ist nicht im Bitmap enthalten sonder wird über LCDAT eingesetzt).
Auch einzelndes Resetten des LCD's oder des µC's bringt nichts...

...

Der Takt kommt über den XTAL1 mit 16MHz vom Taktausgang eines anderen µC's...

PS: Der oben beschriebene Fehler trat auch mit dem Atmega644(p) auf, jedoch nur äußerst
selten und scheinbar bei "unsauberen" einschalten.
um ein Timing-Problem auszuschließen versuch mal folgendes ...

zur Zeit steht da ja ... $crystal = 16000000 ' 16MHz

stell es mal auf ...... $crystal = 16500000 ' 16,5MHz

Dann rechnet Bascom das Timing mit 16,5MHz aus. Wenn du nun mit 16,0MHz Quarz laufen läßt dann ist alles etwas langsamer. Du läßt dem Display also ein wenig mehr Zeit zum arbeiten. Wenn es dann klappt ist es ein Timing-Problem. Für eine Lösung müßte man dann nochmal genauer alles unter die Lupe nehmen.

Damit laufen natürlich auch alle anderen Sachen (UART, ADC, ...) nicht mehr mit korrektem Timing !! Die Umstellung ist also keine Lösung sondern lediglich eine Möglichkeit einen Timingfehler zu finden.

Gruß
Dino
 
Hallo AVRuser!

Eigentlich sollte das Programm im 1284P genauso laufen wie im 644P.
Ich habe auch gerade den Controller von Mega16 auf Mega1284P gewechselt.... aber anfängliche Probleme lagen leider auch nur am Anwender bzw. eine fast nicht sichtbare Unterbrechung. :cool:

Hast du den 1284P mal mit internen 8MHz laufen lassen?
Mein 644P macht bei höheren Frequenzen auch manchmal ein paar zicken..... allerdings habe ich das beim 1284P noch nicht gehabt.

Es geht ja auch nur erst mal darum eine Fehlerquelle auszuschließen und den Takt runter zu fahren.

Grüße,
Cassio
 
Das DOGL-128 kennt ja keinen Unterschied zwischen Gafik und Text. es werden immer Informationen zur verwendeten Page ("Zeile"), Spalte (in Pixeln), und dann ein byte für die 8 Pixel hohe Säule gesendet. Innerhalb einer Page wird Auto-Inkrement unterstützt.
Jetzt ist die Frage, wie das Bild und der Text übertragen wird (bzw. was da der Unterschied ist). Insofern kann es sich schon um ein Timing-Problem handeln.
Es gibt sicher keine Unterschiede bei der Speicherverwaltung der unterschiedlichen Controller (Stichwort doppelter Speicher)? Wo werden Bilddaten und Fontdaten "geparkt"? im Flash oder im Eeprom?
 
Hallo Leute,

ich geh mal der Reihe nach...:

@Dino: Gute Idee, allerdings meine ich das schon mal probiert zu haben, aber ich machs nochmal so...

@Cassio: Eine Unterbrechung schliess ich aus, da der Fehler ja nur mit diesem Controller
häufig vorkommt. Das mit dem 8Mhz intern hab ich schon probiert, ohne Erfolg...

@LotadaC: Genau das wundert mich auch, ich verwende zum Anzeigen der Bitmaps und des
Textes die standart Bascom-befehle. Sämtliche Zeichenfunktionen hab ich selbst geschrieben,
unabhängig von den Bascom-befehlen und mit relativ großzügigen Timing, was immer gut funzt...
Was die Speicherverwaltung angeht ist alles im Flash.

PS: UART und alle anderen Programm-funktionen wie z.B auch der timer funktionieren...

Gruß:
AVRuser
 
Hmm... sicher, daß die Bascom Befehle für den Adressraum über 64k vorgesehen sind? Nicht, daß da dann irgendwelche anderen Pixeldaten ausgegeben werden.
Was kannst Du jetzt darstellen, und was nicht?
-Deine eigenen Methoden (Grafik) gehen?
-Text mit Bascom-Befehl geht nicht?
-simple Bild-Ausgabe von Bascom (mit diesen komischen bgf) geht wieder?
 
Ich kann:
-Pixel manuel setzten
-mit meinen eigenden Routinen zeichnen
-Bitmaps bzw bgf's anzeigen
-und keinen Text korrekt darstellen

Am Adressraum kanns wohl nicht liegen, da wie ich schon mehrmals geschrieben hab
der Fehler, wenn auch sehr selten auch beim 644(p) auftritt...

mfg
 
Am Adressraum kanns wohl nicht liegen, da wie ich schon mehrmals geschrieben hab
der Fehler, wenn auch sehr selten auch beim 644(p) auftritt...
gern gesehen sind auch Interrupts die einemdas Timing verhageln. Läuft irgendwas das da in die Ansteuerung des Displays reinhaut ?
 
Ich hatte früher so ein Disp von Polle dran und dass hat sehr emfindlich auf die Interrupts reagiert,
daher hab ich die Interrupts vor jedem LCD-Befehl deaktiviert.
Das EA-DOG hat zwar kein Prob mit den INts, aber ich hab die disables noch drin...
 
Ich kann:
-Pixel manuel setzten
-mit meinen eigenden Routinen zeichnen


Hallo AVRuser!

Gibt es dazu vielleicht auch mal ein passenden Programmcode, über das man mal drüber schauen könnte?

Vielleicht interessieren sich ja auch obendrein Andere für deine selbstgeschriebenen Routinen?


Grüße,
Cassio
 
Hallo Cassio,

Ich habe sowieso vor das ganze Projekt hier vorzustellen, ist aber noch lange nicht fertig
und noch etwas kommentarlos:D

Hier einfach mal der anfang, erstes auftreten des Fehlers:

Code:
$regfile = "m1284pdef.dat "
$framesize = 150
$swstack = 100
$hwstack = 150
$crystal = 16000000
$baud = 2400
$lib "glcdeadogm128x6.lbx"

Config Com1 = 2400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Graphlcd = 128 * 64eadogm , Cs1 = Porta.0 , A0 = Porta.2 , Si = Porta.6 , Sclk = Porta.5 , Rst = Porta.1
Waitms 1
Initlcd
Waitms 1
Cls

Config Timer1 = Timer , Prescale = 256 , Clear Timer = 1 , Compare A = Disconnect
Ocr1a = 12500 : On Oc1a Irupt
Sw1 Alias Pinb.7 : Config Sw1 = Input : Sw1 = 1
Sw2 Alias Pinb.6 : Config Sw2 = Input : Sw2 = 1
Sw3 Alias Pinb.5 : Config Sw3 = Input : Sw3 = 1
Sw4 Alias Pinb.4 : Config Sw4 = Input : Sw4 = 1
L1 Alias Portb.0 : Config L1 = Output
L2 Alias Portb.1 : Config L2 = Output
L3 Alias Portb.2 : Config L3 = Output
L4 Alias Portb.3 : Config L4 = Output
Row1 Alias Pind.2 : Config Row1 = Input : Row1 = 1
Row2 Alias Pind.3 : Config Row2 = Input : Row2 = 1
Row3 Alias Pind.4 : Config Row3 = Input : Row3 = 1
Ckl Alias Portd.6 : Config Ckl = Output
Cklout Alias Portd.7 : Config Cklout = Output
Sdata Alias Portd.5 : Config Sdata = Output
Cck Alias Portc.4 : Config Cck = Output
Cout Alias Portc.5 : Config Cout = Output
Dout Alias Portc.7 : Config Dout = Output
Cck2 Alias Portc.3 : Config Cck2 = Output
Cout2 Alias Portc.2 : Config Cout2 = Output
Dout2 Alias Portc.1 : Config Dout2 = Output
Dio Alias Pina.7 : Config Dio = Input
Pcl Alias Pinc.0 : Config Pcl = Input
Dim Ad As Integer , X As Byte , Xad As Single , Ady As Byte
Dim I As Integer , Adb As String * 12 , Adx As String * 5 , Swt As Byte
Dim Presc As Byte , Msv As Integer , Trg As Integer , Smplr As Integer
Dim Msvstr As String * 3 , Smpstr As String * 4 , Smpls As String * 4 , Smples As Single
Dim Maxms As Integer , Ftstr As String * 16 , J As Byte , Sw As Byte , Pcnt As Byte
Dim Ifsr As Integer , Dwstr As String * 3 , Searched As Single , Tmpb As Byte
Dim Count As Word , Smplold As Single , Calced As Single , Diffcalced As Single
Dim Diffsmplold As Single , Tmp As String * 10 , It As Single , Abyte As Byte
Dim Adalt As Integer , L As Byte , R As Byte , G As Byte , B As Byte , Ds As Bit
Dim Reep As Eram Byte , Geep As Eram Byte , Beep As Eram Byte , Cnr As Eram Byte
Dim Tcnr As Byte , Ctb As Eram Byte , Tmr As Eram Byte , Ttmr As Byte , Tmp3 As Byte
Dim Minclk As Byte , Scnt As Integer , Leds As String * 4 , Ias As Bit , Svals As Bit
Dim Ledstr As String * 12 , Gts As Bit , Ix As Bit , Ig As Byte , Contrast As Byte
Dim Rgbpos As Byte , Rgb As String * 8 , Rtmp As Byte , Tmx As Integer , Lp As Byte
Dim Gtmp As String * 8 , Tmp2 As Byte , Tmpx As String * 8 , Rgb2 As String * 8
Dim Tcode As String * 4 , Ecode As Eram Integer , Tmpcode As String * 4 , Tmpcode2 As Integer
Dim Fcodes As Eram Byte , Fcode As Byte , Ssh As Byte , Mark(116) As Byte , Plots As Byte
Dim Minx As Byte , Maxx As Byte , Xtmp As Bit , Plot2(115) As Byte , Plot3(115) As Byte
Dim Plot4(115) As Byte , Plot5(115) As Byte , Plot6(115) As Byte , Plot7(115) As Byte
Dim Plot8(115) As Byte , Plot9(115) As Byte , Plot10(115) As Byte , Wplot As Byte
Dim Eplot1(115) As Eram Byte , Eplot2(115) As Eram Byte , Eplot3(115) As Eram Byte
Dim Eplot4(115) As Eram Byte , Eplot5(115) As Eram Byte , Eplot6(115) As Eram Byte
Dim Eplot7(115) As Eram Byte , Eplot8(115) As Eram Byte , Eplot9(115) As Eram Byte
Dim Savelist(8) As Byte , Esavelist(8)as Eram Byte , Kbin As String * 12
Const Maxsmpl = 999
Const Uf = 54 / 4095
Const Pt = 3
Enable Oc1a
If Reep = 0 Or Geep = 0 Or Beep = 0 Or Reep > 4 Or Beep > 4 Then
   Reep = 4 : Geep = 4 : Beep = 4
End If
If Fcodes > 10 Then Fcodes = 0
Fcode = Fcodes
If Cnr > 3 Then Ecode = 1234
Tmpcode2 = Ecode
Tmpcode = Str(tmpcode2)
If Cnr > 3 Then Cnr = 0
If Ctb > 1 Then Ctb = 1
If Tmr > 60 Or Tmr = 0 Then Tmr = 1
R = 4 : G = 4 : B = 4
Contrast = Cnr
For X = 1 To 115
   Plot2(x) = 63
   Plot3(x) = 63
   Plot4(x) = 63
   Plot5(x) = 63
   Plot6(x) = 63
   Plot7(x) = 63
   Plot8(x) = 63
   Plot9(x) = 63
   Plot10(x) = 63
   If X < 9 And Esavelist(x) > 3 Then Esavelist(x) = 0
Next
Gosub Ctrset
Gosub Rgbset
Gosub Lcd_cls2
Showpic 0 , 0 , Startpic
Ftstr = "0000000000001111"
Gosub Shreg
For I = 0 To 7 Step 1
   If I < 4 Then
      Toggle Portb.i
   Else
      I = I - 4
      Toggle Portb.i
      I = I + 4
   End If
   Select Case I
   Case 0
      Ftstr = "0000011111101111"
      Gosub Shreg
   Case 1
      Ftstr = "0000011111001111"
      Gosub Shreg
   Case 2
      Ftstr = "0000011110001111"
      Gosub Shreg
   Case 3
      Ftstr = "0000011100001111"
      Gosub Shreg
   Case 4
      Ftstr = "0000011100001111"
      Gosub Shreg
   Case 5
      Ftstr = "0000011100011111"
      Gosub Shreg
   Case 6
      Ftstr = "0000011100111111"
      Gosub Shreg
   Case 7
      Ftstr = "0000011101111111"
      Gosub Shreg
   End Select
   Waitms 200
Next I
Ftstr = "0000000000001111"
Gosub Shreg
Maxms = 400
Setfont My6_8
Tcode = ""
Cl:
Gosub Lcd_cls2
Showpic 0 , 0 , Code
Disable Interrupts
Lcdat 4 , 15 , "    "
Lcdat 4 , 15 , Tcode
Ssh = 1
Enable Interrupts
Do
....

PS: Nach "Showpiv 0,0,Code" bzw. "Cl:"

Ergänzung:
Habe den Tip $crystal auf 16,5MHz zu setzen erfolglos ausprobiert...
 
Noch was:
Ich weiß das man in der lib das Timing anpassen kann,
hab ich irgent wo hier mal gelese - glaub bei Cassio,
kennt sich damit vlt. jemand aus hier?
 
Funzt jetzt- mehr morgen...
Danke für eure hilfe, ihr braucht nicht mehr auf diesen Tread antworten...

mfg
 
Hallo Leute,

Also: schließlich läuft es doch noch, ohne jegliche Fehler:)

Nun wie schon angekündickt zum 'Wie':
Ich war ziemlich ratlos was ich nun noch versuchen sollte, bis mir dann noch einfiel,
dass auch bascom-programmierer mal Fehler machen und evt. das Timing für den Text
nicht hinkommt. Also hab ich ne Kopie der Lib gemacht und sie mir mal genauer angeschaut
ob ich das Timig vieleicht irgentwo anpassen kann, ähnlich der lib für so ein
128x64 von Pollin bei Takten >8MHz (vgl. Cassios LCD-Tread).
Das brachte allerdings keine große Verbesserung des ganzen, jedoch ist mir noch
aufgefallen dass manche Variablen in der Lib kontrolliert werden ob sie nicht über
den speicher des µC laufen. Dieser war allerdings fest auf 65536bit gelegt.
Nach dem ich diesen noch auf 131072bit geändert hab läufts nun prima!:)

Der Vollständigkeit halber sei noch gesagt, dass Lodatac dies bereits angedeutet hatte,
ich es allerdings weil anderes ja ging ausgeschlossen und vergessen hatte - trotzdem Danke;)

Gruß:
AVRuser
 
Hi AVRUser,

Das brachte allerdings keine große Verbesserung des ganzen, jedoch ist mir noch
aufgefallen dass manche Variablen in der Lib kontrolliert werden ob sie nicht über
den speicher des µC laufen. Dieser war allerdings fest auf 65536bit gelegt.
Nach dem ich diesen noch auf 131072bit geändert hab läufts nun prima!:)
da soll nun einer drauf kommen ;)
Gibt mir aber eine weitere Idee woran es liegen kann warum die Softclock auf meinem Mega2560 nicht läuft obwohl ich die Programmierung identisch vom Mega128 übernommen habe.

Gruß
Dino
 
Interessant finde ich, daß es jetzt lediglich durch ändern irgendwelcher Grenzen (in der lib?)geht. Um zur Laufzeit irgendwelche Bytes aus dem Flash in die 32 Rechenregister zu laden wird die Assembler-Instruktion "LPM" (load program memory) verwendet. Die Speicheradresse (im Flash) muß vorher im Z-Register festgelegt werden. Und das ist als Doppelregister halt 16bit lang -> LPM funktioniert bis 64K Flash. Wenn Du jetzt einfach irgendwo die Kontrolle veränderst, kann LPM trotzdem nicht dahin adressieren.
Dafür wird ein anderer Befehl verwendet, nämlich "ELPM" (extendet load program memory). Dieser nutzt zusätzlich ein extra dafür vorgesehenes drittes Adress-Register (RAMPZ).
 
Hallo Lotadac,

hast wohl recht, hab mich zu früh gefreut: Bin nähmlich bis eben mit dem Code unter
64k geblieben, jetzt bin ich mit einigen weiteren bitmaps knapp drüber und jetzt
stürtzt das Display an manchen SStellen "zuverlässig" ab...:(

Was müsste ich den wirklich ändern damits funzt?

Gruß:
AVRuser
 
Naja, es scheint ja so auszusehen, daß die lib nicht für Controller mit mehr als 64K Flash vorgesehen ist. Einen derartigen Hinweis hast Du nirgends gefunden? An den Stellen, wo Du die "Kontrollen" bezüglich 64K geändert hattest: was soll da geschehen, wenn eine Adresse drüber liegt?
Zu Deiner Frage: Du brauchst eine lib, die das halt kann. Ob Du die irgendwo findest, Du diese anpaßt, oder selbst eine schreibst, ist Deine Sache (bzw. Deiner Fähigkeiten)
Was mMn geändert werden muß, hab ich ja oben bereits geschrieben: statt LPM muß letztendlich ELPM verwendet werden - das bedeutet natürlich auch, daß neben den beiden Z-Registern auch RAMPZ mit der Adresse befüllt werden muß. Ich bin mir jetzt auch nicht sicher, inwiefern beide Instruktionen identisch autoinkrement unterstützen. Wieweit in Deiner lib auf Assembler zurückgegriffen wird, weiß ich natürlich auch noch nicht.
Kann man bei Bascom solche zu ladenden Datenbereiche denn vor das Programm schreiben lassen (also zwischen Interruptvektortabelle und Reset-"Interrupt"-Ziel)? (in Assembler ja kein Problem) Würden Dir denn dann die knapp 64K reichen?
(kannst Du die verwendete lib mal hochladen oder so? Dann schau ich bei Gelegenheit mal selbst rein)

Edit: habs selbst gefunden. Also eigentlich ist die für Controller mit mehr als 64K vorgesehen. Bei den von Dir gefundenen "Kontrollen" wird geprüft, ob ROMSIZE >64K ist, dann wird RAMPZ manipuliert. sollte also so passen.
Kann es sein, daß die Variable ROMSIZE bei Dir nicht stimmt?
 

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