Hallo liebe Community,
habe hier ein Problem, das eure Hilfe erfordert.
Ich verwende einen Atmega 48-20AU um ein DMX-Signal auszuwerten und daraus 2 RGB-Kanäle per Hardwarepwm auszugeben.
Probleme dabei macht der Timer2: übertrage ich das Programm wie unten beschrieben, so spinnt der Controller. (Die RGB LEDs beginnen zu flackern bis entweder Timer2, also rot bei beiden LEDs gar nicht mehr tut oder sich der rote Kanal von LED2 (untere LED im Video) durchgesetzt hat)
Klammere ich jetzt allerdings einen der beiden PWM- Kanäle von Timer2 aus, so funktioniert alles einwandfrei. Beie Kanäle faden ohne zu stocken die Farben durch, bei einem fehlt dann allerdings rot.
Aber woran liegt's??
$regfile = "m48def.dat"
$crystal = 16000000
$baud = 115200
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 1
Config Timer0 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
Config Timer1 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
Config Timer2 = Pwm , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
'Puffer für das angekommene Byte aus dem DMX-Signal
Dim X As Byte
'Byte aus dem letzten Interruptdurchgang
Dim Exx As Byte
'Array, in dem alle 64 Kanäle gespeichert werden
Dim Puffer(64) As Byte
'Der aktuelle Kanal in der Empfangsroutine
Dim Kanal As Word
'Byte für die Kanalfestlegung 1-64
Dim Sollkanal As Byte
'Kanalberechnung
Sollkanal = 1
Sollkanal = Sollkanal * 3
Sollkanal = Sollkanal - 2
On Urxc Empfang
Enable Urxc
Enable Interrupts
Do
Ocr2b = Puffer(sollkanal) ; 1 'roter Kanal LED1
Ocr0b = Puffer(sollkanal + 1) ; 1 'grüner Kanal LED1
Ocr0a = Puffer(sollkanal + 2) ; 1 'blauer Kanal LED1
Ocr2a = Puffer(sollkanal + 3) ; 1 'roter Kanal LED2
Ocr1bl = Puffer(sollkanal + 4) ; 1 'grüner Kanal LED2
Ocr1al = Puffer(sollkanal + 5) ; 1 'blauer Kanal LED2
Loop
'--------------------------------------------------------------
'
'Empfang:
'
'steht in der USART ein Byte an, wird ein Interrupt
'ausgelöst und folgender Code abgearbeitet:
'--------------------------------------------------------------
Empfang:
X = Udr
Incr Kanal
If X = &HA1 And Exx = &H5A Then Kanal = 0
If Kanal < 64 Then Puffer(kanal) = X
Exx = X
Return
Alles anzeigen
edit:
nach Neuauflage des Platinenlayouts flackern die LEDs nur noch wenn die Werte für rot (ocr2) ansteigen. ???
Die Fusebits sind auf externen Quarz gesetzt, ich verwende einen mit 16MHz. Löte ich statt dessen einen mit 8MHz ein, kann ich mit PonyProg nicht mehr auf den Controller zugreifen; aber warum???