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

Jak odebrać impuls sygnału z silnika w PIC16F84A (C)?

11 Lip 2007 19:36 1379 5
  • Poziom 10  
    Buduję zegarek na podstawie tego tutaj: http://www.bobblick.com/techref/projects/propclock/propclock.html z tą różnicą, że korzystam z innego silnika ( JLN4B02 ) i programuję pica w C.
    Godzina w zegarku wyświetlana jest tak: od jakiegoś punktu zaczynają się wyświetlać odpowiednie diody (ich sekwencje) w odpowiednich odstępach czasu, co w połączeniu z obrotami wywołuje złudzenie optyczne - widzimy godzinę.
    Problem polega na wyznaczeniu punktu startowego do wyświetlania diód. W oryginale jedna z faz silnika jest przekazana do pica na wejście ra4.
    Tak samo u mnie, sygnał sinusoidalny prawdopodobnie o jednym impulsie na obrót silnika. Pytanie brzmi: jak zaprogramować wejście ra4 (lub inne), żeby właściwie wykorzystać ten impuls z silnika?

    Załączam aktualny schemat i proszę o pomoc, gdyż jest to jedyne czego mi brakuje do ukończenia prac, reszta działa :).
  • Poziom 27  
    Jesli chcesz zeby program reagowal na impuls, to najlepiej wykorzystac do tego port RB0 zaprogramowany jako zewnetrzne przerwanie.
  • Poziom 10  
    Takie rozwiązanie jest mi znane, wiem, że najprościej zastosować fotokomórkę .. problem w tym że jak widać na schemacie wszystkie porty rb0 - rb6 są zajęte, a układ jest już mocno 'napakowany', silnik również okablowałam tak, żeby dostarczyć sygnał do mikrokontrolera. W oryginale zastosowano sygnał w porcie ra4 i jak widać zadziałało i tej wiedzy właśnie mi potrzeba.
  • Poziom 27  
    Jesli piszesz w asemblerze to ten fragment odpowiada za detekcje zbocza na RA4:

    Code:

    ;--------
    ; test for index in rotation and store period in period_dup
    ;--------
    Check_index   movf   PORTA,w      ;get the state of port a
          xorwf   flags,w      ;compare with saved state
          andlw   b'00010000'   ;only interested in bit 4
          btfsc   STATUS,Z   ;test for edge
          retlw   0      ;not an edge, same as last
          xorwf   flags,f      ;save for next time
          btfsc   flags,4      ;test for falling edge
          retlw   0      ;must have been a rising edge
          movf   period_count,w   ;make a working copy
          movwf   period_dup   ;called period dup
          clrf   period_count   ;a fresh start for next rotation
          clrf   digit_index   ;set to first digit
          clrf   dot_index   ;first column


    Dodano po 1 [minuty]:

    A co do tej zajetosci RB0... ze schematu widze ze wyprowadzenia ledow dalo by rade przesunac o 1 port (od RB1 do RB7), ale to juz twoja sprawa jak chcesz to rozwiazac ;-)
  • Poziom 10  
    Widziałam ten kod, niestety nie piszę w assemblerze a w C (niełatwo czyta się czyjeś kody zwłaszcza assemblerowskie). A co do przesunięcia diód to owszem jest to możliwe, ale dosyć kłopotliwe. Wolałabym uniknąć rozbiórki układu i takiej reorganizacji.
  • Poziom 27  
    No to ja nie widze problemu... zalezy co chcesz dokladnie osiagnac tym impulsem.

    Powinno byc to cos takiego:

    Code:

    temp = RA4; // zapisuje wartosc portu do temp-a
    while(1) {  // nieskonczona petla
       if(RA4==1 && temp==0) {  // wykrywam zbocze narastajace
          ...jakis kod...;
          break; // wychodze z petli while
       }
       if(RA4==0 && temp==1) {  // wykrywam zbocze opadajace
          ...jakis kod...;
          break; // wychodze z petli while
       }
    }


    i robisz co tam potrzebujesz w danym momencie. Ten fragment kodu jest zapetlony ( while(1) ) dopoki na RA4 nie nastapi zmiana. Musisz i tym pamietac.

    Jesli nie o to chodzilo to napisz po krotce co chcesz osiagnac.