Autor Tema: Leer Echo de Sensor HC-SR04 con PIC16F84A mediante ASM  (Leído 4633 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado salvacoloco

  • PIC10
  • *
  • Mensajes: 1
Leer Echo de Sensor HC-SR04 con PIC16F84A mediante ASM
« en: 10 de Febrero de 2017, 15:03:01 »
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.pe/2016/11/pic16f84a-hc-sr04-ultrasonic-sensor.html?m=1

El proyecto es excelente, y funciona muy bien, sin embargo está escrito en CCS C, y mi proyecto es convertirlo en ASM.

Código: C++
  1. //LCD module connections
  2. #define LCD_RS_PIN PIN_B0
  3. #define LCD_RW_PIN PIN_B1
  4. #define LCD_ENABLE_PIN PIN_B2
  5. #define LCD_DATA4 PIN_B3
  6. #define LCD_DATA5 PIN_B4
  7. #define LCD_DATA6 PIN_B5
  8. #define LCD_DATA7 PIN_B6
  9. //End LCD module connections
  10.  
  11. #include <16F84A.h>
  12. #fuses HS,NOWDT,PUT,NOPROTECT
  13. #use delay(clock = 8000000)
  14. #include <lcd.c>
  15. #use fast_io(A)
  16.  
  17. unsigned int8 count;
  18. unsigned int16 i, distance;
  19. #INT_TIMER0
  20. void timer0_isr(){
  21.   count++;
  22.   clear_interrupt(INT_TIMER0);
  23. }
  24. int1 wait_sensor(){
  25.   i = 0;
  26.   set_timer0(0);
  27.   count = 0;                             // Reset Timer0
  28.   while(!input(PIN_A1) && (i < 1000))
  29.     i = count * 256 + get_timer0();
  30.   if(i > 990)
  31.     return 0;
  32.   else
  33.     return 1;
  34. }
  35. unsigned int16 get_distance(){
  36.   i = 0;
  37.   set_timer0(0);
  38.   count = 0;
  39.   while(input(PIN_A1) && (i < 25000))
  40.     i = count * 256 + get_timer0();
  41.   return i;
  42. }
  43. void main(){
  44.   output_a(0);
  45.   set_tris_a(2);                                      // Configure RA1 as input
  46.   lcd_init();                                         // Initialize LCD module
  47.   lcd_putc('\f');                                     // LCD clear
  48.   clear_interrupt(INT_TIMER0);
  49.   enable_interrupts(GLOBAL);
  50.   enable_interrupts(INT_TIMER0);
  51.   setup_timer_0 (T0_INTERNAL | T0_DIV_2);             // Configure Timer0 module
  52.   lcd_gotoxy(4, 1);                                   // Go to column 4 row 1
  53.   lcd_putc("Distance:");
  54.   while(TRUE){
  55.     // Send 10us pulse to HC-SR04 Trigger pin
  56.     output_high(PIN_A0);
  57.     delay_us(10);
  58.     output_low(PIN_A0);
  59.     // Read pulse comes from HC-SR04 Echo pin
  60.     if(wait_sensor()) {
  61.       distance = get_distance();
  62.       if(distance > 24990) {
  63.         lcd_gotoxy(3, 2);                             // Go to column 3 row 2
  64.         lcd_putc("Out Of Range");
  65.       }
  66.       else {
  67.         distance = i/58;                              // Calculate the distance
  68.         lcd_gotoxy(3, 2);                             // Go to column 3 row 2
  69.         lcd_putc("       cm   ");
  70.         lcd_gotoxy(6, 2);                             // Go to column 6 row 2
  71.         printf(lcd_putc,"%3Lu",distance);
  72.       }
  73.     }
  74.     else {
  75.       lcd_gotoxy(3, 2);                               // Go to column 3 row 2
  76.       lcd_putc("  Time Out  ");
  77.     }
  78.   delay_ms(100);
  79.   }
  80. }

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: [Seleccionar]
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.

Aquí dejo el diagrama:


* hc-sr04-ultrasonic-sensor-distance-pic16f84a-circuit.png
(27.54 kB, 1421x751 - visto 3273 veces)


Agradecido de antemano
« Última modificación: 10 de Febrero de 2017, 15:47:30 por salvacoloco »

Desconectado humberto_caceres

  • PIC10
  • *
  • Mensajes: 1
Re:Leer Echo de Sensor HC-SR04 con PIC16F84A mediante ASM
« Respuesta #1 en: 04 de Octubre de 2017, 20:21:52 »
hola pudiste hacer que funcione en ASM por que estoy en la misma que vos para un proyecto de una feria de ciencias y encima la semana que viene


 

anything