Fórum témák

» Több friss téma
Fórum » ATMEGA C kód ultrahangos távmérő
Lapozás: OK   1 / 1
(#) dedista hozzászólása Márc 14, 2010 /
 
Sziasztok!

Lenne egy olyan kérésem, hogy elakadtam egy kód írásában. Ultrahangos távolságmérés a téma, de kicsit más a kérdésem, mint az eddigi topikokban. Ezért bátorkodtam újat nyitni. Sikerül kiadnom a jelet az ATMEGA32 OC0-s lábán. 40kHz. És meg is tudom állítani. De hiába jön vissza jel az ICP1-es lábra, nem lép ki a while ciklusból. 5.23 Voltos jel jelenik meg a lábán mikor visszaérkezett a hang, de nem tudom hogyan dolgozzam föl. Hogy számoljam ki mennyi az ami a TIMER1-be íródott. Igazából programozásból analfabéta vagyok. Erre lenne szükségem.

  1. while(1)
  2.   {
  3.         while (echo == 0) //for (j = 0; j < 2; j++)
  4.         {      
  5.                 TIMSK &= ~((1 << TICIE1) | (1 << TOIE1));
  6.                 start_pwm(); // Jel kibocsatas 0.3 ms-ig
  7.                 for (i = 0; i < 3; i++) _delay_us(100);
  8.                 stop_pwm();
  9.                 _delay_ms(2);
  10.                 TIMSK |= (1 << TICIE1) | (1 << TOIE1);
  11.  
  12.         }

ITT a capture:
Elvileg ennek kéne jeleznie.
  1. SIGNAL (SIG_INPUT_CAPTURE1)
  2. {
  3.         cli();
  4.        
  5.                 ido_d = ICR1; // Mentjuk a capture erteket
  6.                 TCCR1B &= ~(1 << CS11); // Szamlalo leall...
  7.                 TCNT1 = 0; // ... es nullazodik
  8.                 echo == 1;
  9.  
  10.         sei();
  11.         return;
  12. }


Köszi a segítséget!
(#) Moderátor hozzászólása dedista hozzászólására (») Márc 14, 2010
 
Használd a kód beillesztést máskor.
(#) boczhunor hozzászólása Márc 15, 2010 /
 
Helló.
Én Arduino-ban programozok AVR-ket,ott az egész olvasás (általában pulseIn-t vagy SofetSerial parancsal olvasok pinget,de még van sok,pl. a wire library,NewSofetSerial,egyszerű analogRead és konverzió... és aztán pedig osztási képlettel számítók értéket. Egyébként rengeteg Ping-ről szóló anyag van a neten, könnyű megérteni működésüket. Egyébként az Arduino is egy C alapú nyelv,hasonlítanak,szinte a gondolkodásmód is azonos.) meg minden kicsit más de a gondolkodás hasonlít.
Egyébként hagyjuk az előszót térjünk a lényegre.
Itt van a kérdésedre a 100%-os megoldás példa progival meg minden infó. Sok sikert!
Üdv. Hunor!!
(#) boldivi válasza dedista hozzászólására (») Márc 19, 2010 /
 
Szia!

Nem lehet, hogy a fordító kioptimalizálja az echo változót?

winavr csinál ilyet amikor egy globális változó a főprogramban van és pl. megszakításban változik az értéke.
(#) (Felhasználó 4577) válasza dedista hozzászólására (») Márc 20, 2010 /
 
Nem tudom, hogy aktuális-e még.
Hogy van deklarálva az echo változó?

Így kell:
  1. volatile unsigned int echo = 0;
(#) Ricsi89 válasza dedista hozzászólására (») Márc 20, 2010 / 4
 
Egy apró megjegyzés. Az interruptban az echo-t nem két egyenlőség jellel kellene 1-re állítani. Szóval ehelyett:
  1. echo==1;

Ez kellene:
  1. echo=1;

Ahogy most van neked így csak egy egyenlőség vizsgálatot csinál, nem egyenlővé teszi 1-el. Így nem is fog kilépni a while ciklusból.
(#) (Felhasználó 4577) válasza Ricsi89 hozzászólására (») Márc 20, 2010 /
 
Pontosan, és a return se kell bele. return; pedig végképp nem, ha már beleteszed, valami legyen, pl return 0;, de nem kell bele return.
Következő: »»   1 / 1
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem