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.

PIC12F683

Marlena80 06 Maj 2008 12:17 4491 31
  • #1 06 Maj 2008 12:17
    Marlena80
    Poziom 10  

    Czesc.

    Mam zrobic urzadzenie na PICu tym oto:
    PIC12F683

    ktore dokladnie co 4 godziny, wladza urzadzenie na 30 sekund.

    Silniczek na wyjsciu bedzie sterowany z mosfeta. Mosfet poprzez nozke PICa.

    Jestem zupelna nowicjuszka. Co mi jest potrzebne i w jakim jezyku to najlpeij robic? Pozdrawiam

    Marlena

    0 29
  • Pomocny post
    #2 06 Maj 2008 12:31
    Freddie Chopin
    Specjalista - Mikrokontrolery

    ten pic jest tak prosty, a wybor kompilatorow tak ograniczony (zerowy?), co wiecej - projekt tak prosty - ze najlepiej napisac te kilka linijek w assemblerze, bo to nic specjalnego. jeden timer i gotowe.

    0x41 0x56 0x45!!

    0
  • Pomocny post
    #3 06 Maj 2008 12:33
    kamyczek
    Poziom 34  

    Można to zrobić w każdym języku i w którym dokładnie będzie zależało jedynie od tego, czy podstawy któregoś z języków opanowałaś. Najłatwiej bedzie zapewne w c ale i w asemblerze nie będzie to zbyt skomplikowane. Prostym rozwiązaniem będzie użycie timera do odmierzania czasu a w pętli głównej sprawdzanie wartości zmiennej incrementowanej przez ten timer i sterowanie portem mikrokontrolera. Zabieg potrzebny gdyż sam timer nie odliczy nam takiego długiego czasu chyba że na "zegarkowym" kwarcu...

    0
  • #4 06 Maj 2008 12:44
    Marlena80
    Poziom 10  

    @Freddie Chopin
    PDF do tego PICa zajmuje 174 strony, wiec chyba az tak proste to to nie jest.

    Wybor kompilatorow ograniczony, zerowy? Moze prosic o bycie nieco mniej tajemniczym?

    0x41 0x56 0x45!! - co to oznacza?

    @kamyczek
    Ten PIC ma uzywac jak najmniej pracu, czy da sie go budzic co 4 godziny?

    Mam srednie doswiadczenia w PASCALU, bardzo podstawowe w C, stusunkowo duze w "asemblerze" na PLD do Siemensa Simatic S7, wiec nie wiem czy to mozna porownac.

    0
  • #6 06 Maj 2008 13:04
    Freddie Chopin
    Specjalista - Mikrokontrolery

    Marlena80 napisał:
    @Freddie Chopin
    PDF do tego PICa zajmuje 174 strony, wiec chyba az tak proste to to nie jest.

    pdf do dowolnego pic24 zajmuje 700, a nic w nim nie ma, bo wszystko jest na jakichs 1500 stronach manuala, wiec uwierz - 174 strony to jest nic [;

    Cytat:

    Wybor kompilatorow ograniczony, zerowy? Moze prosic o bycie nieco mniej tajemniczym?

    osobiscie nie znam zadnego kompilatora C dla PIC12, dlatego zostalbym przy assemblerze, gdyz jest on banalny. choc pewnie mikroC albo CCS obsluguje ten procesor.

    Cytat:

    0x41 0x56 0x45!! - co to oznacza?

    cos napewno, ale nic co by cie interesowalo [;

    0x41 0x56 0x45!!

    0
  • Pomocny post
    #7 06 Maj 2008 13:05
    kamyczek
    Poziom 34  

    Jeśli tak to można go budzić przerwaniem od licznika, sprawdzać warunki i uruchamiać układ na czas pracy urządzenia w przeciwnym wypadku usypiać go ponownie. Nie wiem czy jest tryb uśpienia ,który nie spowoduję po jego wprowadzeniu wyłączenia tranzystora wiec możliwe że w czasie pracy układy będzie musiał on funkcjonować bez usypiania. Dla oszczędzania prądu najlepiej używać "wolnego oscylatora i spać ile sie da ;). Co do języka asembler albo C.

    0
  • #9 06 Maj 2008 13:23
    Marlena80
    Poziom 10  

    @Dr_DEAD
    To jest projekt do pracy, nie jest to moja dzialka, ale ktos musi to zrobic.
    Powiedzmy ze 20-30 minut po 5 latach.

    @Freddie Chopin
    O jakim manualu mowisz?
    Ok, zrobie to w asemblerze (jesli zrobie).
    To po to to piszesz? Jesli cos mowisz to mow to konca, sugerowanie w stylu "i tak tego nie zrozumiesz" troszke mnie nie kreci.

    @Kamyczek
    Czyli licznik moze wybudzic uklad? tak?
    Jakie mam sprawdzac warunki? Z czym mam porownywac warunki?

    Tranzystor ma byc tylko wlaczony (silnik wlaczony) podczas 30 sekund.
    Pozostale 3h, 59 minut i 30 sek, silnik i mosfet maja byc wylaczony.

    Czy masz na mysli to ze jak uC spi to piny wisza w powietrzu? Sadze ze maly rezystor sprowadzi mosfety do ziemi podczas spania.

    Jak wolny oscylator proponujesz?
    Czy timer liczy tak jak licznik na technice cyfrowej?
    Od np 000000 do 1111111 i wtedy nastepuje przebudzenie gdy sa same jedynki? (sorry za glupie pytanie, dopiero zaczynam czytac pdf`a)

    Mowisz C?
    Ok, jaki kompilator?

    0
  • #10 06 Maj 2008 13:34
    kamyczek
    Poziom 34  

    Do pic-ów MPlab flagowy kompilator , ze strony microchipa timer może liczyć od zadanej wartości do przepełnienia lub całą pojemność licznika osobiście dążyłbym do takiego rozwiązania w którym przerwania występują dokładnie co 30 s co spowoduje konieczność odliczenia 480 przerwań w ciągu 4h i np 479 załaczy układ a 480 wyłączy tranzystor i zeruje zmienną. Można również potraktować to w taki sposób że zerowy stan zmiennej załącza tranzystor a każdy inny wyłącza . Łatwiej sprawdzać taki warunek.

    0
  • #11 06 Maj 2008 14:28
    nsvinc
    Poziom 35  

    Jest taka podstawowa zasada, że:

    NAJPIERW czytasz pdfa...
    ...a POTEM pytasz na elce. Nie odwrotnie....

    Dodano po 1 [minuty]:

    Jesli znasz chociaż podstawy C to wiesz jakie liczby zaczynają sie na 0x....:D [moge podpowiedzieć: nie binarne i nie dziesiętne...]

    Jak uC śpi to piny pozostają w tych samych stanach co wtedy jak nie spał bo wyobraź sobie istnienie zatrzasków na porcie....:D
    Przykład:

    Stawiasz na stole kubek i czytasz książke. Jak idziesz spać to kubek nie znika, a stoi dalej...:D

    0
  • #12 06 Maj 2008 14:28
    piti___
    Poziom 23  

    Witam

    W PIC16/18 timery podczas uśpenia są wyłączone. Podejrzewam że w PIC12 jest tak samo. Działa wyłącznie watchdog jeśli jest włączony. Przepełnienie watchdoga jeśli układ jest uśpiony powoduje obudzenie i wykonywanie programu znajdującego się po komendzie sleep.

    Stany wyjść z procesora są utrzymywane podczas uśpienia.

    0
  • #13 06 Maj 2008 14:37
    Dr_DEAD
    Poziom 28  

    Zerknołem do manuala procka i kontynułując myśl kamyczka mamy:
    Kwarc zegarkowy podłączony pod piny OSC1 OSC2. Procesor jest budzony 16-sto bitowym Timerem1 (bo tylko on może budzić). Z tego co mi się przypomina to 16-sto bitowy timer z kwarcem zegarkowym 32.768kHz da nam przerwanie co 2s. W przerwaniu tym wstarczy zinkrementwać 16-sto bitową zmienną i sprawdzić czy już mineło 4 godziny, a jeżeli tak to wiadomo co robić.

    0
  • #15 06 Maj 2008 14:55
    Dr_DEAD
    Poziom 28  

    Freddie Chopin napisał:
    a preskaler?

    Zakładam że to pytanie do mnie skierowane :-).
    Preskaler oczywiście jest i można by uzyskać interwały 2s*2, 2s*4, 2s*8 ale takie interwały odrobinke komplikują odliczanie 30s.

    0
  • #16 06 Maj 2008 15:51
    kamyczek
    Poziom 34  

    Szczególnie jak wpiszesz wartość początkową do timera i uzyskasz 15s Chyba to wykonalne jest .
    A tak na marginesie Atmel ma preskaler max 1024 . Co daje możliwość uzyskania przerwania co 34 minuty !!!.

    0
  • #17 06 Maj 2008 16:08
    Dr_DEAD
    Poziom 28  

    kamyczek napisał:
    Szczególnie jak wpiszesz wartość początkową do timera i uzyskasz 15s Chyba to wykonalne jest .

    Pewnie tak, ale nie doczytałem jak jest z synchronizacją bo przecież CPU i Timer będą chodziły asynchronicznie a wtedy bardzo łatwo zgubić takt z rezonatora kwarcowego, lepiej jest jak licznik sam sie przeładuje na 0. Oczywięcie ktoś może powiedzieć że to już "Apteka", ale zawsze lepiej tworzyć dopracowany kod.
    Trzeba by było doczytać wszystko żeby ładować Timera wartością początkową.

    0
  • #18 06 Maj 2008 16:28
    kamyczek
    Poziom 34  

    Oj kolega chyba nie zna zbyt dobrze zagadnienia liczników . Więc napisze kilka słów wpisując podczas przerwania do timera wartość początkową skraca się czas odliczania o taką liczbę cykli jaką wpiszemy wobec tego możemy zliczyć np 15 sek. Co już ułatwi zabawę. Najbardziej optymalne było by generowanie przerwań co 30 sek tu niestety jest to ciężkie do zrealizowania. Co do trybów uśpienia nie znam tego pica na tyle żeby powiedzieć co zasypia co nie ...

    0
  • #19 06 Maj 2008 18:40
    mkaczor
    Poziom 15  

    Mam zainstalowany MPLAB IDE v.7.62 pobrany z www.microchip.com do ktorego firma CCS dolaczyla kompilator C miedzy innymi dla PIC12F683. Kompilator ma narzucone jakies ograniczenia ale z tym zadaniem z pewnoscia sobie poradzi. W katalogu \Program Files\Microchip\Third Party\PICC\Examples mozna znalezc wiele przykladowych programow napisanych w jezyku c dla tego kompilatora.

    Pomylilem sie. Wraz z MPLAB instalowany jest kompilator PCB (dla PIC16F683 wymagany jes kompilator PCM). Mozna za to zastosowac np. PIC12F508 lub PIC16F509 ktorych wyprowaczenia rozmieszczone tak samo jak w PIC12F683 a sa obslugiwane przez kompilator PCB.

    0
  • #20 06 Maj 2008 22:40
    Dr_DEAD
    Poziom 28  

    kamyczek napisał:
    Oj kolega chyba nie zna zbyt dobrze zagadnienia liczników . Więc napisze kilka słów ...

    Zmusiłeś mnie do rozwinięcia tematu ;-).
    kamyczek napisał:
    ...wpisując podczas przerwania do timera wartość początkową skraca się czas odliczania o taką liczbę cykli jaką wpiszemy wobec tego możemy zliczyć np 15 sek...

    To akurat jest dla mnie oczywiste i nie o tym był mój wcześniejszy post, a był on o tym, że:
    Timer aby obudzić CPU musi działać w trybie asynchronicznym, a tryb asynchroniczny stwarza problemy z czytaniem i zapisywaniem wartości do timera, na potwierdzenie tego mam wycinek z manuala:
    PIC12F683
    Manual zaleca aby podczas Timera, sam Timer był zatrzymany, więc co prawda z dużą dokładnością możemy odliczyć 15 sekund ale nie możemy z dużą dokładnością otrzymywać przerwania co 15 sekund bo trzeba zatrzymywać i startować Timer co powoduje gubienie taktów rezonatora kwarcowego. Cytat z manuala:
    PIC12F683
    kamyczek napisał:
    ... Co już ułatwi zabawę...

    Wcale nie jest tak łatwo jak by się wydawało i widać że jest kilka pułapek w które można wpaść. Oczywiście taki kod z błędami może działać całkiem dobrze i nawet dokładność odmierzania czasu może być zadowalająca ale równie dorze może to być tykająca bomba.[/url]

    0
  • #21 06 Maj 2008 23:15
    kamyczek
    Poziom 34  

    po pierwsze przy tak "zapracowanym" picu zegar główny może pracować z częstotliwością 32,768KHz więc o zegarze asynchronicznym mowy tu nie ma. Co do dokładności to od tego ma kolega w symulatorze licznik cykli zegara systemowego . Te same instrukcje zawsze zajmują tyle samo czasu więc dodanie pewnej liczby cykli do wpisywanej wartości początkowej na wykonanie obsługi przerwania jest sprawą dość łatwą nawet jeśli przerwanie zawiera rozgałęzienie zawsze w krótszym jego warunku można dopisać kilka nop-ów i będzie tyle samo cykli.

    0
  • #22 07 Maj 2008 11:25
    Bigfoot
    Poziom 25  

    Marlena80 - powiedz cos wiecej o samym ukladzie - w koncu to Tobie mamy pomoc a nie tylko przescigac sie w pisaniu tego co kto wie. Wszyscy tu sie rozpisuja o trybie SLEEP mikrokontrolera (ktory rzeczywiscie utrudnia zycie - nie mozna wykorzystac np. idealnego do tego zadania timera 2 z autoprzeladowaniem). Tryb SLEEP ma jednak wtedy sens, jesli urzadzenie jest np. zasilane bateryjnie, by oszczedzic baterie. A ja zaloze sie, ze Twoje urzadzenie zasilane bateryjnie nie jest, tylko pewnie przez jakiegos LM7805, ktory sam z siebie ciagnie 10 razy wiecej pradu niz uspiony uC. Jaki wiec sens debaty o trybie SLEEP? Tym bardziej, ze musisz sterowac jakims silnikiem, wiec na pewno uzywasz zasilacza a nie baterii. Napisz to! I po prostu uzyj Timera 2, w przerwaniu po jego przepelnieniu inkrementuj sobie jakas mala zmienna i gdy zliczy ona 30 sekund to dzialaj.
    Przykladowo dla fosc=32768Hz, prescaler=16, reload=160, postscaller=16 otrzymasz przerwanie co 5 sekund. Zliczasz do 6 - masz pol minuty, zliczas do 2874 - masz 3h59m30s. Albo nawet wykorzystaj wewnetrzny oscylator jesli nie jest krytyczne superdokladne odliczanie bo pewnie i nie jest. No i napisz cos wiecej jesli chcesz konkretnej pomocy.

    BF

    0
  • #23 07 Maj 2008 12:26
    Dr_DEAD
    Poziom 28  

    kamyczek napisał:
    .. zegar główny może pracować z częstotliwością 32,768KHz więc o zegarze asynchronicznym mowy tu nie ma..

    PIC12F683

    0
  • #24 07 Maj 2008 13:05
    Marlena80
    Poziom 10  

    Bateria.
    Co 4 godziny nalezy wlaczac silnik na 30 sekund.

    Mam malutko pradu, bardzo malutko. Bateria ma wytrzymac 6 lat.

    PIC, mosfet, silniczek, to wszystko.

    Jako bateria bedzie 2x (lub 4x) AA prawdopodobnie, silniczek ma brac w okolicach 4mA (sa takie).

    Mosfet dlatego ze prad rozruchowy silniczka to 160mA co uwali pin na PICu bo ona da max 20mA.

    Nie obliczajcie mi prosze baterii, bo nie potrzebuje z tym pomocy, natomiast z PIC ami tak.

    0
  • #25 07 Maj 2008 13:32
    Dr_DEAD
    Poziom 28  

    Marlena80 napisał:
    Bateria.
    Co 4 godziny nalezy wlaczac silnik na 30 sekund.
    Mam malutko pradu, bardzo malutko. Bateria ma wytrzymac 6 lat.
    PIC, mosfet, silniczek, to wszystko.

    No to trzeba określić jaki prąd pobiera silniczek. Na podstawie tego można określić jaka bateria nas interesuje i ile prądu pozostaje dla reszty układu. Zapewne jest to już zrobione , ale jakoś autor szczędzi nam tych informacji.

    Dodano po 1 [minuty]:

    no tak spóźniłem sie ze swoimi pytaniami ;-)

    Dodano po 3 [minuty]:

    czyli pasowałoby aby reszta układu nie pobirała więcej 8uA to wtedy zużycie energii przez silniczek i resztę układu będzie podobne.

    0
  • #26 07 Maj 2008 13:47
    Marlena80
    Poziom 10  

    Dr_DEAD napisał:
    Marlena80 napisał:
    Bateria.
    Co 4 godziny nalezy wlaczac silnik na 30 sekund.
    Mam malutko pradu, bardzo malutko. Bateria ma wytrzymac 6 lat.
    PIC, mosfet, silniczek, to wszystko.

    No to trzeba określić jaki prąd pobiera silniczek. Na podstawie tego można określić jaka bateria nas interesuje i ile prądu pozostaje dla reszty układu. Zapewne jest to już zrobione , ale jakoś autor szczędzi nam tych informacji.

    Dodano po 1 [minuty]:

    no tak spóźniłem sie ze swoimi pytaniami ;-)

    Dodano po 3 [minuty]:

    czyli pasowałoby aby reszta układu nie pobirała więcej 8uA to wtedy zużycie energii przez silniczek i resztę układu będzie podobne.


    Ten PIC bierze 60nA w czasie spania.
    Chcialabym wobec tego wykozystac timer1.

    0
  • #27 07 Maj 2008 14:16
    Bigfoot
    Poziom 25  

    No niestety wiecej niz 60 nA...

    BF

    0
  • #28 07 Maj 2008 16:07
    Dr_DEAD
    Poziom 28  

    Marlena80 napisał:

    Chcialabym wobec tego wykozystac timer1.

    No to do dzieła. Generalnie upierałbym się przy najprostrzym rozwiązaniu czyli: Timer1 zliczający impulscy z kwarca zegarkowego 32.786kHz, Timer przy przepełnieniu budzi procesor co 2 sekundy. Procesor zlicza ilość obudzeń (15 obudzeń to 30 sekund, 7185 obudzeń to 3:59:30 ).
    Czyli przy obudzeniu 7185 załącza Mosfeta, przy 7200 wyłącza Mosfeta i resetuje ilość obudzeń do 0 i tak w kółko.

    0
  • #29 07 Maj 2008 16:39
    Bigfoot
    Poziom 25  

    Albo zastosowac preskaler 8 i zliczac do 40960 - wtedy przerwanie bedzie co 10 sekund (oszczednosc baterii). Trzeba bedzie tylko wyliczyc sobie dokladnie ile cykli zajmie reinicjalizacja timera po tych 10 sekundach aby uzyskac dokladne 10 sekund. Zadne problemy sie nie pojawia z timerem, jezeli go wczesniej wylaczymy. A dokladnie tez wiemy ile cykli zuzyjemy przy wylaczonym timerze - po wzieciu tego pod uwage dostaniemy dokladnie odmierzone 10 sekund.

    BF

    0
  • #30 12 Maj 2008 12:28
    Marlena80
    Poziom 10  

    Bigfoot napisał:
    Albo zastosowac preskaler 8 i zliczac do 40960 - wtedy przerwanie bedzie co 10 sekund (oszczednosc baterii). Trzeba bedzie tylko wyliczyc sobie dokladnie ile cykli zajmie reinicjalizacja timera po tych 10 sekundach aby uzyskac dokladne 10 sekund. Zadne problemy sie nie pojawia z timerem, jezeli go wczesniej wylaczymy. A dokladnie tez wiemy ile cykli zuzyjemy przy wylaczonym timerze - po wzieciu tego pod uwage dostaniemy dokladnie odmierzone 10 sekund.

    BF


    Code:
    LIST=12F683
    
    #include <p12f683.inc>
    ORG   00
    INITIALIZE;

    START   BCF STATUS,RP1;      BANK 1
       MOCLW B`00000000`;
       MOVWF TRISA;      OUTPUT
       CLRF ANSEL ;      digital O
       BCF STATUS, RP0;   BANK 0
       BCF GPIO,GP0;      INITIALIZING PIN 0 (MOSFET DRIVER)
       CLRF 0X7F;
       CLRF 0X20;

    MAIN   BSF 0X20;      GATE OR OUTPUT SET TO LOW

       BTFSC 0X7F,7;      CHECKING OR INPUT, IF BIT = 0 -> WE SKIP NEXT INSTRUCTION, IF BIT = 1 DO
       BSF 0X20, 0;      SET OUTPUT OF OR

       BTFSC 0X7F,6;
       BSF 0X20, 0;

       BTFSC 0X7F,5;
       BSF 0X20, 0;

       BTFSC 0X7F,4;
       BSF 0X20, 0;

       BTFSC 0X7F,3;
       BSF 0X20, 0;

       BTFSC 0X7F,2;
       BSF 0X20, 0;

       BTFSC 0X7F,1;
       BSF 0X20, 0;

       BTFSC 0X7F,0;
       BSF 0X20, 0;
       
       BTFSS 0X20,0;      CHECKING OUTPUT OF OR
       BSF GPIO, GPO;      SWITCH ON MOTOR IF OUTPOT OF OR IS 1

       


       GOTO MAIN;


    To jest moj kod. To co stanowi wiekszosc to zrobiona przeze mnie 8 wejsciowa bramkna OR, jek na wejsciu sa same zera, to na wyjsciu tez, i wtedy wlaczam silniczek.

    Wyjscie z Timera barde przepisywac do rejestru 0x20 co 3 cykl (wtedy osiagne 30 sekund).

    Pytanie jest ktory timer mam wykorzystac. Czy moge uzyc timer1? Chodzi o oszczednosc energi (bateria).

    I najwazniejsze pytanie na ktore nie ma odpowiedzi w pdfie.
    Gdzie jestesmy w programie jak timer wybudzi nas z trybu sleep.
    Czy w nastepnej linijce po sleep. Czy w MAIN?

    Prosze o pomoc, jak to widzicie?

    0