Elektroda.pl
Elektroda.pl
X
CControls
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

PIC16F1459 - Przejście z AVR (Arduino) na PIC

mariomario 08 Cze 2015 20:27 7017 47
  • #1 08 Cze 2015 20:27
    mariomario
    Poziom 18  

    Witam,

    dotychczas programowałem mikrokontrolery AVR na poziomie średnim (Arduino w Arduino IDE).
    Dostałem niedawno kilka całkiem fajnych PIC'ów i chciałbym je zaprogramować.

    I tu przychodzą pytania - czym programować (programator - najlepiej jak najtańszy lub jakieś proste projekty, które samemu można szybko wykonać) oraz w jakim środowisku (może jakieś kursy/tutoriale najlepiej w języku polskim, ale angielski też może być).

    mam kilka "gołych" układów PIC (PIC12LF1552 , PIC16F1455 , PIC12F675 , PIC16F1459) i chciałbym je jakoś wykorzystać ;)

    0 29
  • CControls
  • Pomocny post
    #2 08 Cze 2015 21:02
    don diego
    Poziom 32  

    Jeśli chcesz się bawić PICami, to najlepiej zainwestuj w PICKit 3. Obsługuje chyba wszystkie PICi. Z tańszych opcji, kiedyś używałem klona ICD2, ale MplabX go nie obsługuje.

    1
  • #3 08 Cze 2015 21:11
    mariomario
    Poziom 18  

    don diego napisał:
    Jeśli chcesz się bawić PICami, to najlepiej zainwestuj w PICKit 3. Obsługuje chyba wszystkie PICi. Z tańszych opcji, kiedyś używałem klona ICD2, ale MplabX go nie obsługuje.


    Też zdążyłem doczytać że to chyba najlepsza opcja dla PIC'ów :) ale czytałem też że oryginalne kosztują ok 150-200zł a znalazłem na "chińskich" stronach za ok 14$ czyli jakieś 52zł w tym już wysyłka - i mam pytanie czy to są te oryginalne ? 50zł to niby nie tak dużo, choć więcej niż USBasp dla AVR .. ;)

    Dodatkowo zauważyłem że są uP co mają w nazwie literę "L" np PIC16F1459 oraz ten sam z ta literą PIC16LF1459. Czym się różnią ?

    0
  • Pomocny post
    #5 08 Cze 2015 21:28
    dondu
    Moderator Mikrokontrolery Projektowanie

    mariomario napisał:
    ... i mam pytanie czy to są te oryginalne ?

    Myślę, że znasz odpowiedź :)

    mariomario napisał:
    Dodatkowo zauważyłem że są uP co mają w nazwie literę "L" np PIC16F1459 oraz ten sam z ta literą PIC16LF1459. Czym się różnią ?

    Oj zaglądnij do dokumentacji: http://ww1.microchip.com/downloads/en/DeviceDoc/40001639B.pdf

    Już na pierwszej stronie najważniejsza różnica:

    Cytat:
    Special Microcontroller Features:
    • Operating Voltage Range:
    - 1.8V to 3.6V (PIC16LF145X)
    - 2.3V to 5.5V (PIC16F145X)


    EDIT:
    mariomario napisał:
    50zł to niby nie tak dużo, choć więcej niż USBasp dla AVR .. ;)

    Pickit 3 to także debugger, czyli o niebo więcej niż zwykły programator USBasp.
    Dla AVR debuggery są tak samo w cenie jak te Microchipa, czy innych producentów.

    1
  • #6 08 Cze 2015 21:54
    mariomario
    Poziom 18  

    Wyczytałem też że w PIC'ach jest możliwość programowania niskonapięciowego i wysokonapięciowego - jak rozróżnić, które jakim napięciem trzeba programować ?

    0
  • Pomocny post
    #7 08 Cze 2015 22:08
    dondu
    Moderator Mikrokontrolery Projektowanie

    Nie przejmuj się tym. Pickit 3 załatwi za Ciebie takie sprawy - to bardzo dobry programator/debugger.

    1
  • #8 11 Cze 2015 08:00
    mariomario
    Poziom 18  

    Zamówiłem PICkit 3 :) (klona wyglądającego jak oryginał za 14 $, w komentarzach ludzie odpowiadali że programator ten w 100% działa z MPLAB'em).

    Mam jeszcze pytanie - czy znacie jakieś dobre książki lub strony (mogą być w języku angielskim choć lepiej gdyby były po polsku) poświęcone programowaniu PIC'ów lub jakieś fora ?

    0
  • Pomocny post
    #10 11 Cze 2015 20:32
    Marico
    Poziom 19  

    Nie wiem czy wybór 16F jest dobry, jeśli programowałeś Atmegi powinieneś raczej kierować się ku układom 18F, które są bardziej konkurencyjne dla Atmegi, mają więcej RAM niż 16F no i konstrukcyjnie przyjazne językowi C. 12F i 16F to układy prostsze, z reguły chętniej programowane asemblerem niż C.

    0
  • CControls
  • Pomocny post
    #11 11 Cze 2015 23:09
    szymonjg
    Poziom 15  

    Z polskich autorów książek o microchipie kojarzę Tomasza Jabłońskiego. Ma całkiem fajną książkę w której opisał kilka programów w języku C na jakiegoś PIC12 i na nieśmiertelnego PIC16F84. O assemblerze na PIC16F84 jest dobra książka Bohdana Borowika. Tytułu nie pamiętam, ale miała ona na okładce małe dziecko ciągnięte wagonik lub wózeczek. Z angielsko-języcznych tytułów podobno Włoch o nazwisku di Jasio pisał dobre książki.

    Wiele problemów ja rozwiązywałem szukając informacji po forach np. kopiując do googla nieznany komunikat kompilatora o błędzie.
    Nie wiem czy do starszych PICów też, ale do PIC18 oprócz dokumentacji do są jeszcze dodatkowo specjalne Reference Manual'e opisujące szczegółowiej działanie poszczególnych modułów. W sumie działanie tych modułów jest podobne w obydwu tych rodzinach, także poczytać nie zaszkodzi.

    1
  • #12 12 Cze 2015 08:05
    mariomario
    Poziom 18  

    Marico napisał:
    Nie wiem czy wybór 16F jest dobry, jeśli programowałeś Atmegi powinieneś raczej kierować się ku układom 18F, które są bardziej konkurencyjne dla Atmegi, mają więcej RAM niż 16F no i konstrukcyjnie przyjazne językowi C. 12F i 16F to układy prostsze, z reguły chętniej programowane asemblerem niż C.


    Mam też jedną sztukę PIC18F14K50 z obsługą USB 2.0 i jak nauczę się programować PIC'e (jak przyjdzie mi zamówiony programator PICkit 3) to będę chciał wgrać na ten mikrokontroler bootloader tak aby programować go bezpośrednio z USB ( choć wiem że nie ma w tej "kostce" zbyt dużo pamięci bo tylko 16KB ;) ).

    Panowie jeszcze mam pytanie - czy znacie jakieś dobre strony z bibliotekami dla PIC'ów ? bo nie ukrywam że pierwszy projekt jaki chcę zrealizować (który już zrealizowałem na AVR i działa poprawnie) będzie pomiar napięcia na 1 linii ADC i w zależności od pomiaru program będzie czekał na poprawne napięcie, a jeśli się pojawi to załączy czujnik temperatury na DS18B20 i jeśli ten wskaże niższą temperaturę od zadanej to ma załączyć MOSFET-a ;). A całość będzie od samego początku wyświetlać informacje na LCD HD47780... Ok i tu rodzi się pytanie - czy znajdę gdzieś gotowe biblioteki dla DS18B20 oraz HD47780 najlepiej dla rodzin PIC12 / PIC16 / PIC18 (będę testować projekt na każdej rodzinie) ?

    Dodatkowo kolejne pytanie :D .. jak ustawiać prędkość taktowania mikroprocesora ?
    PIC16F1459 - Przejście z AVR (Arduino) na PIC

    Przypuśćmy że chcę ustawić PIC12LF1552 na 1MHz (internal) - jak mam ustawić bit FOSC ?

    0
  • Pomocny post
    #13 12 Cze 2015 08:25
    szymonjg
    Poziom 15  

    Na HD47780 w języku C biblioteki są uniwersalne. Trzeba tylko przedefiniować nazwy portów na te Microchipowe. Szkopuł może być w tym, że ustawiając port jako wyjście do rejestru wyboru kierunku PICach wpisujemy 0 a w AVR'ach i ARM'ach jest chyba na odwrót. Popularna biblioteka do tego wyświetlacza jest na stronie radzio.dxp napisana przez Radosława Kwietnia.

    Aby skonfigurować taktowanie to po pierwsze w programowalnych bitach konfiguracyjnych wybiera się źródło taktowania na Internal Oscilator. Nie wiem czy w nowym MplabX też, ale w starym Mplab 8.x po stworzeniu projektu dla danego mikrokontrolera wybieramy w menu Configure->Configuration Bits... i tam mamy wszystkie te bity programowalne.
    Gdy już wybierzemy sobie źródło taktowania jako wewnętrzny oscylator to już w kodzie podczas działania programu możemy ustawiać jego taktowanie wpisując odpowiednią wartość do bitów IRCF rejestru OSCCON. Szczegóły w dokumentacji w dziale Oscilator Module.

    1
  • Pomocny post
    #14 12 Cze 2015 08:28
    Marek_Skalski
    Moderator Projektowanie

    @mariomario
    Znalazłeś rysunek dystrybucji sygnałów zegara, ale do opisu rejestrów już nie przewinąłeś? Zapoznaj się z treścią strony 42. w DS40001674E; w szczególności: REGISTER 5-1: OSCCON: OSCILLATOR CONTROL REGISTER i nie zadawaj zbędnych pytań.

    3
  • #15 12 Cze 2015 19:45
    mariomario
    Poziom 18  

    Marek_Skalski napisał:
    @mariomario
    Znalazłeś rysunek dystrybucji sygnałów zegara, ale do opisu rejestrów już nie przewinąłeś? Zapoznaj się z treścią strony 42. w DS40001674E; w szczególności: REGISTER 5-1: OSCCON: OSCILLATOR CONTROL REGISTER i nie zadawaj zbędnych pytań.


    ok znalazłem :)

    Kod: c
    Zaloguj się, aby zobaczyć kod


    choć mam kolejne pytanie.. Jak ustawić np tylko jedną nóżkę np. RA0 (a nie cały port) aby była tylko wyjściem i zapisać na niej stan HIGH ?

    W Arduino IDE (dla AVR) wg. mnie łatwiej było można to zdefiniować, w "czystym" języku C jeszcze nie programowałem mikrokontrolerów:

    ...
    byte LED = SCK;
    ...
    pinMode(LED, OUTPUT);
    ...
    DigitalWrite(LED, HIGH);
    ...






    //Edit//
    Chyba sam odpowiedziałem na swoje pytanie - proszę o sprawdzenie poprawności poniższego fragmentu kodu

    PIC16F1459 - Przejście z AVR (Arduino) na PIC

    Dla pinu RA0 (nóżka 7, PIC12LF1522)
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #16 15 Cze 2015 10:40
    szymonjg
    Poziom 15  

    Ustawianie poszczególnych pinów, czy też w ogóle poszczególnych bitów w rejestrach zależy od tego czy i jak są one definiowane w bibliotekach kompilatora.

    Zawsze można zapisywać wartości całymi rejestrami, albo używać maskowania bitów.

    A powyższy kod jest zły po próbujesz ustawiać bity z PORTA w rejestrach PORTB

    1
  • #17 15 Cze 2015 22:09
    mariomario
    Poziom 18  

    szymonjg napisał:
    Ustawianie poszczególnych pinów, czy też w ogóle poszczególnych bitów w rejestrach zależy od tego czy i jak są one definiowane w bibliotekach kompilatora.

    Zawsze można zapisywać wartości całymi rejestrami, albo używać maskowania bitów.

    A powyższy kod jest zły po próbujesz ustawiać bity z PORTA w rejestrach PORTB


    Kod: c
    Zaloguj się, aby zobaczyć kod


    powyższe przykłady napisałem poprawnie ?

    0
  • Pomocny post
    #18 15 Cze 2015 23:25
    94075
    Użytkownik usunął konto  
  • #19 19 Cze 2015 08:08
    mariomario
    Poziom 18  

    Tak więc dotarł już do mnie programator PicKit 3 (działa tak jak powinien, testowałem go na kilku różnych PIC'ach prostym "blinkiem")i chcę zacząć naukę programowania PIC'ów , chciałbym teraz podłączyć 1x czujnik temperatury DS18B20 bez wyświetlacza (aby PIC zapamiętywał temperaturę do zmiennej w °C) i pytanie jak przerobić poniższy kod (poniższy kod obsługuje wyświetlacz i 2 czujniki ds18b20) aby zadziałał na którymś z pic'ów -> PIC12LF1552 / PIC12F675 / PIC12F1840 (dopiero uczę się ustawiać rejestry I/O , WTD, pomiar ADC, rejestry FOSC itp. i to sprawia mi największą trudność jak narazie więc proszę o wyrozumiałość.. "programowanie AVR (Arduino) w Arduino IDE nie wymagało ode mnie znajomości tych rejestrów" ;) )

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • Pomocny post
    #20 19 Cze 2015 09:03
    Urgon
    Poziom 36  

    AVE...

    To, co Cię interesuje znalazłem po kilku chwilach z Google-fu: http://www.dutchforce.com/~eforum/index.php?showtopic=43185
    Jedna rada na przyszłość: czytaj dokładnie noty katalogowe i erraty dla mikrokontrolerów. Normalne środowisko programistyczne nie ułatwia niczego, dlatego będziesz ustawiał wiele rejestrów ręcznie, chyba że zaczniesz używać gotowych bibliotek. Cierpliwym musisz być i spokojnym, gdyż początki zawsze są trudne.

    2
  • #21 24 Cze 2015 11:32
    mariomario
    Poziom 18  

    Zaczynam powoli rozumieć o co chodzi z rejestrami, aktualnie bawię się PIC12F1840 (7KB flash, 256B RAM, 256B EEPROM, PDIP8).
    Czy moje poniższe ustawienia są poprawne ?

    Kod: c
    Zaloguj się, aby zobaczyć kod


    0x50 0x49 0x43 :)

    0
  • #22 24 Cze 2015 12:33
    szymonjg
    Poziom 15  

    Nie potrzebnie pytasz. Wystarczy tylko sprawdzić w dokumentacji. Po co ma ktoś to sprawdzać za Ciebie jak równie dobrze możesz zrobić to sam. Zresztą niektóre opisy masz już z dokumentacji chyba więc na pewno do niej zaglądałeś.

    Więc jeśli już wiesz co oznaczają poszczególne bity w rejestrach to nie pozostaje Ci nic innego jak tylko skompilować kod i wgrać do procesora. I jeśli będzie działał tak jak trzeba to znaczy, że jest dobrze, a jeśli nie to próbuj innych ustawień aż do skutku.
    Jak już wyczerpiesz wachlarz możliwości to wtedy dopiero zadaj pytanie na forum opisując co i jak działa lub nie.

    Przypomnę tylko, że zapis rejestrów w funkcji main (i innych) podczas działania programu możemy robić tylko do tych rejestrów które są "writable" (literka W przy nazwie bitu w tabelce w dokumentacji) A rejestry które nie są "writable" a tylko "programable" zapisujemy w inny sposób, który opisałem już wcześniej na przykładzie tego starszego MPlaba.

    Poza tym MCLRE nie jest rejestrem a tylko bitem rejestru, a w przypadku tego mikrokontrolera, słowa CONFIGURATION WORD 1.

    Poprawne są te zapisy co do których kompilator nie zgłasza błędu.

    0
  • Pomocny post
    #23 24 Cze 2015 21:23
    p.kaczmarek2
    Poziom 23  

    mariomario napisał:


    mam kilka "gołych" układów PIC (PIC12LF1552 , PIC16F1455 , PIC12F675 , PIC16F1459) i chciałbym je jakoś wykorzystać ;)


    te bez wersji L byś zaprogramował nawet zwykłym JDMem na paru tranzystorach, troszkę przesadą tu jest kupno PICKITa, ale zależy, jakie masz plany...

    1
  • #24 25 Cze 2015 08:06
    mariomario
    Poziom 18  

    Już pierwsze kompilacje za mną ;) (software reset - wstawka z ASM, blinki, ustawianie rejestrów, odczyt stanu pinów cyfrowych)
    Ale mam pytanie czy ten poniższy kod pomiaru stanu analogowego na pinie RA0(AN0) dla PIC12F1840 można jakoś prościej (mniej linijek kodu) zapisać ? (tak aby działało to dalej na MPLABie i XC8)

    Kod: c
    Zaloguj się, aby zobaczyć kod


    I jeszcze korzystając z okazji... czy są jakieś równie dobre środowiska programistyczne dla PIC'ów jak MPLAB X IDE ? Czytałem że jest też MikroC for PIC (Link) ale ma ograniczenie do 2KB kodu..

    które środowisko jest lepsze ? lub czy są jakieś dobre/lepsze/polecane darmowe środowiska konkurencyjne dla MPLAB'a ?

    0
  • #25 25 Cze 2015 08:57
    Urgon
    Poziom 36  

    AVE...

    Nie musisz umieszczać dodatkowej pętli while(1) w pętli głównej, bo wszystko w pętli głównej będzie wykonywane ciągle. Ustaw przerwanie dla ADC i w pętli obsługi przerwania wartość odczytuj. W ten sposób mikrokontroler może robić inne, interesujące rzeczy czekając na pomiar. Mikrokontrolery z reguły są dużo szybsze od ADC.
    Co do MPLABX i XC8 to jest to najlepsze darmowe środowisko do programowania PICów. Są też takie rzeczy, jak Pinguino czyli Arduino dla niektórych PICów, ale wygląda to przeciętnie. Wspiera: PIC18Fx450, PIC18Fx5(K)50, PIC18Fx6J50 i PIC18Fx7J53, oraz rodzinę: PIC32MX Mips. Z płatnych to najmilej mi się pracuje w MikroPascalu od Mikroelektroniki, testowałem też MikroC, ale generalnie C nie lubię. Był też PICBasic oraz zupełna ciekawostka, czyli Flowcode.
    Wielką zaletą MPLABX i XC8 jest spora biblioteka gotowych kodów i przykładów dostępna na stronach Microchip.

    1
  • #26 25 Cze 2015 10:09
    mariomario
    Poziom 18  

    Urgon napisał:
    AVE...

    Nie musisz umieszczać dodatkowej pętli while(1) w pętli głównej, bo wszystko w pętli głównej będzie wykonywane ciągle. Ustaw przerwanie dla ADC i w pętli obsługi przerwania wartość odczytuj. W ten sposób mikrokontroler może robić inne, interesujące rzeczy czekając na pomiar. Mikrokontrolery z reguły są dużo szybsze od ADC.
    Co do MPLABX i XC8 to jest to najlepsze darmowe środowisko do programowania PICów. Są też takie rzeczy, jak Pinguino czyli Arduino dla niektórych PICów, ale wygląda to przeciętnie. Wspiera: PIC18Fx450, PIC18Fx5(K)50, PIC18Fx6J50 i PIC18Fx7J53, oraz rodzinę: PIC32MX Mips. Z płatnych to najmilej mi się pracuje w MikroPascalu od Mikroelektroniki, testowałem też MikroC, ale generalnie C nie lubię. Był też PICBasic oraz zupełna ciekawostka, czyli Flowcode.
    Wielką zaletą MPLABX i XC8 jest spora biblioteka gotowych kodów i przykładów dostępna na stronach Microchip.


    W internecie wyczytałem, że MPLAB®X IDE w darmowej wersji bardzo słabo optymalizuje kod wynikowy (.HEX). Czy w wersji PRO optymalizacja faktycznie działa aż tak dobrze (jak na załączonym obrazku) że np do uC PIC12F675 (1,75KB pamięci, 64B RAM, 128B EEPROM) lub PIC12LF1552 (3,5KB pamięci, 256B RAM) zmieściłbym:
    obsługę wyświetlacza HD47780 2x16 poprzez ekspander PCF8574 + pomiar ADC + odczyt temperatury z 2szt DS18B20 + prezentacja danych na wyświetlaczu (napięcie, temperatura z czujników) + obliczenia + software reset w ASM (funkcja) + obsługę z 2 portów I/O (1 dla przycisku "button" z pull up'em programowym jednocześnie odczyt stanu "buttona" poprzez 2 if'y z delay'em które niwelują debouncing, drugi jako wyjście które ma podać stan wysoki przez chwilę, po spełnieniu kilku warunków) ?

    Chodzi mi o to czy ta optymalizacja faktycznie działa tak jak na załączonym niżej obrazku ?

    Dodam że kod taki już napisałem dla AVR (Arduino mini, wszystko napisane w Arduino IDE) i działa tak jak chcę ale kod wynikowy zajmuje prawie 10KB w pamięci Flash, 0B w EEPROM, i ok 1KB RAM...

    PIC16F1459 - Przejście z AVR (Arduino) na PIC

    0
  • Pomocny post
    #27 25 Cze 2015 11:54
    p.kaczmarek2
    Poziom 23  

    To raczej zależy od tego jaki kod, ale mógłbyś znaleźć kogoś z wersją PRO i porównać rozmiary z jeo wynikiem kompilacji Twojego kodu.
    Ale jak patrzyłem na ceny w sieci to te większe PICe nie są o wiele droższe od tych mniejszych, więc nie wiem czy warto się tą optymalizacją przejmować. Jak robisz amatorsko to cena jednego układu większa o 50gr Ci nie zrobi różnicy, co innego, jakbyś produkował tysiące zestawów...

    1
  • Pomocny post
    #28 25 Cze 2015 13:17
    Urgon
    Poziom 36  

    AVE...

    Przykład z MikroPascal, prosty kod do małego alarmu na PIC16F84A. Optymalizacja ustawiona na zero dała takie wyniki RAM: 4, ROM: 211 słów. Optymalizacja ustawiona na pięć zaś dała RAM: 4, ROM: 178 słów. Inny program, z kilkoma operacjami na liczbach zmiennoprzecinkowych pisany na PIC16F1827 dał takie wyniki: bez optymalizacji 122/3954 słów RAM/ROM; z maksymalną optymalizacją 122/3984 słów. Zatem optymalizacja nie zawsze daje lepsze wyniki.

    1
  • #29 01 Lip 2015 09:52
    mariomario
    Poziom 18  

    Po pierwszych bojach a czymś bardziej ambitnym niż "blink", a mianowicie obsługą wyświetlacza HD47780 (takiego -> Link) już nie mogę się połapać co robię źle - wyświetlacz ten po podłączeniu wg. schematu poniżej wyświetla takie coś:
    PIC16F1459 - Przejście z AVR (Arduino) na PIC
    PIC16F1459 - Przejście z AVR (Arduino) na PIC

    uC PIC16F1459, kość programowana była bezpośrednio z programatora i proces programowania i weryfikacji był poprawny, programator PICkit3, kod programu (pisane i kompilowane w MPLAB X IDE v3.05 + kompilator MPLAB® XC8 Compiler v1.34), dodatkowo plik lcd.h jest w tym samym folderze co plik main.c:

    main.c

    Kod: c
    Zaloguj się, aby zobaczyć kod


    lcd.h
    Kod: c
    Zaloguj się, aby zobaczyć kod


    oba pliki umieściłem w tym samym folderze projektu dla MPLAB

    0