- LiFePO4 Speicher Test         
Ergebnis 1 bis 3 von 3

Thema: Probleme mit Interruptgesteuerter Soft-Uart

  1. #1

    Probleme mit Interruptgesteuerter Soft-Uart

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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é

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    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.

Ähnliche Themen

  1. Soft UART sendet, empfängt aber nicht
    Von panier im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 14
    Letzter Beitrag: 02.01.2012, 16:54
  2. Soft-Uart - Intergerzahlen ohne ext. Quarz übermitteln
    Von #fritz# im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 10.10.2011, 19:31
  3. UART Probleme
    Von filth im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 2
    Letzter Beitrag: 17.03.2009, 22:07
  4. Soft-UART mit Standardtakt 1MHz
    Von gorra im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 09.09.2008, 18:39
  5. Soft-UART in BAscom?
    Von mar_phil im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 19.08.2008, 18:44

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad