elkokiller
01.01.2007, 11:14
Hallo zusammen und frohes neues Jahr!
Wer kann mir mal helfen?
Ich habe in meinem Programm zwei Interrupotrotinen.
In der einen wird bei einer Abfrage über einen RS485 Bus ein Interrupt ausgelöst der den Status meines Steuermoduls überträgt.
Gleichzeitig senden das Modul von sich aus bei bestimmten Schaltvorgängen etwas auf den Bus.
Dies hat bisher auch immer funktioniert.
Da in dem Modul aber Zeiten verwendet werden, habe ich einen Timer eingesetzt der ebenfalls Interrupts auslöst.
Irgentwie beeinflussen sich die beiden jetzt so, dass der 485 Interrupt weder bei einer Abfrage noch bei einem einfachen Sendevorgang etwas macht.
Woran liegt das?
Hier die relevanten Codeausschnitte:
On Timer0 Ontimer0 'Timer Interrupt
Config Timer0 = Timer , Prescale = 1024
Enable Timer0
Enable Interrupts
On Urxc Onrxd 'Interrupt RS485
Enable Urxc
Enable Interrupts
'---------- Programm --------
Prog_start:
Do
'....
'....
Loop
End
'---------- Interrupt RS485 --------
Onrxd:
Disable Interrupts
Incr N
B(n) = Udr
If N > 9 Then
Preamble = B(1) : Sync = B(2) : Hdb2 = B(3)
Hdb1 = B(4) : Dab1 = B(5)
Sab1 = B(6)
Db1 = B(7)
Db2 = B(8)
Crc2 = B(9)
Crc1 = B(10)
N = 0
Gosub Pruefung
Else
End If
Return
'---------- Senden --------
Uebertragung:
Portb.5 = 1
Disable Urxc
Disable Interrupts
Portd.2 = 1 : Waitms 20 'RS485 PIN auf Senden
Print Chr(preamble_) ; Chr(sync_) ;
Print Chr(hdb2_) ; Chr(hdb1_) ;
Print Chr(dab1_) ; Chr(myadress);
Print Chr(db1_) ; Chr(db2);
Print Chr(crc2) ; Chr(aktion) ;
Do
Loop Until Ucsra.txc = 1
Reset Ucsra.txc
Waitms 10 : Portd.2 = 0 'RS485 PIN auf Enpfang
Enable Urxc
Enable Interrupts
Aktion = ""
Sz = 0
Portb.5 = 0
N = 0
Goto Prog_start
End
'---------- Timer -----------
Ontimer0:
Rtime = Rtime + 1 ' variable wird bei jedem Interrupt um 1 erhöht
Gosub Minutenzaehler
Return
'---------- Minutenzähler -----------
Minutenzaehler:
If Rtime = 1700 Then ' Teilungsfaktor bei 7372800 Hz und Prescale um auf 1 Minute zu kommen
Minute = Minute + 1
Rtime = 0
Else
End If
Return
Wer kann mir mal helfen?
Ich habe in meinem Programm zwei Interrupotrotinen.
In der einen wird bei einer Abfrage über einen RS485 Bus ein Interrupt ausgelöst der den Status meines Steuermoduls überträgt.
Gleichzeitig senden das Modul von sich aus bei bestimmten Schaltvorgängen etwas auf den Bus.
Dies hat bisher auch immer funktioniert.
Da in dem Modul aber Zeiten verwendet werden, habe ich einen Timer eingesetzt der ebenfalls Interrupts auslöst.
Irgentwie beeinflussen sich die beiden jetzt so, dass der 485 Interrupt weder bei einer Abfrage noch bei einem einfachen Sendevorgang etwas macht.
Woran liegt das?
Hier die relevanten Codeausschnitte:
On Timer0 Ontimer0 'Timer Interrupt
Config Timer0 = Timer , Prescale = 1024
Enable Timer0
Enable Interrupts
On Urxc Onrxd 'Interrupt RS485
Enable Urxc
Enable Interrupts
'---------- Programm --------
Prog_start:
Do
'....
'....
Loop
End
'---------- Interrupt RS485 --------
Onrxd:
Disable Interrupts
Incr N
B(n) = Udr
If N > 9 Then
Preamble = B(1) : Sync = B(2) : Hdb2 = B(3)
Hdb1 = B(4) : Dab1 = B(5)
Sab1 = B(6)
Db1 = B(7)
Db2 = B(8)
Crc2 = B(9)
Crc1 = B(10)
N = 0
Gosub Pruefung
Else
End If
Return
'---------- Senden --------
Uebertragung:
Portb.5 = 1
Disable Urxc
Disable Interrupts
Portd.2 = 1 : Waitms 20 'RS485 PIN auf Senden
Print Chr(preamble_) ; Chr(sync_) ;
Print Chr(hdb2_) ; Chr(hdb1_) ;
Print Chr(dab1_) ; Chr(myadress);
Print Chr(db1_) ; Chr(db2);
Print Chr(crc2) ; Chr(aktion) ;
Do
Loop Until Ucsra.txc = 1
Reset Ucsra.txc
Waitms 10 : Portd.2 = 0 'RS485 PIN auf Enpfang
Enable Urxc
Enable Interrupts
Aktion = ""
Sz = 0
Portb.5 = 0
N = 0
Goto Prog_start
End
'---------- Timer -----------
Ontimer0:
Rtime = Rtime + 1 ' variable wird bei jedem Interrupt um 1 erhöht
Gosub Minutenzaehler
Return
'---------- Minutenzähler -----------
Minutenzaehler:
If Rtime = 1700 Then ' Teilungsfaktor bei 7372800 Hz und Prescale um auf 1 Minute zu kommen
Minute = Minute + 1
Rtime = 0
Else
End If
Return