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

[attiny2313] [attiny2313][bascom] Program resetuje się po 26 załączeniach przekaźnika

roy_ 13 Lut 2012 22:43 1643 4
REKLAMA
  • #1 10542558
    roy_
    Poziom 16  
    Witam
    Napisałem swój pierwszy program wiec proszę o wyrozumiałość …
    Attiny cyklicznie będzie odmierzał zadany czas i po upływie tego czasu załączał przekaźnik na 1 sek
    Będzie również zliczał ile razy przekaźnik został załączony i wyświetlał na wyświetlaczu :
    Zadany czas , ilość załączeń wyświetlacza , ile czasu już upłynęło od ostatniego załączenia.
    Wiem że odmierzany czas nie jest precyzyjny ale dla moich potrzeb nie jest istotne.

    Po wgraniu tego programu do procesora wszystko działa ale jest jedno ale ….
    Dzieje się coś takiego jak by procesor a dokładniej jego pamięć zostala zapełniona po 26 zliczeniach załączenia przekaźnika , wyświetlacz się „ wykrzacza” i program startuje od początku.
    Co zrobiłem nie tak?
    Gdzie jest problem ?
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 10542947
    jacekk232
    Poziom 17  
    Witam.

    Piszesz, że jest to twój pierwszy. Niestety widać to na każdym kroku.
    Masz kilka błędów rzucających się w oczy.

    Pierwszy błąd notorycznie popełniany przez początkujących to mylenie rejestru PIN z rejestrem PORT.
    Zamiast:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    powinno być:
    Kod: text
    Zaloguj się, aby zobaczyć kod


    Do rejestru PIN nic się nie zapisuje. To jest rejestr tylko do odczytu. Jeśli jakąś "nóżkę" masz ustawioną jako wejście to wewnętrzne rezystory podciągające załącza się wpisując jedynkę do rejestru PORT a nie PIN.

    I drugi błąd, który najpewniej powoduje restarty procka to nie właściwe używanie Gosub i etykiet do podprogramów.

    Pamiętaj, jeśli z jakiegoś miejsca w programie robisz skok do jakiegoś podprogramu to bezwzględnie musisz z niego wrócić za pomocą polecenia RETURN w to samo miejsce, z którego zrobiłeś skok.

    A tymczasem ty skaczesz sobie beztrosko z jednego podprogramu do drugiego za pomocą Gosub a następnie z tego drugiego do pierwszego tez za pomocą Gosub. I tak w kółko.

    Każde użycie Gosub powoduje odłożenie na stos m.in. adresu miejsca, z którego wykonany został skok. Powrót za pomocą Return powoduje ściągnięcie tych danych ze stosu. U ciebie nigdzie nie ma powrotu przez Return więc na stosie co chwilę są odkładane jakieś dane. Pamięć RAM, w której znajduje się stos, nie jest z gumy więc po pewnym czasie nastąpi jej przepełnienie co potem prowadzi do takich niekontrolowanych resetów.

    Ten program nadaje się do gruntownej zmiany. A skoro dopiero zaczynasz przygodę z mikrokontrolerami to dobrze ci radzę daj sobie spokój z takimi rozbudowanymi programami i zacznij od czegoś prostszego. A do tego wróć jak nabierzesz choć trochę doświadczenia.

    Pozdrawiam
  • REKLAMA
  • #3 10543078
    roy_
    Poziom 16  
    Jacek232 dziekuje za cenne wskzowki - faktycznie to ta komenda gosub bez return-a to powodowala.
    teraz zamiast gosub wpisalem goto i pomoglo :)

    Wiem ze moze to nie jest program do napisania przez poczatkujacego i napewno pozostawia wiele do zyczenia lecz potrzebowalem takie urzadzenie i ciesze sie ze mi sie udalo
    Pozdrawiam
  • REKLAMA
  • #4 10546569
    SylwekK
    Poziom 32  
    Jeśli mogę delikatnie zasugerować to staraj się zapomnieć o instrukcji GOTO... Uwierz można program napisać bez takiego skoku i zapewniam, że będzie równie czytelny co funkcjonalny.
    Używaj Do..Loop, While..Wend, Select Case i zobaczysz, że da się bez GOTO :)
  • #5 10546664
    jacekk232
    Poziom 17  
    Witam.

    Z Goto działa bo z tego co się orientuje to polecenie nie odkłada na stos adresu powrotu. Ale to i tak nie jest w dobrym stylu i powinno się unikać takich rozwiązań.

    Pozdrawiam
REKLAMA