- 12V Akku mit 280 Ah bauen         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 21

Thema: [gelöst] Interrupt "on URXC" wird nicht angesprung

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253

    [gelöst] Interrupt "on URXC" wird nicht angesprung

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo!

    Ich möchte einige Daten per RS232 empfangen und daraus PWMs generieren. Der PWM-Teil funktioniert auch wunderbar, nur habe ich heute die RS232-Empfangsroutine von einfachem Polling in der Hauptschleife auf ein interruptbasiertes Verfahren umstellen wollen. Leider wird der Interruptvektor überhaupt nicht angesprungen. (Die Debug-Message im Interrupt wird nicht ausgegeben). Kann mir jemand sagen, woran das liegt?
    Hier der Code

    Code:
    $regfile = "m8def.dat"
    $crystal = 14745600
    $baud = 115200
    
    Config Timer0 = Timer , Prescale = 1                        'Timer0 für 100 Hz
    Config Portb = Output
    Config Portc = Output
    Dim Tmp_b As Byte                                           'Temp-Register für die Outputs (schneller beschreibbar)
    Dim Tmp_c As Byte
    Dim Pointer As Byte                                         'debug
    Dim Pwm_cnt As Byte                                         'Zähler für PWM-Intervall
    Dim Pwms(12) As Byte                                        'Array mit PWM-Werten
    Dim Tmp_pwms(12) As Byte                                    'temporäres pwm-array
    Dim Incoming As Byte                                        'Byte welches über UART gekommen ist
    Dim Mybytes As Byte                                         'wieviele signifikante bytes hab ich empfangen
    Dim Bytecnt As Integer                                      'Wieviele Bytes wurden empfangen?
    Dim Receiveflag As Bit
    Bytecnt = 0
    Receiveflag = 0
    Const Slaveid = 0                                           'Slave-IDs von 0 bis 24)
    Const Timervorgabe = 112                                    'Timerstartwert für korrektes Timing
    Const Startwert = 1 +(slaveid * 12)                         'Hier im Stream fangen meine Bytes an
    Const Startsymbol = 123
    
    
    Pwms(1) = 10                                                'Farbwerte zuweisen (debug)
    Pwms(2) = 10
    Pwms(3) = 10
    Pwms(4) = 10
    Pwms(5) = 10
    Pwms(6) = 10
    Pwms(7) = 10
    Pwms(8) = 10
    Pwms(9) = 10
    Pwms(10) = 10
    Pwms(11) = 10
    Pwms(12) = 10
    
    Waitms 500
    Portb.1 = 1                                                 'Takt testen (debug)
    Waitms 500
    Portb.1 = 0
    Waitms 500
    Portb.1 = 1
    Waitms 500
    Portb.1 = 0
    Waitms 500
    Portb.1 = 1
    Waitms 500
    Portb.1 = 0
    Waitms 500
    
    Print
    Print "RGB-Slave...started"
    Print "Slave-ID..." ; Slaveid
    Print "Communication...OK"
    Print
    
    Enable Timer0
    Enable Urxc
    Enable Interrupts
    
    Timer0 = Timervorgabe
    
    On Timer0 Timer_irq
    On Urxc Getit
    
    
    'Main:
    Do
          If Receiveflag = 1 Then                               'Wenn flag gesetzt ist
             Pwms(1) = Tmp_pwms(1)                              'Array kopieren
             Pwms(2) = Tmp_pwms(2)
             Pwms(3) = Tmp_pwms(3)
             Pwms(4) = Tmp_pwms(4)
             Pwms(5) = Tmp_pwms(5)
             Pwms(6) = Tmp_pwms(6)
             Pwms(7) = Tmp_pwms(7)
             Pwms(8) = Tmp_pwms(8)
             Pwms(9) = Tmp_pwms(9)
             Pwms(10) = Tmp_pwms(10)
             Pwms(11) = Tmp_pwms(11)
             Pwms(12) = Tmp_pwms(12)                            'mybytes zurücksetzen
             Mybytes = 0                                        'flag loeschen
             Receiveflag = 0
             Print
             Print "Array completely received:"                 'debug
             Print Chr(pwms(1)) ; " / " ; Pwms(1)
             Print Chr(pwms(2)) ; " / " ; Pwms(2)
             Print Chr(pwms(3)) ; " / " ; Pwms(3)
             Print Chr(pwms(4)) ; " / " ; Pwms(4)
             Print Chr(pwms(5)) ; " / " ; Pwms(5)
             Print Chr(pwms(6)) ; " / " ; Pwms(6)
             Print Chr(pwms(7)) ; " / " ; Pwms(7)
             Print Chr(pwms(8)) ; " / " ; Pwms(8)
             Print Chr(pwms(9)) ; " / " ; Pwms(9)
             Print Chr(pwms(10)) ; " / " ; Pwms(10)
             Print Chr(pwms(11)) ; " / " ; Pwms(11)
             Print Chr(pwms(12)) ; " / " ; Pwms(12)
             Print
          End If
    Loop
    
    Getit:
          Print "receive"                                       'debug
          Incoming = Udr                                        'Aktuelles Zeichen Speichern
          Incr Bytecnt                                          'Hab nen Byte mehr
          If Incoming = Startsymbol Then Bytecnt = 0            'Startwert ist das Startsymbol des Streams
          If Bytecnt = Startwert Then Mybytes = 1               'Hier ist mein erstes Byte
          If Mybytes > 0 Then                                   'Wenn mein erstes Byte gefunden wurde
             Tmp_pwms(mybytes) = Incoming                       'Byte in temp-Array
             Incr Mybytes                                       'Ein Byte mehr gesammelt
          End If
          If Mybytes > 12 Then                                  'wenn alle 12 bytes da sind...
             Receiveflag = 1                                    '...flag setzen damit im hauptprogramm die werte übernommen werden
          End If
    Return
    
    Timer_irq:
        Timer0 = Timervorgabe
        Tmp_b = 0
        Tmp_c = 0
        If Pwms(1) > Pwm_cnt Then Tmp_c = Tmp_c Or 8            'R1 (PORTC.3)
        If Pwms(2) > Pwm_cnt Then Tmp_c = Tmp_c Or 16           'G1 (PORTC.4)
        If Pwms(3) > Pwm_cnt Then Tmp_c = Tmp_c Or 32           'B1 (PORTC.1)
        If Pwms(4) > Pwm_cnt Then Tmp_c = Tmp_c Or 1            'R2 (PORTC.0)
        If Pwms(5) > Pwm_cnt Then Tmp_c = Tmp_c Or 2            'G2 (PORTC.1)
        If Pwms(6) > Pwm_cnt Then Tmp_c = Tmp_c Or 4            'B2 (PORTC.2)
        If Pwms(7) > Pwm_cnt Then Tmp_b = Tmp_b Or 8            'R3 (PORTB.3)
        If Pwms(8) > Pwm_cnt Then Tmp_b = Tmp_b Or 16           'G3 (PORTB.4)
        If Pwms(9) > Pwm_cnt Then Tmp_b = Tmp_b Or 32           'B3 (PORTB.5)
        If Pwms(10) > Pwm_cnt Then Tmp_b = Tmp_b Or 1           'R4 (PORTB.0)
        If Pwms(11) > Pwm_cnt Then Tmp_b = Tmp_b Or 2           'R3 (PORTB.1)
        If Pwms(12) > Pwm_cnt Then Tmp_b = Tmp_b Or 4           'R3 (PORTB.2)
        Portc = Tmp_c
        Portb = Tmp_b
        Incr Pwm_cnt                                            'Pwm_cnt incrementieren und lustig überlaufen lassen
    Return

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Möglicherweise musst du noch CONFIG UART oder CONFIG SERIAL benutzen.
    Da gibts ja auch Einstellungen für die Interrupts - ging bei mir letztes mal. Siehe Help-File...

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    ich find den Ablauf nicht besonders geschickt, den IRQ zu aktivieren bevor das Sprungziel definert ist.
    ansonsten sollts gehen ... tausch das mal
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    Naja beim Interrupt von Timer0 funktioniert das aber. Ich werds mal probieren.

    edit:
    nein, funktioniert nicht. Ich habe auch versucht, mit

    Code:
    Config Serialin = Buffered , Size = 254 , Bytematch = All
    den Interrupt an Label

    Code:
    Serial0bytereceived:
    auszulösen, aber auch das geht nicht.

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    Könnte es vielleicht an dem Timer0-Interrupt liegen?

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Also ich glaube das ist ein eigener Interrupt. Nicht Timer0

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Aus aktuellem Anlaß weise ich nochmal auf die Stack-Größen hin!
    Die würde ich mal fein groß machen, das ist sehr häufig die Lösung.
    Und stell den Buffer von der Serial mal etwas runter, vielleicht braucht das zuviel RAM!?

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    Ja aber ich glaube hier im RN irgendwann mal gelesen zu haben, dass der Timer die RS232-Übertragung stören kann

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    gut, wenn ich alles auskommentiere bis auf den interrupt und die serialin-config, dann funktioniert es. jetzt werd ich mal langsam alles wieder einkommentieren und dann hoffentlich wissen, woran es liegt.

  10. #10
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    mach die Stacks rein + GROSS!

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test