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   419 / 840
(#) Zsolt36 válasza TavIR-AVR hozzászólására (») Feb 29, 2012 /
 
Hát olcsón meg lehetne oldani mert az adó és a vevő is egy ezres körül mozog. A kód picre ott van a kapcsolások között de abban olyan picek meg modulok vannak amik nincsenek mo-n. Szóval azt a kódot kéne átírni avr-re és annyival ki kéne bővíteni hogy a vevő több kódot kezeljen és minden kimenethez külön kód legyen. Szóval öt adó és öt led mindre 1-1.
(#) Zsolt36 hozzászólása Feb 29, 2012 /
 
Lenne még egy kérdésem:
AVR-t lehet rs 232-es proton más alkatrész nélkül programozni? Esetleg van még printer meg usb de azokat nem hiszem. Nincs most itt semmi olyan alkatrészem és attiny45-öt szeretnék programozni.
(#) TavIR-AVR válasza Zsolt36 hozzászólására (») Feb 29, 2012 /
 
Persze , minden megoldható....
Számoljunk: alsó hangon 8-10 nap. Szorozzak órabérrel vagy inkább ne?

Pénzes munkára én is vállkozom... ENC, AVR : nézd meg a Ethernet + AVR + arduino részt. Szerintem ennél egyszerűbbet nem találsz. Illetve a rádiós kapcsolathoz a jeelabs-t.


Most mit vársz?
1 eft/db-ért valaki írja át, fejleszzse le, tesztelje? Esetleg dobozolva gyártsa is le?

Programozásra: LPT (STK200 vagy SuperLowCost programmer). USB-re egyszerű nincs.
(#) kiborg hozzászólása Feb 29, 2012 /
 
Hali!
Programozás/matematikai kérdéssel fordulnék hozzátok.
Adott egy 16bites szám, aminek a 40%-ra lenne szükségem. ASM-ben programozok, törekedek a minél egyszerűbb felé.
Megcsináltam, hogy a számot elosztom 10-el, (ami 10%) és ezt az értéket 4x összeadom. Ez szép és jó, csak nem minden esetben pontos. Matematikailag: (Z/10)x4 nem= Zx0,4 Sajnos. Van rá valami ötletetek, hogy hogyan lehet megoldani, hogy minél több értékes bitem megmaradjon. Elég csak a séma, le tudom programozni.
Üdv Kiborg
(#) zombee válasza kiborg hozzászólására (») Feb 29, 2012 /
 
Gondolom az nem megy(pl. túlcsordulhat) hogy először 4-szer összeadod aztán úgy osztod 10-el.
Kis logikával lehet pontosítani, pl. ha nem 10-el hanem 5-el osztasz és 2-vel szorzol(ez utóbbi egy balra shift).
Talán már az esély is sokkal kisebb ha először 2x összeadod őket aztán 5-el leosztod.

Ha ez elég sűrűn előfordul akkor elgondolkodnék a bitszám növelésén, az osztásokat pedig végére hagynám.
(#) Zsolt36 hozzászólása Feb 29, 2012 /
 
Össze akarom rakni a nyomtató portos avr programozót.
Ott elakadtam hogy mik a színei a pineknek? vagyis a kábelben mik a színek?
(#) sikolymester válasza Zsolt36 hozzászólására (») Feb 29, 2012 /
 
Fogj egy multimétert és mérd ki.
Vagy nézd meg az adatlapját az lpt kábelednek jobb esetben.
(#) sikolymester válasza Zsolt36 hozzászólására (») Feb 29, 2012 /
 
Mi volt amúgy az első kérdés?
Erre amúgy az a válasz, hogy igen. A dolgot bootloadernek hívják.
Itt találsz ilyet :Bővebben: Link
(#) kiborg válasza zombee hozzászólására (») Feb 29, 2012 /
 
Szia!
Gondolkodtam, illetve folytattam a programot és kell még két érték:89% és 111% is Szóval ha pontosan akarok számolni, akkor bitszám növelés, én is ide jutottam a magam kútfőjéből, pedig nagyon nincs kedvem 24 bites műveleteket végezni
Igen, a túlcsordulás a fő probléma,mert fordulatszámot mérek, ezért a Timer1-t használom 16 biten.Innen származnak az értékeim.
(ráadásul ezeket az értékeket 89 és 111 már olyan ésszerűen nem is lehet felbontani, mint a 40-et).
Nem túl gyakran kell számolni, csak az a baj, hogy a bemenete is változó.(nem túl gyakran = percenként 3000-6000)
Üdv Kiborg
(#) Reggie válasza Zsolt36 hozzászólására (») Feb 29, 2012 /
 
Teljesen mindegy. A szintol fuggetlenul ugyan ugy folyik benne az aram.
(#) Reggie válasza kiborg hozzászólására (») Feb 29, 2012 /
 
(#) zombee válasza kiborg hozzászólására (») Márc 1, 2012 /
 
Hááát, ezekkel valóban cumi van mert a 89 ráadásul prímszám. 24 biten ne próbáld, az újabb szívás!

De tessék, adok egy 64 bites teljes aritmetikát még a régi időkből amikor induktivitásmérőt akartam assemblerben leprogramozni. A 32 bit oda már nem volt elég, de neked igen. Osztásnál a maradékokat is megkapod! Csak a 8-asokat kell 4-esekre átírni és kész. Van benne sztringgé-konvertáló rész is! Használd egészséggel! Ja és az alapszabály: először mindig szorzunk és a legvégén osztunk.
De ha jól kezeled a maradékokat akkor teljesen mindegy!
(#) kiborg válasza zombee hozzászólására (») Márc 1, 2012 /
 
Köszi. Megpróbálom értelmezni és felhasználni.
Ez 64bit-et oszt/szoroz hány bittel ?
Másik kérdés: a sok MACRO-ban a @-jel mit jelent ?
Kiborg
(#) zombee válasza kiborg hozzászólására (») Márc 1, 2012 /
 
Ez oszt,szoroz,kivon,összead,másol,shiftel(balra és jobbra 1-el), minden tényező és eredmény is 64 bites.

A tényezőket az SRAM-ba kell tárolni: mindegyik 8 bájtot foglal el, érdekes volna regiszterezni...
Fontos, hogy egy művelet eredménye mindig a legelső(azaz 0.) tényezőbe kerül,
ezért nem árt másolni "aritmetika_copy" ha utána még fel akarod használni azt az értéket!

A @ jelek a "címe" operátort jelölik az SRAM-ban, azaz a számérték címét adod át a függvénynek!
A 64 bites számokat a ".byte 8" makróval deklarálod az adatszegmensben(".dseg"), erre is találsz példát!

Ezeket a makrók a függvényeket használd: aritmetika_osztas, aritmetika_szorzas, aritmetika_shift_R,
aritmetika_shiftL, aritmetika_copy, aritmetika_minusz, aritmetika_plusz.
Az "load_cseg"-el a kódszegmensből töltesz át konstansokat egy számértékbe.
A "convert" egy 10-es számrendszerű számot (#0-végű-) sztringgé konvertál, a kimenet 12 bájtos legyen!
(#) zombee válasza zombee hozzászólására (») Márc 2, 2012 /
 
Illetve bocs, a @ jelek(+sorszám) a paramétereket jelölik. Nem címet, arra a "high" és "low" makrók valók.
(#) Ricsi89 hozzászólása Márc 3, 2012 /
 
Lenne egy kérdésem. Az Uart-nál az Rx_complete interruptot akarom használni atmega8-nál. UCSRB regiszterben 1-re állítottam az RXCIE bitet, főprogramban engedélyeztem az interruptokat sei() paranccsal. Kell még ezen kívül valamit csinálni, hogy működjön az interrupt?
Betettem egy egyszerű kódot, hogy ha jön valami az uart-on, akkor egy led kapcsoljon be, de semmi nem történik. Mi lehet a gond?
  1. ISR(USART_RXC_vect){
  2. PORTB |=1<<PB0;
  3. }
(#) Ricsi89 válasza Ricsi89 hozzászólására (») Márc 3, 2012 /
 
Közben rájöttem, hogy ha én küldök valamit a gsm modulnak és ő válaszol, akkor végrehajtódik az interrupt, világít a led. De ha nem küldök semmit, csak várok pl egy hívás jelre, ami azt jelenti, hogy küld a gsm modul egy "RING" szócskát az uart-on, akkor semmi sem történik. Na ez hogy van?
(#) zombee válasza Ricsi89 hozzászólására (») Márc 3, 2012 /
 
Biztos hogy rendesen elküldi a RING szócskát? Azért érdekes lenne, mert ha az interrupt nem fut le
akkor az interrupt flag sem állítódik be ami nagy baj mert így még interrupt nélkül se tudod megmondani,
hogy most kaptál-e üzit vagy még várnod kell rá...
(#) Ricsi89 válasza zombee hozzászólására (») Márc 3, 2012 /
 
Múltkor néztem gépen direkt, hogy mi van akkor, ha csörgetem a modult és akkor kb 5s-onként küldte ezt. Most rendeltem egy usb-soros átalakítót, mert ezelőtt egy régebbi gépen néztem, ahol még volt soros port, de laptopon nincs. Így ha megjön az átalakító, akkor ránézek, de tuti, hogy adja a jelet csörgetéskor.
(#) zombee válasza Ricsi89 hozzászólására (») Márc 3, 2012 /
 
Biztos hogy adja? Nincs lehúzva valamelyik láb ami blokkolja az adást? Esetleg még megteheted,
hogy figyeled az Rx portot(talán a PIND-n van), hogy egyáltalán ad-e valamit, azaz cibálja-e a lábat.

De nem is kell szoftver, rákötsz egy PNP tranzisztort egy 10k ellenállással, arra egy LED-et + 100 Ohm ellenállást.
(#) TavIR-AVR válasza Ricsi89 hozzászólására (») Márc 3, 2012 /
 
A modul az AT parancsokkal megtanulta, hogy milyen sebességgel kell visszafele kommunikálni?

Vagy megvan az hogy fix sebesség beégetve a modulba?
(#) Ricsi89 válasza TavIR-AVR hozzászólására (») Márc 3, 2012 /
 
A modul fix 4800 baud sebességgel kommunikál, semmit nem kell állítani.
(#) Tomi_Bp hozzászólása Márc 3, 2012 /
 
Sziasztok! Van egy kütyüm, amin van egy SPI buszra fűzött SD kártya és egy Nokia 3310 LCD.
Az a problémám, hogyha áram alá helyezem, akkor az inicializálás során hibát jelez, de az első RESET után tökéletesen működik...
Már egy elég nagy (több másodperces) DELAY-t tettem a MAIN elejére, de így is hibát jelez...
Van-e valakinek ötlete a megoldásra, illetve hogy lehet szoftveresen RESETelni az AVR-t (atmega32)?
Előre is köszi!
(#) sikolymester válasza Tomi_Bp hozzászólására (») Márc 3, 2012 /
 
Erre ugyan konkrétan nincsen ötletem, de szoftveres resetet úgy érdemes csinálni, hogy a watchdog timert beállítod, majd nem piszkálgatod a watchdog timert. Ezzel kapsz egy teljes, mindenre vonatkozó resetet, akárcsak a reset gombbal csináltad volna.

Használd az avrlibc watchdog rutinját a watchdog bekapcsolására.
(#) zombee válasza Tomi_Bp hozzászólására (») Márc 3, 2012 /
 
Szerintem illene már megtanulni hogy így soha nem javítunk hibát, előbb mindig az alapproblémát
kellene megkeresni! A hibát pontosabban hogy jelzi? Az SD-kártya véletlenül nem kap 5V-ot valamelyik lábon?

A bekapcsolási RESET időtartamát tudod növelni(valamennyi órajel + ms-ban mért idővel) a FUSE biteknél,
pontosabban a SUT_CKSEL résznél. Ha mégis RESET-et akarsz akkor vagy a Watchdog-al próbálkozol,
vagy valami késleltetős dologgal aminek egy portlábról adhatsz jelet, közvetlenül nem köthető a RESET-re!
(#) norbigal hozzászólása Márc 4, 2012 /
 
Hali
Atmega16A esetén a Timer/Counter 0 Phase Correct PWM funkciójában nem értek valamit.
Ez ugye úgy működik, hogy beállítom a megfelelő biteket, majd engedélyezem a megszakítást és jelen funkcióban az OC0 lábon (PortB.3) jelentkezik a PWM jel
A Fast PWM funkciót már beállítottam és az tökéletesen is megy. A Fast PWM és Phase COrrect között bár csak minimális beállításbeli különbség van, viszont:

AZ adatlap azt írja, hogy Phase Correct PWM jel esetén a kimenő frekvencia:
f = (f_clk I/O)/(N*510)
Ahol a beállításaim szerint N=1, f_clk pedig 16MHz. Viszont azt az 510-et nem tudom hová tenni :|

Maga a programrészlet így fest: (bs=bitset, bc=bitclear)
bc(TCCR0,WGM01); //WGM00 és 01-ben különbözik a Fast PWM és a Phase Correct PWM
bs(TCCR0,WGM00);
bc(TCCR0,CS02);
bc(TCCR0,CS01);
bs(TCCR0,CS00);
bs(TCCR0,COM01);
bc(TCCR0,COM00);

OCR0=130;
bs(TIMSK,OCIE0);
sei();


Ahogy látszik az OCR0 állítja a pulzuszélességet, de mégis a képlet szerint hogy lehet maximálisan 510-zel számolni, ha az OCR0 csak 8 bites?!?! Jelenleg ugye 130 van ott, és max 255 adható neki.
Fast PWM esetén egyértelmű volt a dolog mert ott a képletben 510 helyett 256 volt, ami éppen megfelelt a 8 bitnek. De itt mi értelme a képletben az 510-nek?

Azt odáig értem, hogy a számláló nem csak fentről lefelé, hanem lentről felfelé is számol. De ez akkor mit befolyásol? Vagy mi a különbség köztük?
Phase Correct PWM-ben magyarán ha pl OCR0-nak 130-at adok, akkor azt a képletben 260-nak kell vennem?!?! És csak annyi az értelme, hogy Phase COrrect PWM-ben fele akkora frekvenciákat lehet előállítani (ugyanazon OCR0 értékkel) mint a Fast PWM-ben????

Remélem nagyjából érthető volt, hogy mit nem értek
(#) vzoole válasza norbigal hozzászólására (») Márc 4, 2012 /
 
Elsőnek hozzátenném, én kezdő vagyok...

Tapasztaltam olyat, hogy fastPWM-el nem tudtam levinni teljesen 0-ra az értéket, szkópon mindig jelzett egy kis tüskét. Lecserélve p.c.PWM-re már tökéletesen működött.
(azóta már olvastam, hogy másnak is volt hasonló gondja)

A p.c.PWM pont fele olyan gyors mint a fastPWM, gondolom ezért van megszorozva 2-vel az osztó (255*2=510).

De az OCR0 beállítása csak 8 biten történik (0-255), ahogy írtad is.

Amúgy fut a p.c.PWM?
(#) norbigal válasza vzoole hozzászólására (») Márc 4, 2012 /
 
"A p.c.PWM pont fele olyan gyors mint a fastPWM"
Hűű kössz pont erre voltam kiváncsi. Csak valahogy kacifántosan fogalmaztam. Kösz!

Sajnos nincs scope-om szóval ezért voltam zavarban, mert maga a PC PWM működik, szépen tudom villogtatni vele a LED-et, viszont azt megnézni, hogy mennyiben különbözik a Fast PWM-től már nem. A fényerőcsökkenésből szemmel pedig semmit nem tudtam kihámozni.

Kérdésedre válaszolva: fut, bár ugye szemmel láthatólag egy LED_del tesztelve az égvilágon semmi különbséget nem érzékelek a Fast PWM-hez képest.

Azt hiszem lassan ideje lenne beszereznem egy scope-ot.... bár az sztem csillagászati összegeket verne
(#) Ricsi89 válasza zombee hozzászólására (») Márc 4, 2012 /
 
Megoldottam a problémát. Elfelejtettem a main-ba egy while ciklust tenni, így lefutott az a semmi a mainban és vége. Most betettem és megy is rendesen. Már kiírja a hívó fél telefonszámát a kijelzőre és utána megszakítja a hívást.
(#) sikolymester válasza norbigal hozzászólására (») Márc 4, 2012 /
 
Egy logic analyzerrel egész jópofa dolgokat lehet csinálni. Főleg, hogyha csak bináris jeleket akarsz vizsgálni.
Ezt egész olcsó beszerezni: Saleae logic clone
Következő: »»   419 / 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