En aquest exemple partirem de l'exemple RL i farem que la rotació de LED avanci cada cop que es premi el polsador. Recordem que el polsador manté activada l'entrada RA3 i l'entrada es desactiva quan el premem. El programa per fer-ho és el següent:
#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF #pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF #include <xc.h> // Carrega el fitxer de funcions #define Polsador RA3 // Li assigna un nom a l'adreça del polsador
unsigned char Valor; // Variable de 8 bits sense signe (0 a 255)
void main (void){
TRISC = 0b00000000; // Posa el port C com a sortida
TRISA = 0b00001000; // Posa RA3 com a entrada
Valor = 1; // Inicialment posem 1 (activem LED 0)
while (1){ // Bucle infinit
PORTC = Valor; // Copiem el valor al port (als LED)
if (Valor == 8) // Si ja estem al LED 3, no podem rodar més
Valor = 1; // tornem al LED 0
else // Si no estem al LED 3
Valor = 2*Valor; // Multipliquem per 2 i passem al LED següent
while (Polsador == 1) // Mentre el polsador no estigui premut
; // No fa res
}
}
Observem que on hi havia la funció de retard hi hem posat un bucle que es queda bloquejat fins que es prem el polsador.
Si heu provat aquest programa, haureu vist que no funciona. Mentre el polsador està premut es produeix la rotació de bits i quan el deixem anar es para.
A la versió següent, esperem a que el polsador es deixi anar:
#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF #pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF #include <xc.h> // Carrega el fitxer de funcions #define Polsador RA3 // Li assigna un nom a l'adreça del polsador
unsigned char Valor; // Variable de 8 bits sense signe (0 a 255)
void main (void){
TRISC = 0b00000000; // Posa el port C com a sortida
TRISA = 0b00001000; // Posa RA3 com a entrada
Valor = 1; // Inicialment posem 1 (activem LED 0)
while (1){ // Bucle infinit
PORTC = Valor; // Copiem el valor al port (als LED)
if (Valor == 8) // Si ja estem al LED 3, no podem rodar més
Valor = 1; // tornem al LED 0
else // Si no estem al LED 3
Valor = 2*Valor; // Multipliquem per 2 i passem al LED següent
while (Polsador == 1) // Mentre el polsador no estigui premut
; // No fa res
while (Polsador == 0) // Mentre el polsador estigui premut
; // No fa res
}
}
Ara funciona millor però no funciona bé ja que de tant en tant se salta un o dos LED. Els polsadors i els interruptors tenen el problema que quan canvien d'estat els contactes reboten i, per això, sovint el microcontrolador no veu només una activació entrada sinó unes quantes. En el nostre cas, el polsador de la placa és força bo i rebota molt poc.
El que cal fer és assegurar-nos que l'estat és estable. El programa que es proposa ara incorpora un filtre per no veure els rebots del polsador.
#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF #pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF #include <xc.h> // Carrega el fitxer de funcions #define Polsador RA3 // Li assigna un nom a l'adreça del polsador
unsigned char Valor; // Variable de 8 bits sense signe (0 a 255)
void main (void){
TRISC = 0b00000000; // Posa el port C com a sortida
TRISA = 0b00001000; // Posa RA3 com a entrada
Valor = 1; // Inicialment posem 1 (activem LED 0)
while (1){ // Bucle infinit
unsigned char Compta = 0; // Variable local per comptar
PORTC = Valor; // Copiem el valor al port (als LED)
if (Valor == 8) // Si ja estem al LED 3, no podem rodar més
Valor = 1; // tornem al LED 0
else // Si no estem al LED 3
Valor = 2*Valor; // Multipliquem per 2 i passem al LED següent
while(Polsador == 0) // Esperem a que el polsador es deixi anar
; // No fem res
do
{ // Bucle per comptar quants cops detectem el polsador premut
if (Polsador == 0) // Si el polsador està premut
Compta++; // Incrementa Compta
else // Si no està premut
Compta = 0; // Posa el comptador zero
_delay(1000); // Retard de 1000 cicles
} while (Compta < 5); // Es repeteix fins que hem comptat 5 cops
}
}
Si el polsador no funciona, assegureu-vos que heu marcat 3-State on 'Release from Reset' a la finestra de propietats del PICkit 2:

Quan activem aquesta casella li estem dient al programador que es desconnecti del microcontrolador quan acabi de programar. Aquesta desconnexió, però, no és instantània i això pot produir funcionaments inesperats en aquells programes que comprovin l'estat del polsador poc després de que s'iniciï el programa. Per evitar aquests problemes podem posar un retard (per exemple, un segon) entre les inicialitzacions i el tros del programa on es mira el polsador.

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.