PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Probleme mit Interruptgesteuerter Soft-Uart



SD-75M
01.02.2012, 16:51
Hallo zusammen,

Habe mich gerade in diesem tollen Forum angemeldet, mit der Hoffnung das man hier nich wegen Bascom Programmierung nieder gemacht wird....

Zu meinem ersten Problem:

Wie ich in vielen Beispielen hier gesehen habe, kann man einen externen Interrupt (z.B. INT0) dafür verwenden das Startbit bei einer Software Uart zu dedektieren um diese UART Nachricht in der ISR abzurufen.
Aber leider tut sich da nicht viel... Zu der Seriellen Verbindung ist noch zu sagen, es müssen 4 Datenbytes (ohne CR oder LF oder was auch immer) empfangen werden. Das erste Byte ist immer grösser als &H80!

Hier mal der Code, der eigentlich nicht viel anders ist als der von den Beispielen:


$regfile = "attiny84.dat" 'Prozessor
$crystal = 8000000 'Takt in Hz
$hwstack = 20
$swstack = 20
$framesize = 20

Ddrb = &H03
Portb = &H0F
Ddra = &HFF 'PortA = Ausgang
Porta = &HFF

Open "comb.2:16666,8,n,1" For Input As #1 'Soft Uart Input Pin RX
'Open "Comb.0:16666,8,n,1" For Output As #2 'Soft Uart Output Pin TX

'PortB.1 = LED Statusanzeige

Config Int0 = Falling
On Int0 Int0_isr
Enable Int0

Dim Tempa As Byte
Dim Tempb As Byte
Dim Tempc As Byte

Dim Rx_array(4) As Byte
Dim Array_rx_reset As String * 3 At Rx_array(1) Overlay

Enable Interrupts

'HAuptschleife
Do

'Inputbin #1 , Rx_array(1) , 4 'warten bis 4 Datenbytes empfangen

'Hier Nachricht auswerten:
If Rx_array(1) >= &H80 then
IF Rx_Array(2) = &H01 then
Portb.1 = 0
Elseif Rx_array(2) = &H02 then
Portb.1 = 1
Else
Array_rx_reset = String(3 , 0)
End if
Waitms 20
Toggle Porta.0
Loop


Int0_isr:
Inputbin #1 , Rx_array(1) , 4 'warten bis 4 Datenbytes empfangen
Return



Das komische an der ganze sache ist, wenn ich die 4-Byte Nachricht in der "Maine" Schleife Polle, funktioniert es tadellos, aber so bald ich das Inputbin über die ISR Auswerten möchte, geht das nicht mehr. Die Fusebits im Attiny stimmen, also kein Clock Divide o.ä. als Tacktquelle benutze ich den internen RC-Oscilator, aber mit diesem funktioniert die Soft Uart sehr gut, da ich wie schon geschrieben, in der AHuptschleife die Message problemlos pollen kann...

Weiss da einer Rat, was das noch sein könnte? Vielen Dank schon im vorraus.

Gruss René

PicNick
01.02.2012, 17:22
Mit "nicht funktionieren" meinst Müll Empfang, oder überhaupt nix ?
Eins würd ich nicht ausschliessen: Bis die ISR wirklich aktiv wird, werden vom Bascom eine menge Register gesichert, d.h. das "inputbin" liegt etwas verschoben im Baud-Raster.

SD-75M
01.02.2012, 18:03
Hallo Robert,

Ich habe den Fehler gefunden, nach zwei Tagen! Zur Lösung: Wenn das Empfangen mittels pollen funktioniert, kann am Code so viel nicht falsch sein... Also habe ich vor 10 Minuten mal den radikalen weg genommen und alles was in der Main drinsteht, mit in die ISR gepackt. In der HAuptschleife habe ich nur den Toggelnden Port mit der Waitms drin gelassen um zu sehen ob es geht...
Und es Funktionierte! Hää?!?, wunder, wunder, grübel, scheixxe brülln usw... und dann der rettende Gedanke:

If Rx_array(1) >= &H80 then
IF Rx_Array(2) = &H01 then
Portb.1 = 0
Elseif Rx_array(2) = &H02 then
Portb.1 = 1
Else
Array_rx_reset = String(3 , 0)
End if
Waitms 20
Toggle Porta.0
>>>> Array_rx_reset = String(3 , 0) <<<< Diese Code Zeile war der Auslöser!!!
Loop

Solang ich gepollt habe, war diese Zeile kein Problem.
Also, ich habe meine 4 Datenbytes empfangen, diese Ausgewertet und wenn die Message nicht stimmte habe ich die Nachricht mit dieser Zeile gelöscht usw...

Beim Interrupt ist das aber anders.
Ich kann nicht mehr beeinflussen wenn die Nachricht zur Verfügung steht. Daher, der Interrupt kann Z.B. auslösen wenn der µC gerade den Port Toggelt o.ä. (was, so denke ich immer der Fall war, da nach dem Toggeln die grosse Waitms kommt). Und mit der Codezeile, wo das Array gelöscht wird, habe ich die gerade empfangene Nachricht wieder gelöscht. ohne diese Auszuwerten!

Oh Man, so ein relativ kleiner fehler mit solchen Auswirkungen...

Trotzdem Danke für deine Hilfe.

Gruss René

P.S. ich gönn mir erst mal ein Bier. :cool: