Nastavení a spuštění USART a PWM v programu v C u PIC18F

Zdravím,
píšu program pro pic18f252 v jazyce C a narazil jsem na pár problémů.

potřebuju nastavit USART OpenUSART() mi jde, ale jak mile tam dam ještě baudUSART() tak to nejde zkompilovat :confused:

Stejně tak potřebuju nastavit pwm, když odkomentuju nastaveni pwm (viz kod) tak to taky nejde zkompilovat :confused:

Dále se chci zeptat, jak nastavim, abych měl výstup z pwm na nějaký pin z RA?

Díky

:arrow_right: administrator: přejmenováno z “PIC18F program v C - PWM”
sw.txt (2.15 KB)

Nejde skompilovat, lebo funkcia baudUSART neexistuje. Nenasiel som ju v dokumentacii k Peripheral Library ani inde. Ako si na nu prisiel?
Baudovu rychlost nastavujes vo funkcii OpenUSART - to je ten posledny parameter. Musis si ho vypocitat podla datasheetu, v tvojom pripade to bude BRG_val = (FCPU/16/BAUD_rate)-1
16 pretoze mas USART_BRGH_HIGH

Dokumentacia k tejto funkcii hovori -
This function is only applicable to those devices with Extended or Enhanced CCP (ECCP)
Ozaj neviem ako pouzivat tieto sialene funkcie.
Ked chcem nieco nastavit, manipulujem s prislusnymi registrami. Naprikald nastavenie USARTu je otazka troch riadkov:

Podobne bude aj nastavenie PWM-ka.

To nepojde. Proste mas dane CCP piny a smitec. Myslim ze v konfiguracnych bitoch je moznost zvolit si niektory z dvoch vystupov medzi PORTC nieco a PORTB nieco, ale to je vsetko.
Novsie MCU, ako napriklad 18F26J11 maju tzv. PPS - peripheral pin select, co je moznost softwarovo navolit si periferie na takmer lubovolny pin v akejkolvek kombinacii. Velmi uzitocna vec.

Ale aj na RA pinoch mozes mat PWM, ked si ho urobis softwarovo. Ale mozes s tym dosiahnut len malu frekvenciu alebo male rozlisenie. Skus napisat aku aplikaciu robis a uvidime.

Viz ww1.microchip.com/downloads/en/D … 51297f.pdf strana 50 tam ty fce jsou… je tam i ten USART… a ktere piny to sou konkretne? Spis jak vybrat ten pin na RC? PORTB mam uz obsazeny komplet totiz

edit: Mimochodem, oni tydle serie pry umi pocitat baund rate sami a vzhledem k tomu ze pouze data prijimam, tak to nepotrebuju ne? :astonished:)

Je treba vsimnut si, ze to plati pre Enhanced USART, co je 18F252 nema. On 18F252 je taky dost archaicky kusok.
S tym nastavenim USART-u by som to urobil asi takto:

[code]#define BAUDVAL 9600
#define BRGVAL (SpeedMhz/16/BAUDVAL)-1


OpenUSART( USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH,BRGVAL );[/code]

Teda vytvoril som si konstantu, ktora obsahuje hodnotu SPBRG (ktora urcuje baudovu rychlost pri danej rychlosti MCU), tato konstanta je znama pri preklade, potom ju pouzijem pri volani funkcie pre inicializaciu USARTu.

Len pre poriadok - zvyknem oznacovat konstanty velkym pismom, teda v tvojom pripade SPEEDMHZ - to je take nepisane pravidlo, ale pouziva sa aby sa neplieti konstanty a premenne.

Co sa tyka detekcie baudovej rychlosti - ide o to, ze ked vies SUART-u povedat, aby byte bude prijimat (vacsinou ide o nejaky specialny byte, napriklad 0x55 alebo 0xAA), USART si vie sam odmerat dlzku tohto znameho byte a na zaklade toho si vypocita hodnotu SPBRG. Nie je to pouzitelne na genericke odmeriavanie baudovej rychlosti, ale je to doplnkom pre niektore komunikacne protokoly, trebars LIN.

CCP moduloy (v tvojom pripade pre PWM rezim), tak su dva, mas jeden na RC2 a RC1. Ten na RC1 sa da este prepnut na RB3. Nic viac sa neda ziskat s tymto MCU. Pripadne sa da vytvorit aj sofwarove PWM. Ako som pisal skor, zavisi to od aplikacie, lebo moznosti softwaroveho PWM su dost obmedzene.

To je fuk PORTC nemam vyuzity vubec, takze by to mohlo byt :slight_smile:)

Pokial mas PORTC volny, tak je to jednoduche, pouzijes RC1 alebo RC2, podla chuti. Tie moduly su oba identicke.
Napis mi ake PWM rozlisenie potrebujes (tzn. kolko bitov), aku minimalnu opakvoaciu frekvenciu a skusim ti vygenerovat zdrojak k tomu PWM-ku. Pripadne sa pozri napriklad best-microcontroller-projects.com/pwm-pic.html alebo micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html
Tam vidis ake registre sa maju hybat pri inicializacii, potom zapisujes striedu iba do CCPR1L (alebo CCPR2L). Ak potrebujes lepsie rozlisenie ako 8 bitov, tak aj do CCP1CON (alebo CCP2CON), ale myslim ze 8 bitov ti bude stacit, takze zmena striedy sa bude vykonavat iba zapisom do CCPRxL.

Frek. ± 270HZ a střídu bych potřeboval ovládat (tou bych ovládal rychlost motoru ale to si dodatečně dodělám sám podle toho jak to bude šlapat… :astonished:) )

:arrow_right: administrator: příspěvek byl upraven
Předchozí příspěvky se necitují.

Takze s tym PWM je to asi takto:

PR2 = 100; CCPR1L = 50; TRISCbits.TRISC2 = 0; T2CON = 0x07; CCP1CON = 0x0F;

A potom zapisom do CCPR1L v hodnote 0…99 ovladas striedu od 0 do 100%.
Otestoval som to na 18F452 (to iste ako 252, ale viac vyvodov).
Pri zapise CCPR1L = 90 to vyzera takto:
jaromir.xf.cz/_fil/pwm_90.png

CCPR1L = 50
jaromir.xf.cz/_fil/pwm_50.png

CCPR1L = 10
jaromir.xf.cz/_fil/pwm_10.png

Mam tam 4MHz krystal, frekvencia PWM je asi 620Hz, pri taktovani 20MHz to bude 5x viac. Da sa napriklad znizit na polovicu tym, ze PR2 register bude mat hodnotu 200, potom do CCPR1L zapisujes hodnoty 0…199.

:arrow_right: administrator: přiloženy externí soubory
pwm_90.png
pwm_90.png

Tudis
*5 je naky 3,1KHz
kdyz potrebuju 300Hz
tak mam dat takto?

PR2 = 1000;
CCPR1L = 500; //0 - 999 ?
TRISCbits.TRISC2 = 0;
T2CON = 0x07;
CCP1CON = 0x0F;

Díky

Hmm… nie.
PR2 register je 8 bitovy, teda maximalne do 255. S hodnotou 255 som sa dostal na frekvenciu 244Hz, teda 5 to bude v tvojom pripade 1220Hz.
S PWM modulom sa zial uz neda ist nizsie. Ak potrebujes ozaj nieco okolo 300Hz, tak sa bude musiet urobit PWM softwarovo. Teda nastavit timer na frekvenciu PWM_frekvencia
pocet_stupnov_rozlisenia a pri kazdom tiku timera porovnavat hodnotu timera s nastavenou hodnotou… napisem priklad v dalsom prispevku.
Ale pri SW PWM zas byva problem s rozlisenim. Tych 300Hz a 100 hodnot by este malo ist. Ak ti bude stacit rozlisenie na menej hodnot, o to lepsie.
Este lepsie ak by si siel s taktovacou frekvenciou niekde k 4MHz :slight_smile: