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

Proszę o sprawdzenie poprawności programu (assembler)

raczek3 30 Gru 2008 13:02 2589 21
  • #1 5923273
    raczek3
    Poziom 22  
    Witam, chcę zrobić na procesorku Atmega8 urządzenie działające na zasadzie przekaźnika bistabilnego tzn. po naciśnięciu przycisku podłączonego np. do nogi PC6 procka chcę uzyskać stan wysoki na wyjściu PC5 aż do ponownego naciśnięcia przycisku, i naciśnięcie następnego przycisku załącza stan wysoki na kolejnym wyjściu. Napisałem sobie program ale nie wiem czy dobrze proszę więc o sprawdzenie i jeśli coś jest źle poprawienie go, Oraz proszę o wyrozumiałość bo dopiero się uczę mój 2 program.
     .include "m8def.inc" 
    
     .def temp = R16
    
    rjmp RESET 
    RESET:              
    ldi temp, low(RAMEND)   ;ustawienie wskaźnika stosu 
    out SPL, temp 
    ldi Temp, high (RAMEND) 
    out SPH, temp 
    
    loop: 
    cbi DDRC, DDC6          ;włącz tryb wejściowy lini 6 portu C
    cbi DDRD, DDD0          ;włącz tryb wejsciowy lini 0 portu D
    cbi DDRD, DDD1          ;włącz tryb wejsciowy lini 1 portu D
    cbi DDRD, DDD2          ;włącz tryb wejściowy lini 2 portu D
    sbi DDRC, DDC5          ;włącz tryb wyjściowy lini 5 portu C
    sbi DDRC, DDC4          ;włącz tryb wyjściowy lini 4 portu C
    sbi DDRC, DDC3          ;włącz tryb wyjściowy lini 3 portu C
    sbi DDRC, DDC2          ;włącz tryb wyjściowy lini 2 portu C
    nop                     ;czekaj
    in  temp, PINC          ;odczytaj stan portu C
    nop                          ;czekaj
    in R16, PINC            ;ładuj rejest R16 znacznikami portu C
    in temp, PIND           ;odczytaj stan portu D
    nop                          czekaj
    in R16, PIND            ;ładuj rejestr R16 znacznikami portu D
    out PORTC,R16           ;wyprowadź dane na port C
    rjmp loop               ;skok do początku programu

    Oto kod programu nie wiem czy dobrze wyprowadziłem dane na porty. Proszę jeszcze raz o sprawdzenie i poprawę. Z góry dzięki. Pozdrawiam
  • Pomocny post
    #2 5923525
    _StinG_
    Poziom 14  
    Według mnie nie zadziała:
    Cytat:
    .def temp = R16

    czy to nie czyni, że wszystko co do tempa idzie do R16?

    Poza tym nie do końca rozumiem co chcesz zrobić.

    Inna sprawa, po co za każdym razem definiujesz "kierunki" portów?
  • Pomocny post
    #3 5923556
    mirekk36
    Poziom 42  
    Sorry, że tak wprost ale zapytam - co tam? kto pyta nie błądzi?

    hmmm tak całkiem z pamięci piszesz ten program na zaliczenie ? .... przy okazji - sam nie możesz sprawdzić? choćby skompilować?

    ..... i zobaczyć ile błędziorów kompilator ci wywali? A wystarczyłoby po kolei czytać te błędy i po kolei je poprawiać - więc po co ktoś tu na forum ma to za ciebie poprawiać hmmm? skoro to co napisałeś to stek bzdur nie tylko dla kompilatora.

    zadanie pierwsze spełniłem - sprawdziłem - totalna kicha i widać, że w ogóle nie przykładałeś się do nauki programowania w swoim czasie

    z drugim zadaniem czyli poprawą tego musisz zająć się sam.
  • Pomocny post
    #4 5923560
    d3zerter
    Poziom 12  
    żeby program działał tak jak napisałeś musisz wyeliminować drgania styków przycisku (poprzez np. dodanie opóźnienia) w przeciwnym razie tak na dobrą sprawę będzie loteria (po każdym włączeniu przycisku wyjście się załączy i wyłączy kilka razy i nie wiadomo czy stanie zostanie ostatecznie włączone czy wyłączone).
    Co do ASM to nie jestem w tym biegły.
  • Pomocny post
    #5 5923605
    _StinG_
    Poziom 14  
    d3zerter napisał:
    żeby program działał tak jak napisałeś musisz wyeliminować drgania styków przycisku (poprzez np. dodanie opóźnienia) w przeciwnym razie tak na dobrą sprawę będzie loteria (po każdym włączeniu przycisku wyjście się załączy i wyłączy kilka razy i nie wiadomo czy stanie zostanie ostatecznie włączone czy wyłączone).
    Co do ASM to nie jestem w tym biegły.


    Drugim rozwiązaniem jest kondensator, ale o tym nawet na wiki znajdziesz...
  • Pomocny post
    #6 5923608
    mirekk36
    Poziom 42  
    d3zerter napisał:
    żeby program działał tak jak napisałeś

    to trzeba najpierw napisać program a nie chałkę bananową

    d3zerter napisał:

    musisz wyeliminować drgania styków przycisku (poprzez np. dodanie opóźnienia)
    to wcale nie jest podstawą zadziałania "programu" autora

    d3zerter napisał:

    w przeciwnym razie tak na dobrą sprawę będzie loteria (po każdym włączeniu przycisku wyjście się załączy i wyłączy kilka razy i nie wiadomo czy stanie zostanie ostatecznie włączone czy wyłączone).
    Co do ASM to nie jestem w tym biegły.

    więc może wypada choć troszkę wiedzieć coś w danej dziedzinie - w tym konkretnym przypadku o asm - żeby się jednak wypowiadać hmmm? albo zadać sobie choć odrobine trudu aby jednak próbować przeanalizować to co zostało "napisane" - jak np kolega _StinG_

    Dodano po 6 [minuty]:

    raczek3 -> zakładając, że to jednak nie na zaliczenie to na prawdę - sam to skompiluj i zobacz co się będzie działo.

    po drugie - kierunki portów ustal sobie w części inicjalizacyjnej programu przed pętlą główną - wystarczy tylko raz

    po trzecie - wybierz sobie konkretne piny i tylko ich używaj a nie całych portów niepotrzebnie

    po czwarte w pętli sprawdzaj już spokojnie tylko co się dzieje na jednym z pinów portu, który obsługuje klawisz, sprawdź sobie polecenia sbis albo skoki typu brxx

    po piąte - gdy już wykryjesz że pin zwarty jest do gnd czyli wciśnięto przycisk to dopiero wtedy zmień stan pinu wyjściowego (przekaźnika) na przeciwny

    oczywiście wtedy uwzględnij drgania styków ale na początku możesz się tym aż tak nie przejmować - najpierw doprowadź ciało programu do ładu i porządku
  • #7 5923643
    raczek3
    Poziom 22  
    Mirek 36>> Sprawdzałem kompilatorem i nie wyskoczyły błędy więc czy mógł byś powiedzieć co jest nie tak?
    d3zerter>> wstawiłem po odczycie stanów portów procedurę nop (czekaj) czy to weliminuje drgania?
    _StingG_>> czyli mam usunąć
    Cytat:
    .def temp = R16
    ? Proszę mnie zrozumieć dopiero się uczę (czytam książkę ,,Mikrokontrolery AVR ATmega w praktyce") moglibyście powiedzieć co jeszcze trzeba poprawić? Z góry dzięki, pozdrawiam.

    Dodano po 3 [minuty]:

    Chyba się trochę spóźniłem
  • Pomocny post
    #8 5923687
    mirekk36
    Poziom 42  
    ok sorry może się trochę rozszalałem ale denerwują mnie strasznie kolesie szukający tu zaliczeń.

    Tak więc w asemblerze dobrze jeste przede wszystkim porządnie przygotować sobie strukturę programu:

    początek:

    .cseg						;
    .org 		0				;
    rjmp		RESET			;
    
    .org		INT0addr		;
    reti						;
    .org		INT1addr		;
    reti
    .org		OVF2addr
    reti
    .org		OVF1addr
    reti
    .org		OVF0addr		;
    reti
    .org		URXCaddr		;
    reti						;
    .org		UDREaddr		;
    reti						;
    .org		UTXCaddr		;
    reti
    
    RESET:


    oczywiście nie trzeba tego koniecznie robić jeśli nie używa się przerwań czy skoków itp ale ja zawsze robię - bo program się rozwija a porządek warto trzymać

    potem inicjalizacja stosu i różnych twoich zmiennych , plus w twoim przypadku ustawienie kierunków interesujących cię pinów odpowiednich portów

    potem pętla główna a w niej cykliczne sprawdzanie jak pisałem tego jaki stan jest na wejściu (klawisza) bo normalnie ten pin warto podciągnąć do VCC nawet w sposób tylko programowy

    warto zdefiniować sobie pewne stałe jak np numery pinów które cię interesują za pomocą dyrektywy EQU

    np:

    .EQU   klawisz = 5
    .EQU   przekaznik = 6


    aby później w kodzie odwoływać się wygodniej, np:

    loop:
    
    sbis PINC, klawisz
    rcall Zmien_stan_przekaznika
    
    rjmp loop

    to oczywiście przykład nie uwzględniający drgań styków



    i tak badasz sobie czy jest 0 - jeśli tak to zmieniasz stan pinu (przekaźnika) na przeciwny

    koniec pętli
  • Pomocny post
    #9 5923694
    _StinG_
    Poziom 14  
    Skoro dopiero się zaczynasz uczyć, to ciężkiego kalibru używasz (mam na myśli assemblera)
    Cytat:
    _StingG_>> czyli mam usunąć

    nie prościej w miejsca gdzie temp wpisywać np. R17?

    Poza tym działanie programu wskazuje na robienie wielkiego nica...
  • Pomocny post
    #10 5923754
    d3zerter
    Poziom 12  
    raczek3 napisał:

    d3zerter>> wstawiłem po odczycie stanów portów procedurę nop (czekaj) czy to weliminuje drgania?

    Z tego co pamiętam "nop" trwa jeden takt procesora (około 1us), styki drgają przez parę milisekund, trzeba wstawić jakąś procedurę która by opóźniła trochę bardziej.
  • Pomocny post
    #11 5923767
    mirekk36
    Poziom 42  
    _StinG_ napisał:
    Skoro dopiero się zaczynasz uczyć, to ciężkiego kalibru używasz (mam na myśli assemblera)

    a ja uważam, że to najlepszy pomysł - zaczynać od poznania asemblera.

    Pomimo, że początki są trudne to poznanie podstaw przynajmniej asemblera daje już dużą wiedzę co i jak można robić z prockami. A do większych później projektów czy nawet małych można spokojnie przejść na inny język C albo Bascom do wyboru.

    Jednak docelowo i tak w każdym z wyżej wymienionych języków czasem trzeba zrobić jakieś wstawki asemblerowe - więc czemu nie zaczynać od asemblera właśnie?

    Dodano po 6 [minuty]:

    eliminacja drgań styków szanowni koledzy tak ogólnie polega na tym aby:

    1. odczytać stan portu
    2. odczekać kilkanaście do kilkudziesięciu ale milisekund!
    3. sprawdzić czy po tym czasie stan portu nadal jest taki sam
    4. jeśli jest taki sam to przycisk wciśnięty , jeśli nie to było tylko drganie styków

    natomiast kolego d3zerter ale i autorze tematu - instrukcja nop w asm może być wykorzystywana jako opóźnienie ale absolutnie nie w takim przypadku i nie w taki sposób ! ;)

    nie wiem jak kolega d3zerter wyliczył czas trwania nop w tak uniwersalny sposób iż stwierdził że trwa ono okolo 1us. Akurat w przypadku gdy procek taktowany jest częstotliwością 1MHz to się mu calkiem przypadkiem zgodziło ale jeśli procek taktowany jest już 8MHz to nop trwa już tylko 125ns - a przy większym kwarcu ile ? widzicie panowie tę jasną zależność?

    tak więc policzcie sobie ileż by trzeba było tych nop'ów wpisać aby uzyskać opóźnienie rzędu np 20ms !!! ale tu na szczęście przychodzą nam procedury do opóźnień. Skoro mówisz że czytasz książkę o której wspomniałeś to masz tam (tak się składa) podane przykładowe konstrukcje prostych procedur opóźniających, które w takiej konstrukcji spokojnie się nadają przy zagadnieniu drgań styków
  • Pomocny post
    #12 5923807
    d3zerter
    Poziom 12  
    domyślnie w atmedze8 jest taktowanie 1mhz. T = 1/fosc, a chodziło mi o rząd wielkości.
  • Pomocny post
    #13 5923812
    mirekk36
    Poziom 42  
    d3zerter - no tak wspomniałem o tym, ale nie można tak uniwersalnie komuś podpowiadać, że nop trwa ok 1us bez odniesienia do częstotliwości taktowania jak sam teraz widzisz. Poza tym jak sam też widzisz nie jest to kwestia pamiętania jakichs parametrów procka na pamięć tylko obliczenia. A programując szczegolnie w asm trzeba być mocno "za pan brat" z takimi różnymi przeliczeniami częstotliwości , preskalerów, timerów itp itp
  • Pomocny post
    #14 5923988
    _StinG_
    Poziom 14  
    mirekk36 napisał:
    _StinG_ napisał:
    Skoro dopiero się zaczynasz uczyć, to ciężkiego kalibru używasz (mam na myśli assemblera)

    a ja uważam, że to najlepszy pomysł - zaczynać od poznania asemblera.


    Ja też zaczynałem od assemblera, ale (jeśli miało się do czynienia z innymi językami) to zdecydowanie polecam zacząć od C, z tego względu, że nie trzeba aż tak dobrze rozumieć funkcjonowania całego procka, jak i jego poszczególnych bloków.
    Jednak co muszę przyznać, doje to potem dużo we wszystkich językach (poza bascomem ;p który serdecznie odradzam)
  • Pomocny post
    #15 5924041
    mirekk36
    Poziom 42  
    _StinG_ napisał:

    Jednak co muszę przyznać, doje to potem dużo we wszystkich językach (poza bascomem ;p który serdecznie odradzam)

    jak czegoś nie znasz i nie masz o tym bladego pojęcia to nie odradzaj. W bascomie bardzo fajnie i na szybko pisze się także programy a szczególnie dobrze łączy się go ze wstawkami asemblerowymi - wtedy można sporo a co najważniejsze także szybko z niego wycisnąć. Na prawdę nie warto przez całe życie albo nawet pół mieć klapki na oczach - trzeba się uczyć różnych rzeczy ;)
  • #16 5924451
    raczek3
    Poziom 22  
    Tu jeszcze raz poprawiony ale nadal nie wiem co dopisać do rcall
    :;------------------------------
    ;Przekaźnik           
    ;------------------------------
    
    	.include "m8def.inc"
    
    
    .def temp = R16
    .def przycisk = R17 ;tu parametr dla pętli opóźnienia
    .def przycisk = R18 ;zmienne pomocnicza
    .def przycisk = R19
    ;---------------------------------------------
    ;wektory obsługi przerwań
    ;---------------------------------------------
    .cseg      ;
    .org 0     ;
    rjmp RESET ;po Reset
    reti ;External Interrupt 1
    reti ;T/C1 Capture Event
    reti ;T/C1 Compare Match A
    reti ;T/C1 Compare Match B
    reti ;T/C1 Overflow
    reti ;T/C0 Overflow
    reti ;SPI Transfer Complete
    reti ;UART Rx Complete
    reti ;UART Data Register Empty
    reti ;UART Tx Complete
    reti ;Analog Comparator
    ;-------------------------------------------------
    ;wskaźnik stosu
    ;------------------------------------------------- 
    RESET:              
    ldi temp, low(RAMEND)   ;ustawienie wskaźnika stosu
    out SPL, temp
    ldi Temp, high (RAMEND)
    out SPH, temp
    ;-------------------------------------------------
    ;ustawienie kierunku portów
    ;-------------------------------------------------
    clr temp ;w tym przykładzie wszystkie linie portu D
    out DDRD,temp ;pracują jako wejściowe
    ser temp ;teraz do linii portu D dołączamy rezystory
    out PORTD,temp ;zasilające pull-up (wewnętrzne)
    ;konfiguracja portu C
    out DDRC,temp ;port C jako wyjściowy (temp zawiera $FF)
    out PORTC,temp ;wyprowadzenie stanu wysokiego
    ;-----------------------------------------------------
    ;symboliczne nazwy stałych
    ;-----------------------------------------------------
    
    .EQU klawisz  = 0     ;przypisz linnie 0 portu D do klawisza1
    .EQU wyjscie  = 4     ;przypisz linnie 4 portu C do wyjścia1
    .EQU klawisz2 = 1     ;przypisz linnie 1 portu D do klawisza2
    .EQU wyjscie2 = 3     ;przypisz linnie 3 portu C do wyjścia2
    .EQU klawisz3 = 2     ;przypisz linnie 2 portu D do klawisza3
    .EQU wyjscie3 = 2     ;przypisz linnie 2 portu C do wyjścia3
    .EQU klawisz4 = 3     ;przypisz linnie 3 portu D do klawisza4
    .EQU wyjscie4 = 1     ;przypisz linnie 1 portu C do wyjścia4
    ;-----------------------------------------------------
    ;Pętla programu
    ;-----------------------------------------------------
    
    loop:
    
    sbic PIND,0 ;sprawdzenie stanu bitu 0
    rjmp loop ;instrukcja jest omijana
    ldi przycisk,30 ;parametr dla opóźnienia 30ms
    rcall       ;wywołanie pętli opóźnienia
    sbic PIND,0 ;ponowne sprawdzenie bitu 0 portu D
    rjmp loop ;instrukcja jest omijana
    sbic PIND,1 ;sprawdzenie stanu pitu 1
    rjmp loop ;instrukcja jest omijana
    ldi przycisk,30 ;parametr dla opóźnienia 30ms
    rcall

    proszę o odpowiedź. Pozdrawiam
  • Pomocny post
    #17 5924918
    mirekk36
    Poziom 42  
    rcall - to polecenie skoku do pordprogramu. Trzeba takie podporogramy (procedury) sobie napisać aby potem można było do nich wykonywać skoki np:

    rcall Opoznienie


    czy

    rcall WlaczWylaczPrzekaznik


    ok ale teraz troszkę jakby namieszałeś z tej pętli głównej jeszcze. Bo o ile ładnie podefiniowałeś sobie stałe i rejestry to później z nich w ogóle nie korzystasz, bo piszesz np tak:



    zamiast

    sbic PIND, klawisz


    czyli całość powinna zacząć wyglądać mniej więcej tak:

    loop:
       sbic PIND, klawisz
       rjmp loop
       ldi przycisk, 30
       rcall Opoznienie
       sbic PIND, klawisz
       rjmp loop
    ..... ale tutaj gdy już wiemy, że klawisz jest prawidłowo wciśnięty to mamy zmienić stan przekaźnika tak? a ty znowu zaczynasz badać stan jakiejś lini wejściowej zdaje się klawisz2. Co odbiega od założeń, które przedstawiłeś na początku - nie wiadomo jaki masz układ  - więc sam zobacz jak trudno jest analizować czyjeś poczynania i to jeszcze w oderwaniu od schematu a na dodatek przy zmieniających się założeniach.
    
    ... gdyby więc po sprawdzeniu wciśnięcia klawisza (przy eliminacji drgań - trzeba było zmienić stan przekaźnika to, trza byłoby napisać mniej więcej dalej tak:
    
       rcall ZmianaStanuPrzekaznika
    
       rjmp loop


    ..... w związku z powyższym - stosuj wcięcia bo paskudnie się na to patrzy bez wcięć, sam chyba przyznasz?

    oczywiście dalej za pętlą główną musisz umieścić ciała swoich procedur wywoływanych za pomocą rozkazów rcall, czyli:

    Opoznienie:
    
       ... ciało procedury
    
       ret  // powrót z procedury


    ZmianaStanuPrzekaznika:
    
       ... ciało procedury
    
       ret  // powrót z procedury



    oczywiście teraz musisz napisać ciała procedur - no i na przyszłość trzymaj się swoich stałych skoro je deklarujesz już ładnie.

    trochę tylko wg mnie nieszczęśliwie zrobiłeś sobie definicje nazw dla rejstrów, np:

    .def przycisk = R17 ;tu parametr dla pętli opóźnienia 


    jak już to daj inną nazwę tu niż przycisk albo podaruj sobie narazie stosowanie definiowania nazw rejestrów. Ja akurat prawie nigdy z tego nie korzystałem, choć na początku korciło mnie jako nawyk po programowaniu kiedyś na prockach z rodziny 8051

    Dodano po 4 [minuty]:

    zresztą poczytaj sobie jeszcze to: ;)

    http://www.mimuw.edu.pl/~marpe/mikrokontrolery/w5_klawisze_lcd.pdf
  • #18 5925291
    raczek3
    Poziom 22  
    Napisałem coś takiego:
    
    loop: 
       sbic PIND, klawisz 
       rjmp loop 
       ldi butt, 30 
       rcall Opoznienie 
       sbic PIND, klawisz 
       rjmp loop 
       
       rcall ZmianaStanuPrzekaznika
       rjmp loop
       
       sbic PIND, klawisz2
       rjmp loop
       ldi butt, 30
       rcall Opoznienie
       sbic PIND, klawisz2
       rjmp loop
    
       rcall ZmianaStanuPrzekaznika
       rjmp loop
       
       sbic PIND, klawisz3
       rjmp loop
       ldi butt, 30
       rcall Opoznienie
       sbic  PIND, klawisz3
       rjmp loop
    
       rcall ZmianaStanuPrzekaznika
       rjmp loop
       
       sbic PIND, klawisz4
       rjmp loop
       ldi butt, 30
       rcall Opoznienie
       sbic PIND, klawisz4
       rjmp loop
    
       rcall ZmianaStanuPrzekaznika
       rjmp loop
    
    
    
       Opoznienie: 
    
       ret  // powrót z procedury
    
    ZmianaStanuPrzekaznika: 
    
       ret  // powrót z procedury
    

    i czy po każdej zmianie stanu przekaznika trzeba wysyłać odczytane dane na wyjście, czy można wysłać raz już po sprawdzeniu stanów na wszystkich przyciskach?
    I czy do wysłania stanów wysokich/niskich na wyjścia można uzyć instrukcji np.:
     out PINC, wyjscie
     out PINC, wyjscie1
    itd.
    Czy jakiejś innej?
  • Pomocny post
    #19 5926041
    asembler
    Poziom 32  
    Super !!!!
  • #20 5926342
    raczek3
    Poziom 22  
    Witam czyli dobrze napisałem? Ale czy można wysłać wszystkie na raz czy po każdej zmianie stanu trzeba wysyłać? Jak to dokończę to zostaję tylko zapętlić i programować? Tak? Dzięki i pozdrawiam
  • #21 5927386
    raczek3
    Poziom 22  
    Chyba jednak nie jest super bo jak to napisałem i sprawdziłem to były błędy więc jak to wysłać na wyjścia?

    Dodano po 1 [godziny] 24 [minuty]:

    Pomóżcie, bo ja już nie mam pomysłu jak to wysłać.

    Dodano po 1 [godziny] 23 [minuty]:

    Proszę pomóżcie, bo już sobie zrobiłem wszystko tylko dokończyć ten program i zaprogramować procka, a ja naprawdę nie wiem już jak to wysłać na wyjścia, chociaż powiedzcie jakiej instrukcji użyć. Pomożecie?

    P.S Mirekk36>> Nie robię tego na żadne zaliczenie bo chodzę do gimnazjum. I dzięki za tak dużą pomoc ale proszę o odpowiedź jeszcze na ten problem. Pozdrawiam
  • Pomocny post
    #22 5928014
    mirekk36
    Poziom 42  
    Witam,

    nie było mnie. Poza tym już wcześniej się przekonałem, że nie robisz tego na żadne zaliczenie i dlatego nieco pomogłem ale wybacz nie mam aż tyle czasu aby z tobą krok po kroczku pisać cały program, tym bardziej, że jeszcze raz powtórzę, iż miałeś proste założenia że jeden klawisz i jeden przekaźnik a ty z uporem wciskasz obsługę kolejnych klawiszy i robisz kolejne nieoczekiwane błędy.

    Jak się chcesz czegoś kolego nauczyć to zrób najpierw jakiś podstawowy najprostszy program a nie kombinujesz, bo tak to się szybko zniechęcisz i dasz sobie spokój.

    Poza tym podałem ci link do fajnego PDF'a - możesz tam się sporo dowiedzieć jeśli chodzi o twoje obecne potrzeby.

    Poaza tym jeśli masz tę książkę o której mówiłeś to masz tam jak na dłoni pokazanych wiele tego typu przykładów itp a ty sprawiasz wrażenie jakbyś miał wszystko gdzieś i nawet książki nie chce ci się poczytać. To myślisz, że tego nie widać w twoich dalszych poczynaniach??? dlatego też innym nie chce się pomagać nie tylko mi.

    Ostatnia moja próba pomocy.

    1. wywal z tego swojego programu obsługę innych klawiszy niż ten jeden o którym mówiliśmy (bo i tak nie mają one szansy zadziałać w tak napisanym przec ciebie teraz programie - żadnej)

    2. coś ty dał za podprogramy ???? mówię o tym o nazwie Opoznienie czy ZmianaStanuPrzekaznika ????? wstawiłeś puste procedury ?????? na prawdę chyba w ogóle nie czytasz tej książki albo tylko białe a nie czarne.
    przecież - trzeba napisać kod w tych procedurach - tam gdzie miałeś wpis ....ciało procedury (a ty sobie wywaliłeś tan wpis - no i szczęśliwy jesteś bo masz dwie nic nie robiące procedury!

    3. Coś ty się uparł żeby po jakiejś każdej zmianie stanu przekaźnika wysyłać jakieś odczytane dane na wyjścia!

    człowieku to że przy okazji sprawdzania stanu klawisza badasz stan wejściowy portu (jednego pinu) nie ma NIC WSPÓLNEGO w tym przypadku z wysyłaniem tych (jakichś wydumanych twoich danych) na jakiejś tam wyjście. Po prostu dzięki temu, że programowo sprawdzasz jaki jest stan to w programie możesz określić czy przycisk został wciśnięty czy nie ??? kapujesz???

    a jeśli już wiesz że został wciśnięty (bo miałeś stan niski na wejściu klawisza) to możesz podjąć dalsze działania w programie. I tym dalszym działaniem jest zmiana stanu na wyjściu pinu sterującego przekaźnikiem.

    Można to zrobić na wiele sposobów, można użyć wielu poleceń ale OUT wpisuje jakąś wartość z jakiegoś rejstru do całego portu a nie tylko na ten jeden interesujący cię pin. Nie będę teraz tłumaczył jak to sprawnie zrobić za pomocą OUT bo się całkiem zakałapućkasz

    możesz to zrobić za pomocą znowu poleceń sbis oraz sbic aby sprawdzić jaki stan na tym pinie panuje a następnie za pomocą operacji XOR zmienić go na przeciwny poprzez polecenia sbi lub cbi. Czyli w tej operacji musi brać jeszcze udział jakiś rejestr(y) pośredni. Ale nie będę tego już tutaj ci rozpisywał w postaci gotowca - weź sobie poszukaj w necie i książce podobnych rozwiązań bo w samej książce masz ich bez liku !!!!

    No i napisz tę procedurę opóźniającą !!! bo bo bez niej (przy obecnej bzdurnej konstrukcji) możesz zapomnieć o eliminacji drgań styków i możesz ją w ogóle pominąć i nie wiem czy dla ciebie to nie byłoby zdrowsze

    a zamiast przekaźnika podłącz sobie diodę LED i próbuj na początku jeszcze prostszymi programami ją wysterować - zapalić zgasić - nawet bez udziału klawisza to szybciej zaczniesz łapać to wszystko i po kolei
REKLAMA