Pagina 1 di 3

PIERIN e MM5450

MessaggioInviato: 5 ott 2014, 13:33
da spivo
Ciao a tutti, vorrei riuscire a collegrate Pierin con un Driver led MM5450, prendento spunto da questo articolo http://www.electroyou.it/galaxi93/wiki/impariamo-con-il-pierin-il-bus-spi di Galaxi93 e scopiazzando un po' in giro sorno riuscito a fare questo:


Codice: Seleziona tutto
void ConfigureOscillator(void)
{
    /* FA PARTIRE IL PLL */
    OSCTUNEbits.PLLEN = 1;
    __delay_ms(20);
}

void InitApp(void)
{
    //Configuro le porte D come uscite
    TRISD=0;
    PORTD=0;
   
    //Pin SPI
    TRISC7=0;
    TRISB4=0;
    PORTBbits.RB4=0;
    //Chip select
    TRISB0=0;
   
    //Inizializza il modulo MSSP in modalità SPI master:
    //invio dati da condizione di riposo
    //condizione di riposo a livello basso
    //Frequenza = Fosc/64 = 12000kHz/64 = 187.5kHz
    SSP1STAT=0b01000000;
    SSP1CON1=0b00100010;
}

void main(void)
{
    ConfigureOscillator();
    InitApp();
   
    while(1)
    {
    LATDbits.LATD6=1; //segnalo inizio

    PORTBbits.RB0=0; //Indica allo slave che i dati in arrivo
    SSP1BUF=0b11111111111111111111111111111111111; //Invio
    while(!SSP1IF); //Attesa e reset
    SSP1IF=0;
    PORTBbits.RB0=1; //Fine comunicazione

    __delay_ms(65);__delay_ms(65);__delay_ms(65);__delay_ms(65);__delay_ms(65);
    LATDbits.LATD6=0; //segnalo fine

    LATDbits.LATD7=1; //seganlo inizio

    PORTBbits.RB0=0; //Indica allo slave che i dati in arrivo
    SSP1BUF=0b10000000000000000000000000000000000; //Invio
    while(!SSP1IF); //Attesa e reset
    SSP1IF=0;
    PORTBbits.RB0=1; //Fine comunicazione

    __delay_ms(65);__delay_ms(65);__delay_ms(65);__delay_ms(65);__delay_ms(65);
    LATDbits.LATD7=0; //seganlo fine
    }
}


Io scrivendo questo programma avrei voluto che i led collegari al mm5450 lampeggiassero tutti insieme ogni 325ms (65x5), e che i led di PIERIN si accendessero alternativamente quando viene inviato il comando di accensione o spegnimento.
Ma qualcosa non funziona, i led collegati al mm5450 lampeggaino in una strana maniera, avete qualche consiglio? Grazie Ivo

Re: PIERIN e MM5450

MessaggioInviato: 5 ott 2014, 13:39
da spivo
Ops perché non si vede Pierin nell'immagine di fidocad ?

Re: PIERIN e MM5450

MessaggioInviato: 5 ott 2014, 13:49
da simo85
spivo ha scritto:Ops perché non si vede Pierin nell'immagine di fidocad ?


Codice: Seleziona tutto
MC 50 70 0 0 libreria pierin pic18.7

Hai disegnato il componente e lo hai salvato in una libreria personale ? ;-)

In tal caso devi copiare anche le macro.

Re: PIERIN e MM5450

MessaggioInviato: 5 ott 2014, 13:52
da spivo
Grazie, sai dirmi come si fa?

Re: PIERIN e MM5450

MessaggioInviato: 5 ott 2014, 13:57
da simo85
Usando Fidocadj in inglese, dal menù a tendina:

Edit >> Copy, split non standard macros.

Altrimenti dovrebbe essere Ctrl + M.

Re: PIERIN e MM5450

MessaggioInviato: 5 ott 2014, 14:00
da spivo


GRAZIE, simo85 ora ho capito e funziona.

Re: PIERIN e MM5450

MessaggioInviato: 5 ott 2014, 15:09
da simo85
De nada Foto Utentespivo. :ok:

Re: PIERIN e MM5450

MessaggioInviato: 5 ott 2014, 15:20
da Galaxi93
Ciao Foto Utentespivo,

il tuo errore è che cerchi di inviare tutti i 36bit in una volta sola mettendoli nel registro SSP1BUF che è a 8 bit. Come si vede nel mio articolo, per inviare informazioni più grandi bisogna "spezzare" il pacchetto in byte e inviarli uno alla volta. Nel tuo caso sarebbe così:
Codice: Seleziona tutto
PORTBbits.RB0=0; //Indica allo slave che i dati in arrivo
SSP1BUF=0b11111111; //Invio
while(!SSP1IF); //Attesa e reset
SSP1IF=0;
SSP1BUF=0b11111111; //Invio
while(!SSP1IF); //Attesa e reset
SSP1IF=0;
SSP1BUF=0b11111111; //Invio
while(!SSP1IF); //Attesa e reset
SSP1IF=0;
SSP1BUF=0b11111111; //Invio
while(!SSP1IF); //Attesa e reset
SSP1IF=0;
SSP1BUF=0b11110000; //Invio
while(!SSP1IF); //Attesa e reset
SSP1IF=0;
PORTBbits.RB0=1; //Fine comunicazione


Stessa cosa per spegnere i led. Prova e fammi sapere.
O_/

Re: PIERIN e MM5450

MessaggioInviato: 5 ott 2014, 16:19
da spivo
Grazie, ora funziona :D
Avrei ancora un paio di dubbi:

1) io ho configurato così MSSP perché sul datasheet del MM5450 c'è scritto che il clock può lavorare al massimo a 500 kHz e quindi se usassi Fosc/16 andrebbe a 750 kHz, troppo veloce quindi. È giusto il mio ragionamento ?
Codice: Seleziona tutto
    //Inizializza il modulo MSSP in modalità SPI master:
    //invio dati da condizione di riposo
    //condizione di riposo a livello basso
    //Frequenza = Fosc/64 = 12000kHz/64 = 187.5kHz
    SSP1STAT=0b01000000;
    SSP1CON1=0b00100010;


2) mi piacerebbe comandare MM5450 da un PC tramite collegamento seriale USART. Ma se uso il pin RC7 per inviare i dati al MM5450 posso usarlo anche per la connessione USART? o è meglio cambiare qualcosa?
Grazie ancora ciao Ivo

Re: PIERIN e MM5450

MessaggioInviato: 5 ott 2014, 19:39
da Galaxi93
1)Se il datasheet dice così, non puoi fare altro.
2)Direi di no, perché avresti dei problemi con il PC quando invii i dati al MM5450 (riceve qualcosa di strano).
Il PIC18F47J53 ha due periferiche USART, e la seconda in particolare non ha dei pin "fissi" ma ha la possibilità di rimapparli dove vuoi segliendoli tra quelli contrassegnati con il prefisso RP (datasheet pagina 7).
A pagina 160 c'è il paragrafo dedicato ai pin rimappabili e spiega come funzionano; in particolare a pagina 164 c'è un esempio in assembler su come configurare i pin della periferica USART 2 (proprio quella che interessa a te!).

Prova te a scrivere il codice per la configurazione della USART2 e delle sue porte, guardando se ti serve, il mio articolo sulla USART. Se poi hai qualche problema, chiedi pure.

Ciao,