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