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







Zitieren
Lesezeichen