- 3D-Druck Einstieg und Tipps         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 15 von 15

Thema: Mega16 stürzt manchmal ab

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.08.2006
    Ort
    Budapest
    Alter
    37
    Beiträge
    563
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Das ist so. Meiner Meinung nach ist das das Problem.

  2. #12
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2006
    Ort
    Aachen
    Alter
    35
    Beiträge
    718
    Also pack ich einfach mal in jede ISR und jede Call ein RET(I) rein?

    Ich hab grad mein Programm etwas verständlicher geschrieben (kommentiert)
    Vielleicht versteht man es jetzt

    Code:
    '####################################
    '# Projekt IR gesteuertes LED Licht #
    '# Copyright 2007 by Stefan Reible  #
    '####################################
    
    $regfile = "m16def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 40
    $crystal = 16000000
    $baud = 9600
    
    Waitms 50                                                   'Einschwingzeit
    
    '//////////Ports Konfigurieren\\\\\\\\\\
    Config Porta = Output                                       'Multiplexer1
    Config Portc = Output                                       'Multiplexer2
    Config Portd.4 = Output                                     'RGB-Blau
    Config Portd.5 = Output                                     'RGB-Grüen
    Config Portd.6 = Output                                     'RGB-Rot
    Config Portd.3 = Input                                      'TSOP
    
    Porta.4 = 1                                                 'Enable1 active = low
    Portc.4 = 1
    Enable1 Alias Porta.4
    Enable2 Alias Portc.4
    
    Portd.4 = 1                                                 'RGB Led ausschalten
    Portd.5 = 1
    Portd.6 = 1
    
    
    '//////////Timer konfigurieren, Vorteiler auf 1\\\\\\\\\\
    Config Timer0 = Timer , Prescale = 1
    
    '//////////RC5 konfigurieren mit Timer 2\\\\\\\\\\
    Config Rc5 = Pind.3 , Timer = 2
    
    '/////////Sub Deklarieren\\\\\\\\\\\\\
    Declare Sub Wait_and_get(byval Ms As Byte)
    
    '//////////Definiere den Interrupthandler\\\\\\\\\\
    On Ovf0 Tim0_isr
    Enable Interrupts
    
    Enable Timer0                                               'Timer einschalten
    
    
    Dim R1 As Byte                                              ' In diese Variablen muss man
    Dim G1 As Byte                                              ' im Hauptprogram die gewnschten
    Dim B1 As Byte                                              ' Ausgabewerte laden
    
    Dim Z As Word                                               'Zaehler
    
    Dim Ri1 As Byte                                             'Hilfsregister
    Dim Gi1 As Byte
    Dim Bi1 As Byte
    
    '//////////Variablen fr Hauptprogramm\\\\\\\\\\
    Dim A As Byte                                               'Schleifenvariable RGBs
    
    Z = 0
    
    G1 = 0
    R1 = 0
    B1 = 0
    
    Dim I As Byte                                               'Schleifenvariable Lauflicht
    Dim Ir_address As Byte                                      'Geraet
    Dim Ir_command As Byte                                      'Befehl
    
    Dim Freilauf As Integer
    
    '//////////Einstellungen\\\\\\\\\\
    Freilauf = 10                                               'Lauflicht Freilaufzeit
    '//////////Hauptprogramm <Start>\\\\\\\\\\
    
    Waitms 200
    Print "Starte Hauptprogramm"
    
    Standby:
    R1 = 0
    G1 = 0
    B1 = 0
    Enable1 = 1
    Enable2 = 1
    Do
    Call Wait_and_get(5)                                        'Daumchen drehen und auf Befehl warten
    Loop
    
    '//////////Hauptprogramm <Ende>\\\\\\\\\\
    
    '//////////Programme <Start>\\\\\\\\\\
    'Programm1: RGB LEDs
    Programm1:
    Enable1 = 1
    Enable2 = 1
    Do
    
    'Rot
    For A = 0 To 254
    Incr R1
    Waitms 1
    Next
    Waitms 10
    For A = 0 To 254
    Decr R1
    Waitms 1
    Next
    
    Call Wait_and_get(0)
    
    'Grn
    For A = 0 To 254
    Incr G1
    Waitms 1
    Next
    Waitms 10
    For A = 0 To 254
    Decr G1
    Waitms 1
    Next
    
    Call Wait_and_get(0)
    
    'Blau
    For A = 0 To 254
    Incr B1
    Waitms 1
    Next
    Waitms 10
    For A = 0 To 254
    Decr B1
    Waitms 1
    Next
    
    Call Wait_and_get(0)
    
    'Blau/Grn
    For A = 0 To 254
    Incr B1
    Incr G1
    Waitms 1
    Next
    Waitms 10
    For A = 0 To 254
    Decr B1
    Decr G1
    Waitms 1
    Next
    
    Call Wait_and_get(0)
    
    'Blau/Rot
    For A = 0 To 254
    Incr B1
    Incr R1
    Waitms 1
    Next
    Waitms 10
    For A = 0 To 254
    Decr B1
    Decr R1
    Waitms 1
    Next
    
    Call Wait_and_get(0)
    
    'Grn/Rot
    For A = 0 To 254
    Incr G1
    Incr R1
    Waitms 1
    Next
    Waitms 10
    For A = 0 To 254
    Decr G1
    Decr R1
    Waitms 1
    Next
    
    Call Wait_and_get(0)
    
    'Grn/Rot/Blau
    For A = 0 To 254
    Incr G1
    Incr R1
    Incr B1
    Waitms 1
    Next
    Waitms 10
    For A = 0 To 254
    Decr G1
    Decr R1
    Decr B1
    Waitms 1
    Next
    Loop
    'Ende Rgb Fadern
    
    'Programm2: Lauflicht
    Programm2:
    R1 = 0
    G1 = 0
    B1 = 0
    Enable1 = 1
    Enable2 = 1
    
    Do
    
     For I = 0 To 15
      Porta = I
      Call Wait_and_get(0)
      Enable1 = 0
      Waitms Freilauf
      Enable1 = 1
     Next I
    
     For I = 0 To 11
      Portc = I
      Call Wait_and_get(0)
      Enable2 = 0
      Waitms Freilauf
      Enable2 = 1
     Next I
    Loop
    'ende des 2. programms
    
    
    'Programm3: Lauflicht2
    Programm3:
    R1 = 0
    G1 = 0
    B1 = 0
    Enable1 = 1
    Enable2 = 1
    
    Do
    
     For I = 0 To 15
      Porta = I
      Enable1 = 0
      Call Wait_and_get(0)
      Enable1 = 1
     Next I
    
     For I = 0 To 11
      Portc = I
      Enable2 = 0
      Call Wait_and_get(0)
      Enable2 = 1
     Next I
    Loop
    'ende lauflicht 2
    
    'Dauer
    Dauer:
    Do
    Enable1 = 0
     For I = 0 To 15
      Porta = I
      Waitus 1
     Next I
     Enable1 = 1
    
     Enable2 = 0
     For I = 0 To 12
      Portc = I
      Waitus 1
     Next I
     Enable2 = 1
    'Call Wait_and_get(0)
    Loop
    'Dauer
    
    '//////////Standlicht  <Start>\\\\\\\\\\
    Programm_rot:
    R1 = 255
    G1 = 0
    B1 = 0
    Enable1 = 1
    Enable2 = 1
    Do
     Call Wait_and_get(5)
    Loop
    
    
    Programm_gruen:
    R1 = 0
    G1 = 0
    B1 = 255
    Enable1 = 1
    Enable2 = 1
    Do
     Call Wait_and_get(5)
    Loop
    
    Programm_gelb:
    R1 = 255
    G1 = 0
    B1 = 255
    Enable1 = 1
    Enable2 = 1
    Do
     Call Wait_and_get(5)
    Loop
    
    Programm_blau:
    R1 = 0
    G1 = 255
    B1 = 0
    Enable1 = 1
    Enable2 = 1
    Do
     Call Wait_and_get(5)
    Loop
    
    Programm_pink:
    R1 = 255
    G1 = 255
    B1 = 0
    Enable1 = 1
    Enable2 = 1
    Do
     Call Wait_and_get(5)
    Loop
    '//////////Standlicht  <Ende>\\\\\\\\\\
    
    '/////////////////Funktion zum RC5 empfangen und warten <Start>\\\\\\\\\\\\\\\
    'Sub zum empfangen und warten
    Sub Wait_and_get(byval Ms As Integer)
    Getrc5(ir_address , Ir_command)                             'Empfangen
    
    'Wenn was empfangen dann reagieren
    If Ir_address = 0 Then
    Ir_command = Ir_command And &B01111111                      'entfernt das togglebit
    If Ir_command <> 0 Then Print Ir_command                    'IR befehl Printen
    
      If Ir_command = 17 Then Goto Programm1                    'RGB Fadern
      If Ir_command = 18 Then Goto Programm2
      If Ir_command = 19 Then Goto Programm3
    
      If Ir_command = 37 Then Freilauf = Freilauf + 10          'Lauflicht langsamer
      If Ir_command = 36 And Freilauf > 9 Then Freilauf = Freilauf -10       'Lauflicht schneller
    
      If Ir_command = 38 Then Goto Programm_rot
      If Ir_command = 44 Then Goto Programm_gruen
      If Ir_command = 46 Then Goto Programm_gelb
      If Ir_command = 51 Then Goto Programm_blau
      If Ir_command = 47 Then Goto Programm_pink
    
      If Ir_command = 21 Then Goto Dauer
     If Ir_command = 32 Then Goto Standby
    End If
    
    Waitms Ms                                                   'warten
    End Sub
    '/////////////////Funktion zum RC5 empfangen und warten <Ende>\\\\\\\\\\\\\\\
    
    
    '//////////Interupthandler Timer0 <Start>\\\\\\\\\\
    Tim0_isr:
    
        If Z = 0 Then                                           'Gewnschte Ausgabewerte an
        Ri1 = R1                                                'Hilfsregister bergeben
        Gi1 = G1
        Bi1 = B1
        Z = 255
        End If
    
        Z = Z - 1
    
        'PWM Kanaele
    
        'RGB LEDs
        If Ri1 > 0 Then
        Portd.6 = 0
        Else
        Portd.6 = 1
        End If
        Decr Ri1
        If Ri1 = 255 Then Ri1 = 0
    
        If Gi1 > 0 Then
        Portd.5 = 0
        Else
        Portd.5 = 1
        End If
        Decr Gi1
        If Gi1 = 255 Then Gi1 = 0
    
        If Bi1 > 0 Then
        Portd.4 = 0
        Else
        Portd.4 = 1
        End If
        Decr Bi1
        If Bi1 = 255 Then Bi1 = 0
    
        Return
    '//////////Interupthandler Timer0 <Ende>\\\\\\\\\\
    EDIT
    Aus der ISR geht ich nicht raus.
    Nur aus der Funktion (mit Goto)

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.08.2006
    Ort
    Budapest
    Alter
    37
    Beiträge
    563
    Naja, ich kenn mich in Bascom net aus... Und die Zeit hab ich auch nicht, das jetzt zu druchstöbern, aber check mal, ob alle Rutinen die aufgerufen werden, auch einmal enden, und mit return dorthin zurückkehren, von wo sie aufgerufen worden sind.
    Nochn ne kurze Verständisfrage zu Bascom: ist CALL = RCALL und GOTO = RJMP?
    Falls ja, musst du am Ende aller Funktionen, die mit CALL aufgerufen worden sind, ein Return schreiben, und bei denen, die mit Goto aufgerufen worden sind, entweder ein Return (dann gehen sie nicht dorthin zurück, wo goto stand, sondern dorthin wo die Funktion mit dem Goto aufgerufen worden ist), oder ein goto, damit sie dorthin zurückkehren, wo der letzte goto stand, aber dann ist es gleich besser, diese zwei gotos mit einem CALL und RET zu ersetzen. Generell gilt: RJMP/GOTO + RET nur für Fallunterscheidung, für Subrutinen immer RCALL/CALL + RET.

    Bsp:

    R1:
    ...
    CALL R2
    ...
    R2:
    ...
    GOTO R3
    ...
    RET --> zurück zu R1, wird nicht erreicht
    R3:
    ...
    RET --> wir sind in R1

    R1:
    ...
    CALL R2
    ...
    R2:
    ...
    CALL R3
    ...
    RET --> zurück nach R1
    R3:
    ...
    RET --> wir sind in R2


    War das so eingermaßen vertsändlich?

    MfG

    pongi

  4. #14
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    die Unterprogramme, die per SUB bzw. aus Interrupt
    angesprungen werden einfach mit RETURN beenden.
    Dann läuft das Programm von der Einsprungstelle aus
    weiter.
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    29.10.2006
    Ort
    Aachen
    Alter
    35
    Beiträge
    718
    Danke erstmal für die zahlreichen Antworten.
    Ja das ist kla, aber sie wird ja über eine Endlosschleife im Hauptprogramm aufgerufen, nicht über ein Interrupt.

    'Hauptprogramm
    Do
    Call Wait_and_get(5)
    Loop


    'Funktion zum IR Emfang und Programmaufruf
    Sub Wait_and_get(byval Ms As Integer)
    <emfängt IR>
    If Ir_command = 17 Then Goto Programm1
    <usw>
    End Sub


    Programm1:
    Do
    <Macht irgendwas>
    Call Wait_and_get(0)
    Loop
    Return

    Das Hauptprogramm ruft also endlos die Funktion Wait_and_get auf.
    Wenn die Fkt ein IR Signal emfängt ruft diese wiederum das passende Programm auf (hier Programm1).

    Programm1 wird dann wegen der Do Loop Schleife dauer ausgeführt.
    Programm1 hat allerdings die Fkt Wait_and_get implementiert, um zu prüfen ob ein neuer IR Command ankommt (=Programmwechsel).

    Die Fkt Wait_and_get ist jetzt mit "End Sub" beendet, und die Programme mit "Return".

    Wenn ich jetzt gedoch das Programm ca 10-12 mal wechsel stürzt der µC ab.

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

Labornetzteil AliExpress