Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

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

paradaise1 11 Cze 2013 11:55 1860 10
  • #1 11 Cze 2013 11:55
    paradaise1
    Poziom 6  

    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: basic4gl
    Zaloguj się, aby zobaczyć kod



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

    0 10
  • Pomocny post
    #2 11 Cze 2013 21:11
    wiewioor222
    Poziom 13  

    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.

    0
  • #3 11 Cze 2013 22:29
    paavo91
    Poziom 19  

    Z podprogramu Prawo idziesz gosubem do Wyswietl. Coś zagmatwany masz ten programik.

    0
  • #4 11 Cze 2013 22:33
    paradaise1
    Poziom 6  

    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

    0
  • #5 11 Cze 2013 23:58
    wiewioor222
    Poziom 13  

    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.

    0
  • #6 12 Cze 2013 00:33
    paradaise1
    Poziom 6  

    Taki zapis wziąłem akurat z książki, więc zakładam, że też jest poprawny :P

    Załączam zmieniony program:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #7 12 Cze 2013 11:26
    paradaise1
    Poziom 6  

    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: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #8 12 Cze 2013 20:53
    wiewioor222
    Poziom 13  

    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: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #9 13 Cze 2013 05:28
    emarcus
    Poziom 35  

    wiewioor222 napisał:
    Spróbuj zamiast Timebase zrobić Load Timer0, 31250 ................


    Timer/Counter0 (TCNT0) jest 8-bitowy rejestr. Jak więc chcesz do niego wpisac liczbę większa niż 255? (!)
    Nie jest tu istotne czy stosujesz wpis zmiennej 'timebase' czy tez liczbę const. skutek jest ten sam.
    Popatrz na mechanizm wpisu wartości do Timera0:

    Timer0= A '-znaczy to samo co
    Load Timer0, B ' gdzie; B= 256-A
    Tę ostatnią conversję wykonuje w Bascom kommenda "Load".
    Jaką zatem liczbę chcesz wpisac do rejestru TCNT0?

    Jeżeli autor chce odliczyc 1 sec. stosując Timer0 winien ustawic dla niego prescaler na 64 i liczyc pełny jego zakres (bez żadnych wpisów typu "Load Timer0,x");

    Config Timer0 = Timer , Prescale = 64
    i wtedy po osiągnięciu 31250 przepełnień timera0 osiągnie upływ czasu 1 sec.

    Ponadto te wartości nie sa poprawne (zbyt zaniżone !):

    $hwstack = 40
    $swstack = 16
    $framesize = 32


    e marcus

    0
  • #10 13 Cze 2013 10:12
    paradaise1
    Poziom 6  

    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ł?

    0
  • Pomocny post
    #11 13 Cze 2013 14:47
    emarcus
    Poziom 35  

    paradaise1 napisał:


    @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ł?


    Tak, masz rację, przecaler winien byc 256, wtedy otrzymasz rozdzielczośc 32 usec, a 1 sec. bedzie po założonych 31250 cyklach.

    $SWSTACK, $HWSTACK, $FRAMESIZE
    Wartości tych trzech parametrów oblicz w/g instrukcji podanych w Bascom Manual;
    Na stronie internetowej 'mcselec' znajdziesz manual w języku polskim tłumaczony przez Zbigniewa Gibek.

    e marcus

    0