Le petit programme ci-dessous est écrit en c pour compilateur ccs.
La cible est un 16F877, la lecture se fait sur la liaison série.
Il ne faut pas faire d'erreur sur la programmation de la liaison série, sinon pas de lecture cohérente.
Il ne faut pas non plus fair d'erreur sur la fréquence programmée et celle du quartz, sinon le timing du capteur est erroné.
L'adresse du capteur ci-dessous est E00 comme généralement programmé lors de l'achat du capteur.
#include <16f877.h>
#fuses HS,NOPROTECT,NOWDT,BROWNOUT,PUT,NOLVP
#ORG 0x1F00,0x1FFF {} /* Reserve memory for bootloader for the 8k 16F876/7 */
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use i2c (master, sda=PIN_C4, scl=PIN_C3)
main()
{
long range;
while(1)
{
i2c_start(); //initate start condition
i2c_write(0xE0); //device address
i2c_write(0x00); //register address
// i2c_write(0x50); //set units to inches
i2c_write(0x51); //set units to centimeters
i2c_stop();
delay_ms(105); //wait for returning ping
i2c_start(); //initiate a new start condition
i2c_write(0xE0); //device address
i2c_write(0x02); //address of high byte register
i2c_start();
i2c_write(0xE1); //device address but read
range = i2c_read(1); //read first byte and shift left
range = range << 8;
range += i2c_read(0);
i2c_stop();
// printf("range in inches = %lu\n\r", range[i]);
printf("range in centimeters = %4lu\n\r", range);
printf(" \n\r");
delay_ms(100);
}
}
Bonne chance
Ecrire un commentaire - Voir les 2 commentaires

Commentaires