- Messaggi: 14
- Ringraziamenti ricevuti 0
Interrupt PIC12F1840
10 Anni 8 Mesi fa #6
da amastro
Risposta da amastro al topic Interrupt PIC12F1840
La differenza fra i segnali, guardando lo schema allegato, nasce a secondo di dove prelevi, se x1-4 lo alimenti da x1-1 o da x1-2.
detto questo allora c'è qualcosa che non mi è chiaro.
questo il listato:
// CONFIGURATION SETTINGS
#include "mTouch_hardwareProfile_12F184x.h"
#include "../include/p18f2480.h"
#define _XTAL_FREQ 32000000 // <-- Oscillator frequency of your MCU in Hz
__CONFIG(FOSC_INTOSC & WDTE_SWDTEN & PWRTE_ON & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF);
__CONFIG(WRT_OFF & PLLEN_OFF & STVREN_ON & BORV_HI & LVP_OFF );
// PROTOTYPES
void System_Init (void);
void interrupt ISR (void);
void Blink (void);
// unsigned int i ;
// START PROGRAM
#define ON 1
#define OFF 0
#define LED0 LATA2 // Uscita relay (PIN 5)
#define SPIA0 RA4 // Spia di accensione (PIN 3)
#define JUMPER RA5 // Jumper Monostabile(0) / Bistabile(1) (PIN 2)
#define FUNC_JUMP RA0 // Jumper ALL OFF / REVERSE (PIN 7)
#define FUNC_IN RA3 //ingresso segnale Funzioni (PIN 4)
#define FlagAddr 0x30 // Locazione EEPROM per il salvataggio del Flag di memoria ON/OFF
#define FlagON 0x11 // Stato del Flag di memoria ON
#define FlagOFF 0x00 // Stato del Flag di memoria OFF
void main(void)
{
System_Init(); // Your System Initialization Function
INTCONbits.GIE = 1;
// INTCONbits.PEIE = 0;
INTCONbits.IOCIE = 1;
IOCAPbits.IOCAP3 = 1;
IOCANbits.IOCAN3 = 1;
// INTCONbits.INTE = 0;
LED0 = OFF ;
while(1)
{
//
Blink();
} // end - while(1) main loop
} // end - main() function
void System_Init()
{
ANSELA = 0b00000000;
LATA = 0b00000000;
TRISA = 0b00100001;
// OSCCON = 0b01101000; // 4 MHz Fosc w/ PLLEN_OFF
OSCCON = 0b11110000; // 32 MHz Fosc w/ PLLEN_ON (config bit)
// EXAMPLE TIMER INITIALIZATION
//
// TMR1/3/5 are not currently able to be used for this purpose.
OPTION_REG = 0b10000000; // TMR0 Prescaler = 1:2
}
/===========================================
void interrupt ISR(void)
{
if(IOCAPbits.IOCAP3 == 1 || IOCANbits.IOCAN3 == 1)
{
INTCONbits.IOCIE = 0;
LED0 = ~LED0;
__delay_ms(120);
IOCAFbits.IOCAF3 = 0 ;
INTCONbits.IOCIE = 1;
}
}
void Blink (){
for (;{
SPIA0 = ON ;
__delay_ms(250);
SPIA0 = OFF;
__delay_ms(250);
}
}
Non mi è chiaro per quale motivo applicando all'ingresso 4 quel segnale il relay cambia di stato finché non termina l'impulso, con ovviamente uno stato casuale.
In realtà a me occorrerebbe che quando applico l'impulso, il relay (LED0) commuta di stato, indifferentemente da quanto tempo l'impulso duri.
Ale
detto questo allora c'è qualcosa che non mi è chiaro.
questo il listato:
// CONFIGURATION SETTINGS
#include "mTouch_hardwareProfile_12F184x.h"
#include "../include/p18f2480.h"
#define _XTAL_FREQ 32000000 // <-- Oscillator frequency of your MCU in Hz
__CONFIG(FOSC_INTOSC & WDTE_SWDTEN & PWRTE_ON & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF);
__CONFIG(WRT_OFF & PLLEN_OFF & STVREN_ON & BORV_HI & LVP_OFF );
// PROTOTYPES
void System_Init (void);
void interrupt ISR (void);
void Blink (void);
// unsigned int i ;
// START PROGRAM
#define ON 1
#define OFF 0
#define LED0 LATA2 // Uscita relay (PIN 5)
#define SPIA0 RA4 // Spia di accensione (PIN 3)
#define JUMPER RA5 // Jumper Monostabile(0) / Bistabile(1) (PIN 2)
#define FUNC_JUMP RA0 // Jumper ALL OFF / REVERSE (PIN 7)
#define FUNC_IN RA3 //ingresso segnale Funzioni (PIN 4)
#define FlagAddr 0x30 // Locazione EEPROM per il salvataggio del Flag di memoria ON/OFF
#define FlagON 0x11 // Stato del Flag di memoria ON
#define FlagOFF 0x00 // Stato del Flag di memoria OFF
void main(void)
{
System_Init(); // Your System Initialization Function
INTCONbits.GIE = 1;
// INTCONbits.PEIE = 0;
INTCONbits.IOCIE = 1;
IOCAPbits.IOCAP3 = 1;
IOCANbits.IOCAN3 = 1;
// INTCONbits.INTE = 0;
LED0 = OFF ;
while(1)
{
//
Blink();
} // end - while(1) main loop
} // end - main() function
void System_Init()
{
ANSELA = 0b00000000;
LATA = 0b00000000;
TRISA = 0b00100001;
// OSCCON = 0b01101000; // 4 MHz Fosc w/ PLLEN_OFF
OSCCON = 0b11110000; // 32 MHz Fosc w/ PLLEN_ON (config bit)
// EXAMPLE TIMER INITIALIZATION
//
// TMR1/3/5 are not currently able to be used for this purpose.
OPTION_REG = 0b10000000; // TMR0 Prescaler = 1:2
}
/===========================================
void interrupt ISR(void)
{
if(IOCAPbits.IOCAP3 == 1 || IOCANbits.IOCAN3 == 1)
{
INTCONbits.IOCIE = 0;
LED0 = ~LED0;
__delay_ms(120);
IOCAFbits.IOCAF3 = 0 ;
INTCONbits.IOCIE = 1;
}
}
void Blink (){
for (;{
SPIA0 = ON ;
__delay_ms(250);
SPIA0 = OFF;
__delay_ms(250);
}
}
Non mi è chiaro per quale motivo applicando all'ingresso 4 quel segnale il relay cambia di stato finché non termina l'impulso, con ovviamente uno stato casuale.
In realtà a me occorrerebbe che quando applico l'impulso, il relay (LED0) commuta di stato, indifferentemente da quanto tempo l'impulso duri.
Ale
Si prega Accedi o Crea un account a partecipare alla conversazione.
- amastro
- Autore della discussione
- New Member
Riduci
Di più
10 Anni 8 Mesi fa #7
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Interrupt PIC12F1840
Vorrei prendere il discorso da un altro lato.
Se tu volessi distinguere i due segnali cosa andresti a verificare/misurare?
...non pensare ai PIC e interruzioni.
Da un punto di vista elettrico qual'e' l'ampiezza e periodo dei due segnali?
Saluti,
Mauro
Se tu volessi distinguere i due segnali cosa andresti a verificare/misurare?
...non pensare ai PIC e interruzioni.
Da un punto di vista elettrico qual'e' l'ampiezza e periodo dei due segnali?
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
10 Anni 8 Mesi fa #8
da amastro
Risposta da amastro al topic Interrupt PIC12F1840
Ciao Mauro.
Inizio col dire che in realta' non mi interessa differenziarli. Devono dare entrambi lo stesso risultato
Stesso periodo (semionda positiva della rete 220V). I Valori in ampiezza indicativamente si aggirano su 2,6v e 0.6
Ale
Inizio col dire che in realta' non mi interessa differenziarli. Devono dare entrambi lo stesso risultato
Stesso periodo (semionda positiva della rete 220V). I Valori in ampiezza indicativamente si aggirano su 2,6v e 0.6
Ale
Si prega Accedi o Crea un account a partecipare alla conversazione.
- amastro
- Autore della discussione
- New Member
Riduci
Di più
- Messaggi: 14
- Ringraziamenti ricevuti 0
10 Anni 8 Mesi fa #9
da StefA
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Risposta da StefA al topic Interrupt PIC12F1840
@Pinna: di che allegati parli? io vedo solo le immagini
@All: considerando che la frequenza del segnale all'ingresso è la stessa, potresti fare così: quando arriva un fronte positivo scatta l'interrupt sul pin e accendi quello che devi.. in contemporanea attivi un timer che scatti dopo un certo tempo, questo tempo deve essere tale per cui se è ancora presente il segnale ad onda quadra devi trovarti in uno stato maggiore di 0, quando scatta il timer vai a vedere il pin se è alto hai ancora l'onda che dovrebbe accende tutto, se il pin è basso vuol dire che non hai più l'onda e puoi spegnere tutto.
Altra idea che mi viene, metti un condensatore in ingresso che si carica, quando hai l'onda è carico, quando non c'è si scarica.. di conseguenza vedendo lo stato del pin puoi accendere o spegnere.
Ste
@All: considerando che la frequenza del segnale all'ingresso è la stessa, potresti fare così: quando arriva un fronte positivo scatta l'interrupt sul pin e accendi quello che devi.. in contemporanea attivi un timer che scatti dopo un certo tempo, questo tempo deve essere tale per cui se è ancora presente il segnale ad onda quadra devi trovarti in uno stato maggiore di 0, quando scatta il timer vai a vedere il pin se è alto hai ancora l'onda che dovrebbe accende tutto, se il pin è basso vuol dire che non hai più l'onda e puoi spegnere tutto.
Altra idea che mi viene, metti un condensatore in ingresso che si carica, quando hai l'onda è carico, quando non c'è si scarica.. di conseguenza vedendo lo stato del pin puoi accendere o spegnere.
Ste
..avevano magari fatto lo sgambetto al ka, ma il sangue restava sempre più denso dell'acqua.. [cit.]
Si prega Accedi o Crea un account a partecipare alla conversazione.
- StefA
- Moderator
Riduci
Di più
- Messaggi: 1222
- Ringraziamenti ricevuti 104
10 Anni 8 Mesi fa #10
da amastro
Risposta da amastro al topic Interrupt PIC12F1840
Ciao Ste,
Quando metto un elettrolitico, segnale va ad off. la corrente e' talmente bassa che si assorbe tutto.
Inoltre, non so se hai visto lo schema, l'impulso viene generato tramite un pulsante. quindi potrebbe ritardare il fronte di salita.
ritornando alla prima Ti chiedo, (a parte se possibile un esempio relativo al pic incriminato), :
1) Attivo l'impulso che puo' durare un T indefinito. il timer quando inizia a contare?
2) alla scadenza del timer la lettura puo' anche essere fatta quando il segnale e' presente ma a 0V. Che accade in questo caso?
grazie
Ale
P.S. sul DS mi sembra di aver capito che e' possibile utilizzare come INT solo IOC. giusto? quindi? che significa?
Quando metto un elettrolitico, segnale va ad off. la corrente e' talmente bassa che si assorbe tutto.
Inoltre, non so se hai visto lo schema, l'impulso viene generato tramite un pulsante. quindi potrebbe ritardare il fronte di salita.
ritornando alla prima Ti chiedo, (a parte se possibile un esempio relativo al pic incriminato), :
1) Attivo l'impulso che puo' durare un T indefinito. il timer quando inizia a contare?
2) alla scadenza del timer la lettura puo' anche essere fatta quando il segnale e' presente ma a 0V. Che accade in questo caso?
grazie
Ale
P.S. sul DS mi sembra di aver capito che e' possibile utilizzare come INT solo IOC. giusto? quindi? che significa?
Si prega Accedi o Crea un account a partecipare alla conversazione.
- amastro
- Autore della discussione
- New Member
Riduci
Di più
- Messaggi: 14
- Ringraziamenti ricevuti 0
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.