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.
Programmare i PIC
Moderatore:
Paolino
24 messaggi
• Pagina 2 di 3 • 1, 2, 3
0
voti
-

lelerelele
4.899 3 7 9 - Master

- Messaggi: 5505
- Iscritto il: 8 giu 2011, 8:57
- Località: Reggio Emilia
0
voti
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.
0
voti
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.
0
voti
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ù.
0
voti
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?
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?
0
voti
Per dichiarare l'ISR si usa sempre la stessa sintassi, con la differenza che nella parte finale
- Codice: Seleziona tutto
Interrupt(void)
- Codice: Seleziona tutto
void _ISR _INT0Interrupt(void)
0
voti
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.
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.
0
voti
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???
0
voti
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:
senza impostare la priorità dell'interrupt.
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.
0
voti
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.
24 messaggi
• Pagina 2 di 3 • 1, 2, 3
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 0 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)

