- Labornetzteil AliExpress         
Ergebnis 1 bis 4 von 4

Thema: Verwendung von mehreren Interruptrotinen (RS485 und Timer)

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2006
    Ort
    Nidda
    Alter
    51
    Beiträge
    180

    Verwendung von mehreren Interruptrotinen (RS485 und Timer)

    Anzeige

    Praxistest und DIY Projekte
    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:

    Code:
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    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.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    22.01.2006
    Ort
    Nidda
    Alter
    51
    Beiträge
    180
    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

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    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/dl...le&file_id=169
    Vor den Erfolg haben die Götter den Schweiß gesetzt

Berechtigungen

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

LiFePO4 Speicher Test