Fórum témák

» Több friss téma
Fórum » AVR - Miértek hogyanok
 
Témaindító: pakibec, idő: Márc 11, 2006
Témakörök:
WinAVR / GCC alapszabályok:
1. Ha ISR-ben használsz globális változót, az legyen "volatile"
2. Soha ne érjen véget a main() függvény
3. UART/USART hibák 99,9% a rossz órajel miatt van
4. Kerüld el a -O0 optimalizációs beállítást minden áron
5. Ha nem jó a _delay időzítése, akkor túllépted a 65ms-et, vagy rossz az optimalizációs beállítás
6. Ha a PORTC-n nem működik valami, kapcsold ki a JTAG-et
Bővebben: AVR-libc FAQ
Lapozás: OK   427 / 840
(#) trudnai válasza sgt hozzászólására (») Márc 20, 2012 / 1
 
Bocsanat, hogy kozbe kotyogok, de igy nem szabad csinalni, mivel igy tul irhatod a buffert!

  1. #define MAXBUF 20
  2.  
  3. unsigned char i;
  4. char string[MAXBUF];  // előre le kell foglalni a helyet
  5.  
  6. for ( i = 0; i < MAXBUF; i++ )
  7. {
  8.     // eltaroljuk -- a lezro nulla is kell,
  9.     // kulonben bajok lehetnek a string kezelessel
  10.     string[i] = UDR;
  11.  
  12.     if ( '\0' == string[i] ) {
  13.         break;
  14.     }
  15. }
  16.  
  17. // biztonsag kedveert beteszunk egy lezaro nullat a buffer
  18. // legvegere is, igy elkeruljuk az esetleges problemakat
  19. // ha pl tul hosszu string jonne be...
  20. string[MAXBUF-1] = '\0';


...es most mar a string teljesen megbizhato...
(#) zombee válasza mzozo95 hozzászólására (») Márc 20, 2012 /
 
Például úgy hogy a karaktereket egyenként beleteszed egy karaktertömbbe?
(#) Topi válasza trudnai hozzászólására (») Márc 20, 2012 / 1
 
Ezt annyival egészíteném ki, hogy természetesen várakozni kell, míg az UDR-t olvasod, mert ez így egy pillanat alatt végigfut... csak adat nem kerül az UDR-be.
(Mindkét megoldásra igaz. Sgt első veszélyes megoldására, és Trudnai korrektebb megoldására is)

De a valóságban ettől eltérő módon kellene gyűjteni a stringet, megőrizve a kvázi taskokat és aszinkronitásunkat.
Bemásolom az egyik általam készített AT-val vezérelhető készülék ide vonatkozó program részletét.

  1. if(USARTDataReceived(0)) {
  2.   data = USARTReceiveByte(0);
  3.   if(EchoOn) USARTSendByte(0,data);
  4.  
  5.   if(data>='a' && data<='z') {
  6.     data -= 32;//uppercase
  7.   }
  8.  
  9.   if(data==0x0D) {
  10.     ParseCommand(&recbuff[0]);
  11.     recbuff_idx = 0;
  12.   } else
  13.   if(data==0x0A) {
  14.     //eldobás
  15.   } else {
  16.     recbuff[recbuff_idx] = data;
  17.     if(recbuff_idx<RECBUFF_LEN-1) {
  18.       recbuff_idx++;
  19.       recbuff[recbuff_idx] = 0;
  20.     }
  21.   }
  22. }//rec


- 0x0D-re "triggerelt", ekkor az addig gyűjtött stringet átadja a parse-oló függvénynek (ParseCommand)
- 0x0A-t eldobja
- minden mást gyűjt a pufferben, és mindig lezárja a stringet azonnal (ez fontos!!) Lsd. recbuff[recbuff_idx]=0;
(#) hunkiraly hozzászólása Márc 20, 2012 /
 
Sziasztok! Nem rég ismerkedek én is az AVR-ekkel.Egy olyan problémám lépett fel, hogy a "Belépés programozási üzemmódba"-re Failed-et kapok egy olyan hiba üzenettel ami ebben a videóba másodjára ugrik fel. Azután is hogy kivettem a pipát a CKDIV8-ból és át állítottam a frekit és így kezdő fejjel már egészen neki keseredtem a dolognak mert nincs több 5letem akébel rövidebb mint 20 cm szóval ez nem lehet gond. Topi féle programozóm van(lehet hogy ezzel van valami) és AVR Studio 4.19 van fel telepítve a Számítógép pedig egy laptop. Kösz a válaszokat így előre is.
(#) Reggie válasza patmosis hozzászólására (») Márc 20, 2012 /
 
Az nem is giroszkop.
(#) Reggie válasza sgt hozzászólására (») Márc 20, 2012 / 1
 
Majdnem jo, csak ha o fogad sorosporton es \n a lezaras, akkor EOL-ra kell tesztelni (0x0d). A ciklus pedig lehet nyugodtan hatul tesztelo, mert a memoriaban is le kell zarni a stringet. Tehat igy:

  1. #define EOS 0x00
  2. #define EOL 0x0D
  3. ...
  4. char x;
  5. char string[20];  // előre le kell foglalni a helyet, ahova majd kerülni fog, ha jól tudom.
  6. do {
  7.   x=UDR;
  8.  *string++ = x;
  9. } while(x!=EOL);
  10. *string=EOS;
(#) patmosis válasza Reggie hozzászólására (») Márc 20, 2012 /
 
Gyorsulás mérő , de ugyan úgy dőlést mér!
Accelerométer.
(#) Reggie válasza patmosis hozzászólására (») Márc 20, 2012 /
 
Nem, gyorsulast mer. Dolest csak nyugalmi allo helyzetben tud merni. Peldaul szabadeses kozben nem, mig ott a giroszkop hasznalhato. Es meg sorolni lehetne. Tehat giroszkop!=gyorsulasmero. Hasonloan ahhoz, hogy kondenzator!=akkumulator.
(#) Fizikus válasza patmosis hozzászólására (») Márc 20, 2012 /
 
Hat igen, amit linkeltel az gyorsulasmero! Ajanlom figyelmedbe a kovetkezo cikkem:
MMA7260
Ez a gyorsulasmero az MMA7361 elodje. Nem sok kulonbseg van koztuk (csak mas az allithato merestartomany), ugyanugy analog jelet allitanak elo.
Ahhoz hogy hasznalni tudjad, az X, Y es Z kimeneten levo analog jelet kell merned (a cikkben levo kodot kell atirnod Arduino-ra). A neten sok pelda van, keress ra az Arduino + potmeter-re...
(#) sikolymester válasza Fizikus hozzászólására (») Márc 20, 2012 /
 
Tudtommal az Arduino IDE megeszi a szabványos C kódot, így nem lesz nagyon bonyolult szinte akár egy az egyben betennie.
(#) Fizikus válasza sikolymester hozzászólására (») Márc 21, 2012 /
 
Igaz, de egy kezdonek szerintem egyszerubb osszehozni es megerteni egy 20-25 soros Arduino kodot, mint az ADC es UART mukodeset regiszter szinten megismerni es az En kb 100 soros AVR-GCC kodomat megfejteni.
(#) Reggie válasza Fizikus hozzászólására (») Márc 21, 2012 /
 
Van AVR Software Framework, igy azert nem kell feltetlen regiszter szinten szenvedni. Bar teny, hogy kezdetekben az Arduino egyszerubb, de hamar korlat is lesz a sok kotottseg.
(#) patmosis hozzászólása Márc 21, 2012 /
 
Nagyon kjöszönöm a sok segítséget, sajnos teljesen kezdő vagyok ezen a téren de érdekel a dolog ,lesz sok hülye kérdésem de szertném az alapokat megtanulni.
(#) prody válasza trudnai hozzászólására (») Márc 21, 2012 /
 
A szakdolgozatomat.
Konkrétan egy 6 szabadságfokú robotkart.
3 atmega 162 és 1 16-ost tartalmaz a vezérlőpanel plusz egy kis sallang (csatolás, szűrés, miegymás).
Tisztában vagyok vele hogy nem éppen UART a legideálisabb erre a feladatra mint ahogy nem is ezek a mikrokontrollerek, de kötött volt a kezem a DIP miatt... szívesebben nyomattam volna SPI-al, meg még inkább CAN-nel, de DIP-ben az felejtős... Mivel mindent idehaza építek az viszont előkövetelmény volt számomra. Ezek meg olcsó kis kontrollerek és tökéletesen realizálható velük a feladat, még ha sokkal többre is képesek lennének mint holmi robotkar vezérlés A 162-esek a PWM plusz dupla UART miatt, de persze ADC egyikben sincs Szóval a 16-os emiatt kell.
A Real Time Terminált meg Perlben írtam, ez egy real time diagnosztikai GUI magához a vezérlőpanelhez.
(#) Reggie válasza prody hozzászólására (») Márc 21, 2012 /
 
A DIP tokot a tanszek irta elo?
(#) sikolymester válasza prody hozzászólására (») Márc 21, 2012 /
 
Ha kell számítási kakaó, akkor ott vannak a DSPic-ek DIP tokban.
(#) sgt válasza sikolymester hozzászólására (») Márc 21, 2012 /
 
Vagy már PIC32-k is.
(#) jwaldha válasza sgt hozzászólására (») Márc 21, 2012 /
 
Esetleg Parallax Propeller ?
(#) szdani hozzászólása Márc 21, 2012 /
 
Sziasztok!
Farok voltam mert amikor programoztam az atmega168-at akkor nem raktam át a jumpert, 3,3V-ról ment az avr és úgy programoztam, azóta nem ismeri fel, segéd órajel generátorral is próbáltam de semmi, a reset lábon 5V-ot mérek ha 5Vról hajtom, de nem történik semmi. Ez azt jelenti hogy örök vadászmező? Egyébként még az az érdekes számomra hogy atmega168-ból az smd változatot nem tudom programozni csak a simát. Van valami hardveres különbség?
(#) prody válasza Reggie hozzászólására (») Márc 21, 2012 /
 
Nemnem, én írtam elő magamnak, mert: 1: Nem volt pénzem a panelt legyártatni. 2.: Nem volt, és még mindig nincs meg odahaza a technológiám smd forrasztáshoz.
Így maradt a DIP
@sikolymester: A Pic meg szintén elég idegen számomra régóta használok atmegát így ezért választottam atmegát.

Számítási kakaó nem kell, ez most 18,432 MHZ-ről üzemel igen biztonságosan, szóval bőven elegek.
Így a komplett robotkar mindennel együtt max 10000Ft volt Kiskereskedelmi áron vásárolva mindent!
(#) kiborg válasza prody hozzászólására (») Márc 21, 2012 /
 

Ha kész leszel akkor akár írhatnál róla egy cikket is, szerintem sokan szívesen vennék. Neked meg okoznak túl sok plusz munkát, hiszen, már egyszer úgyis megírtad.
Üdv Kiborg
(#) szdani válasza prody hozzászólására (») Márc 22, 2012 /
 
Ha akad úgy pénzed akkor 25000FT ért lehet kapni asztali veller pákát, 150-450C-ig állítható az elektro konthába láttam, én egy ilyennel forrasztom az smd alkatrészeket, nagyon jól lehet vele dolgozni, viszont ha le akarod szedni akkor hőlégfúvó kell, olyan 6-7e körül szerintem kapsz aminek van szűkítője, ahoz meg már csak egy csipesz és egy kis folyasztószer, meg némi tapasztalat kell. Nagyobb hegyű pákával is megtudod oldani, ha a panelt előónozod, rárakod az alkatrészt és a lábakra érinted a pákát, vagy az adott lábhoz érinted a pákát és nyomsz oda egy kis ónt. Ha 2 lábat összefolyasztasz akkor ónszívó fonattal le tudod szedni a felesleget. Remélem segítettem.
(#) zombee válasza Reggie hozzászólására (») Márc 22, 2012 /
 
A frekimérő témához, egy ilyen megfelelne a bemenetre? Bővebben: Link
Mondjuk egy 220-330 kOhm bázisellenállással open-collector üzemmódban, és még 1µF kondival.
(#) Reggie válasza zombee hozzászólására (») Márc 22, 2012 /
 
Nem nyilik meg az url.
(#) Reggie válasza szdani hozzászólására (») Márc 22, 2012 /
 
Meg holegfuvo sem kell, csak jo technika. Amugy en egy Weller TCP-24-et hasznalok mar >10 eve.
(#) H2opok hozzászólása Márc 22, 2012 /
 
Üdv
Egy kis segítség kellene. Összeraktam egy ILYEN órát. A programozást egy barátom csinálta pickit 2-vel. Működik rendesen, egy baj van csak, hogy a kijelzés nagyon villog. Arra tippelünk hogy a controller villogtatja mivel a belső órajelet nem tudtuk átállítani. Mert az oldalon van egy hivatkozás a Fuse bitekről. Ahogy mi kivettűk a leírásból, az Atmega alapból 1Mhz-en van, de át kellene állítani 0001-ről 0000-ra. A mellékelt képen látható programot használtuk. A "Program fuse bit" ablakban alapból ez van a kontrollerben:
Cksel0=0 "kipipálva"
Cksel1=0
Cksel2=0 "kipipálva"
Cksel3=0 "kipipálva"

Itt, ezeknél kellene módosítani, vagy hol?

ITT az oldal alján a mutatja hogy mit kellene átírni, de ezt a programot nem használja.

Előre is köszi.
(#) Reggie válasza H2opok hozzászólására (») Márc 22, 2012 /
 
Igen. 0001 re kell atirni, ahol az 1 a nem programozott allapot.
(#) H2opok válasza Reggie hozzászólására (») Márc 22, 2012 /
 
De a fotókon pont 0001-ről írják át 0000-ra. ?
És amire én kíváncsi vagyok, hogy a pipákat hová (cksel0=0, stb.) kell tenni, mert amit leírtam, az van most benne, nem lett módosítva.
(#) Hp41C válasza H2opok hozzászólására (») Márc 22, 2012 /
 
Szia!

Csak értetlenkedek, a megoldást nem tudom... A leírásban a Fuse bitek részletezésében AtMega8535 -tel készült képek vannak, a belinkelt képen AtMega64 van beállítva, a kapcsolási rajzon pedig AtMega88 szerepel.
(#) Reggie válasza H2opok hozzászólására (») Márc 22, 2012 /
 
Sajnos nem tudok japanul. De ha latod, hogy 0000-at kell beleirni, akkor nem ertem miert kerdezed. De leegyszerusitem a kerdest: Van kulso orajel(vagy kvarc)? Ha van akkor 0000 mehet bele. 0 a bepipalt, azaz programozott allapot.
Következő: »»   427 / 840
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