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 - prosty programik, który na Mega8 działa a na Tiny13 nie bardzo :(

Daniel_GSM 07 Paź 2014 13:33 807 1
  • #1 07 Paź 2014 13:33
    Daniel_GSM
    Poziom 25  

    Witam,

    Programik, który wklejam poniżej idealnie funkcjonuje na ATmega8 a na Tiny13 już nie...
    Może ktoś mi podpowie dlaczego? Siedzę na tym już trochę i nie wiem co jest grane.

    Jakie zadanie ma poniższy projekt.
    Po naciśnięciu przycisku zmienia stan przekaźnika na załączony lub wyłączony w zależności od tego jaki był poprzednio.
    Dodatkowo zmienia kolor dwukolorowej diody LED - czerwony PK wyłączony a zielony PK załączony.
    Dodatkowo w przypadku kiedy do pinu PB4 podamy jedynkę przez dzielnik zapalają się równocześnie dwie diody dając pomarańczową barwę.
    I najważniejsze o co chodziło w tym projekcie to to, aby po zaniku zasilania stan w jakim pozostawiono PK był zapamiętywany - w pamięci eeprom.

    Wklejam listing z Bascom i schemat całości:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod



    Bascom - prosty programik, który na Mega8 działa a na Tiny13 nie bardzo :(

    FuseBity mam ustawione w taki sposób:

    Bascom - prosty programik, który na Mega8 działa a na Tiny13 nie bardzo :(

    0 1
  • #2 07 Paź 2014 16:47
    emarcus
    Poziom 35  

    Daniel_GSM napisał:
    Witam,

    Programik, który wklejam poniżej idealnie funkcjonuje na ATmega8...


    Wcale w to nie wierzę...
    Wg schematu, - wielokolorowa dioda jest w wersji ' z WSPÓLNĄ ANODĄ (CA)', którą to podłączyłeś do GND. Ta dioda nigdy nie zaświeci niezaleznie jaki potencjał będzie na jej pozostałych elektrodach.

    Odnośnie programu... (najlepszy przykład jak nie nalezy pisac programu)
    Popatrz na ten fragment:
    Cytat:

    Obsluga_przycisku:
    Debounce Pinb.3 , 0 , Obsluga_przycisku_s1 , Sub

    If Pinb.3 = 1 Then Przycisk = 0
    Return


    Za każdym przewinięciem pętli (trzeba czy nie trzeba), program odwiedza tą subrutynę
    W aliasach podałeś że 'Przycisk' to jest Pinb.3, który wcześniej skonfigurowałeś jako wejście'.
    Stan logiczny wejścia nie może byc edytowany z poziomu programu. Wejście może byc tylko czytane przez processor a zmianę jego stanu logicznego wywołujesz TY , zwierają kontakty przycisku.
    Popatrz jeszcze na sam przycisk i wejście do którego jest on podłączony....
    Jaki stan logiczny jest na wejściu podczas gdy przycisk jest rozwarty?
    - na pewno nie ZERO!!!! (miernik może pokazywac 0 Voltów co nie znaczy że jest to 'logiczne ZERO').

    Wejście processora musi miec jednoznacznie określony stan logiczny!!!
    Pozostawienie pinu wejściowego w stanie wysokiej inpedancji może powodowac przypadkowe odczyty jego stanu jako wysoki i uruchamiac dalsze procedury przewidziane programem.
    Jeżeli sterujesz wejście stanem wysokim to wymagane jest aby jego stan spoczynkowy był niski czyli GND. Ponieważ AVR nie ma automatycznego podciągania do GND to musiałbyś to zrobic zewnętrznym rezystorem.
    Alternatywnie, możesz odwrócic sterowanie wejścia niskim poziomem i stosowac wewnętrzny rezystor podciągający do Vcc.

    Ponieważ cały program jest krótki i pętla główna Do/ Loop' przewija się' często, z której masz skok do drugiej subrutyny "Przelaczanie:" a tam przy każdym naciśnięciu przycisku figuruje wpis zmiennej do EEprom.
    Eprom ma ograniczoną ilośc wpisów, zatem nie zbyt długo cały uC będzie użyteczny.

    Cytat:

    FuseBity mam ustawione w taki sposób
    ............:


    Dla tego typu programu jak mruganie diodą lub załączanie przekaźnika, pomiar temperatury przy wykorzystaniu ADC lub 1-wire itp, oraz gdzie nie jest użyty timer a uplyw czasu jest odmierzany prez processor (Wait, Waitms) częstotliwośc taktowania (fuse bity) nie ma większego znaczenia.

    e marcus

    0