PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verwendung von mehreren Interruptrotinen (RS485 und Timer)



elkokiller
01.01.2007, 10: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

Vitis
01.01.2007, 16:07
warum disablest du beim senden die interrupts?
der timer funzt dann nämlich nichtmehr und der würde
ja die zeitmessung auslösen.
dann hängste noch ewigkeiten in der timerinterruptroutine fest weil du da
ja nen gosub mit diversen unterfunktionen drinne hast,
dann ist ein teiler von 1700 um eine minute zu zählen auch ziemlich
heftig, den timer kannste auch konfigurieren das er eben alle sekunde
auslöst, dann brauchste nur bis 60 zählen.
bei 485 kannste den urxc auch enabled lassen, da wenn der bus belegt
ist kann eh nix einlaufen währen der sendung.
dann haste noch ne unterfunktion in der urxc die du per gosub anspringst,
der weil ist der interrupt natürlich auch gesperrt.

an stelle von pirint chr kannste auch printbin verwenden.

elkokiller
01.01.2007, 17:38
Hi Vitis,

wie kann ich den Timer so konfigurieren dass er nur im Minutentakt auslöst?
Ich konnte dazu nichts finden.
Die Krücke mit dem Teilen habe ich dann hier im Forum gefunden

Vitis
01.01.2007, 22:54
sekunden, nicht inuten, esseidenn du machst ne Betriebsfrequenz des AVR
im KHz-Bereich. Aber Sekunden sind klar machbar.
Zum Timer berechnen gibts von Roboternetz n Tool zum Download.
https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=169