Goblin
04.08.2008, 22:58
Hallo!
Ich möchte einige Daten per RS232 empfangen und daraus PWMs generieren. Der PWM-Teil funktioniert auch wunderbar, nur habe ich heute die RS232-Empfangsroutine von einfachem Polling in der Hauptschleife auf ein interruptbasiertes Verfahren umstellen wollen. Leider wird der Interruptvektor überhaupt nicht angesprungen. (Die Debug-Message im Interrupt wird nicht ausgegeben). Kann mir jemand sagen, woran das liegt?
Hier der Code
$regfile = "m8def.dat"
$crystal = 14745600
$baud = 115200
Config Timer0 = Timer , Prescale = 1 'Timer0 für 100 Hz
Config Portb = Output
Config Portc = Output
Dim Tmp_b As Byte 'Temp-Register für die Outputs (schneller beschreibbar)
Dim Tmp_c As Byte
Dim Pointer As Byte 'debug
Dim Pwm_cnt As Byte 'Zähler für PWM-Intervall
Dim Pwms(12) As Byte 'Array mit PWM-Werten
Dim Tmp_pwms(12) As Byte 'temporäres pwm-array
Dim Incoming As Byte 'Byte welches über UART gekommen ist
Dim Mybytes As Byte 'wieviele signifikante bytes hab ich empfangen
Dim Bytecnt As Integer 'Wieviele Bytes wurden empfangen?
Dim Receiveflag As Bit
Bytecnt = 0
Receiveflag = 0
Const Slaveid = 0 'Slave-IDs von 0 bis 24)
Const Timervorgabe = 112 'Timerstartwert für korrektes Timing
Const Startwert = 1 +(slaveid * 12) 'Hier im Stream fangen meine Bytes an
Const Startsymbol = 123
Pwms(1) = 10 'Farbwerte zuweisen (debug)
Pwms(2) = 10
Pwms(3) = 10
Pwms(4) = 10
Pwms(5) = 10
Pwms(6) = 10
Pwms(7) = 10
Pwms(8) = 10
Pwms(9) = 10
Pwms(10) = 10
Pwms(11) = 10
Pwms(12) = 10
Waitms 500
Portb.1 = 1 'Takt testen (debug)
Waitms 500
Portb.1 = 0
Waitms 500
Portb.1 = 1
Waitms 500
Portb.1 = 0
Waitms 500
Portb.1 = 1
Waitms 500
Portb.1 = 0
Waitms 500
Print
Print "RGB-Slave...started"
Print "Slave-ID..." ; Slaveid
Print "Communication...OK"
Print
Enable Timer0
Enable Urxc
Enable Interrupts
Timer0 = Timervorgabe
On Timer0 Timer_irq
On Urxc Getit
'Main:
Do
If Receiveflag = 1 Then 'Wenn flag gesetzt ist
Pwms(1) = Tmp_pwms(1) 'Array kopieren
Pwms(2) = Tmp_pwms(2)
Pwms(3) = Tmp_pwms(3)
Pwms(4) = Tmp_pwms(4)
Pwms(5) = Tmp_pwms(5)
Pwms(6) = Tmp_pwms(6)
Pwms(7) = Tmp_pwms(7)
Pwms(8) = Tmp_pwms(8)
Pwms(9) = Tmp_pwms(9)
Pwms(10) = Tmp_pwms(10)
Pwms(11) = Tmp_pwms(11)
Pwms(12) = Tmp_pwms(12) 'mybytes zurücksetzen
Mybytes = 0 'flag loeschen
Receiveflag = 0
Print
Print "Array completely received:" 'debug
Print Chr(pwms(1)) ; " / " ; Pwms(1)
Print Chr(pwms(2)) ; " / " ; Pwms(2)
Print Chr(pwms(3)) ; " / " ; Pwms(3)
Print Chr(pwms(4)) ; " / " ; Pwms(4)
Print Chr(pwms(5)) ; " / " ; Pwms(5)
Print Chr(pwms(6)) ; " / " ; Pwms(6)
Print Chr(pwms(7)) ; " / " ; Pwms(7)
Print Chr(pwms(8)) ; " / " ; Pwms(8)
Print Chr(pwms(9)) ; " / " ; Pwms(9)
Print Chr(pwms(10)) ; " / " ; Pwms(10)
Print Chr(pwms(11)) ; " / " ; Pwms(11)
Print Chr(pwms(12)) ; " / " ; Pwms(12)
Print
End If
Loop
Getit:
Print "receive" 'debug
Incoming = Udr 'Aktuelles Zeichen Speichern
Incr Bytecnt 'Hab nen Byte mehr
If Incoming = Startsymbol Then Bytecnt = 0 'Startwert ist das Startsymbol des Streams
If Bytecnt = Startwert Then Mybytes = 1 'Hier ist mein erstes Byte
If Mybytes > 0 Then 'Wenn mein erstes Byte gefunden wurde
Tmp_pwms(mybytes) = Incoming 'Byte in temp-Array
Incr Mybytes 'Ein Byte mehr gesammelt
End If
If Mybytes > 12 Then 'wenn alle 12 bytes da sind...
Receiveflag = 1 '...flag setzen damit im hauptprogramm die werte übernommen werden
End If
Return
Timer_irq:
Timer0 = Timervorgabe
Tmp_b = 0
Tmp_c = 0
If Pwms(1) > Pwm_cnt Then Tmp_c = Tmp_c Or 8 'R1 (PORTC.3)
If Pwms(2) > Pwm_cnt Then Tmp_c = Tmp_c Or 16 'G1 (PORTC.4)
If Pwms(3) > Pwm_cnt Then Tmp_c = Tmp_c Or 32 'B1 (PORTC.1)
If Pwms(4) > Pwm_cnt Then Tmp_c = Tmp_c Or 1 'R2 (PORTC.0)
If Pwms(5) > Pwm_cnt Then Tmp_c = Tmp_c Or 2 'G2 (PORTC.1)
If Pwms(6) > Pwm_cnt Then Tmp_c = Tmp_c Or 4 'B2 (PORTC.2)
If Pwms(7) > Pwm_cnt Then Tmp_b = Tmp_b Or 8 'R3 (PORTB.3)
If Pwms(8) > Pwm_cnt Then Tmp_b = Tmp_b Or 16 'G3 (PORTB.4)
If Pwms(9) > Pwm_cnt Then Tmp_b = Tmp_b Or 32 'B3 (PORTB.5)
If Pwms(10) > Pwm_cnt Then Tmp_b = Tmp_b Or 1 'R4 (PORTB.0)
If Pwms(11) > Pwm_cnt Then Tmp_b = Tmp_b Or 2 'R3 (PORTB.1)
If Pwms(12) > Pwm_cnt Then Tmp_b = Tmp_b Or 4 'R3 (PORTB.2)
Portc = Tmp_c
Portb = Tmp_b
Incr Pwm_cnt 'Pwm_cnt incrementieren und lustig überlaufen lassen
Return
Ich möchte einige Daten per RS232 empfangen und daraus PWMs generieren. Der PWM-Teil funktioniert auch wunderbar, nur habe ich heute die RS232-Empfangsroutine von einfachem Polling in der Hauptschleife auf ein interruptbasiertes Verfahren umstellen wollen. Leider wird der Interruptvektor überhaupt nicht angesprungen. (Die Debug-Message im Interrupt wird nicht ausgegeben). Kann mir jemand sagen, woran das liegt?
Hier der Code
$regfile = "m8def.dat"
$crystal = 14745600
$baud = 115200
Config Timer0 = Timer , Prescale = 1 'Timer0 für 100 Hz
Config Portb = Output
Config Portc = Output
Dim Tmp_b As Byte 'Temp-Register für die Outputs (schneller beschreibbar)
Dim Tmp_c As Byte
Dim Pointer As Byte 'debug
Dim Pwm_cnt As Byte 'Zähler für PWM-Intervall
Dim Pwms(12) As Byte 'Array mit PWM-Werten
Dim Tmp_pwms(12) As Byte 'temporäres pwm-array
Dim Incoming As Byte 'Byte welches über UART gekommen ist
Dim Mybytes As Byte 'wieviele signifikante bytes hab ich empfangen
Dim Bytecnt As Integer 'Wieviele Bytes wurden empfangen?
Dim Receiveflag As Bit
Bytecnt = 0
Receiveflag = 0
Const Slaveid = 0 'Slave-IDs von 0 bis 24)
Const Timervorgabe = 112 'Timerstartwert für korrektes Timing
Const Startwert = 1 +(slaveid * 12) 'Hier im Stream fangen meine Bytes an
Const Startsymbol = 123
Pwms(1) = 10 'Farbwerte zuweisen (debug)
Pwms(2) = 10
Pwms(3) = 10
Pwms(4) = 10
Pwms(5) = 10
Pwms(6) = 10
Pwms(7) = 10
Pwms(8) = 10
Pwms(9) = 10
Pwms(10) = 10
Pwms(11) = 10
Pwms(12) = 10
Waitms 500
Portb.1 = 1 'Takt testen (debug)
Waitms 500
Portb.1 = 0
Waitms 500
Portb.1 = 1
Waitms 500
Portb.1 = 0
Waitms 500
Portb.1 = 1
Waitms 500
Portb.1 = 0
Waitms 500
Print "RGB-Slave...started"
Print "Slave-ID..." ; Slaveid
Print "Communication...OK"
Enable Timer0
Enable Urxc
Enable Interrupts
Timer0 = Timervorgabe
On Timer0 Timer_irq
On Urxc Getit
'Main:
Do
If Receiveflag = 1 Then 'Wenn flag gesetzt ist
Pwms(1) = Tmp_pwms(1) 'Array kopieren
Pwms(2) = Tmp_pwms(2)
Pwms(3) = Tmp_pwms(3)
Pwms(4) = Tmp_pwms(4)
Pwms(5) = Tmp_pwms(5)
Pwms(6) = Tmp_pwms(6)
Pwms(7) = Tmp_pwms(7)
Pwms(8) = Tmp_pwms(8)
Pwms(9) = Tmp_pwms(9)
Pwms(10) = Tmp_pwms(10)
Pwms(11) = Tmp_pwms(11)
Pwms(12) = Tmp_pwms(12) 'mybytes zurücksetzen
Mybytes = 0 'flag loeschen
Receiveflag = 0
Print "Array completely received:" 'debug
Print Chr(pwms(1)) ; " / " ; Pwms(1)
Print Chr(pwms(2)) ; " / " ; Pwms(2)
Print Chr(pwms(3)) ; " / " ; Pwms(3)
Print Chr(pwms(4)) ; " / " ; Pwms(4)
Print Chr(pwms(5)) ; " / " ; Pwms(5)
Print Chr(pwms(6)) ; " / " ; Pwms(6)
Print Chr(pwms(7)) ; " / " ; Pwms(7)
Print Chr(pwms(8)) ; " / " ; Pwms(8)
Print Chr(pwms(9)) ; " / " ; Pwms(9)
Print Chr(pwms(10)) ; " / " ; Pwms(10)
Print Chr(pwms(11)) ; " / " ; Pwms(11)
Print Chr(pwms(12)) ; " / " ; Pwms(12)
End If
Loop
Getit:
Print "receive" 'debug
Incoming = Udr 'Aktuelles Zeichen Speichern
Incr Bytecnt 'Hab nen Byte mehr
If Incoming = Startsymbol Then Bytecnt = 0 'Startwert ist das Startsymbol des Streams
If Bytecnt = Startwert Then Mybytes = 1 'Hier ist mein erstes Byte
If Mybytes > 0 Then 'Wenn mein erstes Byte gefunden wurde
Tmp_pwms(mybytes) = Incoming 'Byte in temp-Array
Incr Mybytes 'Ein Byte mehr gesammelt
End If
If Mybytes > 12 Then 'wenn alle 12 bytes da sind...
Receiveflag = 1 '...flag setzen damit im hauptprogramm die werte übernommen werden
End If
Return
Timer_irq:
Timer0 = Timervorgabe
Tmp_b = 0
Tmp_c = 0
If Pwms(1) > Pwm_cnt Then Tmp_c = Tmp_c Or 8 'R1 (PORTC.3)
If Pwms(2) > Pwm_cnt Then Tmp_c = Tmp_c Or 16 'G1 (PORTC.4)
If Pwms(3) > Pwm_cnt Then Tmp_c = Tmp_c Or 32 'B1 (PORTC.1)
If Pwms(4) > Pwm_cnt Then Tmp_c = Tmp_c Or 1 'R2 (PORTC.0)
If Pwms(5) > Pwm_cnt Then Tmp_c = Tmp_c Or 2 'G2 (PORTC.1)
If Pwms(6) > Pwm_cnt Then Tmp_c = Tmp_c Or 4 'B2 (PORTC.2)
If Pwms(7) > Pwm_cnt Then Tmp_b = Tmp_b Or 8 'R3 (PORTB.3)
If Pwms(8) > Pwm_cnt Then Tmp_b = Tmp_b Or 16 'G3 (PORTB.4)
If Pwms(9) > Pwm_cnt Then Tmp_b = Tmp_b Or 32 'B3 (PORTB.5)
If Pwms(10) > Pwm_cnt Then Tmp_b = Tmp_b Or 1 'R4 (PORTB.0)
If Pwms(11) > Pwm_cnt Then Tmp_b = Tmp_b Or 2 'R3 (PORTB.1)
If Pwms(12) > Pwm_cnt Then Tmp_b = Tmp_b Or 4 'R3 (PORTB.2)
Portc = Tmp_c
Portb = Tmp_b
Incr Pwm_cnt 'Pwm_cnt incrementieren und lustig überlaufen lassen
Return