Partager l'article ! Lecture I2C simple d'un capteur de type srf08: Le petit programme ci-dessous est écrit en c pour compilateur ccs. La cible est un 16F877, la ...
Bienvenue sur le blog de GreenRbot
mon robot tondeuse de 2ème génération.
Ma précédente réalisation, SyLaM, était un robot tondeuse entièrement réalisé à partir de matériel de récupération. Malheureusement, les moteurs, issus des essuie-glaces d'une Toyota Corolla, n'étaient pas assez puissant pour ma pelouse, ou devrais-je dire mon pré.
De plus, le processeur, un PIC 16F84 n'offrait pas la puissance de calcul suffisante à l'algorithme de tonte parallèle que je voulais intégrer.
Vous pourrez voir la description de SyLaM à l'adresse suivante : http://sylam.blogspirit.com/
GreenRbot, offre une motorisation plus puissante, et le processeur central est un classique PIC 16F877.
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
<div id="viadeoBlog"><script type="text/javascript" src="http://widget.viadeo.com/blogs/afficheblog/index.jsp?w=1&b=0042ccn2t7pqtgd3&u=0041k7tt3hmzav7w"></script></div>
Commentaires