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 avr] resetujace sie wartosci zmiennych

szeryfff 26 Kwi 2009 21:11 2425 24
  • #1 26 Kwi 2009 21:11
    szeryfff
    Poziom 24  

    Witam!
    Program pisany w Bascomie, jest to prosty programik ktory pokazuje temperature w aucie, przejechany dystans itd.
    Timer0 wykorzystywany jest jako licznik (zlicza impulsy drogi), przy przepelnieniu licznika wywolywane jest przerwanie.
    Timer1 wykorzystywany jest jako timer, odmierzam nim 1ms, czyli co 1ms wywolywane jest przerwanie.
    Problem polega na tym, ze po przejechaniu kilku km program zaczyna bardzo dziwnie dzialac, do zmiennej zawierajacej liczbe przejechanych kilometrow wpisuje bardzo dziwne rzeczy.
    Wczesniejsza wersja programu nie wykorzystywala Timer1, i problem nie wystepowal, program dzialal stabilnie.
    Czy mozliwe jest, ze oba przerwania wywolywane sa jakos rownoczesnie, i dlatego cos sie psuje?
    Pozdrawiam

    0 24
  • #2 26 Kwi 2009 22:03
    Tomcio7
    Poziom 17  

    Nikt nie jest jasnowidzem...
    Może przekraczasz zakres zmiennej do której wpisujesz drogę

    0
  • #3 26 Kwi 2009 22:05
    szeryfff
    Poziom 24  

    To ze nikt nie jest jasnowidzem to wiem, ale jakbys dokladnie przeczytal mojego posta, to bys wiedzial, ze bez uzycia timer1 program dziala bez problemu, wiec chyba przekroczenie zakresu nie wchodzi w gre.

    0
  • #4 26 Kwi 2009 22:33
    dawid512
    Poziom 32  

    O ile się nie mylę to T0 jest pierwszy w hierarchii przerwań jeśli chodzi o timery więc stwierdzenie że wykonane zostają dwa przerwania jednocześnie nie ma racji bytu, choć mogę się mylić. Dobrze byłoby abyś pokazał kod, być może wtedy będziemy w stanie coś więcej powiedzieć.

    0
  • #5 26 Kwi 2009 22:59
    szeryfff
    Poziom 24  

    Struktura programu wyglada mniej wiecej tak, wycialem kilka nieznaczacych fragmentow.

    Code:

    'definiowanie procka
    $regfile = "m8def.dat"
    $crystal = 8000000

    'konfiguracja portów
    ...

    Config Timer0 = Counter , Edge = Falling                    'Licznik impulsów drogi
    Enable Timer0 : On Timer0 Przep                             'przepelnienie licznika
    Config Timer1 = Timer , Prescale = 64
    Enable Timer1 : On Timer1 Co1ms                             'przewrwanie co 1ms

    Enable Interrupts

    'zmienne
    ...

                                                   'poczatkowe napisy
    Do : Loop : End




    Co1ms:
    Timer1 = 65411                                           
    Incr Czas_pom                                             
    If Czas_pom = 1000 Then                                     
       Incr Czas
       Czas_pom = 0
    End If

    If Kropka = 0 Then
       Gosub Temperatura
    Elseif Kropka = 1 Then
       Gosub Droga1
    Elseif Kropka = 2 Then
       Gosub Predkosc
    Elseif Kropka = 3 Then
       Gosub Data1
    End If


    If Zegar_prz = 0 Then                                       'sprawdzenie, czy zostal wcisniety przycisk
       Incr Zegar_pom                                           'zwiekszanie zmiennej pomocniczej
       If Zegar_pom = 40 Then                                   'jak dojdzie do 4000 to da 40 ms
          Incr Zegar                                            'zwiekszanie zmiennej zegar
       End If
    Else
       Zegar_pom = 0                                            'zerowanie zmiennej pomocniczej
    End If

    If Kropka_prz = 0 Then
       Incr Kropka_pom                                          'zwiekszanie zmiennej pomocniczej
       If Kropka_pom = 40 Then                                  'jak dojdzie do 4000 to da 40 ms
          Incr Kropka                                           'zwiekszanie zmiennej kropka
          Zegar = 0                                             'zeby zawsze szedl na pierwszy ekran
       End If
    Else
       Kropka_pom = 0                                           'zerowanie zmiennej pomocniczej
    End If


    If Kropka > 3 Then : Kropka = 0 : End If
    If Zegar > 2 Then : Zegar = 0 : End If
    Return                                                      'koniec petli



    Temperatura:
    ...
    Return

    Droga1:
    ...
    Return

    Predkosc:
    ...
    Return

    Data1:
    ...
    Return

    Przep:
    Impdr = Impdr + 256
    Return

    0
  • #6 27 Kwi 2009 00:19
    mirley
    Poziom 17  

    Witam

    Czy jesteś pewien że kod zawarty w przerwaniu skończy się wykonywać zanim przyjdzie następne przerwanie. W kodzie widzę dużo skoków do różnych procedur. Miałem podbny problem gdy kolejno przychodzące przerwania wędrowały na stos aż do zablokowania mikrokontrolera.

    Spróbuj zrobić obsługę w przerwania w pętli głownej. Przerwanie ustawi zmienną bitową (Flagę) a pętla głowna wykona tą obsługę przy najbliższym sprawdzaniu warunku czy flaga jest ustawiona. W przerwaniu zostaw tylko konieczne procedury, które muszą być wykonane bezpośrednio po wystąpieniu przerwania.

    0
  • #7 27 Kwi 2009 00:19
    wader_669
    Poziom 28  

    Nie analizowalem dokladnie kody, ale moim zdaniem za duzo masz nawalone w przerwaniu. Ja bym to zrobil w petli za pomoca flagi itp.

    0
  • #8 27 Kwi 2009 07:08
    szeryfff
    Poziom 24  

    Nie wiem czy dobrze zrozumialem, ale chodzi o to, ze w obsludze przerwania mam ustawiac jakas zmienna np. na 1, a w petli glownej wykonywac reszte programu?

    0
  • #10 27 Kwi 2009 16:43
    emarcus
    Poziom 35  

    szeryfff napisał:
    Nie wiem czy dobrze zrozumialem, ale chodzi o to, ze w obsludze przerwania mam ustawiac jakas zmienna np. na 1, a w petli glownej wykonywac reszte programu?


    Nie sadze ze w pelni zrozumiales swoj problem;
    Zwroc uwage na procedury wykonywane chocby tylko w przerwaniu Timera1, ktore powtarza sie co 1 ms czyli masz tylko 125 cykli zegarowych pomiedzy kolejnymi przerwaniami co jest absolutnie za malo na jakiekolwiek inne procedury lub ewentualna obsluge przerwania od Timera0.
    Druga rzecz;
    Czy pomocnicza zmienna "Czas_pom" ma jakies inne wykorzystanie w programie, czy sluzy tylko do kalkulowania czasu 1sek.?
    Jezeli jest to jedyne jej zadanie, to dlaczego nie dasz preskaler 256 oraz timer1=31250?
    Trecia rzecz;
    Bascom to nie tylko zwyczajny compiler.
    W symulatorze programu (step mode) na dolnym pasku mozesz odczytac ile cykli zegarowych/czasu "kosztuje cie" kazda procedura, pozwala takze analizowac operacje na stosie.
    Wykorzystanie pamieci SRAM.
    Wiele innch cennych funkcji przydatnych w 'troubleshooting' symulowanego programu.

    e marcus

    0
  • #11 27 Kwi 2009 17:37
    szeryfff
    Poziom 24  

    Nie moge dac preskalera 256, bo co 1ms sprawdzam stan przyciskow. A co do reszty to pewnie masz racje, musze dokladnie przeanalizowac kod.
    Pozdrawiam

    Dodano po 1 [minuty]:

    A mozesz mi jeszcze powiedziec, jak obliczyles to, ze mam 125 cykli zegarowych pomiedzy kolejnymi przerwaniami?

    0
  • #12 27 Kwi 2009 19:48
    emarcus
    Poziom 35  

    szeryfff napisał:



    A mozesz mi jeszcze powiedziec, jak obliczyles to, ze mam 125 cykli zegarowych pomiedzy kolejnymi przerwaniami?


    Sluszna uwaga, moj blad!, Przeoczylem ze jest to po prescaler.

    e marcus

    0
  • #13 27 Kwi 2009 20:00
    szeryfff
    Poziom 24  

    Czyli nadal jest za malo cykli zegarowych pomiedzy przerwaniami? Moge zmienic czas pomiedzy przerwaniami na 20 ms, myslisz ze to cos da?
    Pozdrawiam

    0
  • #14 27 Kwi 2009 20:21
    janbernat
    Poziom 38  

    A jak chcesz zmienić czas między przerwaniami?
    One przychodzą w czasie niespodziewanym "z zewnątrz" systemu-taka jest ich natura.

    0
  • #15 27 Kwi 2009 21:26
    szeryfff
    Poziom 24  

    niekoniecznie, chyba nie czytales uwaznie watku :) pisalem o przerwaniach od Timer1 :)

    0
  • #16 27 Kwi 2009 23:13
    mirley
    Poziom 17  

    Zwiększ czas między przerwaniami a dodatkowo wiekszość operacji związanych np z wyświetlaniem zamieść w pętli głównej programu pod odpowiednią flagą.

    Temperaturę to na dodatkowej fladze np co 1s albo co 2s wystarczy.

    0
  • #17 15 Cze 2009 23:47
    szeryfff
    Poziom 24  

    Hej :)
    Powracam do tematu, ale z innym problemem.
    Otoz w ww. "komputerku" czasami resetuja mi sie wartosci zmiennych, lub przyjmuja kosmiczne wartosci.
    Bardzo czesto, gdy mam ustawione np. pokazywanie przebytej drogi, po jakims czasie wraca do pokazywania temperatury, czyli wartosc pewnej zmiennej zmienia sie z 1 na 0. Ponadto zmienna przechwujaca ilosc godzin czesto przyjmuje wartosc -1.
    Jaka moze byc tego przyczyna? Dodam ze program nie resetuje sie calkowicie, bo nie wraca do ekranu powitalnego.
    Reset mam podlaczony przez 10k do 5V.
    Pozdrawiam

    0
  • #18 22 Wrz 2009 23:29
    woszu
    Poziom 15  

    Witam. Mam podobny problem. U mnie jednak zeruje się zmienna, która faktycznie jest stałą całym programie. Zmienia się ją tylko w jednym podprogramie, do którego nie wchodzę podczas normalnego działania programu głównego. Na początku, po resecie programu wszystko ładnie śmiga. Po pewnym czasie ta zmienna przyjmuje wartości -0.0, ale program się nie wiesza, ani nie resetuje. Wszystko co nie jest związane z tą zmienną działa normalnie. Czy rozwiązałeś już swój problem?

    0
  • #19 23 Wrz 2009 00:07
    wader_669
    Poziom 28  

    Nie ma to nic wspolnego z tym problemem. Ja stawiam na zle napisany kod

    0
  • #20 25 Wrz 2009 07:51
    woszu
    Poziom 15  

    Kodu niestety wkleić nie mogę, ale dlaczego ma być źle napisany, skoro potrafi tydzień działać bez zarzutu, a potem nagle zeruje zmienną....???

    0
  • #21 25 Wrz 2009 16:51
    wader_669
    Poziom 28  

    Napewno dales to w zlym temacie. Jak masz takie problemy to sprawdz czy masz poprawny schemat. Jednak w to watpie, ze schemat jest powodem, ze caly czas ci sie jedna zmienna resetuje. Jeszcze jest opcja, ze procek jest walniety

    0
  • #22 27 Wrz 2009 12:44
    woszu
    Poziom 15  

    A dlaczego w złym temacie? Dokładnie taki mam problem jak ten temat, więc nie zakładałem nowego wątku. Schemat poprawny, sprawdzany przez kilka osób. Poza tym ta zmienna co się resetuje, nie zależy od żadnego wejścia procka, a sekcję analogową mam odfiltrowaną. Może to i wina procka. Teraz sprawdzę na atmedze 64 i zobacze czy dalej tak będzie.

    0
  • #23 27 Wrz 2009 13:16
    mirekk36
    Poziom 42  

    Cytat:
    "mam podobny problem, dokładnie taki sam jak w tym temacie dlatego nie zakładam nowego wątku. Schemat mam super poprawny. Kod napisany jest IDEALNIE - podkreślam IDEALNIE - a jednak zmienna mi się resetuje . Nie mogę wam przedstawić ani schematu ani kodu bo zresztą po co? skoro są extra! Tym bardziej, że kod potrafi mi działać nawet tydzień czasu bez problemów!

    - pomóżcie bo już nie wiem co zrobić??? czy nie sądzicie, że może być za to odpowiedzialny procesor??? albo firma ATMEL, która go wyprodukowała z wadą ??? a może głupi kompilator??? na co obstawiacie ??? bo przecież to niemożliwe żeby mój IDEALNY kod progamu lub IDEALNY schemat i IDEALNIE wykonana płytka - były tego przyczyną. Szukałem wszędzie odpowiedzi ale nie znalazłem na nią nigdzie satysfakcjonującej odpowiedzi :( ..... no nikt nie chce się ze mną po prostu zgodzić, że to wina procesora albo kompilatora - dlaczego? skoro to oczywiste przy takich efektach"



    -----------------------------------

    sorki - to powyżej to parodia co niektórych szanownych kolegów. Tak to racja - przy takim podejściu, to takie pytania powinny być zadawane w dziale elektrody o nazwie "Hyde park"

    0
  • #24 27 Wrz 2009 14:31
    xury
    Poziom 39  

    woszu napisał:
    A dlaczego w złym temacie? Dokładnie taki mam problem jak ten temat, więc nie zakładałem nowego wątku. Schemat poprawny, sprawdzany przez kilka osób. Poza tym ta zmienna co się resetuje, nie zależy od żadnego wejścia procka, a sekcję analogową mam odfiltrowaną. Może to i wina procka. Teraz sprawdzę na atmedze 64 i zobacze czy dalej tak będzie.

    A wziąłeś pod uwagę, że któryś ze stosów może ci nachodzić na tą zmienną ?
    to tylko hipoteza, bo programu nie widziałem. Miałem podobne problemy, i teraz już uważnie przyglądam się co się dzieje ze stosem.

    0
  • #25 27 Wrz 2009 17:53
    wader_669
    Poziom 28  

    woszu przepraszam tematy mi sie porobaly, dopiero teraz zauwazylem ze to inny temat. Myslalem, ze rozmawiamy w temacie gdzie procesor sie restatu po odlaczeniu programatora.

    Co do problemu: dalej stawiam na program i mysle, ze kolega xury daje tobie dobre wskazowki.

    0