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
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?
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
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