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

Obsługa przycisku w assemblerze - ATmega8

1kizin 20 Sty 2008 16:25 1377 8
  • #1 20 Sty 2008 16:25
    1kizin
    Poziom 13  

    Witam

    Dopiero zaczynam się uczyć programowania AVR-ów w Asemblerze
    i mam problem z napisaniem programu gdzie jeden przycisk jest odpowiedzialny za załączenie diody LED i wyłączenie.

    Mam atmege8
    dioda jest podpięta pod PC0
    a przycisk pod PD0

    jak na razie udało mi się tylko napisać takie coś że dioda się zapala ale zaraz po puszczeniu przycisku gaśnie.

    0 8
  • #2 20 Sty 2008 16:38
    Freddie Chopin
    Specjalista - Mikrokontrolery

    gratulacje za podjecie sie pisania w slusznym jezyku [;

    zasadniczo najprosciej byloby to zrobic na przerwaniu.

    niemniej jednak jesli nie na przerwaniu, to tez sie da [; (jak wiadomo w ASM sie wszystko da).

    najprosciej zrobic to tak:

    1. poczatek petli
    2. sprawdz stan przycisku
    3. jesli przycisk puszczony, skocz do 2.
    4. zmien stan diody (np. poprzez XOR)
    5. sprawdz stan przycisku
    6. jesli przycisk nacisniety, skocz do 5
    7. skocz do poczatku petli

    tym sposobem dopuki nie puscisz przycisku, program nic nie zrobi.

    to jedno z rozwiazan, nie przecze, ze istnieja lepsze, to jednak chyba najprostsze.

    0x41 0x56 0x45!!

    0
  • #3 20 Sty 2008 23:21
    1kizin
    Poziom 13  

    Czyli program powinien wyglądać:

    pomijam ustawienie portów

    Czekaj_na_s:
    sbic PIND, PIND0
    rjmp Czekaj_na_s
    ldi R16, 0b00000001
    out PORTC, R16
    SPR:
    sbic PIND, PIND0
    rjmp SPR
    rjmp Czekaj_na_s

    tak?

    0
  • #4 20 Sty 2008 23:57
    Freddie Chopin
    Specjalista - Mikrokontrolery

    nie znam assemblera AVR, ale wydaje mi sie ze cos pokreciles [;

    1. wydaje mi sie, ze twoje sprawdzania nie beda dzialac. czy sbic to instrukcja w stylu 'pomin nastepna instrukcje jesli bit = 1'? jesli tak, to zauwaz, ze najpierw musisz robic 'pomin jesli 1', a pozniej (gdy czekasz na puszczenie) 'pomin gdy 0'
    2. twoj program zapali diode. i tyle. potem bedzie nadal dzialal i nadal zapalal diode. czyli w zasadzie nic ciekawego nie bedzie robil. powinienes wykonywac operacje XOR portu i bitu odpowiadajacego diodzie - dzialanie takie powoduje zmiane obecnego stanu danego bitu.

    0x41 0x56 0x45!!

    0
  • #5 21 Sty 2008 10:29
    1kizin
    Poziom 13  

    Czyli w 5 punkcie zamiast sbic mam użyć sbrs??

    A jaką junkcję realizuje XOR??
    Chodzi o sumę modulo 2?

    0
  • #6 21 Sty 2008 11:28
    Freddie Chopin
    Specjalista - Mikrokontrolery

    XOR - jak sama nazwa wskazuje - realizuje funkcje XOR. dodam od razu, ze nie wiem jakiego mnemonika na AVRa trzeba uzyc, aby takowa funkcje uzyskac, wiec poczytaj datasheeta. dodam, ze nazwa 'suma modulo 2' choc znaczy to samo, nie jest tak oczywista nazwa jak XOR.

    jak juz mowilem - nie znam assemblera AVR, wiec nie wiem jakiej funkcji powinienes uzyc w punkcie 5.

    45% odpowiedzi na pytania na tym forum jest na wikipedii, 45% w datasheetach, tylko 10% to pytania ktore warte sa zadania.

    0x41 0x56 0x45!!

    0
  • #7 21 Sty 2008 13:07
    1kizin
    Poziom 13  

    Zna ktoś asemblera AVR ?

    0
  • #9 21 Sty 2008 14:38
    1kizin
    Poziom 13  

    Przeglądałem już tą stronę programy są całkiem inne ponieważ do zapalania diody jest jeden przycisk, a do gaszenia drugi.
    W drugim programie przycisk jest wykorzystany tylko do zapalania diody i dioda jest gaszona automatycznie po jakimś czasie.

    A mi chodzi o to żebym mógł jednym przyciskiem załączyć diodę i wyłączyć,
    czyli 1 raz naciskam na przycisk i dioda jest załączona,
    2 raz naciskam na przycisk i dioda jest wyłączona.


    Poradziłem sobie już z tym :D

    0