Agradecido por la ayuda, navegando encontré este proyecto que muestra en un pantalla LED 16x2 lo adquirido por un sensor HC-SR04 ultrasónico:
http://ccspicc.blogspot.com.ar/2016/11/pic16f84a-hc-sr04-ultrasonic-sensor.html
El proyecto es excelente, y funciona muy bien, sin embargo está escrito en CCS C, y mi proyecto es convertirlo en ASM.
Usando las librerías del libro de palacios y haciendo un pequeño cambio en la librería LCD_4BIT.INC para los pines del LED, he obtenido lo siguiente:
Me quedé estancado en la parte donde se lee el Echo del Sensor, que se recibe en RA1, y si pueden sugerirme algo más, ya que mi programación es básica. Sin embargo pude hacer funcionar la simulación en Proteus y armar el circuito físico.
Dejo el diagrama, Agradecido de antemano
http://ccspicc.blogspot.com.ar/2016/11/pic16f84a-hc-sr04-ultrasonic-sensor.html
El proyecto es excelente, y funciona muy bien, sin embargo está escrito en CCS C, y mi proyecto es convertirlo en ASM.
Código:
//LCD module connections
#define LCD_RS_PIN PIN_B0
#define LCD_RW_PIN PIN_B1
#define LCD_ENABLE_PIN PIN_B2
#define LCD_DATA4 PIN_B3
#define LCD_DATA5 PIN_B4
#define LCD_DATA6 PIN_B5
#define LCD_DATA7 PIN_B6
//End LCD module connections
#include <16F84A.h>
#fuses HS,NOWDT,PUT,NOPROTECT
#use delay(clock = 8000000)
#include <lcd.c>
#use fast_io(A)
unsigned int8 count;
unsigned int16 i, distance;
#INT_TIMER0
void timer0_isr(){
count++;
clear_interrupt(INT_TIMER0);
}
int1 wait_sensor(){
i = 0;
set_timer0(0);
count = 0; // Reset Timer0
while(!input(PIN_A1) && (i < 1000))
i = count * 256 + get_timer0();
if(i > 990)
return 0;
else
return 1;
}
unsigned int16 get_distance(){
i = 0;
set_timer0(0);
count = 0;
while(input(PIN_A1) && (i < 25000))
i = count * 256 + get_timer0();
return i;
}
void main(){
output_a(0);
set_tris_a(2); // Configure RA1 as input
lcd_init(); // Initialize LCD module
lcd_putc('\f'); // LCD clear
clear_interrupt(INT_TIMER0);
enable_interrupts(GLOBAL);
enable_interrupts(INT_TIMER0);
setup_timer_0 (T0_INTERNAL | T0_DIV_2); // Configure Timer0 module
lcd_gotoxy(4, 1); // Go to column 4 row 1
lcd_putc("Distance:");
while(TRUE){
// Send 10us pulse to HC-SR04 Trigger pin
output_high(PIN_A0);
delay_us(10);
output_low(PIN_A0);
// Read pulse comes from HC-SR04 Echo pin
if(wait_sensor()) {
distance = get_distance();
if(distance > 24990) {
lcd_gotoxy(3, 2); // Go to column 3 row 2
lcd_putc("Out Of Range");
}
else {
distance = i/58; // Calculate the distance
lcd_gotoxy(3, 2); // Go to column 3 row 2
lcd_putc(" cm ");
lcd_gotoxy(6, 2); // Go to column 6 row 2
printf(lcd_putc,"%3Lu",distance);
}
}
else {
lcd_gotoxy(3, 2); // Go to column 3 row 2
lcd_putc(" Time Out ");
}
delay_ms(100);
}
}
Usando las librerías del libro de palacios y haciendo un pequeño cambio en la librería LCD_4BIT.INC para los pines del LED, he obtenido lo siguiente:
Código:
LIST P=16F84A
INCLUDE <P16F84A.INC>
#DEFINE Sensor_Trigger PORTA,0
#DEFINE Sensor_Echo PORTA,1
CBLOCK 0x0C
ENDC
ORG 0
Bucle
BSF Sensor_Trigger ; Envio un pulso de 10us
CALL Retardo_10micros
BCF Sensor_Trigger
BSF Sensor_Echo ; Recibo por el PORTA,1
CALL LCD_Inicializa ; Inicializa LCD
MOVLW PORTA ; Muevo el valor recibido del Puerto A a W
CALL LCD_ByteCompleto ; Muestro el valor
CALL Retardo_100ms
GOTO Bucle
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
END
Me quedé estancado en la parte donde se lee el Echo del Sensor, que se recibe en RA1, y si pueden sugerirme algo más, ya que mi programación es básica. Sin embargo pude hacer funcionar la simulación en Proteus y armar el circuito físico.
Dejo el diagrama, Agradecido de antemano
Adjuntos
Última edición por un moderador: