- 12V Akku mit 280 Ah bauen         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 21

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

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

    LiFePo4 Akku selber bauen - Video
    hm hier kann man zumindest nachlesen, wozu die dinger gut sind. aber brauche ich dir wirklich? das programm ist nicht im geringsten verschachtelt, es kann im schlimmsten fall sein, dass vom main in einen interrupt und von da aus wieder in den andern interrupt springe, oder?

  2. #12
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    hab mal

    Code:
    $hwstack = 100
    $swstack = 100
    $framesize = 60
    reingepackt. hat aber leider nichts gebracht.

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    hmm schade....
    Es kann auch sein, dass deine ISR zu lange ist oder sowas und er dadurch die Stacks überlaufen läßt...
    Was macht der Simulator?

  4. #14
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    nun ja die isr für den UART ist schon recht lang geworden... ich werd sie mal kürzen

  5. #15
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo Goblin,

    hast Du mal in die Hilfe geschaut, wie das mit Config Serialin funktioniert ?
    Da steht nämlich nix davon, das man die ISR selber anlegen muss !
    Das macht Bascom schon selber. Und da sind auch Beispiele drin, wie man die ganze Sache benutzt, wichtig ist dabei Ischarwaiting() um zu sehen ob was im Puffer ist.
    Das mit dem Bytematch braucht man nur, wenn man auf bestimmte Zeichen wartet, zB. Startbyte o.ä. In der Regel kann man das aber weglassen.

    Und für den Fall das die UART-ISR selber gebaut werden sollte, ist es Grundsätzlich eine schlechte Idee da ein Print reinzubauen
    Denn Print gibt ja auch über die UART aus, und es kann sein dass sich da dann was überschneidet !
    D.H. während das Print 5 Zeichen ausgibt können 5 Zeichen die in der Zeit kommen könnten nicht verarbeitet werden !

  6. #16
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    linux_80 hat recht!
    Was du testen kannst ist: Einen Output-Buffer anlegen.

  7. #17
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    Das mit dem Print war eh nur zu Debug-Zwecken. Wäre ja irre wenns drinbleiben würde. Aber zurück zum eigentlichen Thema:

    Ich hab mein Konzept nochmal überdacht und werde das Bytematch benutzen. In einem Datenstream kommt irgendwann ein Startsymbol und danach sollen die folgenden 12 Bytes gelesen werden. Ich würde also in der Serial0charmatch: nen Flag setzen, damit die Hauptschleife weiß, dass das Startsymbol eingegangen ist. "Ischarwaiting" hab ich mir auch angeschaut und die Funktion ist mir soweit klar. Ich checke in der Hauptschleife also das Flag. Wenns gesetzt ist schau ich mit "Ischarwaiting" in den Buffer. Wenn was drin ist, saug ichs mit inkey() raus. Jetzt ist die Frage: wie sieht der Buffer aus? Was passiert wenn er voll ist? Fliegt dann das älteste Byte wieder raus? Wenn nicht, könne ich ja einfach 12x inkey() machen und hab meine 12 Bytes, egal wieviele danach noch empfangen wurden und danach das Flag zurücksetzen.

  8. #18
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Ich wäre mir da aber nicht Sicher, ob Du mit dem Warten auf das Zeichen auch synchron bist, wenn Du alle Zeichen im Puffer lässt ?
    Denn beim auslesen wird immer das älteste Zeichen kommen, nicht unbedingt das was nach dem erkannten Zeichen kommt.

    Schau aber mal nach Clear ob man das in der Bytematchroutine anwenden kann.

    Und vor jedem einlesen eines Zeichens mit Ischarwaiting abfragen ob das nächste Zeichen schon da ist, die UART ist nicht so schnell wie der µC.

  9. #19
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    Zitat Zitat von linux_80
    Schau aber mal nach Clear ob man das in der Bytematchroutine anwenden kann.
    Ja der Plan wäre gewesen: In der Charmatch nen clear aufrufen und dann das flag setzen. Somit ist der Buffer leer unmittelbar nachdem das Startsymbol empfangen wurde und das nächste Zeichen sollte eigentlich dann auslesbar sein.

    Zitat Zitat von linux_80
    Und vor jedem einlesen eines Zeichens mit Ischarwaiting abfragen ob das nächste Zeichen schon da ist, die UART ist nicht so schnell wie der µC.
    klar, sonst hält ja inkey() das komplette programm auf

  10. #20
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    Gut, also ich hab es so versucht, aber die CharMatch-Routine wird auch nicht angesprungen. Hier der neuste Kot - ähm Code:

    Code:
    $regfile = "m8def.dat"
    $crystal = 14745600
    $baud = 115200
    $hwstack = 200
    $swstack = 200
    $framesize = 200
    Config Serialin = Buffered , Size = 20 , Bytematch = 65
    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
    
    Mybytes = 0
    Receiveflag = 0
    Const Slaveid = 0                                           'Slave-IDs (von 0 bis 24)
    Const Timervorgabe = 112                                    'Timerstartwert für korrektes Timing
    
    
    
    Pwms(1) = 200                                               '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                                                       'Debugmessage
    Print "RGB-Slave...started"
    Print "Slave-ID..." ; Slaveid
    Print "Communication...OK"
    Print
    
    On Timer0 Timer_irq                                         'interruptvektor fuer timer0-interrupt
    
    
    Enable Timer0                                               'timer0 anschalten
    
    Enable Interrupts
    
    Timer0 = Timervorgabe
    
    'Main:
    Do
          If Receiveflag = 1 Then                               'Wenn flag gesetzt ist
             If Ischarwaiting() = 1 Then                        'Test ob neues Zeichen im Buffer
                 Pwms(mybytes) = Inkey()                        'Zeichen in PWM-Array
                 Incr Mybytes                                   'Habe 1 Byte mehr
                 If Mybytes = 12 Then                           'wenn ich 12 Bytes habe
                      Receiveflag = 0                           'bereit fuer Empfang des naechsten Startsymbols
                      Mybytes = 0                               'Mybytes auf 0
                 End If
             End If
    
          End If
    Loop
    
    'Getit:
    Serial0charmatch:
          Clear Serialin                                        'buffer loeschen damit platz fuer relevante zeichen ist
          Receiveflag = 1                                       'hab startsymbol empfangen
          Pwms(12) = 200                                        'debug
    
    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
    Hab zu debug-Zwecken in die Interrup-Routine für den Charmatch mal ne PWM-Wert-Änderung eingebaut. Aber nichts tut sich. Wenn ich den Timer0-Interrupt ausmache geht es.

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test