- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 7 von 7

Thema: Atmel stürtz ab?!?!?! Programm beginnt von vorn!

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    16.06.2005
    Ort
    Göppingen
    Beiträge
    360

    Atmel stürtz ab?!?!?! Programm beginnt von vorn!

    Anzeige

    Praxistest und DIY Projekte
    Ich habe hier dieses Programm. Das ganze ist in einer Hardware eingebunden. Nur nach einiger Zeit die der Chip läuft, beginnt das Programm von vorn. (es wird print start ausgelöst)

    Man kann sich das so vorstellen:

    -> Chip bekommt strom und läuft los
    -> Print "start"
    -> Warte einige Zeit
    -> Print "start"
    ...

    Warum ist das so?

    Mfg
    Tobi

    [Bitte helft mir, es ist sehr von Bedeutung]

    Code:
    '--- [ Init ] ------------------------------------------------------------------
    Dim Emin As Eram Word At 0                                  '0 Wert
    Dim Emax As Eram Word At 2                                  'Max. Wert
    Dim Estrecke As Word                                        'Einheiten Strecke
    Dim Sstab As Eram Word At 4                                 'Abstand zwischen 0 und Max in mm
    
    Dim Offset As Eram Word At 6                                'Offset
    
    Const Datensaetze = 42
    
    Dim Volhigh As Eram Word At 8
    Dim Volmiddle As Eram Word At 10
    Dim Vollow As Eram Word At 12
    
    '--- [ Write into eram - only run the first time! ] ----------------------------
    Emin = 0
    Emax = 1000
    Estrecke = Emax - Emin
    Sstab = 2000
    
    Offset = 50
    
    Volhigh = 500
    Volmiddle = 800
    Vollow = 1500
    
    '--- [ Inizialize compiler ] ---------------------------------------------------
    $regfile = "m168def.dat"                                    'Set chip AVR mega168
    $crystal = 16000000                                         'Set crystal 16 MHz
    $baud = 9600                                                'Set Baudrate 9600
    $framesize = 32                                             'Framesize = 32
    $swstack = 32                                               'SW = 32
    $hwstack = 32                                               'HW = 32
    Print "start"
    '--- [ Config devices and timers ] ---------------------------------------------
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc   'Config ADC
    Sens Alias Pinc.0                                           'Setze PINC.0 als Sensor Eingang
    
    Config Pind.6 = Output                                      'OC0A / Motor PWM
    Pwm_out Alias Pind.6
    
    Config Portc.1 = Output                                     'Direction A
    Dira Alias Portc.1
    
    Config Portc.2 = Output                                     'Direction B
    Dirb Alias Portc.2
    
    Audio Alias Portb.5                                         'Audio Ausgang
    
    Config Pinc.3 = Input                                       'Start Interrupt / Druckschalter
    Inp_start Alias Pinc.3
    
    Config Pind.7 = Input                                       'Libellen Interrupt
    Inp_libelle Alias Pind.7
    
    Config Portb.0 = Output                                     'ROT
    Led_red Alias Portb.0
    
    Config Portb.1 = Output                                     'GELB
    Led_yellow Alias Portb.1
    
    Config Portb.2 = Output                                     'GRUEN
    Led_green Alias Portd.3
    
    Inp_stop Alias Pind.2                                       'Stop Interrupt!
    
    'Timer0 as PWM for engine
    Tccr0a = &B11000001
    Tccr0b = &B00000001
    Tcnt0 = &B00000000
    Timsk0 = &B00000000
    Tifr0 = &B00000000
    Ocr0a = 255
    
    'Timer1 as clock for time
    Config Timer1 = Timer , Prescale = 256
    Const Clock = 3036
    
    '--- [ Declare SUBs ] ----------------------------------------------------------
    
    Declare Sub Snd(byval Freq As Word)
    
    '--- [ Declare variables ] -----------------------------------------------------
    
    Dim Daten(datensaetze) As String * 19                       'Messdaten
    
    Dim Is_ok As Word                                           'Wert ab dem die Messung OK ist
    Dim Soll As Word                                            'Sollwert
    Dim Ist As Integer                                          'Ist Position
    
    Dim Hits As Word                                            'Anschläge
    Dim Libelle As Bit                                          'Libelle
    
    Dim Buffer As String * 8                                    'RS232 Buffer
    
    Dim Year As Integer                                         'Jahr
    Dim Month As Byte                                           'Monat
    Dim Day As Byte                                             'Tag
    Dim Hour As Byte                                            'Stunde
    Dim Minute As Byte                                          'Minute
    Dim Second As Byte                                          'Sekunde
    Dim Tresult As String * 5                                   'Zeitstring
    Dim Dresult As String * 8                                   'Datumstring
    
    Dim B1 As Byte                                              'HV
    Dim W1 As Word                                              'HV
    Dim W2 As Word                                              'HV
    Dim I1 As Integer                                           'HV
    Dim I2 As Integer                                           'HV
    Dim S1 As String * 1                                        'HV
    Dim S2 As String * 1                                        'HV
    
    Dim Start_setted As Bit                                     'S_HV
    Dim After_back As Bit                                       'S_HV
    
    '--- [ Inizialize variables and constants ] ------------------------------------
    
    Start_setted = 0
    After_back = 0
    
    Is_ok = 0
    'Soll = 0
    'Print Soll ; " on init"
    Ist = 0
    Hits = 0
    Libelle = 0
    
    Buffer = ""
    
    Year = 2000
    Month = 1
    Day = 1
    Hour = 0
    Minute = 0
    Second = 0
    Tresult = ""
    Dresult = ""
    
    '--- [ Inizialize Interrupts ] -------------------------------------------------
    
    Sreg.7 = 0
    
    On Int0 Isr_stop                                            'On Rising Edge
    On Pcint1 Isr_start
    On Pcint2 Isr_libelle
    On Timer1 Isr_clock                                         'On Timer1
    On Urxc Isr_data                                            'On Urxc
    
    Eicra = &B00000011
    Eimsk = &B00000001
    Eifr = &B00000001
    
    Pcicr = &B00000110
    Pcifr = &B00000110
    Pcmsk2 = &B10000000
    Pcmsk1 = &B00001000
    Pcmsk0 = &B00000000
    
    Enable Timer1
    Enable Urxc
    
    Sreg.7 = 1
    
    '--- [ Start secuence ] --------------------------------------------------------
    
    Echo Off
    
    Gosub Clrdata
    
    Dira = 0
    Dirb = 0
    Ocr0a = 255
    
    Portc.0 = 0
    Start Adc
    
    '--- [ Main loop ] -------------------------------------------------------------
    
    Do
      Ist = Getadc(0)
    
      If Soll <= Emax Then
          W1 = Soll - Offset
          If W1 > Ist Then
              Dira = 1
              Dirb = 0
              Ocr0a = 0
          End If
    
          W1 = Soll + Offset
          If W1 < Ist Then
              Dira = 0
              Dirb = 1
              Ocr0a = 0
          End If
    
          W1 = Soll - Offset
          W2 = Soll + Offset
          If W1 <= Ist Then
          If W2 >= Ist Then
              Ocr0a = 255
              Dira = 0
              Dirb = 0
    
              'If Ist >= W1 Then Soll = Emin
              If After_back = 1 Then
               After_back = 0
               Soll = Emax
               Print Soll ; " on afterback"
              End If
          End If
          End If
      Else
          Ocr0a = 255
          Dira = 0
          Dirb = 0
          Sreg.7 = 0
      End If
    Loop
    End
    
    '--- [ Interrupt service routine ] ---------------------------------------------
    
    Isr_stop:
     Incr Hits
    
     If Inp_stop = 1 Then Print "STOP 1"
     if inp_stop = 0 then print "STOP 0"
    
     If Ist >= Is_ok Then
      Gosub Savedata
    
      Soll = Emin
      Print Soll ; " on stop_ok"
     Else
      If Hits = 3 Then
       Gosub Savedata
       Soll = Emin
       Print Soll ; " on stop_3hits"
      End If
      If Hits < 3 Then
       I1 = Ist - 500
       If I1 < 0 Then I1 = 0
       Soll = I1
       Print Soll ; " on stop_hit"
       After_back = 1
      End If
     End If
    Return
    
    Isr_start:
     If Inp_start = 1 Then Print "START 1"
     If Inp_start = 0 Then Print "START 0"
    
     If Inp_start = 0 Then
      Start_setted = 1
     End If
    
     If Inp_start = 1 Then
      If Start_setted = 1 Then
       Start_setted = 0
       Soll = Emax
       Print Soll ; " on start"
      End If
     End If
    Return
    
    Isr_libelle:
     If Inp_libelle = 1 Then Print "LIBELLE 1"
     If Inp_libelle = 0 Then Print "LIBELLE 0"
    
     If Inp_libelle = 0 Then
      Libelle = 1
     End If
    Return
    
    Isr_data:
     B1 = Udr
    
     If Chr(b1) = "!" Then
      Soll = 3333
      Print Soll ; " on !"
     End If
    
     If Chr(b1) = "]" Then
      Print Buffer
      Gosub RS232
     End If
    
     Buffer = Buffer + Chr(b1)
    
     If Chr(b1) = "[" Then
      Buffer = ""
     End If
    Return
    
    Isr_clock:
     Timer1 = Clock
    
     Second = Second + 1
     If Second = 60 Then Gosub Addminute
     If Minute = 60 Then Gosub Addhour
     If Hour = 24 Then Gosub Addday
    
     If Day = 31 Then
      Select Case Month
       Case 1 : Gosub Addmonth
       Case 3 : Gosub Addmonth
       Case 5 : Gosub Addmonth
       Case 7 : Gosub Addmonth
       Case 8 : Gosub Addmonth
       Case 10 : Gosub Addmonth
       Case 12 : Gosub Addmonth
      End Select
     End If
     If Day = 30 Then
      Select Case Month
       Case 2 : Gosub Addmonth
       Case 4 : Gosub Addmonth
       Case 6 : Gosub Addmonth
       Case 9 : Gosub Addmonth
       Case 11 : Gosub Addmonth
      End Select
     End If
    
     If Month = 12 Then Gosub Addyear
    
     Tresult = Format(hour , "00") + ":" + Format(minute , "00")
    
     Dresult = Format(year , "00") + "." + Format(month , "00") + "." + Format(day , "00")
    
     Print Soll ; " :: " ; Ist
    Return
    
    '--- [ SUBs and functions ] ----------------------------------------------------
    
    Sub Snd(byval Freq As Word)
     Sound Audio , 200 , Freq
    End Sub
    
    '--- [ GOSUBs ] ----------------------------------------------------------------
    
    Savedata:
     For I2 = 0 To Datensaetze
      If Daten(i2) = "" Then
       Exit For
      End If
     Next I2
    
     If Hits >= 3 Then S1 = "0" Else S1 = "1"
     If Libelle = 1 Then S2 = "0" Else S2 = "1"
    
     Daten(i2) = S1 + "§" + S2 + "§" + Str(soll) + "§" + Str(ist) + "§" + Dresult + "§" + Tresult
    
     Print "DATEN" ; I2
     Print Daten(i2)
    
     Hits = 0
     Libelle = 0
     After_back = 0
     Start_setted = 0
    Return
    
    Clrdata:
     For I2 = 0 To Datensaetze
      Daten(i2) = ""
     Next I
    Return
    
    Addminute:
     Minute = Minute + 1
     Second = 0
    Return
    
    Addhour:
     Hour = Hour + 1
     Minute = 0
    Return
    
    Addday:
     Day = Day + 1
     Hour = 0
    Return
    
    Addmonth:
     Month = Month + 1
     Day = 0
    Return
    
    Addyear:
     Year = Year + 1
     Month = 0
    Return
    
    Rs232:
     If Buffer = "CLR" Then
      Gosub Clrdata
      Print "<EXIT>"
     End If
    
     If Instr(buffer , "YR") > 0 Then
      Buffer = Right(buffer , 4)
      Year = Val(buffer)
     End If
    
     If Instr(buffer , "MN") > 0 Then
      Buffer = Right(buffer , 2)
      Month = Val(buffer)
     End If
    
     If Instr(buffer , "DA") > 0 Then
      Buffer = Right(buffer , 2)
      Day = Val(buffer)
     End If
    
     If Instr(buffer , "HR") > 0 Then
      Buffer = Right(buffer , 2)
      Hour = Val(buffer)
     End If
    
     If Instr(buffer , "MI") > 0 Then
      Buffer = Right(buffer , 2)
      Minute = Val(buffer)
     End If
    
     If Instr(buffer , "SC") > 0 Then
      Buffer = Right(buffer , 2)
      Second = Val(buffer)
      Print "<EXIT>"
     End If
    
     If Instr(buffer , "SL") > 0 Then
      Buffer = Right(buffer , 3)
      Is_ok = Val(buffer)
      Is_ok = Is_ok * 1
      Print "<EXIT>"
     End If
    
     If Instr(buffer , "EI") > 0 Then
      Buffer = Right(buffer , 4)
    
     End If
    
     If Instr(buffer , "EA") > 0 Then
     End If
    
     If Instr(buffer , "OF") > 0 Then
     End If
    
     If Instr(buffer , "FA") > 0 Then
     End If
    
     If Instr(buffer , "FB") > 0 Then
     End If
    
     If Instr(buffer , "FC") > 0 Then
     End If
    
     If Buffer = "GDA" Then
    
     End If
    
     If Buffer = "SND" Then
      If Daten(1) = "" Then
    
      Else
       For I1 = 0 To Datensaetze
    
        If Daten(i1) = "" Then
         Exit For
        End If
    
        Print "<" ; I1 ; "§" ; Daten(i1) ; ">"
    
        Waitms 10
       Next I1
      End If
    
      Print "<EXIT>"
     End If
    
     If Buffer = "FWD" Then
      Soll = Emax
      Print Soll ; " on FWD"
     End If
     If Buffer = "BWD" Then
      Soll = Emin
      Print Soll ; " on BWD"
     End If
     If Buffer = "STP" Then
      Soll = 3333
      Print Soll ; " on STP"
     End If
    
     If Buffer = "GIN" Then
      Print "<4%Position: " ; Ist ; ">"
     End If
     If Buffer = "GTI" Then
      Print "<3%" ; Tresult ; ">"
      Print "<3%" ; Dresult ; ">"
     End If
     If Buffer = "ABP" Then
      Call Snd(volhigh)
      Waitms 10
      Call Snd(volmiddle)
      Waitms 10
      Call Snd(vollow)
     End If
    Return

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    Hi Tobi, mein Tip zum Debuggen:
    Bau noch ein par mehr Prints ein um die Stelle zu lokalisieren an der das Programm neu startet.

    Das durchsehen des Codes würde für jemanden, der das Prgramm nicht geschrieben hat bestimmt Stunden dauern.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    16.06.2005
    Ort
    Göppingen
    Beiträge
    360
    ich hab das Problem gefunden. Der Timer1 wurde als er lief schätze ich mal nochmals aufgerufen.

    Hab den Timer1 nun gekürzt und seitdem ist er nichtmehr abgestürzt (dafür mein PC )

    Danke
    Tobi

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    16.06.2005
    Ort
    Göppingen
    Beiträge
    360
    Chip stürtzt (schon wieder) ab:
    Dieses mal im Int0:
    Code:
    Isr_stop:
      Disable Int0
      Incr Hits
    
      If Inp_stop = 1 Then Print "STOP 1"
      If Inp_stop = 0 Then Print "STOP 0"
    
      If Ist >= Is_ok Then
       Gosub Savedata
       Soll = Emin
       Print Soll ; " on stop_ok"
      Else
       If Hits = 3 Then
        Gosub Savedata
        Soll = Emin
        Print Soll ; " on stop_3hits"
       End If
       If Hits < 3 Then
        I1 = Ist - 500
        If I1 < 0 Then I1 = 0
        Soll = I1
        Print Soll ; " on stop_hit"
        After_back = 1
       End If
      End If
      Eifr = &B00000001
      Enable Int0
    Return
    ich kann mir den Fehler hier nicht erklären (der interrupt kann ja nicht in sich aufgerufen werden da er ja disabled wird)

    bitte helft mir bei diesem kleinen problemchen.

    danke!

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    Ich bin in Bascom nciht mehr drin, ist das in ordung:
    If Inp_stop = 1 Then Print "STOP 1"
    Ohne End If?

    Wenn das so als Einzeiler in Ordnung ist, aht du vielleicht ein End if am ende zu viel.
    Und darf in einer IRQ ein Sub-routine aufgerufen werden?

    Ansonsten fällt mir nciht viel auf, vielleicht mal noch ein par Prints machen die nur sagen, bis hier bin ich gekommen.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    kann es vllt nen hardwareproblem sein? am pullup evtl? oder ein spannungseinbruch...

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    28.01.2007
    Beiträge
    52
    Vielleicht der Watchdog???...

Berechtigungen

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

Labornetzteil AliExpress