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

Atmega 16 wiesza się (Bascom)

T_O_M_A_L_A 02 Paź 2010 22:46 2288 10
  • #1 8576973
    T_O_M_A_L_A
    Poziom 12  
    Witam
    Moja Atmega 16 wiesza się w pętlach Uszczenianie i Paletyzacja poniższego programu:
    
    'Listing programu obsługującego symulator procesów. Program został napisany
    ' i skompilowan w programie BASCOM-AVR 1.11.9.8.
    
    $regfile = "m16def.dat"                                     'określenie typu procesora
    $crystal = 8000000                                          'określene szybkości zegara
    
    'Watchdog
     Wdtcr = &B00011111                                         'konfiguracja watchdoga na 2,2 sekundy
    
    Kontraktron Alias Portb                                     'porty kotraktonów
    Dioda Alias Portd                                           'porty diod
    P_lewo Alias Pina.7                                         'przycisk strzalka w lewo
    P_prawo Alias Pina.6                                        'przycisk Menu
    P_menu Alias Pina.5                                         'przycisk strzalka w prawo
    A Alias Pinb.0
    B Alias Pinb.1
    C Alias Pinb.2
    D Alias Pinb.3
    E Alias Pinb.4
    F Alias Pinb.5
    G Alias Pinb.6
    H Alias Pinb.7
    Dioda_a Alias Portd.0
    Dioda_b Alias Portd.1
    Dioda_c Alias Portd.2
    Dioda_d Alias Portd.3
    Dioda_e Alias Portd.4
    Dioda_f Alias Portd.5
    Dioda_g Alias Portd.6
    Dioda_h Alias Portd.7
    Narzedzie Alias Pina.4
    
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2
    
    Config Kontraktron = Input                                  'port b  jako wejścia
           Kontraktron = &B11111111                             'wszędzie stan spoczynkowy-1
    Config Dioda = Output                                       'port d jako wyjścia
           Dioda = &B00000000                                   'wszędzie stan spoczynkowy-0
    
    Config Porta.7 = Input                                      'przycisk strzalka w lewo
    Porta.7 = 1
    
    Config Porta.6 = Input                                      'przycisk OK
    Porta.6 = 1
    
    Config Porta.5 = Input                                      'przycisk strzalka w prawo
    Porta.5 = 1
    
    Config Porta.4 = Input                                      'wejscie podlaczane do robota, stan narzędzia
    Porta.4 = 1
    
    Config Timer0 = Timer , Prescale = 1024                     'obsługa wyświetlacza LCD - wyświelanie i przesówanie
    On Timer0 Liczenie
    
    Enable Timer0
    
    Config Timer1 = Timer , Prescale = 1
    On Timer1 Czasomierz_1000
    Enable Timer1
    
    Enable Interrupts
    
    Dim Licznik_menu As Byte , Test_licznik_menu As Byte , Zatwierdz As Bit , Dlugi_tekst As String * 80
    Dim Dlugi_tekst_2 As String * 80 , Wyswietlany_tekst As String * 16
    Dim Wyswietlany_tekst_2 As String * 16 , Licznik_lcd As Byte , Licznik_lcd_2 As Byte
    Dim Ilosc_liter As Byte , Ilosc_liter_2 As Byte
    Dim Czas_przypawania As Byte , Licznik_timer0 As Integer , Predkosc_spawania As Word
    Dim Czas_odcinka As Long ,
    Dim 1_1000_sekundy As Long , Minus_czas As Long , Plus_czas As Long , Tolerancja_czasu As Long
    Dim Tolerancja_czasu_przypawania As Long
    Dim Flaga_start As Bit
    Dim Flaga_a As Bit , Flaga_b As Bit , Flaga_c As Bit , Flaga_d As Bit ,
    Dim Flaga_e As Bit , Flaga_f As Bit , Flaga_g As Bit , Flaga_h As Bit
    
    Licznik_menu = 1
    Licznik_lcd = 1
    Licznik_lcd_2 = 1
    Czas_przypawania = 30
    Licznik_timer0 = 0
    Predkosc_spawania = 1                                       'mm/s
    Tolerancja_czasu_przypawania = 20                           ' wartość mniejsza od wartości Czas_przypawania
    Flaga_start = 0
    
       Dlugi_tekst = "WIM Labolatorium"
       Dlugi_tekst_2 = "    robotyki    "
    
       Wait 1
       Reset Watchdog
       Wait 1
       Reset Watchdog
       Wait 1
       Reset Watchdog
    
       Dlugi_tekst = "   Symulator    "
       Dlugi_tekst_2 = "  interaktywny  "
    
       Wait 1
       Reset Watchdog
       Wait 1
       Reset Watchdog
       Wait 1
       Reset Watchdog
    
       Flaga_a = 0
       Gosub Wybor
    
    
    Wybor:
    Dlugi_tekst_2 = "  By wybrac symulacje wcisnij OK, by zmienic wcisnij < lub >  "
    Do
    
       Waitms 100
    
       If P_lewo = 0 Then
          Waitms 100
          Do
             Reset Watchdog
             Test_licznik_menu = Licznik_menu
             Decr Licznik_menu
             If Licznik_menu = 255 Then
             Licznik_menu = 2
             Licznik_lcd = 0
          Loop Until Licznik_menu <> Test_licznik_menu
          End If
       End If
    
       If P_menu = 0 Then
          Waitms 100
          Zatwierdz = 1
       Else
          Zatwierdz = 0
       End If
    
       If P_prawo = 0 Then
          Waitms 100
          Do
             Reset Watchdog
             Test_licznik_menu = Licznik_menu
             Incr Licznik_menu
             If Licznik_menu => 3 Then
                Licznik_menu = 0
                Licznik_lcd = 0
             End If
          Loop Until Licznik_menu <> Test_licznik_menu
       End If
    
    
       If Licznik_menu = 0 Then
          Dlugi_tekst = "  Symulacja paletyzacji  "
          If Zatwierdz = 1 Then
             Waitms 30
             Gosub Paletyzacja
          End If
       End If
    
       If Licznik_menu = 1 Then
          Dlugi_tekst = "  Symulacja nakladania uszczelnienia  "
          If Zatwierdz = 1 Then
             Waitms 30
             Gosub Uszczelnianie
          End If
       End If
    
       If Licznik_menu = 2 Then
          Dlugi_tekst = "  Symulacja przypawania  "
          If Zatwierdz = 1 Then
             Waitms 30
             Gosub Przypawanie
          End If
       End If
    
       Reset Watchdog
    Loop
    
    
    
    Paletyzacja:
    Dlugi_tekst_2 = " By powrocic do menu glownego wcisnij < "
    Do
       Reset Watchdog
    
       If A = 0 Then
          Waitms 50
          Dioda_a = 1
       Else
          Dioda_a = 0
       End If
    
       If B = 0 Then
          Waitms 50
          Dioda_b = 1
       Else
         Dioda_b = 0
       End If
    
       If C = 0 Then
          Waitms 50
          Dioda_c = 1
       Else
          Dioda_c = 0
       End If
    
       If D = 0 Then
          Waitms 50
          Dioda_d = 1
       Else
          Dioda_d = 0
       End If
    
       If Dioda_a = 1 And Dioda_b = 1 And Dioda_c = 1 And Dioda_d = 1 Then
          Wait 1
          Reset Watchdog
          If Flaga_a = 0 Then
             Licznik_lcd = 1
             Dlugi_tekst = " Sukces, zaladuj ponownie podajnik i wezwij prowadzacego"
          End If
          Flaga_a = 1
       Else
          Flaga_a = 0
          Licznik_lcd = 1
          Dlugi_tekst = " Symulacja paletyzacji"
       End If
    
       If P_lewo = 0 Then
          Waitms 100
          Dioda = 0
          Gosub Wybor
       End If
    
       'Gosub Powrot_do_menu
    Loop
    
    
    
    Uszczelnianie:
    
    Waitms 50
    Licznik_lcd = 1
    Licznik_lcd_2 = 1
    Dlugi_tekst = "  Symulacja nakladania uszczelnienia"
    Dlugi_tekst_2 = "  By powrocic do menu glownego wcisnij <. By rozpoczac od nowa wcisnij OK"
    Do
       Flaga_a = 1
       Flaga_b = 1
       Flaga_c = 1
       Flaga_d = 1
       Flaga_e = 1
       Flaga_f = 1
       Flaga_g = 1
       Flaga_h = 1
       Reset Watchdog
       If A = 0 And Narzedzie = 0 Then
          Do
             Reset Watchdog
             Dlugi_tekst = "  Symulacja nakladania uszczelnienia"
             Dioda_a = 1
             Czas_odcinka = 142000 / Predkosc_spawania          'interpolacja kołowa przez punkty ABC
             1_1000_sekundy = 0
             Flaga_a = 0
          Loop Until 1_1000_sekundy >= Czas_odcinka
        End If
    
        If B = 0 And Narzedzie = 0 And Flaga_a = 0 Then
          Do
             Reset Watchdog
             Dioda_b = 1
             Czas_odcinka = 84400 / Predkosc_spawania           'interpolacja kołowa przez punkty ABC
             1_1000_sekundy = 0
             Flaga_b = 0
          Loop Until 1_1000_sekundy >= Czas_odcinka
        End If
    
        If C = 0 And Narzedzie = 0 And Flaga_b = 0 Then
          Do
             Reset Watchdog
             Dioda_c = 1
             Czas_odcinka = 120000 / Predkosc_spawania          'interpolacja liniowa
             1_1000_sekundy = 0
             Flaga_c = 0
          Loop Until 1_1000_sekundy >= Czas_odcinka
        End If
    
        If D = 0 And Narzedzie = 0 And Flaga_c = 0 Then
          Do
             Reset Watchdog
             Dioda_d = 1
             Czas_odcinka = 150000 / Predkosc_spawania          'interpolacja liniowa
             1_1000_sekundy = 0
             Flaga_d = 0
          Loop Until 1_1000_sekundy >= Czas_odcinka
        End If
    
        If E = 0 And Narzedzie = 0 And Flaga_d = 0 Then
          Do
             Reset Watchdog
             Dioda_e = 1
             Czas_odcinka = 300000 / Predkosc_spawania          'interpolacja liniowa
             1_1000_sekundy = 0
             Flaga_e = 0
          Loop Until 1_1000_sekundy >= Czas_odcinka
        End If
    
        If F = 0 And Narzedzie = 0 And Flaga_e = 0 Then
          Do
             Reset Watchdog
             Dioda_f = 1
             Czas_odcinka = 162000 / Predkosc_spawania          'interpolacja liniowa
             1_1000_sekundy = 0
             Flaga_f = 0
          Loop Until 1_1000_sekundy >= Czas_odcinka
        End If
    
        If G = 0 And Narzedzie = 0 And Flaga_f = 0 Then
          Do
             Reset Watchdog
             Dioda_g = 1
             Czas_odcinka = 115000 / Predkosc_spawania          'interpolacja liniowa
             1_1000_sekundy = 0
             Flaga_g = 0
          Loop Until 1_1000_sekundy >= Czas_odcinka
        End If
    
        If H = 0 And Narzedzie = 0 And Flaga_g = 0 Then
          Do
             Reset Watchdog
             Dioda_h = 1
             If Narzedzie = 0 Then
                Wait 2
                Dioda = 0
                Dlugi_tekst = "  Narzedzie nalezy wylaczyc w punkcie H, popraw program i ponow probe"
             End If
    
             If Narzedzie = 1 And Portd = 255 Then
                Dlugi_tekst = "  Sukces, wezwij prowadzacego"
             End If
    
          If P_menu = 0 Then
             Waitms 100
             Dioda = 0
             Gosub Uszczelnianie
          End If
    
             Gosub Powrot_do_menu
    
          Loop
          End If
    
    
    
       If Dioda > 0 Then
          Dlugi_tekst = " Niepoprawna predkosc,zla trasa lub wylaczenie narzedzia w trakcie uszczelniania"
          Wait 10
          Dlugi_tekst = "  Popraw program i ponow probe"
          Wait 10
          Dlugi_tekst = "  Symulacja nakladania uszczelnienia"
          Dioda = 0
       End If
    
       If Narzedzie = 0 Then
          Dlugi_tekst = "  Narzedzie mozna wlaczyc gdy pokonuje trase uszczelniania, ponow probe"
       End If
    
    
        If P_menu = 0 Then
          Waitms 100
          Dioda = 0
          Gosub Uszczelnianie
       End If
    
       Gosub Powrot_do_menu
    Loop
    
    
    Przypawanie:
    Do
    Loop
    
    
    Liczenie:
       Incr Licznik_timer0
       If Licznik_timer0 >= 15 Then
    
          Ilosc_liter = Len(dlugi_tekst) - 14
          Ilosc_liter_2 = Len(dlugi_tekst_2) - 14
    
          Incr Licznik_lcd                                      '= Licznik_lcd + 6
          Incr Licznik_lcd_2                                    ' = Licznik_lcd_2 + 6
    
          If Licznik_lcd >= Ilosc_liter Then
             Licznik_timer0 = -30
             Licznik_lcd = 1
          End If
    
          If Licznik_lcd_2 >= Ilosc_liter_2 Then
             Licznik_timer0 = -30
             Licznik_lcd_2 = 1
          End If
    
          Licznik_timer0 = 0
    
          Gosub Wyswietl
    
       End If
       Return
    
    
    Wyswietl:
       Cls
       Wyswietlany_tekst = Mid(dlugi_tekst , Licznik_lcd , 16)
       Locate 1 , 1
       Lcd Wyswietlany_tekst
    
       Wyswietlany_tekst_2 = Mid(dlugi_tekst_2 , Licznik_lcd_2 , 16)
       Locate 2 , 1
       Lcd Wyswietlany_tekst_2
       Return
    
    
    Powrot_do_menu:
       If P_lewo = 0 Then
          Waitms 100
          Dioda = 0
          Gosub Wybor
       End If
       Return
    
    Od_nowa_przypawanie:
       If P_menu = 0 Then
          Waitms 100
          Dioda = 0
          Gosub Przypawanie
       End If
       Return
    
    
    Czasomierz_1000:
       Incr 1_1000_sekundy
       Timer1 = 57535
       Return
    
    
    Od_nowa_uszczelnianie:
       If P_menu = 0 Then
          Waitms 100
          Dioda = 0
          Gosub Uszczelnianie
       End If
       Return
    

    Czy ktoś może ma pomysł dlaczego?
    Schemat podłączenia:
    Atmega 16 wiesza się (Bascom)
    Fuse bity:
    Atmega 16 wiesza się (Bascom)
    Proszę o pomoc
  • #2 8577304
    hose2
    Poziom 17  
    Witam

    Nie wiesza się, tylko wykonuje nadzwyczaj sumiennie to co napisałeś
    w programie:
    
    Paletyzacja:
    Dlugi_tekst_2 = " By powrocic do menu glownego wcisnij < "
    Do
    ...             
    Loop
    

    To jest pętla BEZ KOŃCA.
    
    ...
          Do
             Reset Watchdog
             Dlugi_tekst = "  Symulacja nakladania uszczelnienia"
             Dioda_a = 1
             Czas_odcinka = 142000 / Predkosc_spawania          'interpolacja kołowa przez punkty ABC
             1_1000_sekundy = 0
             Flaga_a = 0
          Loop Until 1_1000_sekundy >= Czas_odcinka
    ...
    

    To właściwie też bez końca.
    Warunek się nie wykona, bo kiedy "1_1000_sekundy"
    która jest równa 0 może być większe lub równe "142000 / Predkosc_spawania"
    (to jest zawsze > 0)
    Tak gwoli ścisłości to są KONTAKTRONY i LABORATORIUM.
    --
    Pozdrawiam
  • #3 8577659
    T_O_M_A_L_A
    Poziom 12  
    hose2 napisał:

    Nie wiesza się, tylko wykonuje nadzwyczaj sumiennie to co napisałeś
    w programie:

    No bez przesady, gdyby robił to co jest w pętli, bym tutaj nie pisał. Po wejściu w podprogram Paletyzacja lub Uszczelnianie procek się wiesza i watchdog go resetuje.

    Za "laboratrium" dzięki a jeśli chodzi o kontraktrony to w necie też jest używana ta nazwa.
  • #4 8577994
    xury
    Specjalista automatyka domowa
    Mój ulubiony "kwiatek" :)
       Gosub Wybor 
    
    
    Wybor: 


    Potem mamy masę gosub'ów bez poprawnego wyjścia.

    Generalnie program źle napisany. Piszemy programy tak by subrtyny mogły się kończyć i nie zagnieżdżamy nadmiernie podprogramów.
    To nie watchdog tylko przepełnienie stosu. Chociaż i watchdog może w kilku przypadkach resetować, zwłaszcza tam gdzie jest WAIT 2.
  • #5 8578131
    T_O_M_A_L_A
    Poziom 12  
    xury napisał:
    WAIT 2.

    faktycznie - juz poprawione
    xury napisał:

    Mój ulubiony "kwiatek" :)
       Gosub Wybor 
    
    Wybor: 

    Potem mamy masę gosub'ów bez poprawnego wyjścia.

    gdybys konkretnie wyjasnil co jest nie tak.

    xury napisał:

    To nie watchdog tylko przepełnienie stosu. Chociaż i watchdog może w kilku przypadkach resetować, zwłaszcza tam gdzie jest

    Jak nie ma włączonego watchdoga program staje w miejscu i trzeba resetować ręcznie.

    Na razie doszedłem do tego, że najprawdopodobniej Stringi są za długie, bo bez nich podprogramy się nie wieszają.
  • #6 8578175
    Konto nie istnieje
    Poziom 1  
  • #7 8578181
    xury
    Specjalista automatyka domowa
    Chodzi o to, że masz dużo skoków do podprogramów z których nie powracasz i w dodatku w nich masz kolejny skok gdzi indziej itd.
    Każdy skok wykorzystuje stos do zapamiętywania stanu rejestrów. Stos to obszar pamieci deklarowana w ustawieniach lub za pomocą dyrektyw kompilatora. Nawet stawienie bardzo dużych wartości nie pomoże gdy program nie jest napisany prawidłowo. Pamięć ta szybko się zapełni i najedzie na dane zmiennych i program "pójdzie w maliny".
  • #8 8578202
    Konto nie istnieje
    Poziom 1  
  • #9 8580029
    M. S.
    Poziom 34  
    Cytat:
    Po wejściu w podprogram Paletyzacja lub Uszczelnianie procek się wiesza


    Wyście z podprogramu musi kończyć się instrukcją Return. Powyższe podprogramy nie mają tej instrukcji. Pamiętaj póki nie masz wprawy - skąd program wyszedł tam musi wrócić. Inaczej zapcha stos i pójdzie w maliny!
  • #10 8580159
    T_O_M_A_L_A
    Poziom 12  
    Dziękuje wszystkim. Na razie pozamieniałem Gosub na Goto gdzie trzeba. Mimo to program się wiesza dopóki nie zlikwiduje wartości dlugi_tekst i dlugi_tekst_2. Wydaje mi się że zużywają za dużo pamięci. Chciałbym zostawić te opisy. Ktoś może ma pomysł jak zrobić żeby to działało?
  • #11 8581280
    M. S.
    Poziom 34  
    Idź w drugą stronę. Zmień Goto na Gosub wg schematu:

    Do 'Pętla główna
    ...
    Gosub Etykieta1 'wywołanie podprogramu 1
    Gosub Etykieta2 'wywołanie podprogramu 2
    ...
    Loop 'Koniec pętli głównej
    End
    
    Etykieta1: ' Podprogram1
    ...
    Return 'Powrót do następnej instrukcji po Gosub Etykieta1
    
    Etykieta2: ' Podprogram2
    ...
    Return 'Powrót do następnej instrukcji po Gosub Etykieta2


    Rozważ możliwość wtłoczenia "treści" podprogramów do pętli głównej. Podprogram ma sens kiedy wywołujemy go w programie co najmniej 2 razy. (No czasem zwiększa programiście czytelność programu.)
    Przebuduj program bo jest tam więcej kwiatków. Z pętli DO ... Loop wychodź przez Exit Do albo przez Loop Until ... a nie przez Gosub bez powrotu (bez Return). O Goto raczej zapomnij.
REKLAMA