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.

PIC16F628A - prosty stoper - proszę o sprawdzenie schematu i kodu

p.kaczmarek2 11 Mar 2015 21:03 1275 8
  • #1 11 Mar 2015 21:03
    p.kaczmarek2
    Poziom 23  

    Witajcie moi drodzy,
    udało mi się złożyć prosty stoper.
    Korzysta on z 4 cyfrowego wyświetlacza 7segmentowego.
    Do mierzenia czasu wewnętrzny kwarc mikroprocesora.
    Do tego dwa przyciski - "PAUZA" i "RESET".
    Jest to mój pierwszy projekt.
    Zamieszczam kod oraz schemat i proszę o wszelkie uwagi, co można poprawić, zoptymalizować itp.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    PIC16F628A - prosty stoper - proszę o sprawdzenie schematu i kodu
    Ogólnie to mam takie pytania:
    1. Czasem zdarza się, ze stoper nie reaguje na przyciski. Dlaczego? Czy jest błąd w kodzie?
    2. Jak mogę bardziej zoptymalizować ten kod?
    3. Czy schemat jest poprawny, tzn. czy tak zrobiony układ długo będzie działać?
    4. Jak mogę schemat poprawić by był bardziej czytelny?
    5. Czy przyciski są dobrze zorganizowane (rezystor pull up + push button)?
    Jestem początkujący ale chce dobrze ukończyć ten projekcik, wiec proszę o wyrozumiałość.[/code]

    0 8
  • Pomocny post
    #2 12 Mar 2015 04:19
    dondu
    Moderator Mikrokontrolery Projektowanie

    Najpierw krótkie odpowiedzi na część pytań:

    3. Generalnie jest OK z wyjątkiem:
    - pomyłki podłączenia tranzystorów pod kropkę a nie katody wyświetlaczy,
    - nie podłączyłeś pozostałych trzech wyświetlaczy, ale rozumiem, że jest to związane z Twoim pytaniem nr 4,
    - drobiazgi (aczkolwiek istotne) to zasilanie, ale nie pokazałeś go więc nie ma co analizować. Dodaj co najmniej kondensatory filtrujące: http://mikrokontrolery.blogspot.com/2011/04/zasilanie-mikrokontrolera.html

    4. o tak: http://mikrokontrolery.blogspot.com/2011/04/jak-projektowac-czytelne-schematy.html

    5. tak, aczkolwiek możesz pozbyć się rezystorów i włączyć pull-upy (jeśli na tych pinach są dostępne). Zapewne dla PortB można je włączyć, a Port A ich nie ma - sprawdź w dokumentacji. Gdyby tak było, to masz wolny RB5.

    A teraz program - nawet nie będę go analizował, ponieważ nie używasz timerów.
    Rozumiem oczywiście, że to Twój pierwszy projekt, ale właśnie ten projekt należy oprzeć o timery (co najmniej jeden, a może nawet dwa).

    Dlatego powinieneś najpierw zrobić kilka prostych programów:
    - diodę migającą w takt któregoś z timerów,
    - multipleksowanie wyświetlaczy LED,
    - eliminację drgań styków przycisków w oparciu o timer,
    - itp,

    ... i dopiero później mając już te podstawy, zrobić ten projekt od nowa, ale już na bazie timerów, a my Ci z chęcią w tym pomożemy :)

    0
  • Pomocny post
    #3 12 Mar 2015 07:45
    94075
    Użytkownik usunął konto  
  • #4 12 Mar 2015 21:56
    p.kaczmarek2
    Poziom 23  

    Co do zasilania - jest stabilizator 5V z kondensatorami, ale to naniosę na schemat później.

    Dodałem przerwanie co 0.5 ms i poprawiłem liczenie czasu - teraz nawet po 15 minutach pracy "łeb w łeb" z prawdziwym stoperem nie widać różnic czasu.

    Na ten moment w przerwaniu mam liczenie czasu - jedno przerwanie wykonuje się co 0.5ms. Odświeżanie wyświetlacza jest dalej w głównej pętli.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Proszę o przeglądniecie nowego kodu.
    Moje pytania:
    1. Czy ten wywód jest poprawny (z obserwacji wynika ze tak)
    Cytat:

    // timer 0 000 prescaler 1:2
    // crystal internal is 8Mhz, but each instruction takes 4 cycles,
    // so cpu frequence is 2MhHz
    // interrupt toggles every 256 cycles,
    // so its cycle is 2*256=512.
    // a prescaler of 1:2 is being used, so a frequency of
    // 2M/(512*2) = 1.953125 KHz == 2KHz
    // 1Hz = s/1, so 2KHz = s/2000
    // so one interrupt is 0.5 miliseconds = 500 microseconds

    2. Chce dodać drugi timer, ale jak to zrobić? Kompilator nie rozpoznaje T1IF, natomiast rozpoznaje T0IF. O co chodzi? W dokumentacji tez nie mogę się z tym znaleźć, ale powiedziane jest jasno, ze mam 2 timery 8bitowe.

    0
  • #5 12 Mar 2015 22:26
    vania
    Poziom 22  

    p.kaczmarek2 napisał:

    2. Chce dodać drugi timer, ale jak to zrobić? Kompilator nie rozpoznaje T1IF, natomiast rozpoznaje T0IF. O co chodzi? W dokumentacji tez nie mogę się z tym znaleźć, ale powiedziane jest jasno, ze mam 2 timery 8bitowe.

    Timer1 jest 16 bitowy, flaga przerwania nazywa się TMR1IF. Timer2 jest 8 bitowy, flaga przerwania TMR2IF. Datasheet od str 50.

    0
  • #6 13 Mar 2015 19:04
    p.kaczmarek2
    Poziom 23  

    Dziękuję, dzięki tej informacji przeniosłem obsługę 7segmentowego do drugiego przerwania.
    Teraz jest w nim licznik co 8 kroków. W krokach parzystych wyświetlam cyferkę, a w nieparzystych wyłączam całość, by uniknąć efektu "ghosting" spowodowanego wolna reakcja tranzystorów.
    Co ciekawe, "ghosting" teraz jest nawet mniej widoczny niż w poprzednim kodzie gdzie wyświetlacz odświeżałem w pętli.
    Z dokumentacji wynika, ze te drugie przerwanie ma prescaler 1:1.
    Nowy kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Mam takie pytania:
    1. Czy te przerwania są zrobione poprawnie?
    2. Wciąż po jakimś czasie przyciski przestają reagować. Dlaczego? To przez przepełnienie się inta?
    3. Przyciski powinienem obsługiwać tak jak teraz w głównej pętli czy jakoś inaczej? [i] eliminacja drgań styków przycisków w oparciu o timer ?
    4. Co można tu ulepszyć itp?

    0
  • Pomocny post
    #7 14 Mar 2015 19:25
    94075
    Użytkownik usunął konto  
  • #8 14 Mar 2015 21:18
    p.kaczmarek2
    Poziom 23  

    Malutki ghosting jest, bo np. "0 0 0 0" świeci jaśniej, niż inna kombinacja.

    Nowy kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Teraz w kwestii przycisków robię tak, ze jak wykryje naciśniecie to główną pętlą czeka 200 ms. Przez to gdy nacisnę jeden przycisk to drugi tez się blokuje na ten czas 200 ms, ale to chyba nie jest duże utrudnienie w użytkowaniu stopera. Głowna pętla zajmuje się tylko i wyłącznie przyciskami. Odliczanie czasu i wyswietlacz są w osobnych przerwaniach.

    Moje pytania:
    1. Jak lepiej z tymi przyciskami zorganizować?
    2. A może by i liczenie czasu i odwiezanie wyświetlacza dać do jednego przerwania? Czy to ma jakieś plusy/minusy konkretne?

    0
  • #9 14 Mar 2015 22:11
    94075
    Użytkownik usunął konto  
  Szukaj w 5mln produktów