Scheda di controllo

ultimo aggiornamento 2 marzo 2009



 

Sui fascicoli n 64 e n 65 dell'opera presentato nella sezione WORKSHOP il progetto di un servotester basato sull'utilizzo del processore PIC16F628 prodotto dalla Microchip.
Sul fascicolo 65 sono presenti le immagini per montare il circuito su una bread-board, ma se si vuole realizzare qualcosa di pi duraturo possibile montare i componenti su un apposito circuito stampato.
Per la programmazione del PIC occorre memorizzare l'apposito programma il cui listato in C riportato a fondo pagina


Fascicolo 64

Fascicolo 65

homotix

PCBONLINE

 

Elenco componenti

R1,R8,R9

10 KΩ W

R2, R3 330 Ω W
R4, R5 1 KΩ W
C1 0,47 F Poliestere
C2 22 F 10V Verticale elettrolitico

IC1

PIC16F628

IC2

LM2940-5.0

Fet 1 - Fet 2 BS-170
DOWN, UP, CENTER Pulsanti da CS
D1, D2 Led rosso
SERVO strip 3 pin maschio

Power

Connettore Polarizzato di alimentazione

 

 

PIC16F628 - FLASH-Based 8-Bit CMOS Microcontrollers

Piedinatura Datasheet Foto dell'integrato

LM2940 1A Low Dropout Regulator
Piedinatura Datasheet Foto dell'integrato

BS 170 N-Channel Enhancement Mode Field Effect Transistor
  
Piedinatura Datasheet Foto del transistor

Programma in C per la programmazione del PIC

/* Programma a pagina 5 Workshop fascicolo 65 */
/* definizione dei parametri del programma */
#define CENTRATURA 15
#define T_MIN 11
#define T_MAX 19
#define PREMUTO 0
#define RILASCIATO 1
#define RITARDO 5

/* funzione principale */
void main()
{

/*indice per la gestione dei cicli */
int i;

/* durata dell'impulso */
int durata_us = CENTRATURA;

/* stato dei tre pulsanti di ingresso */
int stato_RA0 = RILASCIATO;
int stato_RA1 = RILASCIATO;
int stato_RA2 = RILASCIATO;

/*configurazione delle porte del PIC. Porta A con in tre pin meno significativi
in input e porta B configurata con tutti i pin in uscita. */
TRISA = 0b00000111;
TRISB = 0b00000000;

/* disattivazione dei comparatori del 16F628 */
CMCON = 0b00000111;

while(1)
{

/*inizio dell'impulso con l'innalzamento dell'output RB0 */
PORTB.F0 = 1;

/*generazione del ritardo di impulso */
for(i=0; i<durata_us; i++) Delay_us(100);

/*termine dell'impulso con l'abbassamento dell'output RB0 */
PORTB.F0 = 0;

/*inizio gestione dei pulsanti */

/*rilevamento dei rilasci se la variabile di stato dei pulsanti ha registrato 1a
pressione, ma il bit corrispondente segnala il pulsante rilasciato, E' stato
ultimato il click */

/* pulsante di decremento */
if(stato_RA0 == PREMUTO && PORTA.F0==RILASCIATO)
{
durata_us--; /* decremento la durata */
/* se la durata dell'impulso ha superato il limite minimo, la correggo */
if (durata_us<T_MIN) durata_us = T_MIN;
}
/* pulsante di centratura */
if(stato_RA1 == PREMUTO && PORTA.F1==RILASCIATO)
{
durata_us = CENTRATURA; /* decremento la durata */
}

/* pulsante di incremento */
if(stato_RA2 == PREMUTO && PORTA.F2==RILASCIATO)
{
durata_us++; /* decremento la durata */
}
/* se la durata dell'impulso ha superato il limite massimo, la correggo */
if (durata_us>T_MAX) durata_us = T_MAX;
}

/*rilevamento della pressione dei pulsanti e memorizzazione degli stati */
stato_RA0 = PORTA.F0;
stato_RA1 = PORTA.F1;
stato_RA2 = PORTA.F2;

/* controllo degli estremi di impulso */
if(durata_us == T_MAX)
PORTB.F7 = 1;
else
PORTB.F7 = 0;

/* controllo degli estremi di impulso */
if(durata_us == T_MIN)
PORTB.F6 = 1;
else
PORTB.F6 = 0;

/* generazione del ritardo di chiusura */
for(i=0; i<RITARDO; i++) Delay_us(100);
/* si chiude il ciclo di funzionamento del firmware */
}

 

Elenco revisioni
02/03/2009 Emissione preliminare