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
Allegati:

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • amastro
  • New Member
  • New Member
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

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
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

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • amastro
  • New Member
  • New Member
Di più
10 Anni 8 Mesi fa #9 da StefA
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

..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
  • Avatar di StefA
  • Moderator
  • Moderator
Di più
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?

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • amastro
  • New Member
  • New Member
Di più
Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login