Skocz do zawartości

Hc-sr04 - problem z odpaleniem


piwniczne

Pomocna odpowiedź

Hej,

chciałbym zmierzyć odległość czujnikiem HC-SR04.

Mam jednak problem - nie odpala on moich przerwań.

oto kod:

#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
int pomiar=1;

int main(){

DDRB |= (1<<PORTB0);   // wyjscie, do odpalenia trig na czujniku
PORTB |= (1<<PORTB0);  // daje w stan wysoki
DDRA = 0xff ; // Caly port A pracuje jako wyswietlacz (8 LED)
PORTA= 0xff ; // sprawdzam czy dziala - zapalam i gasze.
_delay_ms(3000);
PORTA= 0x00 ;
_delay_ms(1000);

TCCR1B |= (1 << CS10); // Ustawienie timera taktowanie to 1Mh wiec bez preskalera

DDRD &= ~(1<<PORTD2); // drugi pin portu D jako wejscie.
DDRD &= ~(1<<PORTD3); // trzeci pin portu D jako wejscie.
//PORTD|=(1<<PORTD2);     // do kazdego rezystor podciagajacy
//PORTD|=(1<<PORTD3);     // czyli normalnie jest stan wysoki. (to chyba nie) 

MCUCR|=(1<<ISC01)|(1<<ISC11)|(1<<ISC10); // ustawiamy przerwanie na spadek0 i wzrost1.
GICR|=(1<<INT0)|(1<<INT1);	  // umozliwiamy przerwania
sei();						  // inicjalizacja przerwan.

while(1){

}
}


ISR(INT0_vect){
pomiar=TCNT1; // sprawdzamy czas pomiaru (1 tyk to 1 us)
PORTA= 0xff ;
_delay_ms(3000);
PORTA= 0x00 ;
_delay_ms(1000);
}

ISR(INT1_vect){
PORTA= 0xff ;
_delay_ms(3000);
PORTA= 0x00 ;
_delay_ms(1000);
TCNT1 = 0; // Zeruje wartość timera
}

Działam na płytce stykowej, cU ATmega32.

Co do połączeń. Cały port A idzie na diody.

Czujnik: gnd - do masy. VCC do zasilania. (z płytki, z programatora).

Echo wchodzi do INT0 i INT1 - chciałbym aby zależnie od tego jakie zbocze, odpalało się odpowiednie przerwanie.

Trig PB0 <- powinien byc ciagle stan wysoki.

Efektem dzialania jest dojscie do pętli while, potem nie dzieje się nic.

Oczywiście _delay_ms(x) w przerwaniach dałem jedynie po to by sprawdzić czy w ogóle są wywoływane- otóż nie są.

Pomocy Panowie 🙂

Link do komentarza
Share on other sites

wielkie dzieki, pomogło.

działajacy kod:

/*
* main.c
*
*  Created on: 9 kwi 2014
*      Author: Dawid
*/

#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
int pomiar=1;

int main(){

DDRB |= (1<<PORTB0); // wyjscie
DDRA = 0xff ; // Ustawienie bitu LED jako wyjścia
PORTA= 0xff ;
_delay_ms(1000);
PORTA= 0x00 ;
_delay_ms(500);

TCCR1B |= (1 << CS10); // Ustawienie timera

DDRD &= ~(1<<PORTD2); // drugi pin portu D jako wejscie.
DDRD &= ~(1<<PORTD3); // trzeci pin portu D jako wejscie.
//PORTD|=(1<<PORTD2);  // do kazdego rezystor podciagajacy
//PORTD|=(1<<PORTD3);	 // czyli normalnie jest stan wysoki.

MCUCR|=(1<<ISC01)|(1<<ISC11)|(1<<ISC10); // ustawiamy przerwanie na spadek0 i wzrost1.
GICR|=(1<<INT0)|(1<<INT1);	  // umozliwiamy przerwania
sei();						  // inicjalizacja przerwan.

while(1){
	PORTB |= (1<<PORTB0);
	_delay_ms(1); // wysylamy impuls
	PORTB &= ~(1<<PORTB0);
	_delay_ms(300); // probkowanie 3Hz
}
}


ISR(INT1_vect){
TCNT1 = 0; // Zeruje wartość timera
}

ISR(INT0_vect){
pomiar=TCNT1;
PORTA= (pomiar/58) ; // w cm
}



/*
	DDRC = 0xff; // port jako wyjscie.
DDRD &= ~(1<<PORTD2); // drugi pin portu D jako wejscie.
DDRD &= ~(1<<PORTD3); // trzeci pin portu D jako wejscie.
PORTD|=(1<<PORTD2);  // do kazdego rezystor podciagajacy
PORTD|=(1<<PORTD3);	 // czyli normalnie jest stan wysoki.


MCUCR|=(1<<ISC01)|(1<<ISC11); // ustawiamy przerwanie na spadek.
GICR|=(1<<INT0)|(1<<INT1);	  // umozliwiamy przerwania
sei();						  // inicjalizacja przerwan.
*/


/********************************************************/
/*
void InitInterrupt(void)
{
//PRZERWANIA ZEWNĘTRZNE
   DDRD = 0xf8;     //PD0-PD2 - wejscie (Echo); PD3-PD5 - wyjścia(Trig)
   MCUCR = 0x3f;    //Przerwanie zostanie wywołane zboczem narastająym
                    //na wejściach INT0, INT1, INT2
//TIMER2
   TCNT2 = 0x00;       //Zerowanie rejestru TCNT2 (Rejestr jednostki zegara)
   TCCR2 = (1<<WGM01)|(1<<CS00);     //Ustawia timer2 w tryb CTC bez preskalera
                       //Czestotliwość 16Mhz/1=16MHz
   OCR2 = 0x10;        //Górna wartość licznika wynosi 16
                       //Przerwania będą następować co 1us
   SREG = 0x80;
}



//F-cja przerwania od Timera2
ISR(TIMER2_COMP_vect)
{
   licznik++;
}

//F-cja przerwania zewnętrznego INT0
ISR(INT0_vect)
{
   if(flaga==0)
   {
       TIMSK = (1<<OCIE2);                //włącza Timer2 w trybie dopasowania (START)

       ClrBit(EIMSK, INT0);

       MCUCR = 0x00;                        //Przerwanie zostanie wywołane zboczem opadającym
       MCUCR = (1<<ISC01);                //na wejściu INT0

       SetBit(EIMSK, INT0);

       flaga=1;
   }

   else if(flaga==1)
   {
       TIMSK &=~(1<<OCIE2);                //zatrzymuje Timer2 (STOP)

       ClrBit(EIMSK, INT0);

       MCUCR = 0x00;                        //Przerwanie zostanie wywołane zboczem rosnącym
       MCUCR = (1<<ISC01)|(1<<ISC00);        //na wejściu INT0

       SetBit(EIMSK, INT0);

       odl0=licznik;                        //Zapisuje wartość licznika do zmiennej "odl"
       odl0/=20;                            //oraz skaluje go

       licznik=0;                            //Zerowanie licznika
       flaga=0;

   }
}

//F-cja przerwania zewnętrznego INT1
ISR(INT1_vect)
{
   if(flaga==0)
   {
       TIMSK = (1<<OCIE2);                //włącza Timer2 w trybie dopasowania (START)

       ClrBit(EIMSK, INT1);

       MCUCR = 0x00;                        //Przerwanie zostanie wywołane zboczem opadającym
       MCUCR = (1<<ISC11);                //na wejściu INT1

       SetBit(EIMSK, INT1);

       flaga=1;
   }

   else if(flaga==1)
   {
       TIMSK &=~(1<<OCIE2);                //zatrzymuje Timer2 (STOP)

       ClrBit(EIMSK, INT1);

       MCUCR = 0x00;                        //Przerwanie zostanie wywołane zboczem rosnącym
       MCUCR = (1<<ISC11)|(1<<ISC10);        //na wejściu INT1

       SetBit(EIMSK, INT1);

       odl1=licznik;                        //Zapisuje wartość licznika do zmiennej "odl"
       odl1/=20;                            //oraz skaluje go

       licznik=0;                            //Zerowanie licznika
       flaga=0;

   }
}

//F-cja przerwania zewnętrznego INT2
ISR(INT2_vect)
{
   if(flaga==0)
   {
       TIMSK = (1<<OCIE2);                //włącza Timer2 w trybie dopasowania (START)

       ClrBit(EIMSK, INT2);

       MCUCR = 0x00;                        //Przerwanie zostanie wywołane zboczem opadającym
       MCUCR = (1<<ISC21);                //na wejściu INT2

       SetBit(EIMSK, INT2);

       flaga=1;
   }

   else if(flaga==1)
   {
       TIMSK &=~(1<<OCIE2);                //zatrzymuje Timer2 (STOP)

       ClrBit(EIMSK, INT2);

       MCUCR = 0x00;                        //Przerwanie zostanie wywołane zboczem rosnącym
       MCUCR = (1<<ISC21)|(1<<ISC20);        //na wejściu INT2

       SetBit(EIMSK, INT2);

       odl2=licznik;                        //Zapisuje wartość licznika do zmiennej "odl"
       odl2/=20;                            //oraz skaluje go

       licznik=0;                            //Zerowanie licznika
       flaga=0;
   }
}


double l_pomiar(void)
{
   SetBit(EIMSK, INT0);


   SetBit(PORTD, 3);
   _delay_us(15);
   ClrBit(PORTD, 3);

   _delay_ms(8);

   ClrBit(EIMSK, INT0);
   return odl0;
}

double p_pomiar(void)
{
   SetBit(EIMSK, INT2);


   SetBit(PORTD, 5);
   _delay_us(15);
   ClrBit(PORTD, 5);

   _delay_ms(8);

   ClrBit(EIMSK, INT2);
   return odl2;
}

double s_pomiar(void)
{
   SetBit(EIMSK, INT1);


   SetBit(PORTD, 4);
   _delay_us(15);
   ClrBit(PORTD, 4);

   _delay_ms(8);

   ClrBit(EIMSK, INT1);
   return odl1;
}
*/
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.