2017-10-16 16 views
0

Je travaille sur une partie du projet pour avoir des lectures avec un capteur à ultrasons et l'envoyer avec une communication série, j'ai écrit du code et donne des lectures aléatoires et donne parfois 0 en lecture, est le Formule J'ai utilisé pour trouver la distance à droite!?, Ou il existe une autre formule, J'utilise Atmega32 avec horloge interne 8MHz, quelqu'un peut-il m'aider et savoir ce qui ne va pas avec mon code!?.Capteur à ultrasons en interface avec AVR

#define F_CPU 8000000UL 
#include <avr/io.h> 
#include <util/delay.h> 
#include <avr/interrupt.h> 

void inti_serial(); 

static volatile int pulse = 0; 
static volatile int change = 0; 

int main(void) 
{ 

/* Replace with your application code */ 
inti_serial(); 

MCUCR |= (1 << ISC00); //Any logical change on INT0 
GICR |= (1 << INT0); //Enable INT0 

TCCR1A=0; 
sei(); 

while (1) 
{ 
PORTC |= (1<<0); 
_delay_us(15); 
PORTC &= ~(1<<0); 
while(!(UCSRA & (1<<UDRE))); 
UDR = ((pulse/2)*1*(1/F_CPU)*343) ; 
_delay_ms(100); 
} 
} 

ISR(INT0_vect){ 


if (change==1)//when logic from HIGH to LOW 

{ 

    TCCR1B=0;//disabling counter 

    pulse=TCNT1;//count memory is updated to integer 

    TCNT1=0;//resetting the counter memory 

    change=0; 

} 

if (change==0)//when logic change from LOW to HIGH 

{ 

    TCCR1B|=(1<<CS10);//enabling counter 

    change=1; 

} 
} 

void inti_serial() 
{ 
UCSRB |= (1<<TXEN); 
UCSRC |= (1<<UCSZ0) | (1<<UCSZ1) | (1<<URSEL); 
UBRRL = 0x33; 
} 
+0

Copie possible de [Sérialiser les structures de données en C] (https://stackoverflow.com/questions/371371/serialize-data-structures-in-c) –

+1

@GianlucaGhettini Cette question n'a rien à voir avec la sérialisation mais, à distance, avec * communication série *. – JimmyB

Répondre

1

Je vois quelques options pour améliorer votre développement:

  • Vous écrivez un échantillon de la RSR à la variable et vous le lire en continu de la boucle principale et la sortie il. Au lieu de cela, vous ne devez sortir qu'un seul échantillon (les données série sont beaucoup plus petites et plus faciles à se concentrer sur le contenu et le timing)

  • Avant de penser à la bonne formule, vérifiez que votre mécanisme d'échantillonnage est correct. Sans détails sur votre capteur, personne ici ne peut juger votre formule, de toute façon.

  • Au lieu d'échantillonnage d'un compteur autonome vous pouvez utiliser le circuit de capture d'entrée du processeur (plus précis, moins la gigue due à interrompre la latence)

  • Au lieu de remettre à zéro le registre de compteur à zéro, vous pouvez soustraire deux des échantillons consécutifs de l'autre (la gigue inférieure de l'échantillon due à interrompre la latence)

  • au lieu d'en déduire le bord d'un drapeau basculée, demander au matériel sur l'état de la broche ou ce bord a déclenché l'alarme (ou la capture)