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   559 / 840
(#) csabeszq válasza morgo hozzászólására (») Szept 10, 2013 /
 
Idézet:
„a csatolt fájlokat hiába próbálom lefordítani az AVR Studió-ban, egy csomó hibát dob ki, és nem jön létre a hex fájl”


Milyen hibát?


Az RPM mérő röviden a következőként megy:

Az AVR IC-t 1 MHz-en járatják, definiálnak egy számlálót 1024-es előosztással. Azaz
1000000/1024=976 Hz. Ezt írják be, mint a számláló teteje, tehát másodpercenként megnézi a szoftver, hogy hányszor bizgették a reflektív optót. Ennek értelemszerűen a pontossága 1 RPM.

Hogyan lehet ennél pontosabban mérni? Úgy, hogy nem másodpercenként nézed, hogy hányat fordul, hanem mondjuk 10 másodpercenként. Ekkor 9760-at írsz az OCR1A-ba, a végeredményt pedig 10-zel osztod. Légy tekintettel arra, hogy az OCR1A maximális értéke 65535, szóval 97600 ebben a formában már nem fog menni.
A hozzászólás módosítva: Szept 10, 2013
(#) morgo válasza csabeszq hozzászólására (») Szept 10, 2013 /
 
Szia! Az AVR Studio-ról küldök valami képernyőmentést, néhány perc...
Én is valami hasonló megoldáson agyaltam, - 10mp mintavételezés, csak ezt nem 60, hanem 6-tal szorozni, hogy megkapjam az RPM-et.
(#) morgo válasza morgo hozzászólására (») Szept 10, 2013 /
 
A képek:
(#) csabeszq válasza morgo hozzászólására (») Szept 10, 2013 /
 
Elkonfiguráltad az AVR típusát. Mi az az Atmega8a?


A képen, amit csatoltál, kidob egy csomó eszközt, amit ismer. Nem látok mindent, de válassz valami olyan eszközt, ami a listában benne van és a neve Atmega8-ra hasonlít.

Kizárt dolog, hogy az AVRStudio ne ismerje az Atmega8-at, csak lehet, hogy nem Atmega8a-nak hívják.
(#) morgo válasza csabeszq hozzászólására (») Szept 10, 2013 /
 
Igen! Sejtettem, hogy valami banális hibát csinálok, így már lefordítja gond nélkül. Köszönöm! Most már lehet próbálkozni a módosítással. A 10-es osztást az RPS-re gondoltad? Ezt hogy tudom megvalósítani?
(#) csabeszq válasza morgo hozzászólására (») Szept 10, 2013 /
 
  1. OCR1A = 9760;
  2.  
  3.    rps=count / 10;
  4.    rpm=count * 6;
(#) morgo válasza csabeszq hozzászólására (») Szept 10, 2013 /
 
Köszi! Innét már remélhetőleg elboldogulok.
Majd éjjel próbálkozok, most készülnöm kell melóba...
Majd írok, ha sikerült valamit összehozni (vagy ha nem)
A hozzászólás módosítva: Szept 10, 2013
(#) gtk válasza zsozsoX hozzászólására (») Szept 12, 2013 /
 
Ha ugyanolyan hosszu a tomb tartalma mindig es le van zarva \0 karakterrel, akkor
  1. if( strlen(tomb) == fix_meret) {}
A tobbit lasd strlen() manualban. Ha string osszehasonlitas kell akkor strcmp(), szinten lasd a manualban (internet).
(#) fifadani hozzászólása Szept 13, 2013 /
 
Sziasztok!
Megjött az LCD kijelzőm és találtam egy cikket, hogy 1 lábról is lehet működtetni az lcd-t...
Van egy kapcsolási rajz, viszont nincs hozzá mellkelve kész nyák terv.
Bővebben: Link

Tudna valaki segíteni ebben?
(DIP alkatrészeim vannak csak sajnos)

Köszi!
A hozzászólás módosítva: Szept 13, 2013
(#) Petroimro hozzászólása Szept 14, 2013 /
 
Sziasztok!

Atmega128-as kontrollernél belefutottunk egy olyan hibába, amit nem értünk. A program megakad a következő sornál:
  1. if (verify) verifyBuffer = (uint8_t *)malloc(MPU6050_DMP_MEMORY_CHUNK_SIZE);


verify értéke 1
MPU6050_DMP_MEMORY_CHUNK_SIZE értéke 16

Többször is lefut ez a sor, de aztán egyszer elakad.

Atmega 328-nál a hiba nem jelentkezik.

Bári ötletet szívesen fogadok.

A segítséget előre is köszönöm!
A hozzászólás módosítva: Szept 14, 2013
(#) gtk válasza Petroimro hozzászólására (») Szept 14, 2013 /
 
Ezt hogy erted?
Idézet:
„Többször is lefut ez a sor, de aztán egyszer elakad.”
Talan fel is kellene szabaditani neha a lefoglalt memoriat. (?)
(#) Petroimro válasza gtk hozzászólására (») Szept 14, 2013 /
 
Ez a sor egy függvényben van, ami többször is meg van hívva. Többször is lefut hibátlanul, de x-edik alkalommal, amikor meghívom a függvényt, a bemásolt sor alatti utasításokat (pl. egy LED bekapcsolása) nem hajtja végre, a program futása megáll.

Nem írtam, de a függvény végén, a return előtt fel van szabadítva a lefoglalt memória.
A hozzászólás módosítva: Szept 14, 2013
(#) csabeszq válasza Petroimro hozzászólására (») Szept 14, 2013 /
 
Az if-es malloc képes meglepetéseket okozni.

Nem látjuk a kódot, de ha

  1. if (verify) free(verifyBuffer);


Annak elvileg jónak kellene lennie, feltéve, hogy nem foglalsz annyit, hogy a stack-et kezdjed felülírni.

Ha a kód másképp néz ki, akkor dupla free simán előfordulhat, ami ugyebár mindenütt fagyás.
(#) gtk válasza Petroimro hozzászólására (») Szept 14, 2013 /
 
A felszabaditasnal nezed hogy az elozo lefoglalas sikeres volt-e ?
  1. if (verifyBuffer != NULL) free(..); //ekkor sikeres csak !
(#) csabeszq válasza gtk hozzászólására (») Szept 14, 2013 /
 
Na, így rossz (az if-es malloc szépségei).

Mert csak akkor kell felszabadítani, ha a verify igaz volt. Mert akkor foglaltad le te a függvényben. Ha nem te foglaltad le, ne is szabadítsd fel. Az, hogy a verifyBuffer konkrétan nulla-e, sehol nem derül ki.

Nem véletlenül írtam, hogy az if-be malloc-ot csak módjával és csak ha tudod, hogy mit miért csinálsz.
A hozzászólás módosítva: Szept 14, 2013
(#) gtk válasza csabeszq hozzászólására (») Szept 14, 2013 /
 
En nem tudom mi az a verify jelen esetben,..Mindenkeppen nezni kell hogy nem-e null a malloc visszateresi erteke,..aztan a tobbit a program szerkezet alapjan dontse el a programozo.
(#) neptunes4you hozzászólása Szept 14, 2013 /
 
Üdv! Egy kis segítségre lenne szükségem.

Tegyük fel hogy van egy esemény, ami beindít egy számlálót egy AVR-ben. A számláló szépen elkezd számolni, ám mire az idő végére érne, az ezután végrehajtandó utasítást felül kellene írni. Hogyan tudom megoldani, hogy egy másik, magasabb prioritású esemény leállítsa a timert?
(#) TavIR-AVR válasza neptunes4you hozzászólására (») Szept 15, 2013 /
 
Start Timer ill Stop Timer Bascom alatt. Gyakorlatilag a regiszterének írásával megállítható/indítható.
Utasítás felülírás? Szoftverből, vagy afelhazsnáló szempontjából csinál mást?
(#) Petroimro válasza csabeszq hozzászólására (») Szept 15, 2013 /
 
Igen a free is if-ben van, pont úgy, ahogy írtad.
(#) zombee válasza Petroimro hozzászólására (») Szept 15, 2013 /
 
Hello!

Én ezt az egész malloc-os dolgot kerülném AVR-ben. Az a baj hogy egyrészt a memória túl kicsi ahhoz hogy dinamikusan foglalgassuk, a másik hogy AVR-eknél nem fut a háttérben olyan kernel ami az egészet menedzselné. Ezért hamar előjönnek a klasszikus memóriafoglalási anomáliák.
(#) zombee válasza neptunes4you hozzászólására (») Szept 15, 2013 /
 
Gondolom a timer lejárata egy interruptot generál. Ugyanezt kell tudnia a "magasabb prioritású" eseménynek is, tehát interruptot generál és leállítja a timert(TCCRx[B]=0).
(#) TavIR-AVR válasza neptunes4you hozzászólására (») Szept 15, 2013 /
 
Vigyázz! Ha egy Interruptban benne vagy, azt egy másik INT nem szakíthatja meg (de a jelzőbitet ott is figyelheted ha kritikus).
(#) zombee válasza TavIR-AVR hozzászólására (») Szept 15, 2013 /
 
Ezért kell egy interruptnak rövidnek lennie, nem az esti mese felolvasására való.

Ha kritikus akkor az interruptban engedélyezhető a többi(sei utasítás), de körültekintően kell használni nehogy egy interrupt önmagára fusson. Ez utóbbi elkerülhető, ha a kérdéses interruptban a sei előtt a sajátját kimaszkolja, majd az interrupt végén engedélyezi azt(amennyiben szükséges).
(#) v alaki hozzászólása Szept 15, 2013 /
 
Sziasztok!
gyenge 2 év után előszedtem az AVR-es cuccaimat.
De mivel azt a kicsit is elfelejettem amit tudtam (és valahol elveszítettem az összes működő projektemet a gépről) kellene egy kis segítség.
Szóval kellene atmega 8 ra valami nagyon egyszerű ledvillogtatós BIZTOSAN működő program.
elviekben minden működik, amit a fiókból előszedtem, de mégse megy. Szóval kellene valami ami biztos...
előre is kösz.
(#) PoC_Zoli válasza v alaki hozzászólására (») Szept 15, 2013 /
 
Fuse bitek jól álnak? Gondolok itt arra, hogy nem kell mellé véletlen külső órajel?
(#) Massawa válasza v alaki hozzászólására (») Szept 15, 2013 /
 
A mikrokontroller.net -n de máshol van egy sereg jol müködö program. Üsd be a googliba és válogass!
(#) csabeszq válasza zombee hozzászólására (») Szept 15, 2013 /
 
Idézet:
„a klasszikus memóriafoglalási anomáliák”


Ezt informatikusokon kívül senki sem érti.

Kicsit bővebben: ha lefoglalsz egy 5 elemű helyet, egy 10 elemű helyet, egy 20 elemű helyet, utána egy 1 elemű helyett, az első hármat felszabadítod (5-10-20), akkor a memóriád úgy fog kinézni, hogy 35 hely üresen, utána 1 hely lefoglalva. Ha ezután egy 40-es elemet akarsz lefoglalni, az a 35+1+1 pozícióra fog kerülni, mert az első 35 szabad bájt használhatatlan. Ez persze fokozódhat, ha olyan szerencsétlenül foglalsz, hogy van 1k szabad memóriád, de a legnagyobb összefüggő használható blokk az 35 bájt a töredezettség miatt. (egyik anomália)

A free elfelejtéséről nem beszélek, mert AVR alatt olyan kicsi a memória, hogy gyakorlatilag azonnal betelik ha a program elfolyatja (másik anomália).

A harmadik az, amikor 1 bájtos blokkokat foglalsz le malloc-kal. Az adminisztrációja belül gondolom többe kerül, mint a lefoglalt méret. Előfordulhat, hogy 1 byte lefoglalása 5 byte-tal csökkenti a szabad helyek számát.

Emellett PC-n van memory mapping, azaz a memóriában egy blokk ide-oda tologatása fizikai másolás nélkül történik meg. Átírnak egy értéket egy címen. Ha van egy 200MByte méretű blokkod és realloc-kal 250MByte méretű blokkot csinálsz, a gép nanoszekundum alatt megcsinálja, mert csak megváltoztatja a memóriatérképet. AVR alatt nincs ilyen, tehát egy realloc fizikailag átmásolja a régi tartalmat az új nagyobb helyre, ami eszméletlenül lassú.

PC-n ez az egész szépen ki lett tesztelve és optimalizálva, meglehetősen jól is működik. AVR alatt is ki lett tesztelve, optimalizálva lett, de nem sebességre és hatékonyságra gyúrtak, hanem méretre, hogy a kód a lehető legkisebb helyen elférjen. Ennek természetesen ára van és gondolom az AVR-es malloc/free negyedakkora hatékonyságot sem mutat, mint a PC-s megfelelője. Sem memóriatakarékosság, sem gyorsaság terén.
(#) TavIR-AVR válasza v alaki hozzászólására (») Szept 15, 2013 /
 
Bascom-avr alatt jó?

  1. $crystal=1000000
  2. $regfile=m8def.dat"
  3. config portb.5=output
  4. do
  5. toggle portb.5
  6. waitms 100
  7. loop

Bővebben: Link

Vagy van az Arduino blink.pde az egyszerűség kedvéért:
  1. void setup() {                
  2.   // initialize the digital pin as an output.
  3.   // Pin 13 has an LED connected on most Arduino boards:
  4.   pinMode(13, OUTPUT);    
  5. }
  6.  
  7. void loop() {
  8.   digitalWrite(13, HIGH);   // set the LED on
  9.   delay(1000);              // wait for a second
  10.   digitalWrite(13, LOW);    // set the LED off
  11.   delay(1000);              // wait for a second
  12. }


ASM, C, Micropascal, FastAVR, MicroC, MicroBasic majd legközelebb....
(#) Fizikus válasza v alaki hozzászólására (») Szept 16, 2013 /
 
Ehhez ugyan kell egy nyomogomb is, de mukodik:
Bővebben: Link
A hozzászólás módosítva: Szept 16, 2013
(#) csabeszq válasza csabeszq hozzászólására (») Szept 16, 2013 /
 
Az AVR-es malloc-ra visszatérve:

1)
A heap vége az első hívás utáni stack pointer -32. (Ez kicsit húzós lehet, mert egy interrupt 16 elemet nyom le helyből). Ezen persze lehet javítani:

__malloc_margin = 64;

2)

semmiképpen se írd felül a memóriát. Ha 10 byte-ot foglalsz, akkor a 0-9 címeket írhatod. Felülírás esetén kialakulhat végtelen ciklus.
Következő: »»   559 / 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