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

ATmega8 assembler – jak napisać program do przełączania LED przyciskiem (PC0, PD0)

1kizin 20 Sty 2008 16:25 1959 8
REKLAMA
  • #1 4715058
    1kizin
    Poziom 13  
    Posty: 111
    Ocena: 3
    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.
  • REKLAMA
  • #2 4715105
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    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!!
  • #3 4716894
    1kizin
    Poziom 13  
    Posty: 111
    Ocena: 3
    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?
  • REKLAMA
  • #4 4717010
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    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!!
  • REKLAMA
  • #5 4717626
    1kizin
    Poziom 13  
    Posty: 111
    Ocena: 3
    Czyli w 5 punkcie zamiast sbic mam użyć sbrs??

    A jaką junkcję realizuje XOR??
    Chodzi o sumę modulo 2?
  • REKLAMA
  • #6 4717784
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    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!!
  • #7 4718068
    1kizin
    Poziom 13  
    Posty: 111
    Ocena: 3
    Zna ktoś asemblera AVR ?
  • #9 4718343
    1kizin
    Poziom 13  
    Posty: 111
    Ocena: 3
    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

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy napisania programu w asemblerze dla mikrokontrolera ATmega8, który umożliwi sterowanie diodą LED podłączoną do portu PC0 za pomocą jednego przycisku podłączonego do PD0. Problem polegał na tym, że dioda zapalała się tylko podczas przytrzymania przycisku, a po jego zwolnieniu gasła. Zaproponowano rozwiązanie oparte na pętli sprawdzającej stan przycisku i zmianie stanu diody za pomocą operacji XOR, co pozwala na przełączanie diody jednym naciśnięciem przycisku. Omówiono również instrukcje asemblera AVR, takie jak SBIC i SBRS, do detekcji stanu bitów portu, oraz funkcję XOR realizującą sumę modulo 2, która zmienia stan wyjścia diody. Autor ostatecznie potwierdził, że poradził sobie z problemem. Wskazano także źródła wiedzy, takie jak datasheety i strony internetowe poświęcone asemblerowi AVR.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA