Ok, Ausgangscode war folgender:
CodeBox BascomAVR
$regfile = "m8def.dat" 'Controllerdefinitionsdatei einbinden
$crystal = 8000000 'Systemtakt angeben (Baudrate)
$hwstack = 40 'Stacks
$swstack = 16
$framesize = 32
$baud = 19200 'Baudrate UART
Dim Zeichen As Byte 'UART-Empfang
Dim Z As Byte 'Timerüberlaufzähler
Dim Poti As Word 'ADC-Messung
Rot Alias Portd.7 'Namen für LED-Beine
Gruen Alias Portc.3
Config Rot = Output 'Ausgänge
Config Gruen = Output
Rot = 1 'LEDs erstmal an
Gruen = 1
'Phasenkorrekter 8-Bit-PWM, PWM-Frequenz=245Hz
Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Pwm1b = 100
'ADC aktivieren (single conversion, Prescaler Auto, AVcc (INTERN!!!)
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Do 'Hauptschleife Begin
'erstes Teilprogramm - UART Empfang und auswerten
If Ischarwaiting() = 1 Then 'Wenn Zeichen Empfangen
Zeichen = Inkey() 'dann Zeichen aus Puffer lesen
If Zeichen = "1" Then 'Wenn Zeichen = "1"
Rot = 1 '...
Print "Led An"
Elseif Zeichen = "0" Then 'Wenn Zeichen = "0"
Rot = 0 '...
Print "Led Aus"
Elseif Zeichen = "t" Then 'Wenn Zeichen = "t"
Toggle Rot '...
Print "Toggle Led"
Elseif Zeichen = "?" Then 'Wenn Zeichen = "?"
If Rot = 0 Then 'Dann wenn Led aus ist...
Print "Led ist aus"
Elseif Rot = 1 Then 'sonst wenn Led an ist...
Print "Led ist an"
End If
Else
Pwm1b = Zeichen 'sonst PWM1B zuweisen
End If
End If
'zweites Teilprogramm - LED durch timer blinken lassen
If Tifr.tov1 = 1 Then 'wenn Timer übergelaufen ist
Tifr.tov1 = 1 'Überlaufflag zurücksetzen
Poti = Getadc(0)
Pwm1a = Poti / 4
Incr Z
If Z = 245 Then 'Überläufe zählen (245)
Z = 0 'Zähler zurücksetzen
Toggle Gruen 'LED toggeln
End If
End If
Loop
Wir haben geprüft ob das empfangene Zeichen "1", "0", "t" oder "?" war. Jetzt fügen wir noch hinzu, ob Zeichen=0 (dann sollen die Ausgaben disconnected werden) oder Zeichen=255 (dann sollen sie connected also mit clear down werden) ist. Bei jedem anderen Wert soll das ganze weiterhin die Intensität von Kanal B festlegen.
Also:
CodeBox BascomAVR
$regfile = "m8def.dat" 'Controllerdefinitionsdatei einbinden
$crystal = 8000000 'Systemtakt angeben (Baudrate)
$hwstack = 40 'Stacks
$swstack = 16
$framesize = 32
$baud = 19200 'Baudrate UART
Dim Zeichen As Byte 'UART-Empfang
Dim Z As Byte 'Timerüberlaufzähler
Dim Poti As Word 'ADC-Messung
Rot Alias Portd.7 'Namen für LED-Beine
Gruen Alias Portc.3
Config Rot = Output 'Ausgänge
Config Gruen = Output
Rot = 1 'LEDs erstmal an
Gruen = 1
'Phasenkorrekter 8-Bit-PWM, PWM-Frequenz=245Hz
Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Pwm1b = 100
'ADC aktivieren (single conversion, Prescaler Auto, AVcc (INTERN!!!)
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Do 'Hauptschleife Begin
'erstes Teilprogramm - UART Empfang und auswerten
If Ischarwaiting() = 1 Then 'Wenn Zeichen Empfangen
Zeichen = Inkey() 'dann Zeichen aus Puffer lesen
If Zeichen = "1" Then 'Wenn Zeichen = "1"
Rot = 1 '...
Print "Led An"
Elseif Zeichen = "0" Then 'Wenn Zeichen = "0"
Rot = 0 '...
Print "Led Aus"
Elseif Zeichen = "t" Then 'Wenn Zeichen = "t"
Toggle Rot '...
Print "Toggle Led"
Elseif Zeichen = "?" Then 'Wenn Zeichen = "?"
If Rot = 0 Then 'Dann wenn Led aus ist...
Print "Led ist aus"
Elseif Rot = 1 Then 'sonst wenn Led an ist...
Print "Led ist an"
End If
Elseif Zeichen = 0 Then 'bei 0x00 PWM deaktivieren
Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Disconnect , Compare B Pwm = Disconnect
Elseif Zeichen = 255 Then 'bei 0xFF PWM aktivieren
Config Timer1 = Pwm , Prescale = 64 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Else
Pwm1b = Zeichen 'sonst PWM1B zuweisen
End If
End If
'zweites Teilprogramm - LED durch timer blinken lassen
If Tifr.tov1 = 1 Then 'wenn Timer übergelaufen ist
Tifr.tov1 = 1 'Überlaufflag zurücksetzen
Poti = Getadc(0)
Pwm1a = Poti / 4
Incr Z
If Z = 245 Then 'Überläufe zählen (245)
Z = 0 'Zähler zurücksetzen
Toggle Gruen 'LED toggeln
End If
End If
Loop
Nachvollziehen und ausprobieren!!