rauf81
20.09.2011, 13:32
Hallo zusammen.
Mein RGB LED Fader ist soweit fertig.
Hard und Software stehen. Allerdings habe ich noch ein lästiges
Problem mit meinem LCD Display 20x4.
Da ich den Fadingwert eines jeden Farbkanals angezeigt bekomme, möchte ich auch,
das nur dieser aktualisiert wir. Das passiert alle 100ms.
Nachteil ist das der Befehl "CLS" das gesamte Display löscht, und dadurch
ein unangenehmes Flackern erzeugt.
Ist es möglich nur Teilbereiche aktualisieren zu lassen,
oder gibt es da eine andere Möglichkeit?
Ich schicke den Quellcode noch mit und hoffe Ihr könnt mir weiter helfen
Grüße Flo
$regfile = "m16def.dat"
$crystal = 16000000
$hwstack = 40
$swstack = 16
$framesize = 32
Ddrb = &HFF
Ddrd = &HFF
Ddrc = &HFF
Ddra = &H00
Porta.3 = 1
Porta.4 = 1
Porta.5 = 1
Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.0 , Rs = Portc.1
Config Lcd = 20 * 4
Enable Interrupts
Dim Adc_rot As Word
Dim Adc_grün As Word
Dim Adc_blau As Word
Dim Pwm_rot As Word
Dim Pwm_grün As Word
Dim Pwm_blau As Word
Dim Status As Bit
Status = 0
Dim Zähler_rot As Integer
Dim Zähler_grün As Integer
Dim Zähler_blau As Integer
Zähler_rot = 0
Zähler_grün = 0
Zähler_blau = 0
Dim Plusminus_rot As Integer
Plusminus_rot = 1
Dim Plusminus_grün As Integer
Plusminus_grün = 1
Dim Plusminus_blau As Integer
Plusminus_blau = 1
Config Timer0 = Pwm , Compare Pwm = Clear Down , Prescale = 256
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Do
Debounce Pina.5 , 0 , Taster3 , Sub
Debounce Pina.4 , 0 , Taster2 , Sub
Debounce Pina.3 , 0 , Taster1 , Sub
If Status = 0 Then
Cls
Locate 1 , 1
Lcd "Motion Control @ RAU"
Locate 2 , 1
Lcd "<ROT> "
Locate 2 , 14
Lcd " Fading"
Locate 3 , 1
Lcd "<GRUEN> "
Locate 3 , 14
Lcd " Fading"
Locate 4 , 1
Lcd "<BLAU> "
Locate 4 , 14
Lcd " Fading"
Adc_rot = Getadc(2)
Adc_grün = Getadc(1)
Adc_blau = Getadc(0)
Locate 2 , 9
Pwm_rot = Adc_rot / 4
Lcd Pwm_rot
Locate 3 , 9
Pwm_grün = Adc_grün / 4
Lcd Pwm_grün
Locate 4 , 9
Pwm_blau = Adc_blau / 4
Lcd Pwm_blau
Ocr0 = Pwm_rot
Ocr1a = Pwm_grün
Ocr1b = Pwm_blau
If Adc_rot < 25 Then
Adc_rot = 0
End If
If Adc_grün < 25 Then
Adc_grün = 0
End If
If Adc_blau < 25 Then
Adc_blau = 0
End If
Else
Zähler_rot = Zähler_rot + Plusminus_rot
If Zähler_rot = 85 Then Plusminus_rot = -1
If Zähler_rot = 1 Then Plusminus_rot = 1
Zähler_blau = Zähler_blau + Plusminus_blau
If Zähler_blau = 170 Then Plusminus_blau = -1
If Zähler_blau = 1 Then Plusminus_blau = 1
Zähler_grün = Zähler_grün + Plusminus_grün
If Zähler_grün = 255 Then Plusminus_grün = -1
If Zähler_grün = 1 Then Plusminus_grün = 1
Ocr0 = Zähler_rot
Ocr1a = Zähler_grün
Ocr1b = Zähler_blau
End If
Waitms 100
Loop
End
Taster3:
If Status = 0 Then
Status = 1
Else
Status = 0
End If
Return
Taster2:
Return
Taster1:
Return
Mein RGB LED Fader ist soweit fertig.
Hard und Software stehen. Allerdings habe ich noch ein lästiges
Problem mit meinem LCD Display 20x4.
Da ich den Fadingwert eines jeden Farbkanals angezeigt bekomme, möchte ich auch,
das nur dieser aktualisiert wir. Das passiert alle 100ms.
Nachteil ist das der Befehl "CLS" das gesamte Display löscht, und dadurch
ein unangenehmes Flackern erzeugt.
Ist es möglich nur Teilbereiche aktualisieren zu lassen,
oder gibt es da eine andere Möglichkeit?
Ich schicke den Quellcode noch mit und hoffe Ihr könnt mir weiter helfen
Grüße Flo
$regfile = "m16def.dat"
$crystal = 16000000
$hwstack = 40
$swstack = 16
$framesize = 32
Ddrb = &HFF
Ddrd = &HFF
Ddrc = &HFF
Ddra = &H00
Porta.3 = 1
Porta.4 = 1
Porta.5 = 1
Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.0 , Rs = Portc.1
Config Lcd = 20 * 4
Enable Interrupts
Dim Adc_rot As Word
Dim Adc_grün As Word
Dim Adc_blau As Word
Dim Pwm_rot As Word
Dim Pwm_grün As Word
Dim Pwm_blau As Word
Dim Status As Bit
Status = 0
Dim Zähler_rot As Integer
Dim Zähler_grün As Integer
Dim Zähler_blau As Integer
Zähler_rot = 0
Zähler_grün = 0
Zähler_blau = 0
Dim Plusminus_rot As Integer
Plusminus_rot = 1
Dim Plusminus_grün As Integer
Plusminus_grün = 1
Dim Plusminus_blau As Integer
Plusminus_blau = 1
Config Timer0 = Pwm , Compare Pwm = Clear Down , Prescale = 256
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Do
Debounce Pina.5 , 0 , Taster3 , Sub
Debounce Pina.4 , 0 , Taster2 , Sub
Debounce Pina.3 , 0 , Taster1 , Sub
If Status = 0 Then
Cls
Locate 1 , 1
Lcd "Motion Control @ RAU"
Locate 2 , 1
Lcd "<ROT> "
Locate 2 , 14
Lcd " Fading"
Locate 3 , 1
Lcd "<GRUEN> "
Locate 3 , 14
Lcd " Fading"
Locate 4 , 1
Lcd "<BLAU> "
Locate 4 , 14
Lcd " Fading"
Adc_rot = Getadc(2)
Adc_grün = Getadc(1)
Adc_blau = Getadc(0)
Locate 2 , 9
Pwm_rot = Adc_rot / 4
Lcd Pwm_rot
Locate 3 , 9
Pwm_grün = Adc_grün / 4
Lcd Pwm_grün
Locate 4 , 9
Pwm_blau = Adc_blau / 4
Lcd Pwm_blau
Ocr0 = Pwm_rot
Ocr1a = Pwm_grün
Ocr1b = Pwm_blau
If Adc_rot < 25 Then
Adc_rot = 0
End If
If Adc_grün < 25 Then
Adc_grün = 0
End If
If Adc_blau < 25 Then
Adc_blau = 0
End If
Else
Zähler_rot = Zähler_rot + Plusminus_rot
If Zähler_rot = 85 Then Plusminus_rot = -1
If Zähler_rot = 1 Then Plusminus_rot = 1
Zähler_blau = Zähler_blau + Plusminus_blau
If Zähler_blau = 170 Then Plusminus_blau = -1
If Zähler_blau = 1 Then Plusminus_blau = 1
Zähler_grün = Zähler_grün + Plusminus_grün
If Zähler_grün = 255 Then Plusminus_grün = -1
If Zähler_grün = 1 Then Plusminus_grün = 1
Ocr0 = Zähler_rot
Ocr1a = Zähler_grün
Ocr1b = Zähler_blau
End If
Waitms 100
Loop
End
Taster3:
If Status = 0 Then
Status = 1
Else
Status = 0
End If
Return
Taster2:
Return
Taster1:
Return