Estoy tratando de conocer mi PIC con proyectos simples de "inicio". Hice un flash LED con un botón. Hice un conteo de BCD de 0 a 9 con un retraso.
Ahora quiero combinar esos dos y también refractorar el código un poco. Así que quiero que el BCD se incremente en cada pulsación de botón. Lo ideal sería utilizar una interrupción, pero no es necesario para esta aplicación. El siguiente paso sería utilizar la interrupción y tener dos entradas (arriba o abajo) y luego cambiar los botones por un codificador rortario.
Las preguntas que tengo son:
- ¿dónde debería "almacenar" el valor actual en el BCD? una var global en principal?
- ¿por qué obtengo este tipo de error y la función declarada como implícita como advertencia?
El BCD está en PORTA, la entrada (activo bajo) está en PORTB.RB0 Estos son los dos programas que realmente funcionan:
void main(void)
{
/* Configure the oscillator for the device */
ConfigureOscillator();
/* Initialize I/O and Peripherals for application */
InitApp();
while(1)
{
if (PORTBbits.RB0 == 0){
PORTAbits.RA2 = 1;
} else {
PORTAbits.RA2 = 0;
}
}
}
Tenga en cuenta que RA2 se conectaría a un LED normal. Y para el contador:
void main(void)
{
/* Configure the oscillator for the device */
ConfigureOscillator();
/* Initialize I/O and Peripherals for application */
InitApp();
// lookup table for BCD
const uint8_t pat7seg[10] = {
// RA0:6 = ABCDEFG
// RA7:0 = FG-EDCBA
0b01000000, // 0
0b11111001, // 1
0b10000100, // 2
0b10010000, // 3
0b00011001, // 4
0b00010010, // 5
0b00000010, // 6
0b11111000, // 7
0b00000000, // 8
0b00010000, // 9
};
// current digit
uint8_t digit;
digit = 0;
while(1)
{
for(digit = 0; digit < 10; digit++){
PORTA = pat7seg[digit];
__delay_ms(2000);
}
}
}
Así que traté de 'combinar' estos como:
void main(void)
{
/* Configure the oscillator for the device */
ConfigureOscillator();
/* Initialize I/O and Peripherals for application */
InitApp();
// current digit
uint8_t digit;
digit = 0;
while(1)
{
/* TODO <INSERT USER APPLICATION CODE HERE> */
/*for(digit = 0; digit < 10; digit++){
PORTA = pat7seg[digit];
__delay_ms(2000);
}*/
if (PORTBbits.RB0 == 0){
digit = updateBCD(digit);
}
}
}
uint8_t updateBCD(uint8_t myCount) {
/* define constant for lookup BCD */
// common anode so, inverted
const uint8_t pat7seg[10] = {
// RA0:6 = ABCDEFG
// RA7:0 = FG-EDCBA
0b01000000, // 0
0b11111001, // 1
0b10000100, // 2
0b10010000, // 3
0b00011001, // 4
0b00010010, // 5
0b00000010, // 6
0b11111000, // 7
0b00000000, // 8
0b00010000, // 9
};
if (myCount < 9){
myCount++;
} else {
myCount = 0;
}
PORTA = pat7seg[myCount];
return myCount;
}
errores: (908) estado de salida = 1 main.c: 46: advertencia: (361) función declarada implícita int make [2]: * [build / XC8_16F628 / production / main.p1] Error 1 make [1]: * [.build-conf] Error 2 main.c: 52: error: (984) tipo redeclared make: * [.build-impl] Error 2 main.c: 52: error: (1098) declaraciones en conflicto para la variable "updateBCD" (main.c: 52)
Uso un PIC16F628 y MPLAB X IDE 2.00 con el compilador XC8.
Espero que puedas ayudar.