Hola, que tal, pues después de varios días he poido seguir dedicado a esto..., aquí está el esquematico del circuito y el codigo.... Vale la pena anotar que el codigo hace parte de uno mucho mas extenso..., aquí he incluido solo cuando detecto los botones y la secuencia que simula los botones presionados.....
En la gráfica que incluyo si se fijan en las anteriores, los pines 3 y 5 corresponden a los extremos de la resistencia, el 5 corresponde al...., como llamarlo "tap", en este caso lo que hice fué colocar 5 voltios (vcc) en la entrada A1 y tierra en B1, el voltaje lo mido entre b1 y w1. Este integrado por defecto comienza en la posición central o mitad (64, son 128), por tanto el voltaje es de 2.5v, sin embargo cuando lo excito con las señales no varía este voltaje...
Nota: Las conexiones obvias del PIC no las he colocado, como vdd y vss
Listo aquí está el código.
/*PINES Y POTENCIOMETRO DIGITAL AD5220
RC0 = UP/DOWN: Si es igual a 1 entonces es incremento, si es igual a 0 decrementa.
RC1 = CLCK: Reloj, con cada flanco de bajada, la resistencia decrementa o incrementa dependiendo del estado del
pin UP/DOWN
a = 0: Bajar resistencia.
a = 1: Incrementar resistencia.
*/
#include <p18f252.h>
#include <stdlib.h>
#include <portb.h>
#include <delays.h>
#include <adc.h>
//CONFIGURACÍÓN DEL MICROPROCESADOR
#pragma config OSC = XT //Oscilador Externo 1:1
#pragma config WDT = OFF //Nada de Watch Dog Timer
#pragma config LVP = OFF //Nada de Low Voltage protect
//PROTOTIPOS
void definicion_puertos(void);
unsigned char get_boton(void);
void main()
{
unsigned char a = 0;
definicion_puertos(); //definicion de entradas y salidas.
Delay10KTCYx(100); //Espera 1 segundo para inicializar.
PORTC = 0x01; //estado inicial del programa (UP/DOWN = 1).
while (1) //Cliclo infinito.
{
a = get_boton(); //Adquisición de botones por polling
if (a == 2)
{
PORTCbits.RC0 = 1; //Coloca en up.
PORTCbits.RC1 = 1; //Activa el reloj.
Delay10KTCYx (25); //Delay de 250 milisegundos.
PORTCbits.RC1 = 0; //Flanco de bajadA, detecta el estado UP del potenciometro.
Delay10KTCYx (1); //Delay de 10 milisegundos.
}
if (a == 4)
{
PORTCbits.RC0 = 0; //Coloca en down
PORTCbits.RC1 = 1; //Activa el flanco de subida del reloj.
Delay10KTCYx(25); //Delay de 250 ms
PORTCbits.RC1 = 0; //FLanco de bajada, detecta el estado LOW del potenciometro.
Delay10KTCYx (1); //Delay de 10 ms.
}
}
}
void definicion_puertos()
{
OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_1ANA_0REF, ADC_CH0 & ADC_INT_OFF); //RA0 entrada análoga, el resto digital.
//Define si los pines son de entrada o salida.
// TRISA=0b00000011; //Pines RA0 (AD0)y RA1 (EOM) de entrada.
TRISC=0X00;
TRISB=0B11100000; //RB7:RB5 entradas de botones, RB0 entrada de ultrasonido.
//Define el estado inicial de los pines
PORTB=0x00;
PORTC=0x00;
// PORTA = 0b00001100; //real: 0b00001100........Definición del estado inicial de la interfaz con el ISD [puerto A] (PD = 1, CE = 1)
}
unsigned char get_boton()
{
unsigned char boton = 0, temp = 0, portemp = 0;
_asm
nop
_endasm
while (PORTBbits.RB7 == 0 && PORTBbits.RB6 == 0 && PORTBbits.RB5 == 0) //Si cualquiera de ellos es activado, sale del while
{
_asm
nop
_endasm
}
Delay10KTCYx(4); //Delay de 40 mili segundos, antirrebote de subida
boton = PORTB;
boton = boton & 0b11100000; //Máscara pa saber cual botón fué presionado.
boton = boton >> 5;
portemp = PORTB;
PORTCbits.RC2 = 1; //Señalización de que el botón está presionado
while (portemp != 0) //Espera a que suelte el boton para salir de la función
{
portemp = PORTB;
portemp = portemp & 0b11100000; //De este modo no importa en que estado se encuentren los otros bits del puerto B
}
PORTCbits.RC2 = 0; //Borro señalización
Delay10KTCYx(4); //Delay de 40 mili segundos, antirrebote de bajada
return boton;
}
Espero me puedan ayudar, gracias.