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.

PIC16f1847 - licznik impulsów

ppawel12 28 Sie 2011 13:27 3408 18
  • #1 28 Sie 2011 13:27
    ppawel12
    Poziom 16  

    Witam,
    zacząłem się bawić/uczyć programowania uk PIC, mam procka PIC16F1847 i ucząc się jego peryferii chciałem go zaprogramować aby zliczał impulsy z przycisku i po przekroczeniu konkretnej wartości podejmował akcje zapalenie diod. Korzystam ze środowiska mikroC PRO for PIC.

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    przycisk jest podłączony do RA4 układ powinien zliczać impulsy (zbocze narastające) i po zliczeniu 5 wciśnięć przycisku zapalają się diody podłączone do porty B. Program odczekuje chwilkę gasi diody i zeruje rejestr licznik TMR0. Po zaprogramowaniu układ działa inaczej diody migają bez względu na przyciśnięcia klawisza :/ diody palą się długo na chwilkę gasną i cykl się powtarza. Tak jak by był układ zliczał impulsy ale nie z przycisku :/

    Ktoś wie czemu ??

    0 18
  • #2 28 Sie 2011 13:42
    maxiu25
    Poziom 16  

    Program działa prawidłowo. Włączyłeś licznik który kreci się w kółko jak ma wartość 5 to zapali diodę itd.
    Spróbuj poprawić program tak aby zliczał naciśniecie przycisku z portu RA4 i dodawał w jakieś zmiennej, eliminacja drgań też by się przydała a licznik jest zbędny.

    0
  • #3 28 Sie 2011 13:51
    ppawel12
    Poziom 16  

    po zaprogramowaniu procka z Brennera8 diody mrugają non stop :/ dłużej się palą zgasną na chwilkę i dalej się zapalają itp. nawet przycisku nie wciskam :/ sprawdzałem bity i datasheet kilka razy według mnie jest ok ale po zaprogramowaniu coś układ działa inaczej nic zakładałem :/

    0
  • #4 28 Sie 2011 16:04
    maxiu25
    Poziom 16  

    Pokaż mi linijkę programu gdzie sprawdzasz przyciśniecie klawisza?
    Licznik liczy bez przerwy dlatego co doliczy do 5 przełącza stan. Nie wiem czy zapalasz FF czy 00? Czytaj co napisałem wcześniej :)

    0
  • #5 28 Sie 2011 16:48
    ppawel12
    Poziom 16  

    a on nie działa tak, że on sam sprawdza przycisk i liczy ile razy był wciśnięty (licznik/counter) ? taka nie jest idea wykorzystania licznika TIMER0jako licznika ?? timer/licznik ma zliczać impulsy, które pokazują się na wejściu/pinie T0CKI. Z tego co przeczytałem w nocie katalogowej to te ustawienia powinny zapewniać pracę licznika z wykorzystaniem wejścia RA4 i zbocze narastające na nim.

    wiem, że można napisać program, który sam będzie sprawdzał stany pinów i dać opóźnienie na wytłumienie drgań na stykach klawiszy. Po co, ja chcę po kolei podczas nauki zaprogramować i przetestować poszczególne peryferie.

    Schemat blokowy TIMER0
    PIC16f1847 - licznik impulsów
    zdaje mi się, że ustawiłem poprawne bity rejestrów

    0
  • #6 28 Sie 2011 23:16
    94075
    Użytkownik usunął konto  
  • #7 29 Sie 2011 09:11
    ppawel12
    Poziom 16  

    Przycisk jest podłączony ale ja nawet go nie wciskam (wiec nie ma drgań na stykach) a diody mrugają o to chodzi !

    0
  • #8 29 Sie 2011 09:53
    94075
    Użytkownik usunął konto  
  • #9 29 Sie 2011 10:49
    ppawel12
    Poziom 16  

    albertb nie wiem o co ci chodzi :/ przed przystąpieniem do programowania procków poczytałem trochę o ich budowie i peryferiach. Z tego co kojarzę to tylko portB ma wbudowane podciągniecie przez rezystor do zasilania (rejestr WPUB). Dlatego portB jest przystosowany do pracy z klawiaturą.
    W liczniku impulsów z wykorzystaniem Timer0 wykorzystuje wejście wyzwalające T0CKI (RA4), postA ma tylko jeden pin podciągnięty przez rezystor do zasilania i jest to RA5 czyli reset

    PIC16f1847 - licznik impulsów

    wiec nie mam pojęcia o co chodzi Tobie z tym podciągnięciem przycisku.

    0
  • #10 29 Sie 2011 11:42
    94075
    Użytkownik usunął konto  
  • #11 29 Sie 2011 12:49
    ppawel12
    Poziom 16  

    wykonać zewnętrzne podciągniecie do zasilania na pinie RA4 ?

    0
  • #12 29 Sie 2011 16:59
    adamwesola
    Poziom 24  

    Podciąganie tak, a co z waczdogiem ? domyślnie jest włączony, wiec może on cyklicznie resetuje procesor ?

    0
  • #13 29 Sie 2011 18:09
    ppawel12
    Poziom 16  

    a mam takie inne pytanie korzystam z mikroC PRO for PIC i tam jest debbuger systemowy by sprawdzać co się dzieje z rejestrami, jak go włączam to sobie chodzi (rejestry sie ustawiają itp) ale ciekawi mnie jedno czemu np. rejestr TMR0 się nie zmienia jak zmieniam poziomy logiczny na pinie RA4, w tym debbugerze ??

    ustawiłem zwykły licznik na TIMER0 i też w tym debbugerze rejestr TMR0 sie nie zmienia :/
    void main()
    {
    OPTION_REG = 0x08;
    TMR0 = 0x00;
    while(1) {}}

    czy w PIC nie ma jakiegoś rejestru gdzie się włącza by np. działał któryś licznik ?? bit rejestru zezwalający na prace liczników itp?

    0
  • #14 29 Sie 2011 19:38
    adamwesola
    Poziom 24  

    W rejestrze OPTION bit PSA , jak go wyzerujesz to przypisujesz preskaler do TMR0 i go uruchamiasz

    0
  • #15 29 Sie 2011 19:42
    ppawel12
    Poziom 16  

    ale jak go ustawie to mam preskaler 1:1 i też działa, dobrze rozumiem, on chyba nie odpowiada za uruchomienie timera :/ z tego co pamiętam to w AVR są konkretne bity do uruchomiania i zatrzymania peryferiów...
    zmieniam środowisko z mikroC na MPLAB

    0
  • #16 30 Sie 2011 17:23
    adamwesola
    Poziom 24  

    Co działa ? timer0 ? Bit PSA dołącza lub odłącza źródło impulsów do preskalera, bez względu na jego (preskalera) ustawienie podziału.
    Źródłem może być oscylator wewnetrzny lub impulsy na RA4/T0CKI, wybierane jest ono bitem T0CS

    0
  • #17 30 Sie 2011 18:30
    ppawel12
    Poziom 16  

    Problem już rozwiązałem :)
    adamwesola - masz mój pierwszy rysunek schemat blokowy timera0, bit PSA ma inne zastosowanie, a mianowicie on włącza lub wyłącza preskaler a nie licznik.

    Mój błąd to rutyna :( zacząłem programować PIC w MPLAB ale było ciężko, trochę toporne :( więc poszukałem innego środowiska i znalazłem mikroC PRO for PIC. Bawiłem się w nim. Posiada ona fajny interfejs i debbugera - według mnie trochę upośledzonego :( W tym debuggerze wszystkie rejestry są wyzerowane :/ tak pokazuje ale w nocie katalogowej niektóre rejestry są domyślnie poustawiane (1). Po załadowaniu tego programu do MPLAB i włączeniu symulacji to zauważyłem (w AVR prawie wszystkie rejestry są wyzerowane domyślnie). Cały rejestr OPTION_REG jest domyślnie ustawiony. Potem przypomniałem sobie, że i w nocie katalogowej jest umieszczone czasem R/W(1/1) lub R/W(0/0). Po zmianie rejestru OPTION_REG (ustawienie to co chciałem i wyłączenie to czego nie chcę) rejestr TMR0 zaczął zliczać impulsy :D dziś planuje zaprogramować jak czas pozwoli procka i sprawdzić czy zadziała :)

    napiszę dziś lub jutro jak poszło :)

    0
  • #18 31 Sie 2011 07:28
    adamwesola
    Poziom 24  

    Jasne, masz racje, mój błąd.

    0
  • #19 01 Wrz 2011 14:53
    ppawel12
    Poziom 16  

    zmontowałem układ i go zaprogramowałem, wykonałem podciągniecie 5V - 10kOhm i masa. Napięcie biorę przed rezystorem 10k i podaje na wejście licznika. Coś nadal nie :( podczas wciskania przycisku podawania stanu wysokiego na RA4. Diody nadal ciągle mrugają, WD jest wyłączony, wszystkie zbędne opcje są wyłączone. Wykonałem obsługę klawisza oraz dąłem opóźnienie na wytłumienie drgań. Macie jakieś inne pomysły ?

    Program pisze w MPLAB, w symulatorze wszystko działa idealnie :/

    Kod: cpp
    Zaloguj się, aby zobaczyć kod
    [/code]

    0