Hallo,
nachdem ich nun selber nicht mehr weiter komme, versuche ich nun einen barmherzigen Bascom-Helfer zu finden, der mir vielleicht weiter helfen kann.
Ich habe ein ATMega8-Programm welches mir abhängig von einem durch einen Interrupt ausgelöstes Event (Servo-Signal aus einem RC-Empfänger), Lichtspielereien an einem WS2803 LED-Treiber ermöglicht.
Soweit funktioniert auch mit dem Mega8 alles wie ich es möchte. Allerdings wollte ich aufgrund von Platzersparnis nun einen ATTiny13 verwenden. Dieser hat allerdings nur einen 8-bit-Timer. Aber ich glaube mein portiertes Programm hat schon mit dem Interrupt Probleme. Hier der Quellcode in Bascom:
Code:
$regfile = "ATtiny13.dat" 'es handelt sich um einen ATTiny13
$crystal = 9600000 'der eingebauter RC-Oszillator läuft mit 9,6 Mhz
$hwstack = 32
$swstack = 10
$framesize = 10
Config Portb = Output 'Alle IO-Pins als Ausgang
Ddrb.1 = 0 'B1 = Interrupt also Eingang
Dim I As Byte
Dim J As Byte
Dim K As Byte
Dim Reading As Bit
Dim Timer_wert As Byte
Dim Error As Bit
Clk1 Alias Portb.0
Data1 Alias Portb.2
'Timer1 konfigurieren
Config Timer0 = Timer , Prescale = 1024
'Interrupt Int0 auf wechselndes Signal konfigurieren
Config Int0 = Change
'======================================================
'Initialisierungen
'======================================================
'Zuweisung der Interrupt-Service-Routinen
On Int0 On_int0
On Timer0 On_timer0
'Timer-Freigabe
Enable Timer0
Stop Timer0
'Freigabe der Interrupt-Routinen
Enable Int0
Enable Interrupts
'======================================================
'Hauptprogramm - Lauflicht mit 5 LEDs an einem WS2803
'======================================================
Do
If Timer_wert < 200 Then
K = 1
Do
Gosub Reset_ws2803
For J = 1 To 18
For I = 1 To 8
If J = K Then Data1 = 1 Else Data1 = 0
Gosub Clk_ws2803
Next I
Next J
Waitms 7
K = K + 1
Loop Until K > 5
End If
Loop
End
'======================================================
'Unterprogramme
'======================================================
On_int0: 'Interrupt
'Den Timer starten mit steigender Flanke
If Reading = 0 Then
Start Timer0
Reading = 1
'Den Timer stoppen mit fallender Flanke
Else
Stop Timer0
Timer_wert = Timer0
Timer0 = 0
Reading = 0
End If
'Error-Bit rücksetzen
Error = 0
Return
On_timer0: 'Timer
'Error-Bit stzen
Error = 1
Reading = 0
Stop Timer0
Timer_wert = 0
Return
'WS2803 LED-Treiber resetten
Reset_ws2803:
Clk1 = 0
Waitus 600
Return
'WS2803 alle LEDs aus
Clear_ws2803:
For J = 1 To 18
For I = 1 To 8
Data1 = 0
Gosub Clk_ws2803
Next I
Next J
Return
'WS2803 Clocksignal
Clk_ws2803:
Clk1 = 0
Waitus 1
Clk1 = 1
Waitus 1
Return
Sobald ich die Fernsteuerung einschalte, blinken die LEDs undefiniert. Ansonsten laufen sie anständig durch. Ich habe den Timer auch zum Test mal herausgenommen und das Timer-Unterprogramm "On_timer0" komplett geleert aber immer der gleiche Müll. Ich denke der Interrupt vermurkst mir das Timing für den WS2803 aber auf dem Mega8 lief es ja einwandfrei. Ich weiss ehrlich keinen Rat mehr. Hat von euch vielleicht jemand eine Idee?
P.S.:
R/C-Signal ist mit 50 Hz PWM moduliert und variiert je nach Reglerstellung zwischen 1-2 ms. Der Interrupt-Pin ist mit diesem Signal verbunden. Bei steigender Flanke wird der Timer gestartet und mit fallender Flanke wieder gestoppt.
Der WS2803 wird seriell mit Graustufen für 18 LEDs befüllt. Ich beschränke mich auf "volle Helligkeit". D.h. ich schiebe 18 x 8bit für die Graustufen in den Chip, hier 18 x den Binärwert für 256. Die Ansteuerung funktioniert wie gesagt soweit, bis ich eben den R/C-Sender einschalte und der Interrupt-Pin dann seine Signalwechsel bekommt.
Lesezeichen