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

Bascom - Atmega8a traci wartość liczników/samoczynny reset mikrokontrolera

paradaise1 11 Cze 2013 11:55 2250 10
REKLAMA
  • #1 12405179
    paradaise1
    Poziom 9  
    Posty: 10
    Witam,

    Mam problem z programem na Atmege8a, mianowicie:

    Piszę program sterujący pracą silnika (za pomocą L293D) który dodatkowo będzie zliczał w czasie impuls od przerwań zewnętrznych i tu pojawia się problem: kiedy napisałem program obsługujący tylko pracę silnika, wszystko działa sprawnie, kiedy napisałem program zliczający impulsy w czasie, również nie było problemów. Problem się pojawił, kiedy połączyłem oba programy w całość – podczas zliczania impulsów, jeśli zaczynam pracę przyciskami sterującymi silnikiem atmega gubi wartości liczników/resetuje się - pwm wraca do ustawień początkowych, timer zaczyna pracę od nowa, licznik impulsów również (przy czym timery i przerwania zew. działają sprawnie, dopóki nie zacznie się praca przycisków).

    Początkowo program miał jedną pętlę główną, w której sprawdzał kierunek obrotu, sprawdzał stan przycisków – opisany problem się pojawiał, dlatego wyniosłem obsługę przycisków do podprogramów, oraz zrobiłem dwie dodatkowe pętle do obsługi każdego z kierunków – to jednak nie pomogło

    Czy przyczyną mogą być przerwy czasowe potrzebne do prawidłowej pracy przycisków? Jeśli tak, to w jaki sposób to zmienić, aby działało poprawnie?

    Jestem początkujący w tej dziedzinie, dlatego prosiłbym o wyrozumiałość. Za wszelkie wskazówki będę ogromnie wdzięczny.

    (Co do programu to pwm musi być ustawiane w zakresie 0 -170, a przerwania maja reagować na zmianę sygnału)


    Kod: text
    Zaloguj się, aby zobaczyć kod



    Bascom - Atmega8a traci wartość liczników/samoczynny reset mikrokontrolera
  • REKLAMA
  • Pomocny post
    #2 12407432
    wiewioor222
    Poziom 13  
    Posty: 110
    Pomógł: 3
    Ocena: 5
    Możliwe, że któryś skok do funkcji niepoprawnie powraca i przepełnia się stos, czego następstwem jest reset mikro kontrolera, prześledź miejsca gdzie wykonywane są skoki i zobacz czy są takie gdzie np wykonujesz skok i zamiast wrócić return to wykonujesz 2 skok.
  • REKLAMA
  • #3 12407866
    paavo91
    Poziom 19  
    Posty: 500
    Pomógł: 24
    Ocena: 16
    Z podprogramu Prawo idziesz gosubem do Wyswietl. Coś zagmatwany masz ten programik.
  • REKLAMA
  • #4 12407894
    paradaise1
    Poziom 9  
    Posty: 10
    Pozmieniałem program tak, aby pozostały tylko podprogramy od timera i od przerwań zewnętrznych, resztę wrzuciłem do pętli głównej. Program już nie wykonuje niepoprawnych skoków, ale niestety problem pozostał ten sam
  • #5 12408235
    wiewioor222
    Poziom 13  
    Posty: 110
    Pomógł: 3
    Ocena: 5
    Zamieść zmieniony program i zmień end if : return, nigdy nie zapisywałem tego tak więc nie jestem w stanie powiedzieć czy zapis jest poprawny, a widzę że stosujesz przemiennie.
  • #6 12408305
    paradaise1
    Poziom 9  
    Posty: 10
    Taki zapis wziąłem akurat z książki, więc zakładam, że też jest poprawny :P

    Załączam zmieniony program:

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #7 12408995
    paradaise1
    Poziom 9  
    Posty: 10
    Zmieniłem jeszcze raz program, tak aby nie wykonywał dodatkowych pętli. W sumie działa sprawniej niż poprzednie wersje ale po pewnym czasie nadal się restartuje

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #8 12411043
    wiewioor222
    Poziom 13  
    Posty: 110
    Pomógł: 3
    Ocena: 5
    Spróbuj zamiast Timebase zrobić Load Timer0, 31250 (nie będzie przeskakiwał po kodzie ponad 30 tys razy tylko zliczy wewnętrzne tyle impulsów i po przepełnieniu przejdzie do podprogramu), w ogóle ustawiłbym Prescale na wartość około sekundy chyba, że chcesz mieć jak najdokładniej.

    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #9 12412133
    Konto nie istnieje
    Poziom 1  
  • #10 12412444
    paradaise1
    Poziom 9  
    Posty: 10
    Ustawienie prescalera pomogło :) co prawda zdarza mu się zawiesić, ale to już bardzo sporadycznie.

    @emarcus: O ile się nie mylę, przy prescalerze 64 i cżestotliwości 8MHz timer0 będzie miał skok co 8us, czyli licznik bedzie przepełniał się co 2,048ms, więc do poprawnego odliczenia 1s w obsłudze timera należy załadowywać do niego Timer0 = 6, i dodać licznik, który 500 razy zliczy przepełnienia.

    A co do tych parametrów, to zawsze wstawiałem domyślne z BASCOMA, a jakie byś polecał?
  • Pomocny post
    #11 12413141
    Konto nie istnieje
    Poziom 1  

Podsumowanie tematu

✨ Użytkownik ma problem z programem na mikrokontrolerze Atmega8a, który steruje silnikiem za pomocą L293D oraz zlicza impulsy z przerwań zewnętrznych. Po połączeniu obu funkcji, mikrokontroler resetuje się, a wartości liczników są gubione. Użytkownik próbował różnych podejść, w tym przeniesienia obsługi przycisków do podprogramów oraz zmiany struktury pętli, ale problem nadal występuje. Użytkownicy sugerują sprawdzenie skoków w kodzie, poprawę ustawień prescalera timera oraz dostosowanie wartości rejestrów, aby uniknąć przepełnienia. Ostatecznie, po zmianie prescalera, problem z resetowaniem się mikrokontrolera został częściowo rozwiązany, ale sporadyczne zawieszenia nadal występują.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA