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.

Budowa przełączników sterowana procesorem PIC.

POMOCRTV 14 Sty 2010 22:34 1632 8
  • #1 14 Sty 2010 22:34
    POMOCRTV
    Poziom 15  

    Potrzebuje zbudować prosty układ na procesorze PIC16F628A, który będzie sterował dwoma przyciskami chwilowymi (mikrostykami). Przyciśnięcie chwilowe klawisza ma podtrzymywać stan wysoki na wyjściu procesora aż do kolejnego wciśnięcia przycisku.
    Procesor ma sterować niezależnie dwoma przyciskami.
    Po włączeniu zasilania na wyjściach powinien być stan niski, dopiero wciśnięcie klawisza zmienia stan na wyjściu.
    Męczę się z tym układem kilka dni i niestety nie daje rady :(
    Zbudowałem płytkę testową nawet znalazłem gotowy program napisany w assemblerze, który mi działa tyle że obsługuje jeden przycisk i nie umiem go przebudować.
    Wolał bym żeby program był napisany w języku C, tyle że nie mam doświadczenia w programowaniu procesorów niedawno rozpoczełem zabawę z tymi procesorami.
    Prosił bym o pomoc w napisaniu programu może być w C lub assemblerze byle było na procesor PIC16F628.

    0 8
  • #3 15 Sty 2010 09:58
    POMOCRTV
    Poziom 15  

    Dołączam schemat mojego projektu narazie steruje diodami potem podłącze pod wyścia przekaźniki. Urządzenie ma działać w samochodzie wiec zastosowałem program z eliminacją drgań styków podczas wciskania klawisza, jak coś to dorzuce ten troche prostszy program bez procedury drgań styków.
    Ważne jest dla mnie tylko żeby po załączeniu zasilania był stan niski na wyjściach procesora i klawisze sterowały niezależnie. Program zaczerpnełem z książki Stanisława Pietraszka "Mikroprocesory jednoukładowe PIC"

    0
  • Pomocny post
    #4 15 Sty 2010 23:02
    adamwesola
    Poziom 24  

    Niedawno zbudowałem timerek w którym stan przycisków sprawdzam tak :

    call sprawdz ;sprawdzaj stan przyciskow
    --------------
    -------------
    -------------


    sprawdz call spr_s1
    call spr_s2
    return
    ;----------------------
    spr_s1 btfsc PORTB,4 ; wcisniety ?
    return ; nie
    btfsc PORTB,4 ; puszczony
    goto $-1 ; nie
    -------------- ; tak, puszczony
    -------------
    -------------
    return
    ;----------------------
    spr_s2 btfsc PORTB,5 ; wcisniety ?
    return ; nie
    btfsc PORTB,5 ; puszczony
    goto $-1 ; nie
    -------------- ; tak, puszczony
    -------------
    -------------
    return

    Nie potrzeba do tego przerwań ani eliminacji drgań styków, zapewniam bo układ zmontowałem i działa bez pudła.
    Jeśli już przycisk wciśniesz to program czeka na jego zwolnienie, inaczej się nie ruszy z miejsca.

    0
  • #5 16 Sty 2010 00:23
    POMOCRTV
    Poziom 15  

    Dziękuje za wszelkie wskazówki, ale nie udało mi się jeszcze uruchomić tego programu :(
    Chyba wskoczyłem za szybko na głęboką wodę, będę musiał pomęczyć kilka książek żeby dojść do czegoś.
    Próbowałem uruchomić ten program co napisałeś, ale coś nie wyszło mi uzupełnienie brakujących linijek programu (nie zadziałał mi) :( choć widzę że na pewno jest o wiele lepszy i mniej skomplikowany od tego co miałem napisanego z tej książki.

    0
  • #6 16 Sty 2010 22:00
    kwito
    Poziom 11  

    adamwesola napisał:

    ;----------------------
    spr_s1 btfsc PORTB,4 ; wcisniety ?
    return ; nie
    btfsc PORTB,4 ; puszczony
    goto $-1 ; nie
    -------------- ; tak, puszczony
    -------------
    -------------
    return
    ;----------------------

    Rozumiem, że program ma po wykryciu naciśnięcia przycisku czekać na jego puszczenie i przycisk zwiera wejście do masy, więc czy za drugim razem nie powinno być btfss?

    0
  • #7 16 Sty 2010 23:33
    adamwesola
    Poziom 24  

    Tak, masz słuszność. Okroiłem oryginalny fragment ze swojego programu w którym jest:

    Code:
          btfsc   lin_1m
    
           return   
          bcf      INTCON,T0IE   ; przerwanie wylaczone
          btfsc   lin_1m
          goto   $+3
          call   wysw   
          goto   $-3

    W czasie trzymania przycisku, by działało wyświetlanie, wykonywany jest skok do podprogramu wyświetlania.
    Tu , doradzając koledze przeoczyłem ze należy ją zmienić na BTFSS

    0
  • #8 17 Sty 2010 15:46
    POMOCRTV
    Poziom 15  

    Nadal męczę się z tym niby prostym programem i coś nie daje rady.
    Nie mogę poradzić sobie tylko z negacją stanu drugiego przycisku, pierwszy przycisk działa już prawidłowo. Z tego co zauważyłem to pętle programu działają poprawnie bo jak dam polecenie zapal diodę po wciśnięciu przycisku 2 to ją zapali jak wcisnę tyle że już nie zgaszę jej :(
    Prosił bym o jeszcze jakąś wskazówkę gdzie robię błąd poniżej ten program:

    ;program zapala i gasi diode po kolejnych puszczeniach przycisku
    ;dioda podlaczona do RA1 i RA0 przycisk do RB4 i RB5
    ;gen. wew. 4Mhz, Tcm=1us

    list p=16f628a, r=hex ;typ procesora i format liczb
    #include p16f628a.inc ;dolaczanie pliku z definicjami
    __config h'3f10' ;ustawinie rej. konfiguracyjnego

    errorlevel -302 ;maskuje komunikat o bledzie 302
    #define wy porta, 1 ;definicja wyjscia 1
    #define wy2 porta, 0 ;definicja wyjscia 2
    #define we portb, 4 ;definicja wejscia 1
    #define we2 portb, 5 ;definicja wejscia 2

    ;poczatek programu

    movlw h'07'
    movwf cmcon ;wylacz komparator
    clrf porta ;inicjacja portu a

    bsf status, rp0 ;bank 1
    bcf pcon, oscf ;generator wewnetrzny 37kHz
    clrf trisa ;port a wyjscia
    bcf option_reg, not_rbpu;zalaczone rezystory podciagajace
    bcf status, rp0 ;bank 0
    ;---------------------------------------------------------------------------------
    loop ;petla glowna programu
    call spr ;sprawdzaj stan przyciskow
    goto loop

    spr call spr_s1
    call spr_s2
    return
    ;----------------------
    spr_s1 btfsc we ;czy klawisz 1 wcisniety ?
    return ;jesli nie to powroc do pentli sprawdzania
    btfss we ;czy klawisz 1 zostal puszczony
    goto $-1 ;jesli klawisz nadal wcisniety spr. dalej
    ;dopuki nie zostanie puszczony
    movlw b'00000010' ;maska dla linii RA1
    xorwf wy ;zaneguj stan wyjscia (tylko RA1)
    return
    ;----------------------
    spr_s2 btfsc we2 ;czy klawisz 2 wcisniety ?
    return ;jesli nie to powroc do pentli sprawdzania
    btfss we2 ;czy klawisz 2 zostal puszczony
    goto $-1 ;jesli klawisz nadal wcisniety spr. dalej
    ;dopuki nie zostanie puszczony
    ;bsf wy2
    movlw b'00000001' ;maska dla linii RA0
    xorwf wy2 ;zaneguj stan wyjscia (tylko RA0)
    return

    end

    Dodano po 1 [godziny] 27 [minuty]:

    Temat zamykam program już zadziałał doszedłem co źle wpisałem.
    Dziękuje bardzo wszystkim za pomoc :)
    Poniżej poprawiony kawałek programu:

    spr_s1 btfsc we ;czy klawisz 1 wcisniety ?
    return ;jesli nie to powroc do pentli sprawdzania
    btfss we ;czy klawisz 1 zostal puszczony
    goto $-1 ;jesli klawisz nadal wcisniety spr. dalej
    ;dopuki nie zostanie puszczony
    movlw b'00000010' ;maska dla linii RA1
    xorwf porta, f ;zaneguj stan wyjscia (tylko RA1)
    return
    ;----------------------
    spr_s2 btfsc we2 ;czy klawisz 2 wcisniety ?
    return ;jesli nie to powroc do pentli sprawdzania
    btfss we2 ;czy klawisz 2 zostal puszczony
    goto $-1 ;jesli klawisz nadal wcisniety spr. dalej
    ;dopuki nie zostanie puszczony
    movlw b'00000001' ;maska dla linii RA0
    xorwf porta, f ;zaneguj stan wyjscia (tylko RA0)
    return

    0
  • #9 05 Mar 2010 22:16
    Gandziorz
    Poziom 16  

    W kodzie we i we2 to odpowiednio RA1 i RA2?
    Jak puścić napięcie w określonym czasie na port np. RA3?
    Chodzi o to że wciśnięcie spowoduje że poda napięcie 5v na określony czas np. 5 sek.

    0