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.

Dlaczego PIC12F675 nie działa?

dejmos 20 Sie 2007 11:21 1871 9
  • #1 20 Sie 2007 11:21
    dejmos
    Poziom 23  

    To są moje początki z procesorami PIC wiec mam takie pytanko.
    Napisałem program którego część zamieszczam poniżej

    Code:

       cblock h'20'
       licznik, licznik2            ;rejestry liczników
       _reg                  ;rejestr odbioru
       ms, st_ms               ;rejestry czasów
       fl_reg                  ;rejestr pomocniczy
       endc

       list p=12F675
       #include p12f675.inc            ;mikreoprocesor PIC12F675

       __config   _WDT_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT
       
    rs_def

       #define in GPIO, 3            ;linia wejścia na na GP3
       #define out GPIO, 5             ;linia wyjścia na GP1
       #define _err fl_reg, 1            ;flaga błędu danych
       #define out2 GPIO, 2              ;linia wyjścia2 na GP2
       
    start


       bcf STATUS, RP0               ;wyłączenie
       movlw h'07'               ;komparatora
       movwf CMCON               ;analogowego
       

       bsf STATUS, RP0               ;ustawienie
       movlw b'00001000'            ;wszystkich portów
       movwf TRISIO               ;jako
       clrf ANSEL               ;cyfrowe
       bcf STATUS, RP0

       bcf out                  ;wyzeruj pin GP5
       bcf out2               ;wyzeruj pin GP2
       bcf in                  ;wyzeruj pin GP3

    dalej jest część odpowiedzialna za odbiór danej na wejściu "in" -GP3 i zależnie od tej danej ma się zapalić odpowiednia diodka. Jeżeli przez określony czas nie zostanie przekazana dana to obydwie diody mają sie zapalić po 20s. (schemat układu znajduje się poniżej).
    I teraz moje pytanko brzmi:
    Dlaczego nic nie działa? Program jest napisany w środowisku MPLAB 7.50, zaś programator użyty do zaprogramowania procesora to UPROG 48EN firmy RK-SYSTEM.
    Dodam jeszcze że mam kilka tych procesorów i wszystkie są nowiutkie.

    Dlaczego PIC12F675 nie działa?

    Proszę o pomoc i z góry dziękuję za rady :|

    0 9
  • #2 20 Sie 2007 14:19
    diag
    Spec od samochodów

    A jak chodzi w symulatorze MPLAB?

    0
  • #3 20 Sie 2007 18:38
    dejmos
    Poziom 23  

    W symulatorze wszystko chodzi dobrze.
    Gdy nie podaję nic na port GP3 "in" procesor odlicza 20s i w rejestrze GPIO pojawia się wartość 00100100. Gdy podaję w symulatorze odpowiednią daną na wejście "in" w rejestrze GPIO pojawia się odpowiednio wartość 00100000
    lub 00000100 zależenie od DANEJ.

    DANA to 8 bitowa liczba podawana szeregowo i zapisywana pod nazwą ms lub st_ms.

    Próbowałem tez skompilować jakieś przykładowe programy na ten procesor i go zaprogramować i po włożeniu go do docelowego układu nic się nie działo :/

    Może ktoś miał takie problemy z uruchomieniem procesorów PIC??
    Może zły programator stosuję??
    Może MPLAB jest źle skonfigurowany i generuje zły plik HEX??
    Posiadam jeszcze programator "ZL15PROG" Może ktoś posiada opis wyprowadzeń tego programatora?? dokładnie interesuje mnie gdzie znajduje się wyjście DATA gdzie CLKDATA??

    Proszę o pomoc w tym temacie. Z góry dziękuję :-)

    0
  • Pomocny post
    #4 20 Sie 2007 20:09
    hnr
    Poziom 12  

    Witam ;
    W przedostatnią komórke flesza procesora trzeba wpisać kalibracje zegara bez tego procek nie ruszy po zaprogramowaniu , zawsze jak cos na nich robie to najpierw czytam i zapisuje kalibracje żeby potem nie mieć problemu .

    pozd;

    0
  • Pomocny post
    #5 20 Sie 2007 20:16
    kjkj
    Poziom 11  

    Tak na dzień dobry to diody powinieneś podłączyć inaczej , sterować niskim poziomem z portu a drugi koniec podłączyć za pomocą rezystora do Vdd.

    1. proponuję przestawić się na C ( dużo łatwiej zwłaszcza jeśli chodzi o analizę kodu)

    2. czy próbowałeś zapalać te diody ???

    3. może być np. tak że porty w wysokim stanie pozostają w stanie wysokiej impedancji.

    Na początek zmień ustawienie dla diody D1, D2

    0
  • #6 20 Sie 2007 21:46
    dejmos
    Poziom 23  

    Jutro sprawdzę z wartością kalibracyjną i z tymi diodkami :-)
    Z tego co zauważyłem to programator UPROG nie kasuje tej wartości (chyba :/ ) jeżeli znajduje się ona pod adresem 7FFh. Bo cały czas jest tam jakaś wartość. Tylko że ona chyba powinna się znajdować pod adresem 3FFh :?:

    Jutro to wszystko sprawdzę i napisze co i jak :-)

    Dziękuję za pomoc :-)

    Jeżeli macie jeszcze jakieś sugestie to piszcie :-)

    0
  • #7 20 Sie 2007 22:36
    Bigfoot
    Poziom 25  

    kjkj - z jakiej racji kolega powinien zmienic kierunek diod LED? Jego polaczenie jest OK - wyjscia te sa typu push-pull.

    BF

    0
  • #8 20 Sie 2007 23:37
    kjkj
    Poziom 11  

    z 3 powodów
    1. Zazwyczaj układy mają większą wydajność prądową przy sterowaniu Vss
    2. Popełnienie błędu typu nie ustawienie push-pull, nie powoduje wadliwego działania układu
    3. To dobra praktyka :)

    0
  • #9 21 Sie 2007 10:49
    Bigfoot
    Poziom 25  

    Koledze kjkj proponuje najpierw przeczytac pdfa mikrokontrolera o ktorym mowi a dopiero potem pisac o "dobrej praktyce".

    1. Sink current i source current sa takie same a ich absolutna maxymalna wartosc wynosi 25mA.
    2. Nieustawiene push-pull?? Jesli pin omylkowo zdefiniowany zostal jako wejscie to nic mu sie nie stanie - niezaleznie czy poda sie na niego bezposrednio napiecie zasilania czy mase. Jesli pin ustawi sie jako wyjscie to automatycznie stanie sie on push-pull. Nie rozumiem wiec o jakie "popelnienie bledu" chodzi...
    3. Dobra praktyka - kwestia uznania. Stosowanie logiki odwroconej (np. wlaczanie LEDa zerem a nie intuicyjna jedynka) ma sens, jesli jest uzasadnione. Ja - w tym przypadku - uzasadnienia nie widze.

    BF

    0
  • #10 22 Sie 2007 09:21
    dejmos
    Poziom 23  

    No więc po kilkunastu próbach coś zaczyna procek robić :D
    Ale nie za bardzo to co trzeba :cry:
    Po pierwsze po skonfigurowaniu oscylatora jako wewnętrzny RC procek nie działa gdy nie podciągnę rezystorem GP5 do +Vcc i zależenie od wartości tej rezystancji częstotliwość jest różna :/
    Po drugie: jeżeli już dobiorę odpowiednią rezystancję tak ze na wyjściu GP4 mam 1MHz (czyli generator wewnętrzny generuje 4 MHz) procesor nie odmierza odpowiednich opóźnień chociaż w symulatorze wychodzi że są dobrze napisane dla generatora 4MHz :/
    I po trzecie nie mogę procesora zatrzymać poleceniem
    goto $
    Czyli diody zamiast zaświecić się i już palić przez cały czas migają z jakąś tam częstotliwością uzależnioną od wartości opóźnienia (które to opóźnienie i tak nie jest odpowiednie) :cry:
    Wychodzi na to że procek wykonuje cały program w pętli (taki jest mój wniosek tylko nie wiem jak to poprawić) :/

    Może wiecie co może być nie tak??


    Tutaj jest kod programu na którym to testuję

    Code:

       cblock h'20'
       licznik, licznik2               
       ms, st_ms                     
       fl_reg                        
       endc

       list p=12F675
       #include p12f675.inc            
       __config   _WDT_OFF & _MCLRE_OFF & _INTRC_OSC_CLKOUT & _PWRTE_OFF & _BODEN_OFF
       
    _def

       #define out GPIO, 0             
       #define out_auto GPIO, 1           
       
    start

       bcf STATUS, RP0                  
       movlw h'07'                     
       movwf CMCON                     

       bsf STATUS, RP0                  
       clrf ANSEL                     
       bcf STATUS, RP0                  
       clrf GPIO
       bsf STATUS, RP0                  




       clrf TRISIO                                                                
       bcf STATUS, RP0                  

       bsf out                        
       bsf out_auto                  
       movlw .40
       movwf st_ms
       movlw .20
       movwf ms
       
       
    ;***odmierzanie milisekund
       incf ms, f             ;sprawdzanie czy wartość ms jest zerem
       decfsz ms, f           ;jeżeli tak - pomiń odmierzanie milisekund
       goto $+2               ;jeżeli nie - odmierzaj milisekundy
       goto $+4
       call del_1ms
       decfsz ms, f
       goto $-2
       
    ;***odmierzanie setek milisekund
       incf st_ms, f        ;sprawdzenie czy wartośc st_ms jest zerem
       decfsz st_ms, f      ;jeżeli tak - pomiń odmierzanie setek milisekund
       goto $+2             ;jeżeli nie - odmierzaj setki milisekund
       goto $+4
       call del_100ms
       decfsz st_ms, f
       goto $-2
       call ustaw   

    ;***opóźnienie 1 ms
    del_1ms
       movlw .248
       movwf licznik
       nop
       decfsz licznik, f
       goto $-2
       return
       
       
    ;***opóźnienie 100 ms      
    del_100ms
       movlw .100
       movwf licznik2
       call del_1ms         
       decfsz licznik2, f      
       goto $-2            
       return

    ustaw

       bcf out
       bcf out_auto            
       goto $
       
       end


    Wprowadzana jest wartość 40 i 20 do zmiennych st_ms i ms czyli program ma odliczyć 4,020 sek i wyzerować piny GP0 i GP1 i zatrzymać się na nieskończonej pętli goto $ .
    Powiedzcie co jest nie tak??

    0