-         

Ergebnis 1 bis 9 von 9

Thema: Wer findet den Programmfehler? ..

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2006
    Ort
    Aachen
    Alter
    28
    Beiträge
    718

    Wer findet den Programmfehler? ..

    Anzeige

    Hallo zusammen,
    mein Projekt ist nun fast abgeschlossen.
    Bis auf die Programmierung steht alles, aber wie es immer so ist, als Anfänger, gibt es immer irgentwo ein Problem.

    Das folgende Programm funktionierte einwandfrei.
    Jetzt wollte ich noch einen Interrupt einbauen, der dann per Subroutine einen RC5 Command emfängt, und dann eine Variable hochzählt!

    Leider bekomm ich nichts per RS232 geschickt, und das Hauptprogramm wird auch nicht durchgearbeitet.

    Der Interrupt für den RC5 Emfang benutzt Timer1, und die PWM für die RGBs Timer0.

    Der TSOP ist auch an Int1 angeschlossen.

    Code:
    $regfile = "m16def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    $crystal = 16000000
    $baud = 9600
    
    Waitms 50                                                   'Einschwingzeit
    
    '//////////Ports Konfigurieren\\\\\\\\\\
    Config Porta = Output                                       'M1
    Config Portc = Output                                       'M2
    Config Rc5 = Pind.3                                         'TSOP
    Portd.3 = 1
    Config Portd.6 = Output                                     'RGB-Rot
    
    Porta.4 = 1                                                 'Enable1 active = low
    Portc.4 = 1
    Enable1 Alias Porta.4
    Enable2 Alias Portc.4
    
    Portd.6 = 1                                                 'RGB Led ausschalten
    Portc.7 = 1
    Portc.6 = 1
    
    '//////////Timer konfigurieren, Vorteiler auf 1\\\\\\\\\\
    Config Timer0 = Timer , Prescale = 1
    
    '//////////Definiere den Interrupthandler\\\\\\\\\\
    On Ovf0 Tim0_isr
    Config Int1 = Low Level                                     'IR
    
    Enable Timer0                                               'Timer einschalten
    Enable Interrupts
    Enable Int1                                                 'IR
    On Int1 Ir_sub
    
    Dim R1 As Byte                                              ' In diese Variablen muss man
    Dim G1 As Byte                                              ' im Hauptprogram die gewünschten
    Dim B1 As Byte                                              ' Ausgabewerte laden
    
    Dim Z As Word                                               'Zähler
    
    Dim Ri1 As Byte                                             ' Hilfsregister
    Dim Gi1 As Byte
    Dim Bi1 As Byte
    
    '//////////Variablen für Hauptprogramm\\\\\\\\\\
    Dim A As Byte                                               'Schleifenvariable RGBs
    
    Z = 0
    
    G1 = 0
    R1 = 0
    B1 = 0
    
    Dim Addresse As Byte , Kommando As Byte                     'RC5 Hilfsvariablen
    Dim Flag As Bit
    
    Flag = 1
    
    Dim I As Byte                                               'Schleifenvariable Lauflicht
    Dim Time As Integer
    
    Dim Programm As Byte                                        'Programmauswahl
    Programm = 0
    
    '//////////Einstellungen\\\\\\\\\\
    Time = 100                                                  'Lauflicht Freilaufzeit
    
    '//////////Hauptprogramm <Start>\\\\\\\\\\
    Print "Starte Hauptprogramm"
    
    Do
    
    If Programm = 1 Then
    
    'Rot
    For A = 0 To 254
    R1 = R1 + 1
    Waitms 1
    Next
    Waitms 10
    For A = 0 To 254
    R1 = R1 - 1
    Waitms 1
    Next
    
    'Grün
    For A = 0 To 254
    G1 = G1 + 1
    Waitms 1
    Next
    Waitms 10
    For A = 0 To 254
    G1 = G1 - 1
    Waitms 1
    Next
    
    'Blau
    For A = 0 To 254
    B1 = B1 + 1
    Waitms 1
    Next
    Waitms 10
    For A = 0 To 254
    B1 = B1 - 1
    Waitms 1
    Next
    
    'Blau/Grün
    For A = 0 To 254
    B1 = B1 + 1
    G1 = G1 + 1
    Waitms 1
    Next
    Waitms 10
    For A = 0 To 254
    B1 = B1 - 1
    G1 = G1 - 1
    Waitms 1
    Next
    
    'Blau/Rot
    For A = 0 To 254
    B1 = B1 + 1
    R1 = R1 + 1
    Waitms 1
    Next
    Waitms 10
    For A = 0 To 254
    B1 = B1 - 1
    R1 = R1 - 1
    Waitms 1
    Next
    
    'Grün/Rot
    For A = 0 To 254
    G1 = G1 + 1
    R1 = R1 + 1
    Waitms 1
    Next
    Waitms 10
    For A = 0 To 254
    G1 = G1 - 1
    R1 = R1 - 1
    Waitms 1
    Next
    
    'Grün/Rot/Blau
    For A = 0 To 254
    G1 = G1 + 1
    R1 = R1 + 1
    B1 = B1 + 1
    Waitms 1
    Next
    Waitms 10
    For A = 0 To 254
    G1 = G1 - 1
    R1 = R1 - 1
    B1 = B1 - 1
    Waitms 1
    Next
    
    End If
    
    If Programm = 2 Then
    
    For I = 0 To 15
     Porta = I
     Enable1 = 0
     Waitms Time
     Enable1 = 1
    Next I
    
    For I = 0 To 11
     Portc = I
     Enable2 = 0
     Waitms Time
     Enable2 = 1
    Next I
    
    End If
    
    Loop
    
    '//////////Hauptprogramm <Ende>\\\\\\\\\\
    
    
    '//////////Interupthandler Timer0 <Start>\\\\\\\\\\
    Tim0_isr:
    
        If Z = 0 Then                                           'Gewünschte Ausgabewerte an
        Ri1 = R1                                                'Hilfsregister übergeben
        Gi1 = G1
        Bi1 = B1
        Z = 255
        End If
    
        Z = Z - 1
    
        'PWM Kanäle
    
        'RGB LEDs
        If Ri1 > 0 Then
        Portd.6 = 0
        Else
        Portd.6 = 1
        End If
        Ri1 = Ri1 - 1
        If Ri1 = 255 Then Ri1 = 0
    
        If Gi1 > 0 Then
        Portc.7 = 0
        Else
        Portc.7 = 1
        End If
        Gi1 = Gi1 - 1
        If Gi1 = 255 Then Gi1 = 0
    
        If Bi1 > 0 Then
        Portc.6 = 0
        Else
        Portc.6 = 1
        End If
        Bi1 = Bi1 - 1
        If Bi1 = 255 Then Bi1 = 0
    
        Return
    '//////////Interupthandler Timer0 <Ende>\\\\\\\\\\
    
    '//////////Interupthandler Timer1 <Start>\\\\\\\\\\
    Ir_sub:
    
    Getrc5(addresse , Kommando)
    If Flag = 1 Then
     Print "Fehlerhaftes Kommando"
     Flag = 0
    End If
    
    If Addresse <> 255 Then
    Reset Kommando.7                                            ' Togglebit zurücksetzen
    Cls
    Print "Addresse: " ; Addresse ; " Kommando: " ; Kommando
    Flag = 1
    Programm = Programm + 1                                     'Programm auswahl
    End If
    
    Return
    '//////////Interupthandler Timer1 <Ende>\\\\\\\\\\

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

    wenn Du das Getrc5 in der Sub hast, blockiert Dir das solange den ganzen Programmablauf, bis etwas über den TSOP rein kommt !
    Ausserdem wird für den RC5-Empfang der Timer0 verwendet, also wird das Deine Einstellung verwerfen.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    19.02.2007
    Beiträge
    210
    hwstack ist doch 40 bei m16

    und enable sind reservierte wörter die sollte man nicht benutzen enable1 alias

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2006
    Ort
    Aachen
    Alter
    28
    Beiträge
    718
    Danke erstmal für die Antworten!
    Sicher das Getrc5() das Programm an der Stelle anhält?
    Wenn ja wie könnte ich das Problem lösen?

    Das RC5 Timer0 benötigt wusste ich nicht, kann man das auch ändern?
    Ansonsten mach ich halt die PWM über Timer1.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Getrc5 bleibt nicht ewig stehen, wenns zulange dauert (ms) gibts 255 als Ergebnis, oder so die Richtung.

    Du könntest im Hauptprogramm einmal pro durchlauf einen Getrc5 machen.

    Man kann auch Timer2 verwenden, wenn man das bei Config Rc5 mit angibt.

    Interrupts müssen immer aktiviert sein eim RC5 einlesen. (Ist bei Dir schon)
    Deshalb geht das nicht von einer ISR aus, da dort die IRQs solange gesperrt sind, wie man sich in der ISR befindet.

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2006
    Ort
    Aachen
    Alter
    28
    Beiträge
    718
    Im Hauptprogramm?
    Das RGB Programm dauert bestimmt 30 sek so lang soll man doch nicht den Taster am Sender drücken.
    Hmm aber das mit dem Low Level ist so oky, oder?

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Welchen Low Level ?
    Von Int1, das geht so nicht, siehe letzter Post !
    Die Sache mit dem Int1 kannst du weglassen, denn dadurch wird ja schon die erste Flanke des RC5-Signals abgeschnitten, die dann dem GetRC5 fehlt !

    Wenn der Durchlauf solange dauert, kann man doch am Anfang oder Ende oder bei jedem Waitms 10 oder vor jeder If-Abfrage ein GetRC5 einbauen (und den Rest der Überprüfung), vorher wird das sowieso nicht mehr geprüft !

    Und wie magic33 schon gemeint hat, den hwstack mal etwas grösser machen, die 32 sind das minimum, wenn man ISRs verwendet.

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    30.12.2006
    Beiträge
    447
    Ich würde mal sagen, der der am besten in dieser Programmiersprache zurechtkommt findet denn Fehler

    Wäre vielleicht nicht schlecht, wenn du die Art der Programmiersprache in den
    Titel schreiben würdest.
    Diese Signatur wurde unter der GPL veröffentlicht.
    Klau was aus meiner Signatur und du bist tot!

    www.twitter.com/skgrobotics

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2006
    Ort
    Aachen
    Alter
    28
    Beiträge
    718
    Sorry, hatte ich vergessen
    war aber eig. auch mehr ironisch gemeint

    Naja zurück zum Thema, die Methode mit Getrc5 immer in regelmäßigen Abstände zu prüfen gefällt mir nicht wirklich, so kann man nicht einfach mal schnell durchschalten.

    Das muss doch über einen Interrupt lösbar sein, ohne die erste Flange zu verschlucken (wäre ja dann Falling, da er ja ohne Signal immer high am Ausgang ist, der TSOP)

    Und den RC5 Emfang kann man doch mit Timer = 2 eifnach auf den 2. Timer legen, dass dürfte ja auch kein Problem sein.

Berechtigungen

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