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

[ATmega8][Bascom] Led nie zaświeca się - Timer0

MICHAŁ6201 02 Cze 2013 00:44 3147 19
  • #1 02 Cze 2013 00:44
    MICHAŁ6201
    Poziom 16  

    Witam
    Jestem początkujacy w pisaniu programów. Do tej pory nie miałem do czynienia z pisaniem, ale chciałem się nauczyć i zacząłem próby w bascom avr.

    Zakupiłem książkę Pana Góreckiego, miała być dla początkujących i same podstawy, niestety nie rozumiem wielu wątków omawianych przez autora, a zwłaszcza sposobu działania itd.

    Szukałem już w googlach i na elektrodzie i nie znalazłem odpowiedzi na mój problem. Proszę o wyjaśnienie mi mojego problemu łopatologicznie.

    Pierwsza rzecz to nie rozumiem co to znaczy "Dim Liczniczek As Byte" co to jest i co zamiast tego trzeba wpisywać w kodzie i do czego to służy? Nie znalazłem na to odpowiedzi w książce Pana Góreckiego.

    Druga rzecz - napisałem programik polegający na: jeśli na pinc.0 pojawi się stan niski to zaświeci się led na porcieD.1 i będzie się świecić póki będzie stan niski na pinieC.0. Jeśli na pinie C.0 pojawi się stan wysoki, to led zgaśnie. I to działa:)

    Chciałem zmodyfikować ten program tak aby dopiero po 5 sekundach od pojawienia się na pinie C.0 stanu niskiego zapalała się led. Użyłem do tego słowa "Wait" ale nie jest precyzyjne i czasami dłużej trwa zaświecenia a czasami krócej i dowiedziałem się na elektrodzie że tego typu rozwiązań się nie stosuje i trzeba użyć timer0.

    Korzystając z informacji w książce Pana Góreckiego i M. Wiązania dopisałem w kodzie ten timer0 i nie działa. Przyznam się szczerze że nie rozumiem bardzo na czym polega ten timer0 mimo że czytałem 3 razy te fragmenty książek.

    Oto mój kod:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Proszę o wyjaśnienie tylko tak na (chłopski rozum)
    Pozdrawiam
    Poprawiłem temat na zgodny z regulaminem p. 3.1.15 oraz składnię.
    LordBlick

    0 19
  • Mitronik
  • #2 02 Cze 2013 06:13
    Mol
    Poziom 30  

    Zacznij od tej instrukcji $crystal = xxxxxxx , bo jak chcesz zliczać czas to musisz znać częstotliwość , z jaką pracuje twój procesor. Wartość $crystal = 8000000 oznacza taktowanie częstotliwością 8MHz.

    0
  • #3 02 Cze 2013 12:19
    MICHAŁ6201
    Poziom 16  

    OK.
    Czyli muszę ustawić zewnętrzny oscylator do tego tak? Bo nie mogę wpisać takiej częstotliwości i będzie taktowany oscylatorem wewnętrznym?

    I jeszcze jedno pytanie mam, na które znów nie ma odpowiedzi w tej niby dla początkujących książce:

    Napisałem malutki programik do wyświetlania napisu na lcd idział. Napisałem też ten drugi programik do świecenia led i też działa. Ale łącząc je razem do jednego kodu już to nie działa, ani wyświetlacz ani led nie świeci po pojawieniu się stanu niskiego na pinie. Jak to się robi? To trzeba zrobić jako główny program wyświetlacz i przejście do podprogramu zaświecania led jeśli pojawi się stan niski na pinie?

    Coś znalazłem w tej książce o komendzie Gosub, ale nie wiem jak to się stosuje bo w tej książce autor zapomniał wyjaśnić.

    0
  • #4 02 Cze 2013 12:48
    yokoon
    Poziom 28  

    Jeżeli nie zmieniałeś fuse bitów to fabrycznie jest ustawiony na 1MHz wewnętrzny oscylator, czyli powinieneś dopisać do programu $crystal = 1 000000.
    Nie musi być zewnętrzny.

    Gosub xxx skok do danej etykiety.

    0
  • #5 02 Cze 2013 13:48
    MICHAŁ6201
    Poziom 16  

    Zakładam, że będzie tylko wewnętrzny oscylator czyli 1MHz. Nie mieszam z fusami i zmianą częstotliwości bo nie mam o tym pojęcia.

    Powiedz mi jeszcze jak się liczy ten timer żeby liczył np. 5 sekund od jakiegoś zdarzenia np. pojawienia się stanu niskiego na pinie i po odliczeniu tych 5 sekund żeby wywołał jakieś inne zdarzenie np. włączenie led. Nie rozumiem tego i nie potrafię sobie tego jakoś tak obrazowo wytłumaczyć.

    Co trzeba wpisać dla Prescale i co trzeba wpisać dla Load timer?

    0
  • #6 02 Cze 2013 14:58
    yokoon
    Poziom 28  

    Wspominałeś o książkach, więc w książce Pana Wiązani "Programowanie mikrokontrolerów AVR w j.BASCOM" na str.159 jest przykład odmierzania 1 sekundy.

    0
  • Pomocny post
    #7 02 Cze 2013 16:56
    Mol
    Poziom 30  

    Ściągnij sobie z tej strony program kalkulator avr
    http://www.elportal.pl/index.php?module=ContentExpress&func=display&ceid=69

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Nie wiem czy będzie działać , bo nie mam na czym przetestować. Teoretycznie jak pinc.0 = 0 to po 5-ciu sekundach powinno zapalić diodę na portd.1 , a jak pinc.1 = 0 to powinno ją zgasić. Musisz tylko dopisać linijki z konfiguracją pinów i na początku podać typ procesora.

    0
  • Mitronik
  • #8 02 Cze 2013 20:06
    MICHAŁ6201
    Poziom 16  

    yokoon napisał:
    Wspominałeś o książkach, więc w książce Pana Wiązani "Programowanie mikrokontrolerów AVR w j.BASCOM" na str.159 jest przykład odmierzania 1 sekundy.


    Wiem, bo spisywałem ten kod i nie działał u mnie w moim kodzie. Mało tego to nie rozumiem tak jak już pisałem wcześniej o co chodzi z tym timerem, na jakiej zasadzie to działa.

    Ktoś nawet do moderatora zgłosił ten temat, że zaniżyłem poziom forum pytając o to. Nie zgadzam się z tym, ponieważ nie oczekuję tu od nikogo napisania mi gotowca tylko chcę sam nauczyć się, a do tego niezbędna jest mi pomoc ludzi znających się na tym. Po to jest forum żeby pytać jak się czegoś nie wie i oczekiwać pomocy. Zwłaszcza że to dział dla początkujących. Jestem na tyle początkujący że nie rozumiem języka technicznego jakiego używa Pan Górecki w swojej książce.

    Mam pytanie - czy kod obsługujacy wyświetlanie napisu na wyświetlaczu i sprawdzanie stanu na jednym pinie i jeśli pojawi się stan niski na tym pinie zaświeci led, może być jako jeden kod, a czy musi być tu jakiś podprogram?

    0
  • Pomocny post
    #9 02 Cze 2013 20:34
    Ciołek30
    Poziom 9  

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Tak na szybko,... nie testowany.
    Zrobić możesz wszystko, z podprogramów korzystasz by np. odwołać się w różnych częściach kodu do jakiegoś fragmentu kodu by go nie powtarzać, mniej lini = więcej wolnej pamięci.

    0
  • #10 08 Cze 2013 21:31
    MICHAŁ6201
    Poziom 16  

    Udało mi się odpalić program z książki Pana Wiązani, ale tam timet odmierza 1s
    A jak zrobić żeby odmierzał np 10 sekund?

    Zmiana preskalera wydłużyła max do 2sekund czas.

    Jak to przeliczyć? Jest jakiś na to wzór?

    0
  • Pomocny post
    #11 09 Cze 2013 06:19
    emarcus
    Poziom 35  

    MICHAŁ6201 napisał:
    Udało mi się odpalić program z książki Pana Wiązani, ale tam timet odmierza 1s


    Jak to przeliczyć? Jest jakiś na to wzór?


    Rzeczywiście musiało się 'udac odpalić' bo ten program nie jest pozbawiony błędów (!)
    \
    Cytat:

    A jak zrobić żeby odmierzał np 10 sekund?
    Zmiana preskalera wydłużyła max do 2sekund czas.


    Aby timer1 odmierzył inne/dowolne interwały czasu, należy przede wszystkim zapoznac się z jego budową i funkcjonalnościa.
    Jest absolutnie nieprawdą że zmiana prescalera pozwala na odmierzenie czasu "max do 2sekund".
    Poniżej fot. przedstawia że ten czas może byc o wiele dłuższy: -ponad 67 sec. wykorzystując timer1 oraz prescaler 1024.

    [ATmega8][Bascom] Led nie zaświeca się - Timer0


    Cytat:

    Jak to przeliczyć? Jest jakiś na to wzór?

    W zasadzie nie jest konieczny żaden wzór. Wystarczy troche logicznego pomyślunku i przeliczenia częstotliwości taktowania processora/prescalera (jest ta sama) na czas trwania impulsu, obliczyc ilosc potrzebnych impulsów odmierzonych przez timer/counter. Tu należy pamiętac że timer to w zasadzie counter (licznik impulsów), którego funkcjonalnośc zmienia sie na timer jeżeli te impulsy mają charakter cykliczny i występują w znanych odstępach czasu. Inaczej to urządzenie pozostaje jako 'counter' i w takiej formie jest często wykorzystywane do zlicznia impulsów zewnętrznch niezależnie jak często występują.

    Jest wiele dostępnych na różnych web, darmowych calculatorów dla timerów mniej lub więcej universalnych, z których najbardziej praktyczny wydaje sie byc ten wyżej przedstawiony.
    Link do dnl. znajdziesz tu:
    http://mail.planet-ian.com/bascom/avrtimerbeta.zip
    Ten calculator nie tylko pozwala poprawnie dobrac parę parametrów (prescaler oraz preset timera) ale także edtuje fragment przykładowego kodu dla srodowiska Bascom, klikając na wybrane okno z odpowiednimi parametrami jak niżej.
    Wymaga troche praktyki.

    [ATmega8][Bascom] Led nie zaświeca się - Timer0

    e marcus

    0
  • #12 09 Cze 2013 13:22
    MICHAŁ6201
    Poziom 16  

    Dzięki za kalkulator i wyjaśnienie

    Napisałem kod z timer1 do odmierzania odcinków czasu po 10 sekund. 10 sekund świeci led i następne 10 sekund nie świeci i tak w kółko.

    Oto kod:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Niestety led cały czas świeci. Przypuszczam że timer nie działa. Jaki błąd popełniłem w tym kodzie?

    Napisałem jeszcze tak:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Ale taki sam efekt. Przecież początkowa wartość licznika to 55771, końcowa 65536. Po 9765 krokach ma się przepełnić. Pogubiłem się już...

    0
  • #13 09 Cze 2013 22:06
    matekogon
    Poziom 22  

    Kolego po co ci timer1 zrób odmierzanie na timerze0


    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    to tak na szybkiego

    co do Dim liczniczek as byte oznacza to że zmienna liczniczek może przyjąć wartość od 0-255

    0
  • #14 09 Cze 2013 22:41
    emarcus
    Poziom 35  

    MICHAŁ6201 napisał:
    Dzięki za kalkulator i wyjaśnienie

    Napisałem kod z timer1 do odmierzania odcinków czasu po 10 sekund. 10 sekund świeci led i następne 10 sekund nie świeci i tak w kółko.

    Oto kod:
    ......................
    Jaki błąd popełniłem w tym kodzie?
    ............
    Ale taki sam efekt. Przecież początkowa wartość licznika to 55771, końcowa 65536. Po 9765 krokach ma się przepełnić. Pogubiłem się już...


    W zasadzie cały code został poprawnie wygenerowany przez 'Timer calculator'.
    oto on:

    [code]
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Porównaj ten code ze swoim i znajdziesz błędy o które pytałeś.

    Jest to najprostszy tryb pracy timera, jednak wymagający 'pomocy' processora dla "reload" wstępnej zawartości timera w każdym jego cyklu pracy, licząc impulsy od tej wartości aż do jego pełnego zakresu.

    Bardziej ekonomiczny jest tryb CTC (Clear Timer on Compare) nie wymagający ciągłej 'interwencji' processora. Ten tryb wymaga nieco więcej parametrów ustawień w konfiguracj. Wszystko jest dośc przystępnie opisane w Datasheet dla każdego processora. Nie każdy timer w Mega8 obsługuje ten tryb(!)....

    Na koniec jeszcze jedna uwaga:
    W Bascom istnieją dwie równoważne metody wpisu początkowej zawartości timera:
    Jedna np:
    Timer1 = 55771
    oraz druga:
    Load timer1, 9765 ' gdzie: 65536 -55771 = 9765
    Nie należy mieszac formy zapisu w tych dwóch metodach.

    e marcus

    0
  • #15 10 Cze 2013 01:24
    MICHAŁ6201
    Poziom 16  

    Kod od Kolegi matekogon nie działa. Cały czas świeci led. Ano dlatego że podobno się nie da zrobić dłuższego czasu na timer0 niż 1 sekunda. A mi nie potrzebna jest jedna sekunda tylko dłuższy czas.

    Zrobiłem na wzór tego kodu, który mi podałeś i też nie działa:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Pewnie błąd zrobiłem w tym kawałku po timer1_isr: ale tak to właśnie zrozumiałem z książki Pana Wiązani.
    Szkoda że nie ma literatury, z której można się nauczyć krok po kroku co jak się pisze od podstaw.

    A jeśli np chciałbym żeby led zaświeciła się np. po czasie 10 sekund od pojawienia się na np. pinie b.0 stanu niskiego i świeciła aż na pinie b.0 pojawi się znów stan wysoki, to też takie jednorazowe liczenie 10ciu sekund zrobię na timerze?

    0
  • #16 10 Cze 2013 03:58
    emarcus
    Poziom 35  

    MICHAŁ6201 napisał:
    .

    Zrobiłem na wzór tego kodu, który mi podałeś i też nie działa:






    Nie musiałeś nic przerabiac ani dodawac. To był cały poprawny code na twjój wymóg " Toggle Portd.0 " co 10 sec. Wystarczyło go przecopiowac do Bascom, dokonac compilacji i wpisac plik *.hex do processora.
    Cytat:

    Pewnie błąd zrobiłem w tym kawałku po timer1_isr: ale tak to właśnie zrozumiałem z książki Pana Wiązani.
    Szkoda że nie ma literatury, z której można się nauczyć krok po kroku co jak się pisze od podstaw.

    Tam zrobiłeś kilka zasadniczych błedów o czym pisałem wcześniej.
    Odnośnie literatury:
    Jeżeli dysponujesz ksiązką wydaną przez M. Wiązani oraz "Ośla łączka" P. Góreckiego to masz dostateczne źródła do poprawnej nauki i zrozumienia pracy microcontrollerów "OD PODSTAW". Obydwa wydania sa zorientowane pod język Basic na którym pracuje compiler Bascom. Jeżeli nie jesteś w stanie zrozumiec jednego lub drugiego textu, pisanego w wyjątkowo przystępnej formie to nie sądze abyś coś osiągnął szukając innych żródeł lub innego języka np. C. Tam też musisz znac budowe uControllerów oraz zasady funkcjonwania i konfiguracji urządzeń peryferyjnych.


    Cytat:


    A jeśli np chciałbym żeby led zaświeciła się np. po czasie 10 sekund od pojawienia się na np. pinie b.0 stanu niskiego i świeciła aż na pinie b.0 pojawi się znów stan wysoki, to też takie jednorazowe liczenie 10ciu sekund zrobię na timerze?


    Tak, wtedy Pinb.0 musiałby byc skonfigurowany jako input i użyjesz instrukcji warunkowej, albo instrukcji "debounce" dla wejścia pinb.0, oraz wyjście zamiast 'toggle' musiałbyś określic konkretny wymagany stan logiczny na każdą okolicznośc.

    P.s. Timer0 również nadaje się do odmierzania dowolnie długich czasów.
    Podobnie jak wskazówka sekundowa u twojego zegarka ma możliwośc odmierzenia tylko 60 sec/obr. a mierzysz czasy dłuższe.... - posługujesz się dodatkowymi wskazówkami.
    Przy wykorzystaniu timera0 posługujesz się dodatkową zmienną zliczającą te krótkie odcinki czasu odmierzane przez Timer0, które w sumie dają te twoje 10 sec.

    e marcus

    0
  • #17 10 Cze 2013 09:39
    MICHAŁ6201
    Poziom 16  

    To źle w takim razie zrozumiałem Twój poprzedni post. Jednocześnie proszę o wyrozumiałość, ponieważ nigdy do tąd nie miałem doczynienia z pisaniem jakicholwiek programów, więc wszystko co czytam na ten temat jest dla mnie nowością. Za C nawet się nie biorę. Bascom wydał mi się najłatwiejszy do opanowania i dlatego zaopatrzyłem się w książkę Góreckiego i Wiązani. Mma dobre chęci, chcę się czegoś nowego nauczyć i padło na bascoma.
    Później przepisze jeszcze raz ten kod od Ciebie bez zmian i dalej będę się tym bawił:)

    0
  • #19 10 Cze 2013 12:04
    MICHAŁ6201
    Poziom 16  

    Raczej odpuszczę sobie narazie C, ponieważ składnia tego jezyka jest w zupeności niezrozumiała dla mnie. Wcześniej nie miałem w ogóle styczności z pisaniem jakichkolwiek programów. Matematykę miałem prawie 15lat temu w ogólniaku i też orłem z tego przedmiotu nie byłem, więc nie chcę porywać się z motyką na księżyc.

    0
  • #20 10 Cze 2013 13:08
    piotrva
    Moderator na urlopie...

    Też tak mówiłem zanim zacząłem kodować w C, ale gwarantuję Ci, że gdy dotrzesz do pierwszej zagwozdki pt. "Bascom robi to inaczej niż zapisano w instrukcjach" to czas się zwróci.
    Ja pisząc poradniki do Bascoma nieraz parę godzin spędzałem nad odnalezieniem przyczyny błędu, która leżała w samym kompilatorze a nie moim programie.
    Zrobisz jak będziesz chciał, ale moim zdaniem skoro zaczynasz to nie ma sensu iść w ślepą uliczkę...

    0