Lo hice!!!
gracias a uds. Nocturno y jgpeiro06.
Nocturno en un principio declaré la función como bien dices, pero dentro de la función no me dejaba acceder con la llamada ls
.pin entonces le dí más vueltas hasta que llegué con el código que publiqué.
jgpeiro06, es exactamente como dices a mi también me gustan los programas encapsulados y los más elegante posible, porque denota que tienes dominio, conocimiento y seguridad de lo que estas haciendo, gracias por indicarme como se accedían a los elementos dentro de la estructura con el indicador
->, yo hasta ví el .lst y me daba cuenta que tenía que incrementar el índice del registro que maneja el direccionamiento indirecto pero no sabía como, y de aqui a que adivinara ufff
, bueno el código definitivo, simplificado y que funciona es éste:
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
#use delay(clock=48000000)
#USE RS232 (baud=9600,bits=8,parity=N,xmit=PIN_C6,rcv=PIN_C7)
//#build(reset=0x000800,interrupt=0x000808:0x000818)
// Necesario para indicarle al compilador a partir de donde alojar mi programa
//#ORG 0x000, 0x07FF {} // Espacio reservado para alojar el bootloader
#byte PORTA = 0xF80// Son las direcciones de memoria de los puertos en este PIC
#byte PORTB = 0xF81
#byte PORTC = 0xF82
#byte PORTD = 0xF83
#byte PORTE = 0xF84
#define entrada1 PIN_A0
#define entrada2 PIN_A1
#define salida1 PIN_B0
#define salida2 PIN_B1
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#use fast_io(D)
#use fast_io(E)
typedef struct{
long pin;
int8 contando;
int8 pasaron_20ms;
} mi_LS;// mi Limit Switch
void estado_pin(mi_LS *);//
void main(void) {
mi_LS ls_art_1={entrada1 0 0};
mi_LS ls_art_2={entrada2 0 0};
set_tris_a(0b00000011);
set_tris_b(0);
set_tris_c(0b10000000);
output_low(salida1);
output_low(salida2);
while (TRUE){
estado_pin(&ls_art_1);
if (ls_art_1.contando) {output_high(salida1);}
else output_low(salida1);
estado_pin(&ls_art_2);
if (ls_art_2.contando) {output_high(salida2);}
else output_low(salida2);
}
}
void estado_pin(mi_LS *ls){
if (input(ls->pin)) (ls->contando)=1;
else (ls->contando)=0;
}
Lo pueden probar con el .dsn que monté anteriormente, la idea de esto es hacer un programa antirebote por interrupciones del timer 1, ya lo tengo implementado pero con variables globales, manejo 6 finales de carrera asi que ya se imaginarán lo grande que es la rutina con ese pocote de ls.pin, ls.contando y ls.pasaron
.
Con respecto al argumento de input() es un número, en la ayuda del CCS dice:
Pin to read. Pins are defined in the devices .h file. The actual value is a bit address. For example, port a (byte 5) bit 3 would have a value of 5*8+3 or 43. This is defined as follows: #define PIN_A3 43.
The PIN could also be a variable. The variable must have a value equal to one of the constants (like PIN_A1) to work properly
así que para PIN_A0 de éste pic sería: 0xF80*8+0=0x7C00 ó lo que es lo mismo un int16 ó long.
Espero que le sirva de utilidad a otros como lo ha sido para mí.
Gracias nuevamente y Saludos.