Hola quisiera saber cuánto consume de recursos de proceso para hacerlo con otro micro.
Hay yo tengo los STM32f100 y un LPC1769 y atmega.
Tu proyecto con ARM lo publicaste en sitio de pics.
Sobre los recursos, estoy usando 2 timers, 1 ADC, 1 SPI, 1 DMA y varios GPIO. El micro trabaja a 72MHz pero MIPS, la RAM y la ROM usados no los sé.
Sobre publicar en el subforo que no toca... bueno, aunque el proyecto realmente esta implementado con un ARM, todo está escrito en C y puede ser de utilidad para cualquier programador de PICs.
Me alegro mucho de que os guste el proyecto...otra cosa que me gustaría resaltar de este proyecto es un pequeño algoritmo que he implementado para manejar botones. No es muy eficiente, pero permite añadir todos los botones que queramos de una manera sencilla.
En tiempo de compilación por cada botón añadimos un elemento al array sButtons y lo rellenamos con los parámetros del botón: pin, puerto, estado activo, función a ejecutar cuando se pulse... Después, en tiempo de ejecución, un único bucle "for" procesa todos los botones con el mismo algoritmo: integrar, limite, hysteresis, flanco y acción. Se pueden ejecutar 3 eventos distintas: Flanco de subida, mantenido y flanco de bajada.
Para ver como funciona el algotirmo y sus capacidades os muestro un ejemplo extremo de "el peor botón del mundo".
Notas1: Hyste se pone a 1 cuando integ>5 y a 0 cuando integ<-5.
Notas2: Dif(Hyste) es state[1] - state[0]
Para comprender las distintas gráficas de la imagen anterior lo mejor es probar el código. Aunque es poco eficiente para leer un simple pulsador (todos hemos usado alguna vez "btfss"), no supone un coste excesivo de MIPS ya que no se ejecuta muchas veces por segundo(~100)...
#define BUTTONS_MAX 1
#define BUTTON_INTEG_MAX 10
#define CLR( A ) {A[0]=0;}
#define SET( A ) {A[0]=1;}
#define BCK( A ) {A[1]=A[0];}
#define isRUP( A ) (A[0] && !A[1])
#define isFDW( A ) (!A[0] && A[1])
#define isHLD( A ) (A[0] && A[1])
struct sBUTTON {
GPIO_TypeDef* port;
uint16_t pin;
uint8_t pressValue;
uint32_t portClk;
int8_t integ;
int8_t state[2];
void (*actionRUP)( void );
void (*actionHLD)( void );
void (*actionFDW)( void );
};
void action1( void );
void action2( void );
void action3( void );
struct sBUTTON sButtons[ BUTTONS_MAX ] = {
{ BTN_A_PORT, BTN_A_PIN, Bit_SET, BTN_A_CLK, 0, {0,0}, action1, action2, action3 }
};
void DoButtons( void ){
uint8_t i = 0;
for( i = 0 ; i < BUTTONS_MAX ; i++ ){
// Integrate
if( sButtons[i].pressValue == GPIO_ReadInputDataBit( sButtons[i].port, sButtons[i].pin ) ){
sButtons[i].integ++;
}else{
sButtons[i].integ--;
}
// Limit
if( sButtons[i].integ > BUTTON_INTEG_MAX ){
sButtons[i].integ = BUTTON_INTEG_MAX;
}else if( sButtons[i].integ < -BUTTON_INTEG_MAX ){
sButtons[i].integ = -BUTTON_INTEG_MAX;
}
// Hysteresis
if( sButtons[i].integ > BUTTON_INTEG_MAX / 2 ){
SET( sButtons[i].state );
}else if( sButtons[i].integ < -BUTTON_INTEG_MAX / 2 ){
CLR( sButtons[i].state );
}
// Rise-Up/Falling-Down edge detection
if( isRUP( sButtons[i].state ) ){
// RUP action perform
if( NULL != sButtons[i].actionRUP ){
sButtons[i].actionRUP();
}
}else if( isFDW( sButtons[i].state ) ){
// FDW action perform
if( NULL != sButtons[i].actionFDW ){
sButtons[i].actionFDW();
}
}else if( isHLD( sButtons[i].state ) ){
// HLD action perform
if( NULL != sButtons[i].actionHLD ){
sButtons[i].actionHLD();
}
}
// Backup state
BCK( sButtons[i].state );
}
}
void action1( void ){
A = 1;
A = 0;
}
void action2( void ){
B = 1;
B = 0;
}
void action3( void ){
C = 1;
C = 0;
}
void main(){
InitButtons();
while(1){
DoButtons();
Delay_mS(10);
}
}