Estoy tratando de conocer mi PIC con proyectos simples de 'puesta en marcha'. Hice un flash LED con un botón. Hice un conteo BCD de 0 a 9 con un retraso.
Ahora quiero combinar esos dos y también refractar un poco el código. Así que quiero que el BCD aumente con cada pulsación de botón. Idealmente, eso usaría una interrupción, pero no es necesario para esta aplicación. El siguiente paso sería usar la interrupción y tener dos entradas (para subir o bajar) y luego cambiar los botones por un codificador giratorio.
Las preguntas que tengo son:
El BCD está en PORTA, la entrada (activa baja) 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 estaría conectado 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) exit status = 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 redeclarado make: * [.build-impl] Error 2 main.c:52: error: (1098) declaraciones en conflicto para la variable "updateBCD" ( principal.c:52)
Uso un PIC16F628 y MPLAB X IDE 2.00 con compilador XC8.
Espero que puedas ayudar.
En C, la mejor práctica es usar prototipos. Generalmente, desea declarar sus prototipos de funciones en un archivo de encabezado. Para su código, tal vez llame al archivo de encabezado BCD.h y créelo en la sección 'Archivos de encabezado' de MPLAB. El código del archivo de encabezado debería ser similar al siguiente:
#ifndef BCD_H
#define BCD_H
uint8_t updateBCD(uint8_t);
#endif
luego agregue la siguiente línea a main.c
#include "BCD.h"
Explicación: en su código, cuando el compilador encuentra la línea "dígito = actualizar BCD (dígito)", el compilador aún no conoce la función actualizar BCD. Esta es la declaración implícita. Mover la declaración de updateBCD antes de main ayuda a que el compilador sepa acerca de updateBCD antes de que encuentre "digit = updateBCD".
Desde el punto de vista de la programación, esto sigue siendo algo indeseable porque entonces debe preocuparse por el orden en que declara sus funciones. Además de ser molesto para el codificador, también puede hacer que el código sea más difícil de leer e interpretar para otros. El uso de prototipos de funciones en archivos de encabezado alivia estos problemas.
m.alin
updateBCD
función antes de la función main() o simplemente inserte una declaración de la función antes de main(), así:uint8_t updateBCD(uint8_t myCount);