Popularny post BlackJack Napisano Luty 4, 2012 Popularny post Udostępnij Napisano Luty 4, 2012 W ostatniej części cyklu, spróbujemy napisać swój pierwszy program dla mikrokontrolera PIC16F690 umieszczonego na płytce Demo zestawu PICKIT 2. Naszym celem będzie stworzenie algorytmu pozwalającego uzyskanie na 4 diodach LED efektu podobnego do tego z filmu "Nieustraszony". Dodatkowo spróbujemy zaprzęgnąć do tego tyle sprzętowych funkcji CPU ile się da. Napiszemy np. własna procedurę DELAY, która będzie odmierzać czas za pomocą Timera 0. Na sam koniec przejrzymy także pobieżnie polskojęzyczną literaturę poświęconą mikrokontrolerom PIC. Środowisko MPLAB - jak pobrać, zainstalować Aby móc cokolwiek działać najpierw trzeba mieć w czym? Dlatego pierwszym krokiem jaki musimy zrobić jest pobranie sobie środowiska MPLAB z tej oto strony. Przewijamy na sam dół i pobieramy spakowane archiwum RAR. Po rozpakowaniu uruchamiamy SETUP. Poniższy obrazek pokazuje poszczególne kroki jakie pojawiły się u mnie na WIN7. Zasadniczo nie ma tu bardzo czego opisywać, wystarczy potwierdzać właściwie pojawiające się ekrany i tyle. PICi a pewne niuanse sprzętowe W naszym przykładzie użyjemy dosyć leciwego PIC16F690, ale nowsze odmiany procesorów mają nieco zmodyfikowane porty I/O i chciałbym na początku poruszyć pewną praktycznie istotną sprawę która w niektórych wypadkach może być przyczyną nieoczekiwanych kłopotów lub niespodzianek. Popatrzmy chwilę na rysunek niżej. Rysunek A przedstawia budowę końcówki RA0 portu RA procesora PIC16F690. Czerwona linia przedstawia przepływ danych podczas odczytu tej linii. Co to oznacza ? Wykonanie instrukcji/operacji typu czytaj-modyfikuj-zapisz powoduje odczyt wartości z wyprowadzeń portu, modyfikację odczytanej wartości w jednostce centralnej i zapisanie jej do rejestru zatrzaskowego portu. Wynika z tego pewna wada w przypadku kiedy np. chcemy odczytać sobie wartość którą zapisaliśmy do portu, jakiś czas temu, i nie mamy jej zapamiętanej nigdzie indziej. Otóż istnieje pewne ryzyko że podczas odczytu, na liniach portu wystąpią stany które zafałszują nam odczytaną z portu wartość. Warto o tym pamiętać przy pisaniu programów, bo czasem mogą się nam pokazać dane duchy. Jednak twórcy procesorów PIC, świadomi wady swoich rozwiązań postanowili coś z tym zrobić i nowsze procesory posiadają nieco zmodyfikowane porty I/O wg. rys.B. Dodano tutaj, dodatkowy rejestr LATx, który można odczytywać jakby była to zwykła komórka pamięci RAM, w której jest duplikat ostatnio zapisanej wartości do portu. Na rysunku zaznaczyłem to kolorem niebieskim. Oczywiście zapis do LATx powoduje zmianę stanów na pinach portu, tak samo jak zapis do rejestru PORTx, ale ważne jest to że odczyt z tego rejestru jest odporny na zakłócenia na liniach portu, bo nie jest fizycznie podczas tej operacji czytany port, tylko jego rejestr. Oczywiście budowa nowego portu powoduje że programy napisane na starsze wersje także na nim działają. Natomiast aby odczytać wartość z końcówek portu musimy odczytać rejestr PORTx, tak jak w starszych procesorach a nie LATx. Gdyby ktoś się pogubił przykłady w C. Najpierw dla PIC16F690. PORTA = zmienna lub stała; //zapis do portu A zmienna = PORTA; // odczyt z końcówek portu A Ale już np. dla PIC16F1936 z nowszą wersją portu mamy takie możliwości. PORTA = 128; // zapisz do portu A wartość 128 LATA = 120;// zapisz do rejestru LATA wartość 120 dane_z_portu = PORTA;// odczytaj dane z portu A dane_z_portu = LATA;// odczytaj dane z rejestru portu A Wynikają z tego następujące właściwości nowych wersji portów w PICach: ➡️ Zapis do portu możemy dokonywać przez zapis do PORTx lub LATx ➡️ Odczyt wartości z końcówek portu dokonujemy przez odczyt PORTx ➡️ Odczyt ostatnio zapisanej wartości do portu, dokonujemy przez odczyt rejestru LATx Innymi właściwościami portów zajmiemy się podczas opisywania programu. Ogólnie zawsze warto przejrzeć dokumentację danego procesora, ponieważ niektóre porty mogą nie posiadać podciągania do plusa, czy mogą mieć nieco zmodyfikowaną budowę, wynikającą z alternatywnych funkcji które mogą pełnić. Warto także wspomnieć o końcówce MCLR, otóż może ona pełnić rolę portu, ale tylko wejściowego, i nie posiada diody ochronnej do plusa zasilania, oraz podczas programowania pojawia się na niej spore napięci rzędu 12-13V o czym trzeba pamiętać. System przerwań i stos Bardzo ważna rzeczą odróżniającą PICi od np. AVR, jest system przerwań i stos. Otóż system przerwań jest jednopoziomowy. Oznacza to że mamy tylko jeden wektor przerwań, czyli jedną procedurę która zajmuje się obsługą przerwań od wszystkich urządzeń aktualnie mających aktywne zgłaszanie przerwań. Dodatkowo Stos na który odkładany jest adres do powrotu z procedury obsługi przerwania, a także w przypadku wywoływania procedur programowych, jest sprzętowy i ma ograniczony z tego powodu rozmiar, zależnie od rodziny procesorów i typu rdzenia od 2 do 32. W przypadku naszego PIC16F690 rozmiar stosu wynosi 8 słów 13-bitowych, co oznacza że podprogramy / procedury mogą się zagnieździć do 8 poziomów, potem czeka nas zwiecha procesora. Ponieważ Stos jest sprzętowy to nie mamy jako tako do niego dostępu, a wszelkie inne dane jak rejestr statusu i inne dane tracone podczas wykonywania podprogramu, muszą być zapamiętywane programowo. Ale w C nie musimy o to się martwić kompilator robi z automatu wszystko co trzeba, no chyba że sami zamieszamy za bardzo 😅 Pierwszy program. Efekt Knight Ridera Szczerze bardzo długo zastanawiałem się nad tym jaki, oraz jak przedstawić przykładowy program dla PICa. Ostatecznie zdecydowałem się chyba na nieśmiertelny efekt, znany z filmu "Nieustraszony", z tą różnicą że chciałem stworzyć uniwersalny algorytm, i wykorzystać maksimum bloków sprzętowych procesora, aby jak najwięcej pokazać. Dla tego też aby artykuł nie stał się książką postanowiłem trochę złamać ogólnie przyjęte reguły na forum. Otóż kod programu wkleiłem w całości, i dodałem do niego odpowiednie opisy, do których będę się odwoływał w tekście. Za pomocą Painta i noty katalogowej PIC16F690 stworzyłem także, taki schemat blokowy programu, pokazujący jakie sprzętowe bloki procesora wykorzystamy. Efekt który stworzyłem na płytce PICKIT2, można zobaczyć na filmiku niżej. Na 4 LEDach co prawda nie jest on powalający, ale algorytm programu jest na tyle uniwersalny, że rozbudowa go do 8 czy nawet 16 LEDów wymaga tylko kilku makijażowych zmian. Schemat blokowy do którego będę się także odwoływał. No dobra, program programem, ale najpierw muszę pokazać jak w środowisku MPLAB stworzyć sobie własny program. Najprostszym sposobem jest skorzystanie z kreatora projektu, który krok po kroku przeprowadzi nas przez tworzenie może nie tyle od razu programu co szablonu do jego tworzenia. Przy czym najpierw warto np. w Moje Dokumenty, utworzyć sobie folder o nazwie np. PIC_King_Rider, lub innej która będzie dla nas jednoznacznie definiować co w nim mamy. Potem uruchamiamy MPLAB, wybieramy Project > Project Wizard..., po czym w wybranym oknie klikamy Dalej >. W następnym oknie z listy rozwijanej wybieramy nasz procesor i klikamy przycisk Dalej > Następnie ukaże się okno w którym z rozwijanej listy Active ToolSuite: wybieramy Hi-Tech Uniwersal Toolsuite Może się okazać, choć nie powinno, że nie mamy żadnego kompilatora tego typu w polu niżej, oraz nie ma ścieżki dostępu w polu Location wtedy musimy sami wskazać ścieżkę dostępu do katalogu kompilatora Hi-Tech. Następnie ukaże się nam okno Step Four zatytułowane Add existing files to your project . w tym oknie możemy dodać do naszego projektu już istniejące pliki .C które mamy zamiar w nim wykorzystać. My nie dodajemy nic, kilkamy Dalej > Ostatnie okno jakie się nam ukaże to podsumowanie. klikamy w nim Zakończ W ten sposób utworzyliśmy nowy projekt. Po tej operacji otworzy się nam nowy pusty jeszcze projekt. Będziemy mieli na ekranie tylko 2 okienka, menadżer projektu w prawym górnym rogu, oraz pod nim okno komunikatów Output Klikamy ikonkę Nowy Plik i otworzy się nam okno o nazwie Noname. Kopiujemy do niego kod z forum i zapisujemy, w utworzonym przez nas katalogu pod nazwą main.C UWAGA!!! bardzo ważne aby plik miał rozszerzenie .C Potem w menadżerze projektu klikamy prawym przyciskiem na polu Surace file i menu które się nam rozwinie wybieramy Add Files.., po czym w otwartym oknie odnajdujemy nasz plik Main.C i zatwierdzamy wybór. Plik powinien się pojawić w menadżerze projektu w sekcji Surace File Teraz możemy skompilować nasz projekt, albo wybierając z menu Project > Build, lub naciskając F10. Jeżeli wszystko poszło zgodnie z naszym planem, to w oknie Output w zakładce Build, zobaczymy wynik kompilacji, ewentualne ostrzeżenia, podsumowanie kompilacji oraz na samym dole nasze upragnione zdanie ****** build successfull ******* 🙂 Jeszcze trzeba nasz program wgrać do procesora, ale zanim to zrobimy należy ustawić odpowiednio bity konfiguracyjne. Najprościej to zrobić z okna Configuration Bits, które wywołać można z menu Configure. My musimy zmienić dwa pierwsze ustawienia na INTOSCIO oraz WDT Disable. Należy także odhaczyć ptaszek pole Configurations Bits set in Code. Teraz możemy podłączyć programator, dla nas PICKIT 2. Potem Należy go wybrać w menu programmer > Select Programmer > PICKIT2 W oknie Output powinna pokazać się zakaldka PIKKIt2 w której wykryty powinien zostać programator, jak na screnie niżej. Teraz pozostaje nam tylko wybrać z tego samego menu Erase i potem Program i procesor powinien zostać zaprogramowany. Teraz możemy przejść do krótkiego opisu programu znajdującego się na listingu niżej. Chciałbym od razu podkreślić że moim celem nie jest robienie kursu o programowaniu w C PICów, są od tego kursy w internecie jak i 2 książki Chcę tylko przedstawić ogólnie działanie programu, i sposób w jaki wykorzystałem bloki funkcyjne procesora. W programie wykorzystałem dwa timery. Timer 0 wykorzystałem do zbudowania funkcji Delay_ms. Dla czego nie użyłem oferowanej przez kompilator funkcji __Delay_ms()? Bo jej dokładność nie jest jakoś powalająca, a chciałem nauczyć się przy okazji posługiwania się Timerami. Do prowadzenia obliczeń wartości dla Timerów w PICach można się posłużyć Tym oto programem. Program na tej stronie jest o tyle fajny że potrafi wygenerować także kod konfiguracyjny. Schemat blokowy Timera 0 znajduje się w szczególe A na rysunku blokowym, pod filmikiem. Jak widać T0 może być taktowany z 3 źródeł, Zegara CPU/4, wejścia T0, oraz zegara taktującego WatchDog. Czerwonym kolorem zaznaczono użytą przez mnie konfigurację. Do sterowania Timerem 0 służy rejestr OPTION_REG. Przy czym dwa najstarsze bity tego rejestru nie są powiązane bezpośrednio z Timerem 0 i maja alternatywne zastosowanie. Znaczenie jego poszczególnych bitów jest następujące: bit 7 ➡️ RABPU - włącza lub wyłącza rezystory podciągające na porcie A. bit 6 ➡️ INTEDG - decyduje na jakie zbocze ma reagować wejscie przerwania zewnętrznego INT na pinie RA2 bit 5 ➡️ T0CS - wybór taktowania timera 0, 1 - wejście T0CKI pin RA2, 0 - wewnętrzne taktowanie. bit 4 ➡️ T0SE - wybór zbocza, które będzie powodowało zwiekszanie licznika T0 przy taktowaniu z pinu RA2. bit 3 ➡️ PSA - wybór źródła dla preskalera który będzie taktował T0. Może to być zegar WatchDoga, lub wewnętrznego układu taktowania T0. bity 2:0 ➡️ PS2:0 - podział preskalera dla T0. Tutaj niektórzy zauważyli pewnie ciekawą właściwość Timera0. Otóż w pewnych warunkach, szczególnie kiedy działa WatchDog, Timera 0 praktycznie nie da się zatrzymać, bo nie ma ani preskalera o podziale 0:0, ani bitu Start/Stop. Jest to taka ciekawa właściwość tego timera, że pracuje on właściwie zawsze. Czyli zdarzenia związane z T0, jeżeli mamy aktywny WatchDog, można kontrolować tylko za pomocą kontrolera przerwań, i bitów T0IE (odblokuj przerwania od T0), oraz T0IF - flaga przerwania od T0. Drugą ważną właściwością jest to że zapisanie do timera (rejestr TMR0) wartości powoduje zatrzymanie zliczania równe dwóm cyklom maszynowym CPU. Ponieważ ja wykorzystałem T0, do odmierzania czasu w programie, z dokładnością 1ms, to pozostawiając domyślne ustawienia CPU,czyli zegar równy 4MHz, preskaler muszę ustawić na 1:4, a do licznika wpisać wartość 131, wtedy Timer 0 będzie zgłaszał mi przerwania co 1ms. Ale żeby tak się działo należy odblokować globalnie przerwania ustawiając bit GIE oraz T0IE na 1. Nie podałem nazw rejestrów, bo nie trzeba ich znać, w kompilatorze Hi-Tech C wystarczy znać definicje poszczególnych bitów, które pokrywają się w 99% z tymi z noty katalogowej i wykonać operację np. GIE = 1; Ale włączenie przerwań to nie wszystko trzeba jeszcze napisać procedurę ich, a właściwie jego obsługi, bo w PICach jak już wspomniałem system przerwań jest jednopoziomowy, czyli mamy tylko jedną procedurę obsługi przerwań od wszystkich źródeł. Spójrzmy więc na odnośnik nr 1 w programie niżej, pod którym mamy procedurę obsługi przerwań. Jak widać całe decyzja które przerwanie obsługujemy, i w jakiej kolejności to po prostu zwykłe Ify. Otóż obsługa przerwań nie jest zdefiniowana w standardzie ANSI i języka C. Jest traktowana jako jego jego niestandardowe rozszerzenie. W kompilatorze firmy Hi-Tech procedura obsługi przerwania. musi spełniać następujące wymagania: - nazwę procedury musi poprzedzać słowo kluczowe interrupt, np: static interrupt isr(void).Przy takiej definicji linkier tak umieszcza procedurę przerwania, by się zaczynała od wektora przerwania o adresie 0004hex: - procedura nie może zwracać żadnej wartości i nie może mieć argumentów; - procedura może wywoływać inne procedury; - program główny nie może wywoływać procedury przerwania, bo kończy się innym rozkazem powrotu; - obsługa przerwania musi programowo zerować wskaźniki (flagi) przerwania. Procedura obsługi przerwania jest wyposażona przez kompilator w automatyczne mechanizmy zachowania i odtwarzania niszczonych przez nią rejestrów, więc nie ma potrzeby się tym zajmować. Popatrzmy teraz na odnośnik nr 2 w programie, mamy pod nim naszą własną procedurę delay_ms, która wykorzystuje przerwania od Timera 0. Jak to działa ? Po wywołaniu procedury, najpierw sprawdzany jest warunek czy zadany czas nie jest równy 0, jeżeli tak to przyjmujemy 1ms. Oczywiście można to także tak zmodyfikować aby opuścić taką funkcję. Potem inicjujemy Timer 0 odpowiednią wartością, ustawiamy znacznik bitowy tms na 1 , przypisujemy do zmiennej mSek, wartość w ms ,którą chcemy odmierzyć i w pętli While(tms) czekamy na jego wyzerowanie, czyli tak długo aż procedura obsługi przerwania od timera 0 go nie wyzeruje. Kiedy to nastąpi ? Znowu przypatrzmy się odnośnikowi nr1. Jeżeli zostanie zgłoszenie przerwanie od Timera 0, czyli ustawiony znacznik T0IF to procedura obsługi przerwania, ładuje Timer nową wartością, konkretnie tak zmodyfikowana aby zachować odpowiednie czas odliczania, i testuje flagę tms, ponieważ jest ona teraz równa 1, to zmniejszana jest o 1 zmienna pomocnicza mSec, jeżeli osiągnie 0, to znaczy że czas został odmierzony i zerowana jest flaga tms, co wykrywa pętla While w funkcji Delay_ms i sie kończy odmierzanie zadanego czasu. Dodatkowo w procedurze obsługi przerwania zerowana jest flaga T0IF, aby możliwe było odebranie kolejnego przerwania od T0. Wspomniałem jednak o dwóch Timerach, więc co robi drugi timer ? Otóż Timer 1, steruje przetwornikiem ADC, a konkretnie wyzwala go ok 25x/sek, aby dokonywać pomiaru z potencjometru który steruje czasem przesuwu naszych diod LED. Odbywa się to całkowicie automatycznie, i na poziomie sprzętu, jest to możliwe dzieki modułowi CCP (Compare, Capture, PWM) powiązanemu z Timerem 1. Został on skonfigurowany w taki sposób że porównuje na bieżąco zawartość Timera 1 z wartością z rejestru komparatora, i kiedy się zrównają, to restartuje Timer 1, oraz wyzwala przetwornik ADC skonfigurowany do pracy w takim trybie. Konfigurację Timera 1 i modułu CCP przedstawiono na szczególe B rysunku blokowego. Jedyne co program musi zrobić to zainicjować moduł CCP, oraz Timer 1, przetwornik ADC i je uruchomić. Odpowiadają za to instrukcje poniżej odnośnika nr 3. Nie będę tu dokładnie opisywał modułu CCP i Timera 1, bo zajęło by sporo miejsca, odsyłam do noty katalogowej. Istotnym jest, że Timer 1 można uruchamiać i zatrzymywać w dowolnym momencie, w odróżnieniu do opisanego wyżej Timera 0. Ale zanim tego dokonujemy należy odpowiednio skonfigurować porty I/O procesora. Oprócz wspomnianych wcześniej rejestru PORTx, z portami są powiązane jeszcze przynajmniej 3 inne ważne rejestry: ➡️TRSIx - Tri-state Port Register - decyduje o kierunku linii I/O. Jeżeli bit jest = 1 to linia jest wejściem, jeżeli 0 to wyjściem. ➡️WPUx - Weak Pull-Up Port register - decyduje czy port jest podciągany do plusa. 1 = tak, 0 = nie. ➡️ANSEL oraz ANSELH - decydują o tym czy dany pin jest w trybie Analogowego wejścia, czy portu I/O. 1 = port analogowy, 0 = port cyfrowy. Konfiguracja protów jest dokonywana na samym początku funkcji Main. Chciałbym się natomiast nieco zatrzymać przy przetworniku ADC, otóż jest on 10-bitowy, ale ja wykorzystałem tylko 8 bitów, tak konfigurując go ,a by odczytać je od razu. Do konfiguracji przetwornika AC, służą dwa rejestry ADCON0 oraz ADCON1. Poszczególne bity mają następujące znaczenie, od B7 rejestru ADCON0: Bit 7 - ADFM - decyduje on o sposobie reprezentacji wyniku w rejestrach ADRESH, ADRESL. Jeżeli jest ustawiony na 0, to wynik jest dosunięty do lewej, jeżeli na 1 to do prawej. Pokazuje to rysunek (na samym dole). Tą właściwość właśnie wykorzystałem w swoim programie, aby odczytywać tylko 8 najstarszych bitów wyniku z rejestru ADRESH. bit 6 - VCFG - wybór napięcia odniesienia dla przetwornika ADC. Bity 5-2 CHS3:0 - wybór kanału ADC.. bit 1 - GO/DONE - bit staru/statusu konwersji ADC. Jest automatycznie zerowany po zakończeniu konwersji, jego ustawienie na 1 rozpoczyna ją. Może być automatycznie ustawianie na 1 przez moduł CCP. bit 0 ADON - bit aktywacji przetwornika ADC. W rejestrze ADCON1, mamy tylko bity odpowiedzialne za taktownie przetwornika ADC, przy czym mamy do wyboru albo wewnętrzny zegar RC o częstotliwości ok 500KHz, wykorzystywany w trybie auto pomiaru, lub może wybrać dzielnik dla zegara CPU, przy czym zalecane jest takie jego dobranie aby czas konwersji mieścił się w przedziale od 2 do 6 us. Główny program obsługujący diody LED mieści siew nieskończonej pętli FOR(;😉 Korzysta on z 5 zmiennych i jednej stałej. Stała diody określa ile mamy diod do wysterowanie, i powinna być potęgę liczby 2 reprezentującą ilość LED,np. 4-LEDy = 16, 6 LEDów = 64.Zmienna Pot przechowuje przekonwertowaną wartość z potencjometru na płytce, i jest jednocześnie odmierzanym czasem w funkcji Delay_ms. Zmienne bitowe kierunek oraz znacznik określają odpowiednie kierunek ruchu, tzn. czy przesuwamy zapalone LEDy w lewo czy w prawo. Natomiast znacznik określa czy na port wystawiamy dane z zmiennej led czy pomocniczej zmiennej s. Zmienne te w zależności od wartości, znaczników kierunek, znacznik przesuwane bitowo w lewo lub w prawo, oraz dokonywane są na nich odpowiednio albo operacja maskowanie AND (&), albo ustawiania OR (|) W ten sposób podczas kolejnych przejść pętli, odpowiednie diody gasną lub się zapalają. // Program Nieustraszony 2012 // CPU - PIC16F690 taktowani INTOSC = 4MHz // Autor: BlackJack #include <htc.h> unsigned char Pot; unsigned char temp; unsigned char led; unsigned char s; static unsigned int mSec; unsigned int msek; struct { char tms:1; char flag:1; char kierunek:1; char znacznik:1; } bits; #define tms bits.tms #define flag bits.flag #define kierunek bits.kierunek #define znacznik bits.znacznik #define diody 16 /* odnośnik nr 1 */ /* OBSŁUGA PRZERWAŃ W PROCESORZE */ static void interrupt int_tmr0(void) { // Obsługa przerwania od Timera 0 if(T0IF){ //T0 interrupt TMR0 = TMR0 + 131; //4 MHz/4/8/125=1KHz T=1ms if(tms==1){ // bitowy wskaźnik odliczania opóźnienia --mSec; // dekrementacja licznika odliczanego opóźnienia if(mSec==0) // jeżeli osiągnięto koniec czasu to : tms =0; // odliczanie opóźnienia zostało zakończone } T0IF = 0; // zerowanie wskaźnika przerwania } // Obsługa przerwania od modułu ADC if(ADIF){ Pot = ADRESH; // odczytaj wartość z ADC flag = 1; // ustaw flagę końca konwersji AD ADIF = 0; // zeruj flagę przerwania od ADC } } /* odnośnik nr 2 */ /* NASZA WŁASNA PROCEDURA DELAY UŻYWAJĄCA Timer0 DO ODLICZANIA CZASU */ void delay_ms(unsigned int msek) { // zabezpieczenie przed zerowym czasem if(msek > 0) mSec = msek; else mSec = 1; TMR0 = 131; // wartość początkowa do T0 tms = 1; // ustaw znacznik odliczania czasu while(tms); // czekaj na zerowanie znacznika } /* ODNOŚNIK NR.1 */ //Pętla główna programu void main(void) { /* konfiguracja portów I/O CPU */ //Port A PORTA = 0x00; //wyzeruj port A ANSEL = 0x01; //końcówka RA0 jako wejście analogowe TRISA = 0x01; // port RA0 jako wejście WPUA = 0b00110110; //wyłącz Pull-UP na RA0 reszta PORTu A podciągana do plusa //PORT C PORTC = 0x0; TRISC = 0xF0; //Ponieważ nie używamy PORTu B, możemy zostawić ustawienia domyślne po RESTRcie. /* konfiguracja Timera 0 */ OPTION_REG = 0b00000010; // T0 - preskaler 1/16, przerwania zablokowane. TMR0 = 131; // wartość początkowa licznika T0IE = 1; // odblokuj przerwania od T0 GIE = 1; // odblokuj kontroler przerwań /* Odnosnik nr 3 */ /* konfiguracja przetwornika ADC */ ADCON1 = 0x50; //dzielnik na FCPU 16 ADCON0 = 0x0; //Kanał 0, VREF = VDD, wynik do Lewej ADON = 1; // odblokuj przetwornik ADC ADIE = 1; // odblokuj przerwania od ADC /* konfiguracja Timera 1 */ T1CON = 0; //T1 taktowany FOSC/4, preskaler = 1 TMR1 = 0; //zeruj T1 CCP1CON = 0x0B; // ustaw CCP1 w tryb Compare mode, trigger special event CCPR1H = 99; // ustaw auto przeładowanie na 25547. CCPR1L = 203; // wyzwalanie ADC 25x/sek T1CON = 1; // start T1, od tej chwili przerwania od CCP będą // wyzwalały przetwornik ADC. Pot = 125; // wartość startowa dla potencjometru. flag = 1; led = 1; s = led; znacznik = 0; kierunek = 0; for (;;) { if(flag ==1){ // odczytaj i przekonwertuj dane z potencjiometra Pot >>= 4; Pot &= 15; if(Pot < 3 ) Pot = 3; Pot = Pot * 8; flag = 0; } PORTC = led; // wystaw na PORTC dane z zmiennej led if(znacznik==0){ // znacznik = 0 if(kierunek==0) led <<= 1; // kierunek = 0 to przesuwamy led o jeden w lewo. else led >>= 1; // w przeciwnym wypadku o jeden w prawo led |= s; // dokonujemy ustawienia bitów uwzględniając zm. pomocniczą s za pomocą operacji OR znacznik = 1; // zmieniamy znacznik na 1 } else { // jeżeli znacznik był równy 1, a nie 0 if(kierunek==0) s<<= 1; // a kierunek = 0, to przesuwamy zm.po. s o 1 w lewo else s >>= 1; // lub w o 1 w prawo w przeciwnym wypadku led &= s; // dokonujemy poprawki na zmienną led, maskując niepotrzebne bity operacją AND znacznik = 0; // znaczki ustawiamy na 0 } delay_ms(Pot); // odczekujemy czas świecenia LEDów if(led==0){ // tutaj sprawdzamy czy nie doszliśmy do skrajnej pozycji w lewo lub prawo. kierunek = !kierunek; // i modyfikujemy odpowiednio zm.bit. kierunek led =1; s = 1; delay_ms(Pot); // odczekujemy także czas zwłoki, w zmianie kierunku. } if (led==diody){ kierunek = !kierunek; delay_ms(Pot); } } } Literatura Tomasz Jabłoński - "Mikrokontrolery PIC16F8x w praktyce", wydawnictwo BTC. Książka moim zdaniem dobra, właściwie jest to przetłumaczenie noty kat. Opisuje tylko programy w ASM, i skupia się na najgorszym chyba PICu na rynku, bo procesor 16F84 nie dość że jest drogi, to jeszcze praktycznie prawie nic nie ma na pokładzie. Ocena 4,5/6. Tomasz Jabłoński - "Mikrokontrolery PIC16F. Przykłady w C dla początkujących" Tutaj trochę się rozpisze bardziej, ponieważ posiłkowałem się właśnie tą książką pisząc artykuł. Tak źle napisanej książki "dla początkujących", jeszcze w życiu w rękach nie miałem. Dla czego tak piszę. Otóż dla mnie książka dla początkujących, powinna zawierać w sobie choćby jeden, jedyny program którego listing jest w całości, oraz którego stworzenie jest pokazane krok po kroku od zera. Tutaj nic takiego nie ma. Co prawda jest pokazane w project wizard, jak zrobić szablon, projektu, ale też jest zrobione nie do końca czytelnie. Przedstawione programy, to tak naprawdę tylko wyrwane z całego kontekstu funkcje, które trzeba sobie samemu odpowiednio przyporządkować. Autor pisząc książkę z podtytułem "dla początkujących", zakłada w domyśle że początkujący zna podstawy C, nie zobaczymy tu żadnego wprowadzenia do zmiennych, opisu podstawowych typów, czy zasad deklarowania funkcji., poza funkcją obsługi przerwań. Moja ocena 2/6 w skali szkolnej. Nie polecam jak ktoś nie zna C, choćby tego z PCta. Stanisław Pietraszek - "Mikrokontrolery PIC12Fxxx w praktyce", BTC. Tą książkę trochę ciężko mi ocenić, bo jeszcze jej w całości nie przetrawiłem. Ogólne wrażenie jest dobre, choć ze względu na rozwój rodziny PIC12 jest ona trochę dzisiaj nie na czasie jeżeli chodzi o możliwości jakie oferują nowe PIC12, ale nie jest to jakaś wielka wada. Tyuł opisuje programy w ASM, ale warto się nim zainteresować jak ktoś chce używać 8 końcówkowych PIC12. Ocena 5/6. Stanisław Pietraszek - "Mikroprocesory jednoukładowe PIC", Helion. Zasadniczo nie bardzo wiem co o tej książce napisać, bo taki przegląd 8-bitowych PICów od środka. Autor nie skupia się tu na jakimś konkretnym MCU, tylko opisuje różnice, poszczególnych rdzeni i ich możliwości. Książka raczej kiepska do nauki, raczej przydatna jako kompeduim wiedzy podczas wyboru, procesora i projektowania układu. Co dalej z PICami ? No cóż to ostania część wprowadzenia. Co prawda udało mi się dorwać PICa16F1507, z CLC na pokładzie ale nie wiem czy dam rady dopisać artykuł uzupełniający o tej ciekawej funkcji, zaimplementowanej w najnowszych odsłonach PIC10/12/16. Czy warto temat drążyć ? Moim zdaniem na pewno, choć nie ma dobrego polskojęzycznego wsparcia dla PICów. Ogólnie początki mogą być trudne, nawet bardzo, ale wydaje mi się że są to na tyle wdzięczne procesory że warto. Linki do poprzednich części : Część 2: https://www.forbot.pl/forum/topics20/programowanie-mikrokontrolery-microchip-pic-czesc-2-vt6634.htm Część 1: https://www.forbot.pl/forum/topics20/programowanie-mikrokontrolery-microchip-pic-czesc-1-vt6623.htm __________ Komentarz dodany przez: Bobby Poprawiłem część błędów ortograficznych, interpunkcyjnych i literówek, niestety zdążyłem tylko do połowy, później dokończę 😉 🤯 - tak jest źle, ale dzięki jakiś schorowany jestem i tak nie mam siły bardzo w edytorze tych małych literek przeglądać. Masz piwko u mnie. 3 Link do komentarza Share on other sites More sharing options...
mog123 Luty 4, 2012 Udostępnij Luty 4, 2012 Knight Ridera nie King Rider 😉 1 Link do komentarza Share on other sites More sharing options...
GAndaLF Luty 4, 2012 Udostępnij Luty 4, 2012 Właśnie to samo miałem napisać. Chodziło ci o "Knight Rider" - ten serial z Hasselhoffem i gadającym samochodem. Link do komentarza Share on other sites More sharing options...
dondu Luty 4, 2012 Udostępnij Luty 4, 2012 Dodam najnowszą książkę (rok 2012): Mikrokontrolery PIC w praktycznych zastosowaniach Paweł Borkowski http://helion.pl/view/5314./mipicp.htm Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
BlackJack Luty 4, 2012 Autor tematu Udostępnij Luty 4, 2012 Knight Ridera nie King Rider Dzięki już poprawiłem. 🙂 Co do książek to jest jeszcze: Autorzy: Tomasz Jabłoński, Krzysztof Pławsiuk Nie miałem okazji jej mieć w ręku, ale po spisie treści jakiś rewelacji nie wróżę, jeżeli chodzi o omówienie języka C i jego podstaw. Link do komentarza Share on other sites More sharing options...
Grzesieq94 Luty 6, 2012 Udostępnij Luty 6, 2012 Bardzo ciekawy artykuł, ale na początku mógłbyś dodać linki do wcześniejszych części kursu 🙂 Link do komentarza Share on other sites More sharing options...
mgiro Kwiecień 28, 2012 Udostępnij Kwiecień 28, 2012 Bardzo fajny i pomocny artykuł. Właśnie próbuję uruchomić ten projekt pod nowym środowiskiem MPLAB X. Mam problem z wgraniem wsadu do mikroprocesora. BlackJack, może opiszesz krótko, jak przejść z MPLABa do MPLAB X? Pojawiają mi się takie błędy: make[2]: *** No rule to make target `x86)\HI-TECH Software\PICC\9.83\include\pic.h)', needed by `build/default/production/main.p1'. Stop. make[1]: *** [.build-conf] Error 2 make: *** [.build-impl] Error 2 Link do komentarza Share on other sites More sharing options...
tomek_j Maj 21, 2012 Udostępnij Maj 21, 2012 Tomasz Jabłoński - "Mikrokontrolery PIC16F. Przykłady w C dla początkujących" Tutaj trochę się rozpisze bardziej, ponieważ posiłkowałem się właśnie tą książką pisząc artykuł. Tak źle napisanej książki "dla początkujących", jeszcze w życiu w rękach nie miałem. Dla czego tak piszę. Otóż dla mnie książka dla początkujących, powinna zawierać w sobie choćby jeden, jedyny program którego listing jest w całości, oraz którego stworzenie jest pokazane krok po kroku od zera. Tutaj nic takiego nie ma. Co prawda jest pokazane w project wizard, jak zrobić szablon, projektu, ale też jest zrobione nie do końca czytelnie. Przedstawione programy, to tak naprawdę tylko wyrwane z całego kontekstu funkcje, które trzeba sobie samemu odpowiednio przyporządkować. Autor pisząc książkę z podtytułem "dla początkujących", zakłada w domyśle że początkujący zna podstawy C, nie zobaczymy tu żadnego wprowadzenia do zmiennych, opisu podstawowych typów, czy zasad deklarowania funkcji., poza funkcją obsługi przerwań. Moja ocena 2/6 w skali szkolnej. Nie polecam jak ktoś nie zna C, choćby tego z PCta. pare rzeczy 1. dla poczatkujacyh nie oznacza dla poczatkujacych w jezyku C. Zostało to wyraźnie napisane we wstępie dostepnym w formacie pdf na stronach wydawnictwa. Mozna przeczytac i ocenić przed kupieniem - tak samo jak spis treści. To zreszta jeden z podstawowych zarzutów dla wszsytkich ksiązek o programowaniu uC z języku C - dlaczego nie ma opisu języka. Nie ma bo dokładny opis to druga spora ksiąka, a opis po łebkach - to nowy zarzut, że po łebkach. Ale Ok tytuł nie jest zbyt szczęśliwy - miła byc inny - wydawnictwo zadecydowało. 2. zarzut podstawowy - brak kompletnych listingów. Tego zupełnie nie rozumiem. Wszsytkie opisane w ksziążce projekty zostały umiesczone w formie kompletnych projektów dla MPLAB IDE V.8 na stronie wydawnictwa. Dla leniwych link http://www.btc.pl/index.php?ukey=product&productID=177288 Drukowanie kompletnych listingów to kompletny bezsens, chyba, ze ktoś nie ma dostepu do komputera - sa tacy? . Chyba łatwiej jest pracowac z gotowym projektem, tym bardziej ze wszsytko co konieczne jest za legalnie i darmochę do pobrania z sieci. Fragmenty listingów umiesczone na papierze są tylko obrazowaniem własnie opisywanych problemów. Autorowi kursu sie nie chciało? 3. cała para została skierowana na konkretne działające projekty z dokładnym opisaniem co jak działa. Jezyk C jest tylko narzędziem, które ma zmusić uC do tego działania i tak został potraktowany - ksiązka nie jest i nie miąła byc przewodnikiem po porogramowaniu w C. O tego sa inne bardzo dobre pozycje. 4. Oczywiście można mieć o książce zdecydowanie złe zdanie - o polskich książkach technicznych ma się zazwyczaj u nas złe zdanie, ale drogi Autorze - pisanie że listingi sa wyrwane z kontekstu, skoro masz do dyspozycji cały gotowy projekt dla MPLAB IDE jest jednak naduzyciem. Pozdawiam Tomasz Jabłoński Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »