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.

PIC12F675 - Konwersja kodu (ADC) z MikroC PRO for PIC do MPLAB X IDE

mariomario 21 Mar 2016 07:57 2595 11
  • #1 21 Mar 2016 07:57
    mariomario
    Poziom 18  

    Witam,

    chcę przeportować poniższy kawałek kodu dotyczący konwersji analogowo-cyfrowej dla PIC12F675 z mikroC PRO for PIC na MPLAB X IDE (kompilator XC8). Tak aby na pinie GP2 było wejście analogowe, a inne piny jako wyjścia I/O, taktowanie uC = INTOSC 4MHz (FOSC2:FOSC0: 100), WDTE: 0, BODEN: 1, MCLRE: 0, PWRTE: 1

    Poniżej kod poprawnie działający u mnie w mikroC PRO for pic

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W mikroC wystarczy użyć "ADC_Read(2); " aby odczytać wartość analogową z pinu AN2/GP2. W MPLAB X IDE taka składnia - nie działa.

    0 11
  • CControls
  • Pomocny post
    #2 21 Mar 2016 08:51
    94075
    Użytkownik usunął konto  
  • CControls
  • #3 21 Mar 2016 16:34
    mariomario
    Poziom 18  

    albertb napisał:
    mariomario napisał:
    W mikroC wystarczy użyć "ADC_Read(2); " aby odczytać wartość analogową z pinu AN2/GP2. W MPLAB X IDE taka składnia - nie działa.

    Zapewniam Cię, ze taka składnia działa dokładnie tak samo jak w mikroC i każdym innym kompilatorze C.
    Oznacza ona wywołanie funkcji o nazwie ADC_Read() z bieżącym argumentem o wartości 2.
    Lecz skoro chcesz funkcję wywoływać to wypadałoby ją pewnie także zadeklarować i zdefiniować lub użyć w tym celu biblioteki. Zajrzyj do DS twojego procesora i przekonaj się, że cała praca to właściwie zapis i test wartości jednego rejestru, a odczyt 2.

    Albert


    Poszperałem w sieci i skleciłem taki kawałek kodu, domyślam się że o coś takiego chodzi aby działało to poprawnie w MPLAB X IDE (XC8)? (jeszcze się uczę programowania więc wolę zapytać)

    Kod: c
    Zaloguj się, aby zobaczyć kod


    PS. Powyższy kod sprawdzę niebawem, gdyż aktualnie nie mam dostępu do IDE, kompilatora ani programatora.

    0
  • Pomocny post
    #4 22 Mar 2016 07:34
    94075
    Użytkownik usunął konto  
  • #5 22 Mar 2016 18:49
    Chivo
    Poziom 22  

    Witam,

    Też zaczynam się uczyć PICow. Mam jedno pytanie. Czy po włączeniu zasilania procesory te pracują na jakimś wewnętrznym kwarcu tak jak AVR czy muszą mieć jakiś zewnętrzny?

    Pozdrawiam, Rafał

    1
  • #6 22 Mar 2016 19:42
    mariomario
    Poziom 18  

    albertb napisał:
    Mniej więcej tak.
    Co do szczegółów to możesz robić tak jak zrobiłeś - tym samym zaoszczędzasz w gotowym programie na wywołaniu funkcji i powrocie z niej, lub przy pomocy tychże instrukcji zdefiniować funkcję ADC_read().
    Wtedy dołączając ją do kodu w mikroC nie będziesz musiał go przerabiać.
    Druga sprawa: ADCResult. Czemu float? Co na tym zyskasz? A zapewniam że stracisz wiele.
    Nie piszę konkretów, abyś poszperał jeszcze w sieci, i rozgryzł temat. Bo dobrze Ci idzie.

    Trzecie (Left justified) Tutaj mamy dowolność w zależności do czego i jak chcemy użyć wyniku.
    Ale wydaje mi się, że częściej przydatne jest wyrównanie do prawej.

    Powodzenia Albert


    Czy taka funkcja dla ADC (w PIC12F675) dla MPLAB X IDE (XC8) zadziała poprawnie (nie mam chwilowo jeszcze dostępu do kompilatora / programatora PICów) ?
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dodatkowe pytanie - software'owy reset tego PIC'a
    Jak w MPLAB X IDE (XC8) dokonać software'owego resetu tego uC (PIC12F675) ? w mikroC PRO for PIC używałem funkcji:
    Kod: c
    Zaloguj się, aby zobaczyć kod




    Chivo napisał:
    Witam,

    Też zaczynam się uczyć PICow. Mam jedno pytanie. Czy po włączeniu zasilania procesory te pracują na jakimś wewnętrznym kwarcu tak jak AVR czy muszą mieć jakiś zewnętrzny?

    Pozdrawiam, Rafał


    Defalutowo (z moich obserwacji - przejrzanych datasheetów PIC'ów) wiele mikrokontrolerów jest taktowanych standardowo częstotliwością ok 500kHz - 1MHz (screen poniżej - przykładowy PIC16F1825)* z wewnętrznego oscylatora, którego częstotliwość wyjściową* możemy regulować poprzez rejestr OSCCON ustawiając odpowiednio bity IRCF* którymi ustawiamy żądaną częstotliwość, a którą to można "podbić" pętlą PLL. Skomplikowanie brzmi, ale lepiej i przejrzyściej wygląda na 2 screenie. Warto wspomnieć że te wewnętrzne oscylatory są dosyć precyzyjne - ich dokładność wynosi ok 1%.

    rejestr OSCCON oraz bity IRCF możemy "zadeklarować" (? dobre słowo ?) w kodzie programu np w ten sposób
    Kod: c
    Zaloguj się, aby zobaczyć kod


    *- tam gdzie dałem gwiazdki, tam zrobiłem screen, którego wklejam poniżej

    PIC12F675 - Konwersja kodu (ADC) z MikroC PRO for PIC do MPLAB X IDE
    PIC12F675 - Konwersja kodu (ADC) z MikroC PRO for PIC do MPLAB X IDE
    PIC12F675 - Konwersja kodu (ADC) z MikroC PRO for PIC do MPLAB X IDE
    Cały datasheet -> Link

    PS. Mogę się gdzieś mylić, nie jestem ekspertem, też się uczę.

    0
  • #7 22 Mar 2016 21:30
    Chivo
    Poziom 22  

    Za pomoca jakiego rejestru mozemy wybrac zewnetrzny lub wewnetrzny rezonator?

    0
  • #8 22 Mar 2016 21:40
    mariomario
    Poziom 18  

    Chivo napisał:
    Za pomoca jakiego rejestru mozemy wybrac zewnetrzny lub wewnetrzny rezonator?


    bazując na powyższym datasheecie (PIC16F1825) ustawić to można za pomocą bitów FOSC

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

    *choć nie jestem pewien czy ECH czy HS (staram się używać tylko wbudowanych oscylatorów jak narazie.. a ich dokładność 1% i szybkość zupełnie mi wystarcza)

    PIC12F675 - Konwersja kodu (ADC) z MikroC PRO for PIC do MPLAB X IDE

    0
  • Pomocny post
    #9 23 Mar 2016 13:13
    94075
    Użytkownik usunął konto  
  • #10 23 Mar 2016 14:00
    mariomario
    Poziom 18  

    albertb napisał:
    mariomario napisał:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    To jest problematyczne. Co się stanie, jeśli najpierw wywołasz funkcję z chann 3, a potem z parametrem 0?

    Najprościej zamiast tego wszystkiego:

    ADCON0bits.CHS = chann;
    Stawiam, że należałoby jednak wyrównać do prawej.

    Co do resetu to w XC8 też można używać wstawek assemblerowych. Czy tak samo to doczytaj w dokumentacji, którą będziesz miał po jego instalacji w katalogu doc

    Ale tak naprawdę, to resetu nie potrzebujesz. :-))
    W końcu włączasz watchdog'a bitami konfiguracyjnymi a nigdzie go nie resetujesz.

    Poważnie myślę, że to jest lepsze od skoku pod adres zero, który nie inicjuje rejestrów.

    Albert


    Dziękuję za podpowiedź :)

    Aktualnie jeszcze nie ogarniam wathdog'a / przerwań / timerów. Moje programy raczej "software'owo emulują" działanie timera lub używam flag do niektórych rzeczy. Dlatego też przydał by mi się jakiś solidny kurs np do przeczytania, ale taki opisujący wszystko od samych podstaw. Widziałem kilka książek o PIC'ach ale są one ... stare, nie pisane w przystępnej formie i opierają się na jakichś archaicznych PICach, starszych od PIC12F675 i innych jakie mam (bynajmniej te wydania w języku Polskim, a takie bym chciał, choć po angielsku też zrozumiem ale "trochę" mniej ;) ). Generalnie w Polsce jakoś mało popularne są PIC'e , wszędzie tylko kursy AVR.. AVR.. ARM.. (ARM'ami też będę chciał się kiedyś zająć)

    PS. Do mikrokontrolera PIC12F675 nad którym pracuję, też za jakiś czas będę chciał zrobić softwareową komunikację I2C (sprzętowej brak), i podłączyć wyświetlacz HD44780, gdyby ktoś miał jakiś sprawdzony kod lub jakieś jego fragmenty (najlepiej dla MPLAB X IDE XC8) to byłbym bardzo wdzięczny :).

    1
  • #11 23 Mar 2016 23:02
    94075
    Użytkownik usunął konto  
  • #12 24 Mar 2016 08:03
    mariomario
    Poziom 18  

    albertb napisał:
    mariomario napisał:
    PS. Do mikrokontrolera PIC12F675 nad którym pracuję, też za jakiś czas będę chciał zrobić softwareową komunikację I2C (sprzętowej brak), i podłączyć wyświetlacz HD44780, gdyby ktoś miał jakiś sprawdzony kod lub jakieś jego fragmenty (najlepiej dla MPLAB X IDE XC8) to byłbym bardzo wdzięczny :).

    Hmm, ile pinów wyjściowych ma PIC12F675?
    A ile potrzebjesz do podpięcia HD44780?
    Kombinujesz w złą stronę. Nie dobieraj na siłę procesora.
    Ten pic to do pewnych rzeczy jest fajny, ale na pewno nie do tego o czym piszesz.
    Jak chcesz używać PIC trochę mniej na siłę to zainteresuj się wyprzedażami w TME
    Mają znacznie lepsze procesory (ze sprzętowym I2C, wększą ilością pinów, ciekawymi peryferiami typu CLC, NCO) poniżej 2PLN (PIC16LF1826, PIC16LF1516, PIC16LF1509) PIC18F1330
    Oraz 16 bitowe poniżej 3PLN

    Albert


    Posiadam trochę innych PICów (PIC16F1825, PIC16F1459, PIC18F2550 i jeszcze kilka innych, nawet 1szt PIC32MX150F128D), a do komunikacji między wyświetlaczem HD44780 a PIC12F675 wykorzystał bym tylko 2 piny (softwareowy I2C na pinach GP0 i GP1, poprzez konwerter I2C (PCF8574)). Pozostałe 4 - jeden z nich jako wejście ADC (GP2/AN2), GP4 jako wyjście sterujące I/O, GP5 dioda sygnalizująca stan pracy. Pozostaje jeszcze GP3 (MCLR), które może służyć tylko jako wejście cyfrowe (specyficzny pin do programowania wysokonapięciowego), lecz ten pin nie byłby mi potrzebny.
    Kod programu też wg. mnie powinien się zmieścić :)
    Aktualnie w mikroC PRO for PIC mój kod zajmuje ok 50% pamięci i 20% ramu (PIC12F675), a na pewno można go jeszcze zoptymalizować, więc jak dodam obsługę wyświetlacza + software'oey I2C to... myślę że powinno się to zmieścić :)

    A dlaczego chcę na tak "małym" uC to wszystko pomieścić ? Większą satysfakcję sprawi mi zmieszczenie tego wszystkiego w takim małym PICu niż na np. PIC18F2550 :) tylko to :)

    Poprzez taki konwerter chcę podłączyć wyświetlasz (używałem go z Arduino i działał ok)
    PIC12F675 - Konwersja kodu (ADC) z MikroC PRO for PIC do MPLAB X IDE

    0