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   482 / 840
(#) boomerang válasza sikolymester hozzászólására (») Szept 14, 2012 /
 
Két akksiról akarom egyszerre táplálni, de nem maszek párhuzamban mert az úgy ugye nem jó.... Lényegében nem pontosan ide illik a topik, most épp AVR-es eszközhöz merült fel ez a kérdés. Lényeg annyi, hogy ez a dupla dióda akkor elvileg azt csinálja, hogy amelyiknek nagyobb a feszültséges, azt terheli, plusz fontos hogy megadott ideig ne maradjon táp nélkül a berendezés.
Tehát akkor menet közbeni akksi cserét is megenged táp kimaradás nélkül ez a megoldás.

(#) boomerang válasza sikolymester hozzászólására (») Szept 14, 2012 /
 
Esetleg tudnál mutatni FET-es kapcsolást erre, nem diódásat ?
(#) sikolymester válasza boomerang hozzászólására (») Szept 14, 2012 /
 
Hát, most már nem vagyok teljesen biztos benne, hogy ez a korrekt megoldás erre.
De Reggie kolléga hacsak nem mond valamit, akkor valszeg csak jó lesz ez.

A FET-es kapcsolásra nem tudok hirtelen semmit linkelni, de annyi a lényeg, hogy kivezérled a teszem azt N csatornás FET-et nyitásra, és akkor szépen folyik rajta az áram. Ha ugye fixen bekötöd a GATE -jét, akkor lebutítod egy diódára.
(#) zombee válasza sikolymester hozzászólására (») Szept 15, 2012 /
 
Nem inkább P csatornás kell? Persze jó az N is ha a negatív oldalt akarod kapcsolni.
Egyébként a FET nem használható diódaként, mivel a drain és source feszültségviszonyai
nem cserélődhetnek fel! Márpedig diódaüzemben ez történik. Ezért is van védődióda a legtöbb FET-ben a source és drain között, hogy ezt megakadályozza!
Apropó, védődiódás FET: ez olyan mintha fogsz két diódát, antiparalel módon bekötöd mindkét akksira!

Szóval, két akksinál vagy elem+táp esetén a megoldás, ha 1-1 schottky-diódával "közösíted" őket.
Azért jobb a schottky mert kisebb a nyitófeszültsége, de mezei diódával is menni fog!
A hozzászólás módosítva: Szept 15, 2012
(#) Reggie válasza boomerang hozzászólására (») Szept 15, 2012 /
 
Nem a FET-et kell hasznalni diodakent, hanem a diodaval parhuzamosan kell kotni. Ezt akkor szoktak alkalmazni, ha a diodan nagy lenne a vesztesseg(nagy aram vagy a dioda nyitofeszultsege jelentos a feszultsegforrashoz kepest. A ket oldal feszultsegviszonyabol hatarozzak meg, hogy melyik FET-et kell bekapcsolni.
Ket iranyu energiaaramlas eseten szoktak ket FET-et alkalmazni ellenparhuzamosan vagy sorosan kapcsolva. Ekkor ki lehet azt hasznalni, hogy a FET-ek drain-source vedodiodai is egy ellenparhuzamos dioda part alkotnak, igy nem kell tovabbi diodat felhasznalni. Soros kapcsolas eseten pedig ki is lehet kapcsolni az aramkor.

Soros kapcsolasra pelda: Bővebben: Link
A hozzászólás módosítva: Szept 15, 2012
(#) sikolymester válasza zombee hozzászólására (») Szept 15, 2012 /
 
Hmm,
sosem voltam olyan penge analógból, úgyhogy hiszek neked.
(#) Reggie válasza zombee hozzászólására (») Szept 15, 2012 /
 
Ez igy ebben a formaban nem igaz. A MOSFET-eknel a dioda alapvetoen azert van jelen, mert a substrat-ot hozzakotik a source-hoz, igy a drain-substrat (mivel ellenkezo adalekolasuak) egy parazita diodat hoz letre. Ha a substrat nem lenne sehova se kotve, felcserelheto lenne, mint peldaul a JFET. Tehat a feszultsegviszonyok felcserelodhetnek, csak korlatozottak technologiai okokbol, de a nyitofeszultseg alatti source-drain feszultsegnel nincsen gond.
A hozzászólás módosítva: Szept 15, 2012
(#) blackdog hozzászólása Szept 15, 2012 /
 
Sziasztok!

A Sleep móddal kapcsolatban kérdeznék. Én eddig csak azt láttam, hogy Sleep módban leáll az oszcillátor. Viszont nekem ez nem jó mert akkor megáll az óra is az viszont kell, hogy menjen.
Lehet valahogy Sleep módot bállítani úgy, hogy az óra menjen tovább? TIMER1 megszakításban léptetem az időt és figyelem van-e az adott időponthoz esemény. Ha van akkor felébreszteném az AVR-t.
(#) sikolymester válasza blackdog hozzászólására (») Szept 15, 2012 /
 
Persze, az adatlap felsorolja az adott AVR alvási lehetőségeit.
Ott van, hogy mitől tud felébredni, mit kapcsol le, stb.

További olvasmány: avrlibc sleep
A hozzászólás módosítva: Szept 15, 2012
(#) blackdog válasza sikolymester hozzászólására (») Szept 15, 2012 /
 
Elnézést! Elkerülte a figyelmem a táblázat az AVR adatlapján.
Megtaláltam azt a két lehetőséget ami kellhet nekem.
(#) zombee válasza Reggie hozzászólására (») Szept 17, 2012 /
 
Ahogy érzed. Azért köszönöm a felvilágosítást! Párhuzamos bekötésnél N és P típusú van,
vagy mindkettő azonos? Itt az a cél hogy kb. olyan legyen mint egy rendes, analóg kapcsoló.
Ettől függetlenül - szerintem - a legegyszerűbb úgyis a diódás megoldás lesz, profi áramkörökben is.
Tarol az üres szöveg? Lesz még itt több is, ha továbbra sem engedi törölni...
A hozzászólás módosítva: Szept 17, 2012
(#) Reggie válasza zombee hozzászólására (») Szept 18, 2012 /
 
Igen, a diodas a legegyszerubb. Ettol elterni akkor szokas, ha annak valami kulonleges oka van. Parhuzamosnal barmilyet lehet hasznalni, csak tudjad vezerelni a tranzisztort es a belso diodak polaritasa megfelelo legyen.
(#) csabeszq válasza blackdog hozzászólására (») Szept 18, 2012 /
 
El kell, hogy keserítselek, mert a jelenlegi multithreading alapja a 80-as években született meg. Ha az interneten megnézed a setjmp / longjmp C metódusokat, interrupt segítségével magad is tudni fogsz schedulert csinálni. Egy ilyen scheduler max. 512 byte.

A Citizen-120d nyomtató a stacket négy 64 byte-os rész-stackre szedte szét és interrupttal mozgatta a stack pointert. 4 szál futott a 8 bites procin és átadták egymásnak a szálak vezérlést, ha épp nem volt munka. Rendes ütemező volt benne.

setjmp/longjmp-n alapuló ütemezőket találsz fenn a neten.
(#) Reggie válasza csabeszq hozzászólására (») Szept 18, 2012 /
 
Mar 1959 korul a Lincoln Labs TX-2 tudod 33 szalat...

Amugy amit leirtal az nem multithread, hanem multitask.
A hozzászólás módosítva: Szept 18, 2012
(#) csabeszq válasza Reggie hozzászólására (») Szept 18, 2012 /
 
A kérdés szempontjából lényegtelen, hogy hogyan hívják.

Párhuzamosan futó feladatokat lehetséges AVR alatt megoldani. Vagy interruptból (gyakori), vagy ütemezővel. Szórakozásból írtam már ütemezőt, de sehol sem kellett.

Elég ritkán van szükség független szálakra. Jelen problémánál sincs szerintem:

- SPI kiír (cím) -> befejezés interrupt
- SPI beolvas (memória) -> befejezés interrupt
- Adat elküld UART -> befejezés interrupt
- SPI kiír (cím) ...

Az interruptok bizony 15-20 órajelciklusig is eltarthatnak, annyira bonyolult a benne lévő logika. Szóval szerintem ide sem kell scheduler.

Persze az UART vár az SPI-re (és vissza), ami nem optimális, mert mehetne párhuzamosan is, de alapvetően interruptokkal kezelhető. A párhuzamos megoldás kicsit bonyolultabb lesz.
A hozzászólás módosítva: Szept 18, 2012
(#) Reggie válasza csabeszq hozzászólására (») Szept 18, 2012 /
 
A kerdes szempontjabol hivhatnank a mikrovezerlot hajszaritonak is, mert nem szamitana, de azert megis az elobbi a celszeru.
Amit most irtal, az se nem multitask se nem multithread, hanem esemenyvezerelt feladatvegrehajtas. Ehhez valoban nem kell utemezes. Viszont ha multithread/multitask rendszered van, abban mindig van utemezo, ugyanis az felelos a vezerles atadasaert.
(#) Novak hozzászólása Szept 18, 2012 /
 
Sziasztok, a következő problémára keresem a megoldást:
Van egy teljesen új, gyári ATMega128-as kontrollerem. Építettem hozzá egy tesztpanelt, de hiába adok neki tápfeszültséget, a programozó nem látja, még az eszköz ID-jét sem tudom kiolvasni.
- A programozót kipróbáltam, másik AVRt azonnal felismer, programoz, így az biztosan jó
- A PEN lábát az ICnek próbáltam szabadon hagyva is, illetve földre húzva is, a probléma így is, úgy is fenn áll
- A vezetősávokat ellenőriztem, elkötés, szakadás, zárlat nincsen a panelen, az áramfelvétel is normális
- Egyelőre semmilyen külső periféria nincs is bekötve, ami esetleg okozhatna gondot
- Az SPI-hez tartozó lábak szintén a levegőben lógnak, csak a programozó van rákötve

Van ennek valami trükkje? Vagy elképzelhető, hogy a gyári állapotú 128-as külső oszcillátorról vár órajelet?
(#) Novak hozzászólása Szept 18, 2012 /
 
Közben kipróbáltam egy külső, 10 MHz-es oszcillátorról bevinni az órajelet, de sajnos így sem történik semmi.
(#) Reggie válasza Novak hozzászólására (») Szept 18, 2012 / 1
 
Nem az SPI labakat kell hasznalni, hanem a PE0 es PE1 labat. Lasd doksi 300. oldala.
(#) sikolymester válasza Novak hozzászólására (») Szept 18, 2012 / 1
 
A programozót melyik lábakra kötötted?
"Szokásosan" MISO-MOSI-ra, vagy a PDI-PDO -ra?

Atmega128-nél csalóka módon a PDI-PDO párosra kell kötni.
Olimex schematic
(#) Novak válasza sikolymester hozzászólására (») Szept 18, 2012 /
 
Mindkettőtöknek köszönöm a gyors választ, valóban ez volt a probléma. Legalábbis az egyik fele. Ugyanis én a MISO-MOSI lábakra kötöttem a programozót, viszont átkötve az általatok is írt PDI-PDO lábakra sem ment a dolog. Végül úgy sikerült, hogy a külső oszcillátort rá kellett kötnöm, utána át tudtam állítani belső oszcillátorra.
Szóval még egyszer köszönöm a segítséget, már elég sokat szenvedtem vele.
(#) blackdog válasza Reggie hozzászólására (») Szept 18, 2012 /
 
Szeretnék ebbe a kérdésbe beszállni. Én is atmega128-ra tervezek és én a MOSI/MISO lábakra tettem a programozó tüskéket. Még csak terven. Ezek szerint ez nem fog menni. Programozni csak a PDI-PDO lábakon tudom?
Ha igen akkor bajban vagyok mert itt van az RX0/TX0 is és itt az RS232 IC van.
RX1/TX1-en meg RS485.
Akkor MOSI/MISO lábról nem lehet programozni. De akkor mi lesz az RS232-vel?
(#) Reggie válasza blackdog hozzászólására (») Szept 18, 2012 /
 
Peldaul rakjal jumpert vagy 0 ohmos atkotest, amit el tudsz tavolitani. A masik megoldas, hogy a MAX232 es mikorkontroller koze rakjal ellenallast es a programozot kozvetlen a uC labara csatlakoztasd. (3. oldal 3. abra szerint)
(#) blackdog válasza Reggie hozzászólására (») Szept 18, 2012 /
 
Jelenleg atmega168-at használok így.
A MOSI/MISO lábakon van egy shift regiszter is. Itt van soros ellenállás 10k.
Ettől függetlenül programozáskor a shift regiszter lábai vígan "perecelnek".
(#) Reggie válasza blackdog hozzászólására (») Szept 18, 2012 /
 
Ebben az esetben marad a jumper.
(#) zombee válasza csabeszq hozzászólására (») Szept 18, 2012 /
 
A 15-20 órajelciklus kb. az amikor az interrupt éppenhogy nem csinál semmit:
Egy interrupt meghívási ideje emlékeim szerint 2 órajel(addig áll a proci is), ha ugró utasítást szakít félbe akkor 3 vagy 4. A visszatérés 2 órajel. Stack pointer és munkaregiszter(ek) elmentése-visszatöltése szintén 1-1 órajel szóval nem egyszerű.
Az se mindegy, hogy egy interrupt végrehajátsa közben a többi tiltva van, kivéve ha az interruptban sei-t adsz ki. Ez persze veszélyes is lehet, ha ugyanaz az interrupt közben újra meghívódna...
(#) Reggie válasza zombee hozzászólására (») Szept 18, 2012 /
 
ASM-ben programozva azert meg lehet oldani.
(#) zombee válasza blackdog hozzászólására (») Szept 18, 2012 /
 
Egyedül az Rx-el lehet probléma, mert "szembemegy" a MAX232 IC Rout kimenetével.
Erre ellenállás a megoldás az AVR és a MAX közé, a programozót az AVR oldalára kötöd.
Az ellenállás megválasztása nem mindegy, pl. ha gyári STK500-ad van akkor 1k nem jó oda.
Mivel az AVR CMOS technológiás, jóval nagyobb(pl. 4.7kOhm) is mehet oda.
A programozóimat pl. úgy építem hogy 1kOhm is jó, mert a kimeneti ellenállás ennél kisebb.

A Tx-nél nincs ilyen gond, hiszen a Tin nagyimpedanciás bemenet.
Viszont ha programozás közben is él a kapcsolat, a vevő(pl. PC) fals adatokat kaphat.
1: vagy széthúzod a kábelt, esetleg "disconnect"-et tolsz a progiban
2: ellenállás+PNP-tranzisztor kombóval tilthatod a MAC IC Tin bemenetét ha a RESET aktív.
(#) koadi hozzászólása Szept 18, 2012 /
 
Sziasztok, a segtségeteket szeretném kérni! Mivel itthon már "marékszám" gyűlik a rossz fuse bit beállítások miatti AVR-em, ezért megépítettem a AVR Fusebit Doctor-t, ami nem akar működni, valószínűleg, mert ebbe is valamelyik fusebit-et rosszul állítom be (Ponyprog-ot használok, a programozóm stabil)
Légyszíves, valaki be tudna linkelni egy jó ponyprog-os fusebit beállítási ablakot az AVR Fusebit Doctorhoz?

Egyébként nem értem, hogy miért nincs leírva szájbarágósan pont a fuse bitek beállítása, úgy, hogy minden hüle megértse (gondolok itt magamra); pont egy olyan áramkörnél, ami pont a hüléknek készül!
A hozzászólás módosítva: Szept 18, 2012
(#) sikolymester válasza zombee hozzászólására (») Szept 18, 2012 /
 
Szerk: Bocsi! Most látom, hogy te is erre jutottál "A 15-20 órajelciklus kb. az amikor az interrupt éppenhogy nem csinál semmit"

Na legalább itt van láthatóan akkor


Hát én most megnéztem ezt az interrupt dolgot.
Itt van az lss -ből az idevágó részlet:
  1. ISR(INT0_vect) /* vormals: SIGNAL(siglabel) dabei Vectorname != siglabel ! */
  2. {
  3.   7c:   1f 92           push    r1
  4.   7e:   0f 92           push    r0
  5.   80:   0f b6           in      r0, 0x3f        ; 63
  6.   82:   0f 92           push    r0
  7.   84:   11 24           eor     r1, r1
  8. }
  9.   86:   0f 90           pop     r0
  10.   88:   0f be           out     0x3f, r0        ; 63
  11.   8a:   0f 90           pop     r0
  12.   8c:   1f 90           pop     r1
  13.   8e:   18 95           reti


Amint látni ez 10 órajel.
WinAVR-rel fordítottam Atmega16a -ra -Os beállítással.

És akkor még nem is lett elmentve az SREG regiszter, amit manuálisan kellene elmenteni.
Azzal együtt így néz ki:
  1. ISR(INT0_vect) /* vormals: SIGNAL(siglabel) dabei Vectorname != siglabel ! */
  2. {
  3.   7c:   1f 92           push    r1
  4.   7e:   0f 92           push    r0
  5.   80:   0f b6           in      r0, 0x3f        ; 63
  6.   82:   0f 92           push    r0
  7.   84:   11 24           eor     r1, r1
  8.   86:   8f 93           push    r24
  9. uint8_t sregsave;
  10.         sregsave = SREG;
  11.   88:   8f b7           in      r24, 0x3f       ; 63
  12.         SREG = sregsave;
  13.   8a:   8f bf           out     0x3f, r24       ; 63
  14. }
  15.   8c:   8f 91           pop     r24
  16.   8e:   0f 90           pop     r0
  17.   90:   0f be           out     0x3f, r0        ; 63
  18.   92:   0f 90           pop     r0
  19.   94:   1f 90           pop     r1
  20.   96:   18 95           reti


Így máris 14 órajel.
Aztán nem is kellett minden regisztert lementenie.

Ebből fordult:
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3.  
  4. ISR(INT0_vect) /* vormals: SIGNAL(siglabel) dabei Vectorname != siglabel ! */
  5. {
  6. uint8_t sregsave;
  7.         sregsave = SREG;
  8.         SREG = sregsave;
  9. }
  10.  
  11. int main()
  12. {
  13.         GICR |= (1 << INT0);
  14.         sei();
  15.         for(;;)
  16.         {
  17.  
  18.         }
  19. }
A hozzászólás módosítva: Szept 18, 2012
Következő: »»   482 / 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