Witam
Mam problem z ultradźwiękowym miernikiem odległości na atmedze8.
Generacja częstotliwości przebiega prawidłowo, na odbiorniku za torem wzmacniaczy otrzymuję widoczny syglał odbity od przeszkody.
Błędy pojawiają się przy komparacji sygnału z napięciem referencyjnym. Wynik jest bardzo niedokładny, ponadto od drugiego bądź trzeciego pomiaru procesor wysyła na UART zawsze tą samą wartość rejestru IC, konkretnie 0x2F. Przypuszczam że błąd może być taki, iż nie zeruję odpowiednio któregoś licznika bądź bitu lub flagi.
Przesyłam kod programu, pomiar następuje po wysłaniu na procesor przez port szeregowy komputera znaku 'S'.
http://ds5.agh.edu.pl/~carlo/elektronika/ksp/kod.c
Dodatkowo przesyłam screen z wynikiem, jak widać po pierwszych dwóch pomiarach procesor wydala tylko 0x30 lub 0x2F.
http://ds5.agh.edu.pl/~carlo/elektronika/ksp/wynik.jpg
Proszę o wskazówkę co nie tak może być w kodzie.
Pozdrawiam
//Edit OK Dodaję kod, sam wiem że nikomu nie chce się otwierać załącznika:D
Mam problem z ultradźwiękowym miernikiem odległości na atmedze8.
Generacja częstotliwości przebiega prawidłowo, na odbiorniku za torem wzmacniaczy otrzymuję widoczny syglał odbity od przeszkody.
Błędy pojawiają się przy komparacji sygnału z napięciem referencyjnym. Wynik jest bardzo niedokładny, ponadto od drugiego bądź trzeciego pomiaru procesor wysyła na UART zawsze tą samą wartość rejestru IC, konkretnie 0x2F. Przypuszczam że błąd może być taki, iż nie zeruję odpowiednio któregoś licznika bądź bitu lub flagi.
Przesyłam kod programu, pomiar następuje po wysłaniu na procesor przez port szeregowy komputera znaku 'S'.
http://ds5.agh.edu.pl/~carlo/elektronika/ksp/kod.c
Dodatkowo przesyłam screen z wynikiem, jak widać po pierwszych dwóch pomiarach procesor wydala tylko 0x30 lub 0x2F.
http://ds5.agh.edu.pl/~carlo/elektronika/ksp/wynik.jpg
Proszę o wskazówkę co nie tak może być w kodzie.
Pozdrawiam
//Edit OK Dodaję kod, sam wiem że nikomu nie chce się otwierać załącznika:D
#include <avr/io.h>
#include <avr/interrupt.h>
//#include <io.h>
#define licz_od 155
#define F_CPU 8000000 //częstotliwość zegara w Hz
#define UART_BAUD 19200 //prędkość transmisji
#define UART_CONST (F_CPU/(16ul*UART_BAUD)-1)
volatile uint8_t obrot;
char litera;
char UART_getchar (void)
{
loop_until_bit_is_set(UCSRA,RXC); // czekaj na zakończenie odbioru
UCSRA &=~_BV(RXC); // skasuj bit RXC w rej. USR
return UDR; // zwróć zawartość rejestru UDR
}
void UART_putchar (char c)
{
UDR = c; // wpisz c do rejestru UDR
loop_until_bit_is_set(UCSRA,TXC); // czekaj na zakończenie transmisji
UCSRA|=_BV(TXC); // ustaw bit TXC w rej. USR
}
//***********robimy impulsy*****************//
SIGNAL (SIG_OVERFLOW0){
if (obrot < 24){
if (bit_is_set (PORTD,PD2)){ //sprawdza czy bit ustawiony
PORTD&=~_BV(2); //kasuje bit
TCNT0 = licz_od;
}
else {
PORTD|=_BV(2);
TCNT0 = licz_od;
}
obrot++;
}
else if (obrot >= 24 && obrot < 30){
PORTD = 0x1b;
TCNT0 = 0x00;
obrot++;
}
else {
//obrot = 0;
TIMSK = 0x24; //przerwania timer1_overflow i input capture timer1
TCCR0 = 0x00; //timer0 wylaczony
TCNT1L = 0x00;
TCNT1H = 0x00;
ACSR = 0x04; //komparator wlaczony
TCCR1B = 0x42; //timer1 wlaczony
}
}
SIGNAL (SIG_INPUT_CAPTURE1){
UART_putchar (ICR1H);
UART_putchar (ICR1L);
PORTD|=_BV(5);//wlacza diode
ICR1H = 0x00;//zerujemy rejestr IC
ICR1L = 0x00;
TIMSK = 0x00;//wylaczamy przerwania
ACSR = 0x00;//wylaczamy komparator
TCCR1B = 0x00;//wylaczamy timer 1
TCNT1L = 0x00;//zerujemy timer 1
TCNT1H = 0x00;
}
SIGNAL (SIG_OVERFLOW1) // przerwanie od przepełnienia timer 1 gdyby nie mial zasiegu
{
//UART_putchar (TCNT1H);
UART_putchar (TCNT1L);
TCCR1B = 0x00;
//ACSR = 0x00;
TCNT1L = 0x00;
TCNT1H = 0x00;
TIMSK = 0x00;
ACSR = 0x00;
PORTD&=~_BV(5);
}
int main (){
TCCR0 = 0x00; //rejestr kontrolny timer0 wylaczony
TCCR1B = 0x00;
DDRD = 0x3f; //rejestr kierunkowy portu D
PORTD = 0x1b; //rejestr stanow portu D
TCNT0 = 00; //inicjacja licznika timer0
TCNT1 = 0x00;
TIMSK = 0x00; //wlacza obsluge przerwania timer0 overfolw, timer1 overflow, timer1 IC
ACSR = 0x00; //IC od komparatora
//UBRR = (unsigned char)UART_CONST; // ustaw prędkość transmisji
UBRRH = (unsigned char)(UART_CONST>>8);
UBRRL = (unsigned char)UART_CONST;
UCSRB = _BV(RXEN)|_BV(TXEN); //zezwolenie na nadanie i odbior znakow
//obrot = 0;
sei (); //wlacza obsluge przerwan
while (1){
litera = UART_getchar ();
if (litera == 'S'){
obrot = 0; //inicjacja zmiennej obrot
ACSR = 0x00; //komparator wylaczony
TIMSK = 0x01; //timer 0 overflow wlaczone
TCNT0 = licz_od; //wartosc poczatkowa timer 0
TCCR0 = 0x01; //timer 0 wlaczony bez preskalera
//PORTD|=_BV(5);
}
else if (litera == 'R'){
TCCR1B = 0x00;
TCCR0 = 0x00;
obrot = 0;
TCNT0 = licz_od;
TCNT1L = 0x00;
PORTD&=~_BV(5);
}
}
}