ginusweb ha scritto:... non penso che sia opportuno, anche se elegante, utilizzare un microcontrollore ...
Un paio di domande:
- Perché trovi inopportuno utilizzare un micro?
- Perché sarebbe elegante utilizzare un micro?
Sono solo curioso.

Moderatori:
carloc,
g.schgor,
BrunoValente,
IsidoroKZ
ginusweb ha scritto:... non penso che sia opportuno, anche se elegante, utilizzare un microcontrollore ...











// File di definizione dei registri del micro.
#include "p18f47j53.h"
#include <delays.h>
// File di configurazione dei fuses
#include "configurazione.h"
// Mappatura delle interrupt
#include "mappa_int.h"
// Header del main
#include "main.h"
//------------------------------------------------------------------------------
// Variabili globali
//------------------------------------------------------------------------------
#pragma udata
volatile unsigned short timer_delay; // Timer software per pulsante
volatile unsigned short timer_reset; // Timer per il reset dell' uscita
volatile unsigned short timer_deb; // Timer per antirimbalzo
#define T_ATTIVA 500 // Intervallo massimo fra i due impulsi (500 ms)
#define T_RESET 5000 // Tempo di reset automatico (5 s)
#define T_DEBOUNCE 20 // Costante di tempo per il debouncing (20 ms)
//------------------------------------------------------------------------------
// Funzione di servizio delle interrupt ad ALTA priorità
//------------------------------------------------------------------------------
#pragma code
#pragma interrupt highPriorityInterrupt
void highPriorityInterrupt()
{
// Verifica quale flag ha causato l' interrupt
// Esegui la parte di codice di servizio dell' interrupt
// Azzera il flag che ha causato l' interrupt
// ...
}
//------------------------------------------------------------------------------
// Funzione di servizio delle interrupt a BASSA priorità
//------------------------------------------------------------------------------
#pragma interruptlow lowPriorityInterrupt
void lowPriorityInterrupt()
{
// Verifica quale flag ha causato l' interrupt
// Esegui la parte di codice di servizio dell' interrupt
// Azzera il flag che ha causato l' interrupt
// ...
// Gestione dell' interrupt del timer 2
if(PIR1bits.TMR2IF)
{
// gestione dei timer software. I timer software devono decrementarsi
// fino ad arrivare a 0. Una volta arrivati a 0 restano fermi a 0.
if (timer_delay) timer_delay--;
if (timer_reset) timer_reset--;
if (timer_deb) timer_deb--;
// Resetta il flag che ha generato l' interrupt
PIR1bits.TMR2IF = 0;
}
}
//------------------------------------------------------------------------------
// Prototipi delle funzioni
//------------------------------------------------------------------------------
#pragma code
void timer2_deInit(void);
char get_pulsante(void);
void set_out(void);
void reset_out(void);
void commuta_out(void);
//------------------------------------------------------------------------------
// Funzioni
//------------------------------------------------------------------------------
#pragma code
char get_pulsante(void)
{
if (!PORTDbits.RD5) return(1); else return(0);
}
void set_out(void)
{
LATDbits.LATD7 = 1;
}
void reset_out(void)
{
LATDbits.LATD7 = 0;
}
void commuta_out(void)
{
LATDbits.LATD7 ^= 1;
}
//------------------------------------------------------------------------------
// De-inizializza il timer 2 e lo porta nello stato in cui si trovava
// subito dopo il RESET
void timer2_deInit(void)
{
T2CON = 0; // Resetta il timer 2 control register
TMR2 = 0; // Azzera il contatore interno
PR2 = 0; // Azzera il registro comparatore
PIE1bits.TMR2IE = 0; // Disabilita l' interrupt
IPR1bits.TMR2IP = 0; // Resetta il bit di priorità dell' interrupt
PIR1bits.TMR2IF = 0; // Azzera il flag di interrupt
}
//------------------------------------------------------------------------------
// MAIN
void main(void)
{
char puls; // stato attuale del pulsante
char puls_old; // stato precedente pulsante
char impulsi; // contatore di impulsi
// Fa partire il PLL.
// Anche se viene selezionato tramite i bit di configurazione
// il suo funzionamento non è automatico. Ha bisogno di un comando.
OSCTUNEbits.PLLEN = 1;
// Attende abbastanza tempo per far stabilizzare il PLL
Delay1KTCYx(100);
// Da ora in poi abbiamo il PLL funzionante ed il micro con il turbo.
// -------- Inizializzazione delle periferiche --------
// Inizializza la PORTD
// bit 4 input pulsante PL0
// " 5 input pulsante PL1
// " 6 output LED LED1
// " 7 output LED LED2
TRISD = 0x3F;
// Mette a 0 tutte le uscite
LATD = 0;
// De-inizializza il timer2. Non sarebbe necessario perché il micro esce
// allo stato di RESET ma è comunque buona pratica de-inizializzare sempre
// le periferiche per non tralasciare nessun bit.
timer2_deInit();
// Inizializza il timer 2 per interrupt ogni millisecondo.
// prescaler divide per 16
T2CONbits.T2CKPS = 2;
// Postscaler divide per 5
T2CONbits.T2OUTPS = 4;
// Imposta il valore comparatore a 150
PR2 = 150;
// Imposta l' interrupt del Timer 2 a priorita' bassa
IPR1bits.TMR2IP = 0;
// abilita interrupt del timer
PIE1bits.TMR2IE = 1;
// -------- Selezione ed abilitazione delle interrupt --------
// Ora che si sono inizializzate tutte le periferiche si possono abilitare
// Oppurtunamente le interrupt
// abilita le interrupt a bassa priorita'
RCONbits.IPEN = 1;
// abilta tutte le interrupt a priorità bassa
INTCONbits.GIEL = 1;
// Abilita tutte le interrupt in generale
INTCONbits.GIEH = 1;
// -------- Attivazione delle periferiche --------
// Con le interrupt abilitate possiamo ora far partire il timer 2
// Accende il timer
T2CONbits.TMR2ON = 1;
// Inizializza la variabile che funge da timer software
timer_delay = 0;
// Inizializza la variabile di conteggio
puls_old = 0;
// Resetta l' uscita
reset_out();
impulsi = 0;
// -------------- Ciclo infinito di funzionamento -------------
for(;;)
{
// Legge lo stato del pulsante
puls = get_pulsante();
// Guarda se c'è transizione pulsante
if (!puls_old && puls)
{
// C' è transizione da rilasciato a premuto
// fa partire il time della finestra temporale
timer_delay = T_ATTIVA;
// Incrementa il numero di impulsi rilevati
impulsi ++;
if (2 == impulsi)
{
// Fa partire il timer di disattivazione
timer_reset = T_RESET;
commuta_out();
impulsi = 0;
}
}
// Se il timer della finestra arriva a zero azzera tutto
if (!timer_delay)
{
impulsi = 0;
}
// Se il timer di reset automatico è a 0 resetta l' uscita
if (!timer_reset) reset_out();
// Ritardo hardware per debouncing del pulsante
timer_deb = T_DEBOUNCE;
while(timer_deb);
// Aggiorna lo stato precedente del pulsante
puls_old = puls;
} // for(;;)
}


TardoFreak ha scritto:ginusweb ha scritto:... non penso che sia opportuno, anche se elegante, utilizzare un microcontrollore ...
Un paio di domande:
- Perché trovi inopportuno utilizzare un micro?
- Perché sarebbe elegante utilizzare un micro?
Sono solo curioso.
Inopportuno è perché poi il circuito non potrebbe, diciamo semplicemente, essere fatto da tutti, essere alla portata di tutti: se si volesse avere una esclusiva, anche da un punto di vista commerciale, diciamo una incopiabilità, allora ok. Diciamo che non è alla portata di tutti avere un programmatore, avere il software giusto e saper cosa fare.
brabus ha scritto:Beh... Bof...
Diciamo che per molti è difficile persino procurarsi i 4017, i transistor, le millefori... persino le resistenze...ecc ecc...



Visitano il forum: Nessuno e 203 ospiti