Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Programmare i PIC

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: Programmare i PIC

Messaggioda Foto Utentelelerelele » 16 mar 2018, 20:04

posso accodarmi a chi ha avuto da ridire sul PIC 16 che lo usava da bambino! Dipende da ciò che si deve fare, se in apparecchiatura industriale, (alti numeri basso costo), devi controllare un lampeggiatore, il tuo prof pensa di usare un pic24? ma dai!

Concordo con la fatica per usare gli ARM, sono un altro pianeta, c'è da rivedere ciò che sai sui PIC, ma sono bestie potenti dal costo inferiore ad i PIC. Ti consiglio la faticata, ne vale la pena.

saluti.
Avatar utente
Foto Utentelelerelele
4.899 3 7 9
Master
Master
 
Messaggi: 5505
Iscritto il: 8 giu 2011, 8:57
Località: Reggio Emilia

0
voti

[12] Re: Programmare i PIC

Messaggioda Foto UtenteFire91 » 17 mar 2018, 0:05

med90 ha scritto:Non hai impostato RB7 come input, devi scrivere
Codice: Seleziona tutto
TRISBbits.TRISB7=1;


Purtroppo anche impostando RB7 come input l'interrupt continua a non funzionare. Quale potrebbe essere il problema? Eppure, non mi pare manchi nulla.
Avatar utente
Foto UtenteFire91
15 4
 
Messaggi: 41
Iscritto il: 19 apr 2015, 10:43

0
voti

[13] Re: Programmare i PIC

Messaggioda Foto UtenteEcoTan » 17 mar 2018, 10:31

Fire91 ha scritto:
Codice: Seleziona tutto
#include <xc.h>
#include "setup.h"

int c =0;

void main(void) {
   
    TRISB=0;
    PORTB=0;
   
   
    _T2IP = 0b001;  //timer2 ha priorità 1
    IFS0bits.T2IF = 0; //clear timer2 status flag
    IEC0bits.T2IE = 1; //interrupt su timer2
    //TCS impostato a 0, quindi viene usato clock interno
    //I bit TCKPS<1:0> sono settati a 0, quindi prescaler di timer2 1:1
    T2CONbits.TON = 1; //starts timer2
   
    IEC0bits.INT0IE = 1;    //abilita interrupt su RB7
    IFS0bits.INT0IF = 0;    //clear status flag interrupt on RB7
    _INT0IP = 0b010;    //priorità 2 per INT0

    //matching dopo 10 us, dato che timer2 incrementa ogni 0.25us per
    //arrivare ad 10us occorrono 10us/0.25us = 40 conteggi
    PR2 = 40;

   
    while(1) {
        while(_T2IF);
        IFS0bits.T2IF = 0;
        c=1;
    }
   
}

void _ISR _INT0Interrupt(void)
{
    if(_INT0IF) {
        _INT0IF = 0;
        _RB0=1;
    }
}

Sto tentando di fare qualcosa di molto simile con un pic32 e compilatore XC32 sotto MPLABX ma l'interrupt non aggancia, e mi sono bloccato.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5420
Iscritto il: 29 gen 2014, 8:54

0
voti

[14] Re: Programmare i PIC

Messaggioda Foto UtenteFire91 » 17 mar 2018, 10:54

EcoTan il programma dove lo hai provato? Simulazione o direttamente su circuito? Te lo chiedo perché ho notato un fatto particolare, in simulazione con Proteus non funziona l'interrupt ma effettuando un debug e mandando un impulso su RB7 con stimulus esegue l'interrupt, l'unica pecca è che dopo il primo impulso ai successivi non reagisce più.
Avatar utente
Foto UtenteFire91
15 4
 
Messaggi: 41
Iscritto il: 19 apr 2015, 10:43

0
voti

[15] Re: Programmare i PIC

Messaggioda Foto UtenteEcoTan » 17 mar 2018, 11:02

La seconda, direttamente sul circuito.
Ho provato con l'interrupt del Timer1 perché è l'unico di cui conosco la nomenclatura esatta per dichiarare la ISR, grazie ad un esempio che si trova nel manuale del compilatore XC32. Ma è possibile che bisogna procedere così a tentoni?
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5420
Iscritto il: 29 gen 2014, 8:54

0
voti

[16] Re: Programmare i PIC

Messaggioda Foto UtenteFire91 » 17 mar 2018, 14:29

Per dichiarare l'ISR si usa sempre la stessa sintassi, con la differenza che nella parte finale
Codice: Seleziona tutto
Interrupt(void)
va preceduto l'interrupt a cui si fa riferimento, ad esempio nel mio caso
Codice: Seleziona tutto
void _ISR _INT0Interrupt(void)
.
Avatar utente
Foto UtenteFire91
15 4
 
Messaggi: 41
Iscritto il: 19 apr 2015, 10:43

0
voti

[17] Re: Programmare i PIC

Messaggioda Foto UtenteEcoTan » 17 mar 2018, 15:13

No, così dà errore di compilazione:
make[1]: Leaving directory 'C:/MPLAB/LRCQ/pic32.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
../src/prova.c:23:11: error: expected '=', ',', ';', 'asm' or '__attribute__' before '_INT0Interrupt'
void _ISR _INT0Interrupt(void)

Invece scrivendo:
void __ISR(_TIMER_1_VECTOR, IPL1AUTO) Timer1Handler(void)

compila ma poi non esegue.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5420
Iscritto il: 29 gen 2014, 8:54

0
voti

[18] Re: Programmare i PIC

Messaggioda Foto UtenteFire91 » 17 mar 2018, 18:20

Ora ci ho fatto caso nei messaggi precedenti che usi il compilatore XC32. Io uso l'XC16, per questo non ci troviamo con la sintassi. Comunque resta il problema che l'interrupt non mi parte, fondamentalmente i punti sono abilitare l'interrupt dal registro IECx, definire la priorità dell'interrupt dal registro IPCx (perché se si lasciano i suoi bit a livello 0 la sorgente di interrupt rimane di default disabilitata). Cos'altro bisogna impostare???
Avatar utente
Foto UtenteFire91
15 4
 
Messaggi: 41
Iscritto il: 19 apr 2015, 10:43

0
voti

[19] Re: Programmare i PIC

Messaggioda Foto UtenteEcoTan » 17 mar 2018, 19:57

Con XC16 non ho questo problema, ma adopero un dsPic33 come MCU.
Ad ogni modo riporto un esempio di ISR che mi funziona, con l'interrupt del modulo PWM ma potrebbe essere qualsiasi altro:
Codice: Seleziona tutto
void __attribute__((no_auto_psv)) _ISRFAST _MPWM1Interrupt(void) 
{   buf=ADC1BUF0;          //legge registro di conversione ADC
    AD1CON1bits.SAMP=1;    //ADC1 module sample start
    dc700=700+(buf>>1);     //modula il duty cycle 
    IFS3bits.PWM1IF = 0; } //ISR esce

senza impostare la priorità dell'interrupt.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5420
Iscritto il: 29 gen 2014, 8:54

0
voti

[20] Re: Programmare i PIC

Messaggioda Foto UtenteFire91 » 17 mar 2018, 20:39

EcoTan ha scritto:Con XC16 non ho questo problema, ma adopero un dsPic33 come MCU.
Ad ogni modo riporto un esempio di ISR che mi funziona, con l'interrupt del modulo PWM ma potrebbe essere qualsiasi altro:
Codice: Seleziona tutto
void __attribute__((no_auto_psv)) _ISRFAST _MPWM1Interrupt(void) 
{   buf=ADC1BUF0;          //legge registro di conversione ADC
    AD1CON1bits.SAMP=1;    //ADC1 module sample start
    dc700=700+(buf>>1);     //modula il duty cycle 
    IFS3bits.PWM1IF = 0; } //ISR esce

senza impostare la priorità dell'interrupt.


Se non erro dsPIC e PIC24 hanno la stessa implementazione hardware. Sul datasheet mostra che se il livello di priorità non viene impostato (quindi si lascia di default a 000) la sorgente viene disabilitata. Comunque non mi funziona nemmeno con la sintassi indicata da te, in ogni caso la notazione _ISR è una macro definita come:
#define _ISR __attribute__((interrupt))
Quindi credo che è sempre la stessa cosa. Ho aperto una discussione sul forum della Microchip, vediamo cosa mi dicono. Nel caso aggiorno questa discussione.
Avatar utente
Foto UtenteFire91
15 4
 
Messaggi: 41
Iscritto il: 19 apr 2015, 10:43

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti