logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega16][bascom] resetuje sie procesor??

noel200 07 Cze 2009 12:44 1631 7
  • #1 6626476
    noel200
    Poziom 26  
    Witam, w ramach pracy mgr tworze automatyke do bramy.
    Napęd itd to jest rzecz malo istotna, ale sterowanie zrobiłem na atmedze 16, program napisłem w bascom, wydaje mi sie z reszta bardzo prosty, ale jakieś cuda sie robią:P mianowicie. brama po otwarciu czeka sobie pewien czas i sie zamyka. W trakcie czekania aktualny czas wyświetlany jest na lcd. I gdy tak sobie brama pracuje w naturalnych cyklach, to w trakcie już 6 cyklu na wyświetlaczu oprucz tego co ma sie wyświetlać to przebijają sie jakieś krzaki, ale program cały czas działa ok. Natomiast w trakcie 9 cyklu licznik zlicza do 100 i procesor wpada z powrotem w główną pętle programu, gdzie czeka na sygnał z pilota, a przecież brama jest otwarta i powinna sie zacząc zamykać.... poniżej kod programu. Wszelkie propozycje mile widziane.


    
    $regfile = "m16def.dat"
    'zadeklarowanie procesora
    
    Ddra = &B11111111
    Ddrd = &B00000000
    'zadeklarowanie portów(wejsc, wyjsc)
    
    Porta = &B00100000
    Portd = &B00000000
    'zadeklarowanie stanow portow(niskie, wysokie)
    
    Enable Interrupts
    'odblokowanie globalnego ukladu przerwan
    
    Config Timer0 = Timer , Prescale = 1024
    Timer0 = 255
    On Timer0 Falownik
    Enable Timer0
    
    Config Lcd = 24 * 2
    Config Lcdpin = Pin , Db4 = Porta.0 , Db5 = Portb.2 , Db6 = Porta.1 , Db7 = Portb.3 , E = Portb.1 , Rs = Portb.0
    'zadeklarowanie wyswietlacza lcd
    
    Pilot Alias Pind.7
    Bariera1 Alias Pind.6
    Bariera2 Alias Pind.5
    Kranp Alias Pind.4
    Kranl Alias Pind.3
    Zwalniaczl Alias Pind.2
    Zwalniaczp Alias Pind.1
    Blad_falownik Alias Pind.0
    
    Lampa Alias Porta.0
    Silnik Alias Porta.1
    Kierunek Alias Porta.2
    Preset Alias Porta.3
    Lampa_falownik Alias Porta.4
    'zadelkarowanie nazw portow
    
    Dim Licznik1 As Word
    Dim Licznik2 As Word
    Dim Licznik3 As Word
    'zadeklarowanie zmiennych
    
    Licznik1 = 0
    Licznik2 = 0
    Licznik3 = 0
    'przypisanie wartosci domyslnej lub zerowej zmiennym, wejsciom oraz wyjsciom
    
    Poczatek:
    Do
    
    Cls
    Cursor Off
    Lcd "czekam na pilot"
    Waitms 30
    
    If Pilot = 1 Then
    Gosub Otwieranie
    End If
    
    Loop
    End
    'glowna petla programu
    '###############################################################################
    
    Otwieranie:
    
    Lampa = 1
    Kierunek = 0
    
    Cls
    Cursor Off
    Lcd "otwieranie"
    
    Waitms 1500
    
    Silnik = 1
    
    Do
    
      If Pilot = 1 Then
      Gosub Zamykanie
      End If
    
      If Zwalniaczl = 0 Then
      Preset = 1
      End If
    
      If Kranl = 0 Then
      Silnik = 0
      Preset = 0
      Gosub Czekanie
      End If
    
    Waitms 30
    
    Loop
    End
    Return
    
    '###############################################################################
    
    Zamykanie:
    
    Silnik = 0
    Kierunek = 1
    Preset = 0
    Cls
    Cursor Off
    Lcd "zamykanie"
    
    Waitms 1500
    
    Silnik = 1
    
    Do
    
      'If Bariera1 = 0 Or Bariera2 = 0 Then
      'Gosub Otwieranie1
      'End If
    
      If Pilot = 1 Then
      Silnik = 0
      Kierunek = 0
      Gosub Otwieranie
      End If
    
      If Zwalniaczp = 0 Then
      Preset = 1
      End If
    
      If Kranp = 0 Then
      Silnik = 0
      Preset = 0
      Kierunek = 0
      Waitms 500
      Lampa = 0
      Goto Poczatek                                             '
      End If
    
    Waitms 30
    
    Loop
    End
    Return
    
    '###############################################################################
    
    Czekanie:
    
    Do
    Incr Licznik1
    
         If Licznik1 = 1200 Then
         Licznik1 = 0
         Gosub Zamykanie
         End If
    
         If Pilot = 1 Then
         Licznik1 = 0
         Waitms 1500
    
         Do
    
           Waitms 200
           Incr Licznik2
    
            Cls
            Lcd Licznik2
    
                If Licznik2 = 20 Then
                Licznik2 = 0
                Gosub Zamykanie
                End If
    
                If Pilot = 1 Then
                Gosub Czekanie1
                End If
    
         Loop
         End If
    
    Cls
    Cursor Off
    Lcd "czekanie"
    Lowerline
    Licznik3 = Licznik1 / 20
    Lcd Licznik3 ; " s (60s)"
    Waitms 50
    
    Loop
    End
    Return
    
    '###############################################################################
    
    Otwieranie1:
    
    Silnik = 0
    Cls
    Cursor Off
    Lcd "otwieranie 1"
    Kierunek = 0
    Waitms 1000
    Silnik = 1
    
    Do
    
      If Bariera1 = 1 And Bariera2 = 1 Then
      Silnik = 0
      Waitms 500
      Goto Zamykanie
      End If
    
      If Zwalniaczl = 0 Then
      Preset = 1
      End If
    
      If Kranl = 0 Then
      Silnik = 0
      Preset = 1
    
             Do
    
               Waitms 50
               Cls
               Lcd "zaslonieta"
               Lowerline
               Lcd "bariera"
    
             Loop Until Bariera1 = 1 And Bariera2 = 1
    
      Gosub Zamykanie
    
      End If
    
    Waitms 30
    
    Loop
    End
    Return
    
    '###############################################################################
    
    Falownik:
    
        If Blad_falownik = 1 Then
    
        Lampa_falownik = 1
        Do
    
        Waitms 50
        Cls
        Cursor Off
        Lcd "blad"
        Loop Until Blad_falownik = 0
    
        Else
        Lampa_falownik = 0
        End If
    Lampa_falownik = 0
    Return
    
    '###############################################################################
    
    Czekanie1:
    
    Cls
    Cursor Off
    Lcd "dlugie czekanie"
    
    Wait 2
    
    Do
    
    Waitms 50
    
           If Pilot = 1 Then
           Gosub Zamykanie
           End If
    
    Loop
    End
    Return
    
  • Pomocny post
    #2 6626854
    dawid512
    Poziom 32  
    Po pierwsze dodaj dyrektywę informującą kompilator z jakiego zegara korzystasz. Po za tym w przerwaniu nigdy nie używaj opóźnień bo to podstawowy błąd.
  • Pomocny post
    #3 6627095
    mirekk36
    Poziom 42  
    nie dość, że w przerwaniu dajesz opóźnienia waitms o czym wspomniał kolega powyżej - to jeszcze wyświetlasz coś w przerwaniu na LCD a to już msakra.

    do tego wszystkiego daj nie tylko dyrektywę informującą jaki zegar ale co najważniejsze dyrektywy ustawiające stos sprzętowy i programowy - dodatkowo zmień wtedy ich wartości na większe niż domyślne bo w tak napisanym programie - to twój efekt resetowania zapewne spowodowany jest przypadkowym przepełnianiem się stosu
  • #4 6627811
    noel200
    Poziom 26  
    dopisanie linijki określającej szybkość, nic nie dało, z resztą przestawiałem fusebity, bo jak do tej pory jechałem na wew zegarze. Dokładnośc działania ani szybkość nie jest priorytetem.
    Całkowicie usunęłem przerwanie i podprogram. Zadnych zmian.
    A o co chodzi z tym stosem? pierwsze słysze i tym, co i gdzie mam wpisać?? dzieki za odp
  • Pomocny post
    #5 6628058
    mirekk36
    Poziom 42  
    przestawienie fusebitów nie jest równoznaczne z tą linijką definiującą taktowanie procka. Wszystkie podstawowe definicje powinny się znaleźć zawsze w kodzie programu - a że tego do tej pory nie robiłeś to teraz się troszkę mści.

    poczytaj w helpie bascoma o takich dyrektywach jak swstack, hwstack itp - i zobacz co mówią na ten temat przykłady a na pewno się wiele rozjaśni
  • #6 6629218
    noel200
    Poziom 26  
    fakt rozjaśniło sie co nieco, ale odpaliłem teraz program nic nie zmieniając ani w ustawianiach kompilatora, ani nie dopisując tych dyrektyw i działa dobrze....
  • Pomocny post
    #7 6629356
    mirekk36
    Poziom 42  
    masz rację - problemy ze stosem bywają bardzo wredne jeśli się nad nim świadomie nie panuje

    tak więc na przyszłość pisząc programy w bascomie radzę ci jednak używać tych dyrektyw i to jeszcze poczytać od czego zależą wartości jakie się podaje dla hwstack i swstack

    bo tak - to na razie może działać ci dobrze a pojutrze zdziwisz się, że znowu szwankuje ;)
  • #8 6629430
    noel200
    Poziom 26  
    Fuse bity przestawiałem oddzielnie oczywiście, w burn-o-matic. Poczytam jeszcze odnośnie tych stosów i dziękuje bardzo za pomoc.
    Problemem okazały się za małe stosy. Wstawienie dyrektyw do programu z powiększeniem stosów rozwiązało problem.
    Pozdrawiam.
REKLAMA