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   633 / 837
(#) fecus hozzászólása Dec 10, 2014 /
 
Próbálom megtanulni, programozni a PID szabályzást. Egy Attiny45-tel szeretnék fényerőszabályozni. A gyári PID implementáció, AVR221-ben 16 bites változókat használnak. Nekem 10 bites AD-m van a fotoellenálláshoz. Hogy praktikusabb 16 bites számot csinálni belőle az algoritmus számára, ha a felső biteket nullázom vagy ha az alsókat? A felbontásom nyilván nem változik.
A LED-et PWM-mel vezérelném.
(#) holex válasza fecus hozzászólására (») Dec 10, 2014 /
 
Miért kéne bármit is nullázni? Ha egy 16 bites változónak egy 10 bites értéket adsz, akkor átkonvertálja 16 bitre, azaz balról kiegészíti nullákkal.
A hozzászólás módosítva: Dec 10, 2014
(#) Massawa válasza csabeszq hozzászólására (») Dec 10, 2014 /
 
Én már eljutottam oda, hogy 8+4 porton minden LED-et meg nyomogombot is tudnák kezelni. és még marad talán kettö másra.
Gondolkodtam már a LED kezelön is. (5450/5451).

De szeretném az áramkör a lehetö legegyszerübbre tervezni. (Hogy ne kelljen sok külsö cucc).
(#) rolandgw hozzászólása Dec 11, 2014 /
 
Tudnátok valami érthető leírást,vagy példaprogramot linkelni,ha egy függvényt asm-ben szeretnék megírni és .S fájlként csatolni ? Leginkább a paraméter átadás és visszatérési érték megadása érdekel,hogy adom át ezeket a regisztereknek ?
(#) killbill válasza rolandgw hozzászólására (») Dec 11, 2014 /
 
Ha minden igaz, akkor egy C-bol meghivott fuggveny az r24,r25-ben kapja az elso parametert, r22,r23-ban a masodikat, r20,r21-ben a harmadikat. Ez addig igaz, amig az atadott parameterek 16 bitesek. (A C nyelv a char-t mindig int-re konvertalva kezeli, tehat azt is 16 biten adja at.)

A fuggveny visszateresi erteket pedig az r24,r25-be kell tenni. Ha 32 bites a visszateresi ertek, akkor r22,r23,r24,r25-ben.

Ha a bemeno parameter 32 bites, akkor az r22..r25 regiszterekben megy at az elso parameter, de nem tudom, hogy melyik az LSB, melyik az MSB, es azt sem, hogy osszesen hany parametert lehet igy atadni. A 3x16 bit az 100%.

Szoval, ha hivsz C-bol igy: x = myfunc(a, b);
akkor a .S-ben a myfunc a-t r24,r25-ben kapja, b-t r22,r23-ban. Es x-be a visszatereskori r24,r25 kerul. Azt sajnos nem tudom, hogy melyik regisztereket szabad elrontani es melyiket nem. Ez valahol le van irva a gcc dokumentaciojaban. Az r1-ben mindig nulla van, azt nem szabad elrontani, az biztos.
  1. .section    .text
  2. ;
  3. ;
  4. ;   FlashBlock(ubyte *ra, ubyte *fa, uword len)
  5. ;
  6.     .global FlashBlock
  7. FlashBlock:
  8.     mov     r26,r24
  9.     mov     r27,r25         ; ra (dest)
  10.     mov     r30,r22
  11.     mov     r31,r23         ; fa (source)
  12.     mov     r24,r20
  13.     mov     r25,r21         ; len
  14.     adiw    r24,0
  15.     breq    fbq
  16. fblp:
  17.     lpm
  18.     st      X+,r0
  19.     adiw    r30,1
  20.     sbiw    r24,1
  21.     brne    fblp
  22. fbq:
  23.     ret
A hozzászólás módosítva: Dec 11, 2014
(#) csabeszq válasza rolandgw hozzászólására (») Dec 11, 2014 /
 
Én asm volatile mániás vagyok. Tök kényelmes, hogy egy for loop-ba asm rutinokat pakolsz bele, de beletellett 2 hónapomba, míg megtanultam, hogy hogyan kell portot, memóriacímet, konstanst, lokális/globális változót átadni a C és az ASM között.

Igazából nem szoktam asm-ben programozni semmit. Megírok mindent C-ben, a kritikus részeket meg az alábbiak szerint adom át. Elsőre garantáltan kínai lesz, de bármilyen változót bárhol átadhatsz a fordítónak, akár függvényen belül is.

Sőt, én eleve nem foglalok le regisztereket, azt a C csinálja, csak használom őket.

  1. uint16_t read_fuses()
  2. {
  3.   uint16_t result = 0;
  4.  
  5.   uint8_t sreg = SREG;
  6.   uint8_t tmp1, tmp2 = (1 << BLBSET) | (1 << SELFPRGEN);
  7.   asm volatile ("cli                   \n\t"
  8.                 "mov r30, r1           \n\t"
  9.                 "mov r31, r1           \n\t"
  10.                 "in  %[tmp1], %[spmcsr]\n\t"
  11.                 "or  %[tmp1], %[tmp2]  \n\t"
  12.                 "out %[spmcsr], %[tmp1]\n\t"
  13.                 "lpm %A[res], Z        \n\t"
  14.                 "ldi r30, 3            \n\t"
  15.                 "out %[spmcsr], %[tmp1]\n\t"
  16.                 "lpm %B[res], Z        \n\t"
  17.   : [tmp1]       "=r" (tmp1),
  18.     [res]        "=r" (result)
  19.   : [spmcsr]     "I" (_SFR_IO_ADDR(SPMCSR)),
  20.     [tmp2]       "r" (tmp2)
  21.   );
  22.   SREG = sreg;
  23.   return result;
  24. }
(#) fecus válasza holex hozzászólására (») Dec 11, 2014 /
 
Akkor az nem teszi tönkre az algoritmust, hogy a 0-65535 helyett csak 0-1023 a bemenő érték tartománya?
(#) rolandgw válasza killbill hozzászólására (») Dec 11, 2014 /
 
Kösz, csabeszq-nak is ! Az inline asm nagyon kínai, még másodikra is
Közben a Fleury féle i2c könyvtárban is találtam a kérdésemmel kapcsolatos megoldást,valamint a doc42055 is erről szól.
(#) holex válasza fecus hozzászólására (») Dec 11, 2014 /
 
Nem egészen értem a problémádat. A PID a hibajel alapján szabályoz. A hibajel a szabályozott jellemző és az alapjel különbsége. Ez most igazából teljesen mindegy hány bites érték, ha nagyobb az eltérés a két érték között, akkor nagyobb lesz a hibajel is. A beavatkozó jelet meg a PID paraméterek határozzák meg, azt úgy kell belőni hogy jó legyen a szabályzás. Nyilvánvalóan ha kisebb a maximális hibajel, akkor nagyobb PID együtthatókat kell alkalmazni. De az most az algoritmus szempontjából teljesen mindegy, hogy mondjuk 20 vagy 80 a P együtthatója, a lényeg, hogy optimális legyen a szabályzás.
(#) 06smici válasza 06smici hozzászólására (») Dec 12, 2014 /
 
Sziasztok
Múltkor felvetettem a kérdést, hogy az ebay-en töredékáron kapható mega128ak mennyire megbízhatók. Végülis rendeltem egyet valami 2-300Ftért. Tegnap meg is jött, de nem sikerül programozóval csatlakoznom rá. Azt a hibát dobja hogy a device signature nem egyezik meg. Holnap majd utánanézek még neten ennek, de hátha valaki tud rá megoldást itt is.

Ha meg nem, hát akkor megtanultuk, hogy ebay-ről nem veszünk kínai avr-t.
(#) csabeszq válasza 06smici hozzászólására (») Dec 13, 2014 /
 
Ha a device signature nem 000000, akkor örülhetsz, mert megy.

ATmega128RFA1 1ea701
ATmega128 1e9702
ATmega128A 1e9702
A hozzászólás módosítva: Dec 13, 2014
(#) 06smici válasza csabeszq hozzászólására (») Dec 13, 2014 /
 
Az a bajom ezzel, hogy AtmelStudio 6-ban ha rányomok hogy olvassaki, akkor mindig a kiválasztott AVR device signature jelenik meg, csak pirosan és jön mellé az error. Szóval a konkrét eszköz azonosítóját nem tudom, pedig abból már vissza lehetne keresni miről is van szó.
(#) mikrofarad válasza 06smici hozzászólására (») Dec 13, 2014 /
 
Nekem most érkezett meg 5 db atmega8 Kínából és hibátlanul működik. Most próbáltam ki egy alap led villogtató programmal.
(#) kapu48 válasza 06smici hozzászólására (») Dec 13, 2014 /
 
Ezek szerin igazam lett, hogy egy lecsiszolt át szitázót tokról van szó!

Ha az AtmelStudio 6 kitudná olvasni a device signaturet, ki is írná neked az azonosítót típust!

Még lehetséges hiba lehetőség, hogy az M128-as programozó kivezetései nem a SPI lábakon vannak. hanem az M103 kompatibilitás miatt talán a 2,3-ason? (Bővebben adatlap! Pin Bekötések)
(#) 06smici válasza kapu48 hozzászólására (») Dec 13, 2014 /
 
Még az is lehetséges, mivel ez a hibaüzenet amit dob, hogy nem sikerült belépni a programozási módba. Viszont érdekes mert feszt kiolvassa, meg kiírja azt is hogy milyen device azonosítónak kéne lennie. Asszem ha kizárom magam az AVR-ből és próbálom akkor pedig csak a hibaüzenetet írja ki.

Majd jövő héten beleásom magam jobban, hátha menthető.
(#) jenebala hozzászólása Dec 13, 2014 /
 
Sziasztok!

Atmega2560-as AVR órajelét szeretném átállítani belső-röl külső 16 MHz re-, ehez egy AVR Dragon programozóm lenne kéznél, JTAG üzemmódban. Atmel Studio 6 al hazsnálom.
Kérdésem az lenne elég lenne nekem a megfelelő OSC választanom a listából vagy esetleg valami más Fuse bitet is állítanom kell ?
Nem szeretném kizárni magam semiképp.

Köszönöm!
(#) gabi20 válasza jenebala hozzászólására (») Dec 14, 2014 /
 
Szia kiválasztod a listából azt hogy "Ext.crystal high frequency" Én ezt szokom használni. Más fuse bitet nem kell megváltoztatni.
(#) jenebala válasza gabi20 hozzászólására (») Dec 14, 2014 /
 
Koszonom! Ha szeretnek debugger-t hasznalani akkor kell valami plusz beallitas ?
(#) gabi20 válasza jenebala hozzászólására (») Dec 14, 2014 /
 
Úgy tudom hogy engedélyezni kell a JTAG-ot, de nem vagyok benne biztos, én főként ATmega8-at használok, azon nincs JTAG.
(#) kapu48 válasza gabi20 hozzászólására (») Dec 14, 2014 /
 
Ha előzőleg letiltja a JTAGot akkor már nem tuja Csak ISP-n keresztül programozni!

Tehát JTAGon már nem is tudja újra engedélyezni a programozást/debugolást!

A project lefordítását viszont debug módban kell elvégezni!
A hozzászólás módosítva: Dec 14, 2014
(#) Raspun hozzászólása Dec 15, 2014 /
 
Üdv!
Nos az lenne a tervem hogy építek egy router féleséget. Van egy wifi hálózat amire csatlakozik és létrehoz egy másik hálózatot de a lényeg az hogy az új hálózat sokkalta nagyobb hatóterű. AVR mikrokontrollerrel gondoltam megcsinálni. Milyen ötletek vannak? Lehető legnagyobbnak kéne lennie a hatótérnek.
(#) killbill válasza Raspun hozzászólására (») Dec 15, 2014 /
 
Hogyan akarsz egy 8 bites AVR-rel IP packeteket route-olni, mondjuk 54 Mbit/s sebesseg mellett? Szerintem ez eleve nem megoldhato hazilag, de legalabbis nem a hobbi kategoria, es semmikeppen nem AVR. Azon felul nem tudsz nagyobb hatotavolsagu WiFi halozatat csinalni, mint ami az elerheto, ugyanis, meg ha csinalnal is nagyobb teljesitmenyu adot, a vevo erzekenyseget nem tudod a vegtelensegig novelni.
(#) Raspun válasza killbill hozzászólására (») Dec 15, 2014 /
 
Esetleg ha van valami modul. De bármilyen megoldás érdekel.
(#) kendre256 válasza Raspun hozzászólására (») Dec 15, 2014 /
 
Routerek
Nézd meg ezekből a több portosakat (433, 435, 493... ), meg azt is, hogy a legkisebb is 300 MHz-es procival megy. A cég, aki ezeket gyártja, már jópár éves tapasztalattal rendelkezik, ezt megfelelő alkatrészekkel is évekig tart "utolérni"... A firmware ezeken a routerboardokon egy egyszerűbb linuxra hasonlít, és van is annyira bonyolult.
Esélytelen, inkább vegyél. A hatótávolságot antennanyereséggel és adóteljesítménnyel lehet növelni. Viszont az adóteljesítmény növelésre mindkét oldalon szükség lenne, mert ahogy kilbill írta, a vevőérzékenységet nem lehet növelni. Ha a kliensek pl. telefonok, notebookok, tabletek, akkor ezek adóteljesítményén sem tudsz növelni.
(#) eSDi válasza Raspun hozzászólására (») Dec 15, 2014 /
 
Üdv!

Belegondoltál egy kicsit is jobban abba, hogy mit is szeretnél?
Egy mikrovezérlő nem képes ilyen feladatra, még modulok segítségével sem.
A jelenlegi routeremben egy 560MHz-en ketyegő processzor van 128MB RAM tarsaságában. Maximum egy régebbi PC-ből összeállítasz egyet, ha mindenképpen építeni akarsz.
(#) Raspun hozzászólása Dec 15, 2014 /
 
Lehet hogy rosszul fogalmaztam de akkor nem erőltetem a témát.
(#) Raspun válasza Raspun hozzászólására (») Dec 15, 2014 /
 
De pl. Arduino wifi shield-del meg tudod osztani a wifit.
(#) Raspun válasza Raspun hozzászólására (») Dec 15, 2014 /
 
Bár gondolom ez max 10 m hatótávolságú.
(#) ktamas66 válasza Raspun hozzászólására (») Dec 15, 2014 /
 
Egy Wireless Access Point-ra van szükséged szerintem, ami tudja ezt a funkciót. Már ha nem mindenáron építeni akarod .
(#) rolandgw hozzászólása Dec 16, 2014 /
 
Üdv! Ez a megoldás csak makróban alkalmazható,mármint hogy az expr3 elhagyható a feltételes kifejezésből ?Ha jól értelmezem,akkor ez egy switch-nek felel meg.
  1. #define lcd_xy(x, y)    lcd_command((x) + ((y==3) ? LCD_LINE4 : \
  2.                                            (y==2) ? LCD_LINE3 : \
  3.                                            (y==1) ? LCD_LINE2 : LCD_LINE1 ))
Következő: »»   633 / 837
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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