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.

PIC18F45K50 - Konfiguracja wewnętrznego oscylatora

dawid_sw1 19 Lip 2015 22:56 2217 42
  • #1 19 Lip 2015 22:56
    dawid_sw1
    Poziom 11  

    Witam,
    zaczynam zabawę z pic'ami i mam problem z częstotliwością wbudowanego oscylatora. W AVR'ach nie miałem z tym problemu w dodatku są gotowe programy.
    Jest tak, że po ustawieniu bitów w rejestrze OSCCON = 0b11110110; częstotliwość powinna być ustawiona na 16MHz. W praktyce dla prostego programu [code]

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Częstotliwość to tylko 500kHz. Próbowałem już grzebać w rejestrach OSCCON2 czy OSCTUNE ale nic to nie pomogło. Proszę o jakieś wskazówki.

    0 29
  • #2 19 Lip 2015 23:58
    archanoid
    Poziom 25  

    Witam . A jaką częstotliwość chciałbyś uzyskać. Przecież w pic - u na 1 cykl maszynowy przypadają 4 takty zegara . A więc policz sobie ile taktów zegara pochłania twój prosty program . Polecam dokumentację strona 78.

    0
  • #3 20 Lip 2015 00:40
    Marico
    Poziom 19  

    Pomijając uwagę archanoida o 1/4 Fosc, po co tracisz czas na wykonywaniu w pętli TRISA=0 skoro w pętli nie zmieniasz kierunku portu? Wystarczy TRISA=0 wywołać raz przed while. Nie wspominając już o tym, że do zapisu do portu powinieneś używać rejestru LATA a nie PORTA (problem copy on write).

    0
  • #4 20 Lip 2015 06:47
    dawid_sw1
    Poziom 11  

    Dziękuję za odpowiedzi. Jest też taka kwestia że nawet jak przedstawię częstotliwość z 16 MHz na 8 MHz to i tak przebieg generuje się z częstotliwością 500 kHz. Tak jakby to była jakaś granica.

    0
  • #5 20 Lip 2015 08:31
    Marico
    Poziom 19  

    Masz dwie możliwości: wcale nie zmieniłes INTRC (OSCCON jednak ustawiony inaczej niż zakladasz lub nawet nie używasz INTRC tylko zewnętrzny kwarc - pokaż konfigurację mcu ) lub źle mierzysz Fout na porcie.

    0
  • #6 20 Lip 2015 09:02
    dawid_sw1
    Poziom 11  

    Zmieniłem na INTRC #pragma config FOSC = INTOSCIO

    0
  • #7 20 Lip 2015 09:24
    Marico
    Poziom 19  

    Pokaż kod zamiast go opisywać, szczególnie fragment gdzie konfigurujesz OSCCON.

    0
  • #8 20 Lip 2015 09:51
    dawid_sw1
    Poziom 11  

    OSCCON napisałem na samym początku OSCCON = 0b11110110;
    Nie mam teraz dostępu do tego pliku.
    Teraz napisałem to w ten sposób to szybkość podskoczyła do 615kHz.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #9 20 Lip 2015 10:52
    Marico
    Poziom 19  

    Co się zmieni jak ustawisz OSCCON = 0b11110100 ?
    Podeślij skompilowaną pętlę for(...), używasz XC8, jak pokażesz skompilowany ten fragment to policzymy teoretyczną częstotliwość na porcie uzyskaną tym wygenerowanym kodem.

    0
  • #10 20 Lip 2015 12:23
    dawid_sw1
    Poziom 11  

    Jak rozumiem to to

    Kod: avrasm
    Zaloguj się, aby zobaczyć kod

    0
  • #11 20 Lip 2015 12:56
    Marico
    Poziom 19  

    Twoja pętla to dwa cykle mov* + 1 cykl nop (ten nop jest zbędny) co razem daje 3 cykle, Póżniej mamy 4 cykle (2 mov* + 2 na goto). Czyli "1" trwa 4 cykle a "0" 3. Zakrąglając do 4 cykli, przy Fosc=16Mhz daje 1/4*16Mhz = 4Mhz takt instrukcji, co nam daje 250 ns na cykl. Skoro "1" i "0" trwa 1us (4*250ns) to pełen okres Fout na pinie trwa 2us co nam daje IOFout circa 500Khz. Zgadza się? :-)

    0
  • #12 20 Lip 2015 13:10
    dawid_sw1
    Poziom 11  

    A czy według kolegi to działało by tak samo

    Kod: c
    Zaloguj się, aby zobaczyć kod

    czy szybciej?

    0
  • #14 20 Lip 2015 13:47
    dawid_sw1
    Poziom 11  

    Jak wyrzuciłem TRIS poza pętle to częstotliwość skoczyła do 617kHz. To inaczej zapytam. Muszę na tym mikrokontrolerze wyciągnąć co najmniej 800kHz. Na AVR'ach nie było z tym najmniejszego problemu. Może PLL.

    0
  • #16 20 Lip 2015 14:55
    dawid_sw1
    Poziom 11  

    Sprecyzuje jeszcze bardziej. Protokół NZR, diody z układem WS2812. Wysyłać jedynkę i zero w tym protokole za pomocą timerów. Jak rozumiem PLL konfiguruję w rejestrze OSCCON2 i powinienem mieć sygnał 3x lub 4x szybszy.

    0
  • #17 20 Lip 2015 15:19
    Marico
    Poziom 19  

    Mam wrażenie, że ignorujesz propozycję dondu: dlaczego chcesz męczyć mcu mało ekonomicznym wachlowaniem pinem (nawet z PLL) zamiast wykorzystać do swoich celów moduł ECCP? Skoro przesiadłeś się z Atmegi na PIC korzystaj z dobrodziejstw mnogości peryferiow jakie daje PIC, zamiast już delikatnie sugerować, że Atmega lepsza bo pinem wachluje szybciej ;-).

    0
  • #18 20 Lip 2015 15:30
    dondu
    Moderator Mikrokontrolery Projektowanie

    Skoro to WS2812, to czemu nie SPI lub co najmniej USART?
    Przykład dla Xmega:
    baza: http://mikrokontrolery.blogspot.com/2011/03/Diody-WS2812B-sterowanie-XMega.html
    USART: http://mikrokontrolery.blogspot.com/2011/03/Diody-WS2812B-sterowanie-XMega-cz-2.html
    USART+DMA: http://mikrokontrolery.blogspot.com/2011/03/Diody-WS2812B-sterowanie-XMega-cz-3.html

    Zapewne do PIC także przykłady znajdziesz.
    Wprawdzie Twój mikrokontroler DMA nie ma, ale może warto pomyśleć o innym PIC-u.

    0
  • #19 20 Lip 2015 17:51
    dawid_sw1
    Poziom 11  

    Dziękuję za wszystkie odpowiedzi. Bardzo mi pomogły. Spróbuję pewnie wszystkich opcji bo już jestem taki dociekliwy. Próbowałem włączyć sobie tego PLL'a ale bez skutku

    0
  • #20 20 Lip 2015 23:29
    Marico
    Poziom 19  

    Datasheet str. 34 PLL_SELECT Ttruth table. Spełniłeś warunki (1) i (2) oraz pkt. 3.8.2 na str. 42? Bit PLLEN ustawia się jako ostatni. Jeśli PLL nie będzie prawidłowo skonfigurowane (pkt. 3.8.2) ustawienie bitu PLLEN nic nie da.

    0
  • Pomocny post
    #21 21 Lip 2015 06:23
    archanoid
    Poziom 25  

    Witam . Ale i tak przy częstotliwości 16MHz nie włączysz PLL razy 4 tylko 3.

    1
  • #23 21 Lip 2015 13:04
    dawid_sw1
    Poziom 11  

    Tyle udało mi się zrobić, ale nadal bez skutku. Mogę prosić o jakieś wskazówki.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #24 21 Lip 2015 14:48
    Marico
    Poziom 19  

    Jednak nie przeczytałeś dokumentacji tylko czekasz na gotowca :(.
    #pragma config CFGPLLEN=OFF // a nie ON tabela 3-1

    Brakuje przed PLLEN=1 OSCTUNEbits.SPLLMULT=1; (lub po prostu SPLLMULT=1).
    Bity konfiguracyjne CPUDIV powinny być wyzerowane, nie pamiętam teraz (leżę na plaży) makra do pragmy, sprawdź sobie.

    0
  • #25 21 Lip 2015 15:29
    dawid_sw1
    Poziom 11  

    CFGPLLEN zostawiłem tak jak ustawił to MPLAB X, ale to też zmieniałem na OFF, ale bez skutku.
    Ustawiałem już cały rejestr OSCTUNE z bitem SPLLMULT na 1 i też to nic nie dało. CPUDIV ustawiałem na NOCLKDIV i na CLKDIV6 i dalej to samo. Siedzę od 8 i wertuje tę dokumentację także proszę nie mówić, że jej nie czytam , tylko że się nie znam i jej nie rozumiem.

    0
  • #26 21 Lip 2015 15:44
    Marico
    Poziom 19  

    Wcześniej pisalem abyś skasował bity SCS w OSCCON (masz 10 a powinno być 00). Zwróć uwagę na blok oscylatora rys 3-1 str 32. SCS ustawione na 10 pomija blok PLL.

    0
  • #27 21 Lip 2015 15:58
    dawid_sw1
    Poziom 11  

    Teraz widzę. Secondary Oscillator pomija PLL i CPUDIV. Teraz działa. Wielkie dzięki za pomoc Marico. Dzięki Tobie nauczyłem się chodź trochę czytać dokumentację. Myślę, że zaowocuje to w przyszłości.

    0
  • Pomocny post
    #28 21 Lip 2015 16:12
    Marico
    Poziom 19  

    dawid_sw1 napisał:
    Teraz widzę. Secondary Oscillator pomija PLL i CPUDIV. Teraz działa.


    Musiało zadziałać, nie ma innej opcji :-). Czy będziesz używał USB w tym układzie? Bo jeśli nie a upierasz się przy dużym Fosc to polecam 18f45k20 lub 18f25k20, który ma PLL x4 czyli Fosc 64Mhz. Ograniczenie tego układu, który używasz wynika z obecności modułu USB.

    1
  • #29 21 Lip 2015 16:37
    dawid_sw1
    Poziom 11  

    USB będzie ale przy tym to już będą także działać koledzy z pracy a to to jest bardziej dla mojej ciekawości i zaznajomienia się z picami.

    0
  • #30 21 Lip 2015 22:51
    dawid_sw1
    Poziom 11  

    Teraz znowu natknąłem się na inny problem. Mianowicie procesor cały czas mi się jakby resetował. Watchdoga zeruję chodź to nie ma żadnego znaczenia, bo w programie nie ma pętli.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Program powinien się wykonać raz i tyle. On ustawi jedynke potem zero odczeka jakies 2us i znowu. Same niespodzianki w tych picach

    0