mplabX + SPI
Hfmcons
hfmcons na gmail.com
Pondělí Březen 25 11:27:45 CET 2013
Simulátor v MplabX někdy zlobí(l), nelíbí se mu neinicializované
proměnné např. z ADC, ale jestli je tohle ten případ nevím.
Miloš Dašek
Dne 25. března 2013 10:25 Miroslav Draxal <evik na volny.cz> napsal(a):
> Asi nepochopeno.
>
> Nejprve init SPI
>
> (zde se nastaví priorita přerušení, povolí přerušení od
> periferii, povolí globálně prerušení)
>
> Nakonec zde skáče na SPIout
>
> SPIout
>
> Pokud je povolený SPIIE, čekej, protože nedokončil předchozí
> relaci SPI
>
> Povol přerušení od SPI (SPIIE), soft.simulace přerušení od
> SPI(SPPIF), následně okamžitě skočí do přerušení od SPI
>
> SPIint
>
> No a sem to právě skočí pouze při soft.simulaci přerušení,
> čili přerušení je OK.Pokud by odeslal celou SPI, potom by zakázal SPPIE.
> jenom to jaksi nic neodesílá (v mplabX), otázka je, jestli MPLAB správně
> simuluje, nebo je chyba mezi klávesnicí a židlí.
>
> Předpokládám že ta klávesnice a židle.
>
> Včera jsem si to napsal do mplab 8.88 a taky to nechodí. Inicializuju to
> podle datasetu, ale nic. Nějak se mi nechce věřit, že by to byla chyba
> simulace.
>
>
>
> #include <htc.h>
>
> //#pragma config CONFIG1H = 0x8
>
> __CONFIG (1, OSC_INTIO67 & FCMEN_OFF & IESO_OFF);
>
> //#pragma config CONFIG2L = 0x1E
>
> __CONFIG (2, PWRT_ON & BOREN_SBORDIS & BORV_3);
>
> //#pragma config CONFIG2H = 0x1E
>
> __CONFIG (3, WDT_OFF & WDTPS_32768);
>
> //#pragma config CONFIG3H = 0x81
>
> __CONFIG (4, CCP2MX_PORTC & PBADEN_OFF & LPT1OSC_OFF & MCLRE_ON);
>
> //#pragma config CONFIG4L = 0x81
>
> __CONFIG (5, STVREN_ON & LVP_OFF & XINST_OFF);
>
> //#pragma config CONFIG5L = 0xF
>
> __CONFIG (6, CP0_OFF & CP1_OFF & CP2_OFF & CP3_OFF);
>
> //#pragma config CONFIG5H = 0xC0
>
> __CONFIG (7, CPB_OFF & CPD_OFF);
>
> //#pragma config CONFIG6L = 0xF
>
> __CONFIG (8, WRT0_OFF & WRT1_OFF & WRT2_OFF & WRT3_OFF);
>
> //#pragma config CONFIG6H = 0xE0
>
> __CONFIG (9, WRTC_OFF & WRTB_OFF & WRTD_OFF);
>
> //#pragma config CONFIG7L = 0xF
>
> __CONFIG (10, EBTR0_OFF & EBTR1_OFF & EBTR2_OFF & EBTR3_OFF);
>
> //#pragma config CONFIG7H = 0x40
>
> __CONFIG (11, EBTRB_OFF);
>
>
>
> void main(void)
>
> {
>
> #define SPI_DATA_OUT LATC5
>
> #define SPI_DATA_OUT_TRIS TRISC5
>
> #define SPI_CLK LATC3
>
> #define SPI_CLK_TRIS TRISC3
>
> #define SPI_STROBO LATA4
>
> #define SPI_STROBO_TRIS TRISA4
>
> #define SPI_DATA_IN PORTCbits.RC4
>
> #define SPI_DATA_IN_TRIS TRISC4
>
>
>
> OSCCON = 0b01110011;
>
> ADCON1 = 0b00001111; //RA0-RA3 IO (no AD)
>
> CMCON = 0b00000111; //RA0-RA2 IO (comparators off)
>
>
>
> SPI_STROBO = 0;
>
> SPI_STROBO_TRIS = 0;
>
> SPI_DATA_IN_TRIS = 1;
>
>
>
> SMP = 1; //vstupní data jsou snímána po odeslání výstupních dat
>
> CKE = 1;
>
> CKP = 0; //klidový stav LO
>
> SSPCON1bits.SSPM = 0; //SPI Master mode, clock = FOSC/4
>
>
>
> PEIE = 1; // enable peripheral interrupts
>
> IPEN = 1; // Interrupt priorities enabled
>
> SSPIP = 0; // low priority interrupt
>
> // SSPIF = 0;
>
> // SSPIE = 1;
>
> GIEL = 1; // povol low-level přerušení
>
> GIE = 1; // povol všechna přerušení
>
>
>
> SPI_DATA_OUT = 0;
>
> SPI_DATA_OUT_TRIS = 0;
>
> SPI_CLK = 0;
>
> SPI_CLK_TRIS = 0;
>
>
>
> SSPEN = 1; //povol SPI modul
>
> SSPIE = 1; //povol přerušení od SPI
>
> SSPIF = 1; //příznak přerušení
>
> do
>
> {}
>
> while (1);
>
> }
>
> void interrupt low_priority interrupt_low (void)
>
> {
>
> if (SSPIE && SSPIF)
>
> {
>
> SSPBUF = 0xff;
>
> SSPIF = 0;
>
> }
>
>
>
> }
>
>
>
> From: hw-list-bounces na list.hw.cz [mailto:hw-list-bounces na list.hw.cz] On
> Behalf Of Milan Baša
> Sent: Monday, March 25, 2013 8:26 AM
> To: HW-news
> Subject: Re: mplabX + SPI
>
>
>
> Dňa 24.03.2013 12:45, Miroslav Draxal wrote / napísal(a):
>> Dobrý den,
>>
>> Od včerejška ladím jeden soft pro 18f2620 v mplabX, fyzicky board ještě
>> nemám, nedaří se mi rozběhnout spi v přerušení. Nezkoušel někdo z Vás,
>> jestli mplabX 1.70 korektně simuluje SPI? Tváří se mi to, jako by nic
>> neodesílal. Prostě naplním SSPBUF a následně mi to neskočí do přerušení
>> (nic se neděje). Míra
>>
>> ps. Trochu jsem to osekal proto tak nelogické nastavování TRIS... atd,
>> předělávám z softSPI na hwSPI
>>
>> void initSPI (void)
>>
>> {
>>
>> #ifdef SPI_HW
>>
>> SPI_STROBO = 0;
>>
>> SPI_STROBO_TRIS = 0;
>>
>> SPI_DATA_IN_TRIS = 1;
>>
>> CKP = 0; //klidový stav LO
>>
>> CKE = 1;
>>
>> SMP = 1; //vstupní data jsou snímána po odeslání výstupních dat
>>
>> SSPCON1bits.SSPM = 0; //SPI Master mode, clock = FOSC/4
>>
>> PEIE = 1; // enable peripheral interrupts
>>
>> IPEN = 1; // Interrupt priorities enabled
>>
>> SSPIP = 0; // low priority interrupt
>>
>> // SSPIF = 0;
>>
>> // SSPIE = 1;
> Tu ste zakazal prerusenie od SPI (defaultne nastavene na 0)
>>
>> GIEL = 1; // povol low-level přerušení
>>
>> GIE = 1; // povol všechna přerušení
>>
>> #endif
>>
>> SPIout_bity.value[0] = 0xff;
>>
>> SPIout_bity.value[1] = 0xff;
>>
>> SPIout_bity.value[2] = 0xff;
>>
>> SPIout_bity_old.bitOut.PowerLed = 1; //pro inicializaci SPI (musí
>> se odeslast do IO samé nuly)
>>
>> SPIout ();
>>
>> }
>>
>>
>> //______________________________________________________________________________________________________________________
>>
>> #ifdef SPI_HW
>>
>> void SPIint (void)
>>
>> // u HW SPI se hned zkopírude do SPIout_bity_old, protože se čeká, až se
>> odešle info do IO po SPI
>>
>> // v době odesílání po SPI si již může používat SPIout_bity
>>
>> {
>>
>> if (SSPIE && SSPIF)
> Sem proc neskoci lebo mate zakazane prerusenie a este navyse testujete
> zakazane prerusenie na 1
>>
>> {
>>
>> //sem skočí pouze 1 a to po SPIout
>>
>> //až odešle vše, zakáže SSPIE
>>
>> }
>>
>> }
>>
>> #endif
>>
>>
>> //______________________________________________________________________________________________________________________
>>
>> char SPIout (void)
>>
>> #ifdef SPI_HW
>>
>> //HW_SPI
>>
>> {
>>
>> char SPItmp = SPI_vyslanychBytu;
>>
>> while (SSPIE); //pokud je povolené přerušení od SPI, potom čekej až
>> to odešle
> Tu by ste mal testovat asi SSPIF - kym sa odosle buffer
>>
>> do
>>
>> {
>>
>> if (SPIout_bity.value[SPItmp - 1] !=
>> SPIout_bity_old.value[SPItmp - 1])//pokud se změnilo něco v bufru, odešli
>>
>> {
>>
>> SPIoutByt = SPI_vyslanychBytu;
>>
>> SPIerrorRepeat = SPI_errorRepeat;
>>
>> SPImode = SPIsave;
>>
>> SPIout_bity_old = SPIout_bity; // zkopíruj pole
>>
>> SPI_DATA_OUT = 0;
>>
>> SPI_DATA_OUT_TRIS = 0;
>>
>> SPI_CLK = 0;
> Nastavene CLK na nulu a nikde ho nenastavujete na 1 - ak HW tak sa asi
> musite postarat aj o CLK
>>
>> SPI_CLK_TRIS = 0;
>>
>> SSPEN = 1; //povol SPI modul
>>
>> SSPIF = 1; //příznak přerušení
>>
>> SSPIE = 1; //povol přerušení od SPI
>>
>> break;
>>
>> }
>>
>> }
>>
>> while (--SPItmp);
>>
>> return 0;
>>
>> }
>>
>>
>>
>> __________ Informace od ESET NOD32 Antivirus, verze databaze 8156
>> (20130324) __________
>>
>> Tuto zpravu proveril ESET NOD32 Antivirus.
>>
>> http://www.eset.cz
>>
>>
>> _______________________________________________
>> HW-list mailing list - sponsored by www.HW.cz
>> Hw-list na list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>
> Milan
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
>
>
> __________ Informace od ESET NOD32 Antivirus, verze databaze 8157 (20130324)
> __________
>
> Tuto zpravu proveril ESET NOD32 Antivirus.
>
> http://www.eset.cz
>
>
>
> __________ Informace od ESET NOD32 Antivirus, verze databaze 8158 (20130325)
> __________
>
> Tuto zpravu proveril ESET NOD32 Antivirus.
>
> http://www.eset.cz
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
Další informace o konferenci Hw-list