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   421 / 839
(#) Suncorgo válasza Massawa hozzászólására (») Márc 5, 2012 /
 
Van itthon hozzá minden alkatrész, amibe egyszer már belefektettem. Egy kis extra belefektetéssel (program megírása) nem lepi a por itt őket. Meg hát a kihívásról nem is beszélve.
(#) zombee válasza Suncorgo hozzászólására (») Márc 5, 2012 /
 
Ha engeditek, én válaszolnék.

Az input capture egység a Timer1-hez kapcsolódó eseményregiszter. A TCCR1B regiszterben ehhez
2 dolgot állíthatsz be. Egyik az ICNC ami egy 4-órajeles "zajszűrő", a másik az ICES, ezzel azt állítod be
hogy felfutó vagy lefutó élre történjen a regisztrálás. Van még az ACIS bit az ADCSRA-ban, ezzel az input capture forrását állítod be. Alapesetben ez az ICP1 láb, beállított ACIS esetében az analóg komparátor.

A regisztrálás úgy történik, hogy az esemény(tehát felfutó vagy lefutó él) bekövetkeztekor a TCNT1 értéke
átmásolódik az ICR1 regiszterbe ami szintén 16 bites. A TIMSK-ban interruptot is állíthatsz az eseményre!

Csak egy kis fantázia kell hogy belásd, miért jó ez kis frekik(<10Hz) pontosabb mérésénél!>
(#) Massawa válasza Suncorgo hozzászólására (») Márc 5, 2012 /
 
Eszem ágában sincs lebeszélni anno az egyiket én is magam épitettem a másikkal meg megleptek .
Ime 2 modern projekt:.

Frekimérö

AVR Freki

Nemrégen viszont alkalmam volt egy szoftwares berendezéssel dolgozni - sajnos össze sem lehet hasonlitani gyorsaságban az anno céláramkörökkel megépitett müszerekkel.

De ez már a modern kor kinja.
(#) Suncorgo válasza zombee hozzászólására (») Márc 5, 2012 /
 
igen nagyjából értem, de én ennek mi hasznát veszem?

Vagyis elindítom a 16bites timer1-et és mikor az ICP lábon felfutó élre van egy impulzus(1 periódus kezdete) akkor a timer1 értékét átmásolja az ICR regiszterbe, miközben a 16bites timer1 ugyanúgy számol tovább.

Ezen akárhogy logikázok, az ICP láb sem tud nagyobb órajelet feldolgozni mint az AVRclk/2

pl 16 megás kavics órajelnek, osztás nincs, tehát a timer 1 tulcsordulása FCPUclk 65536/16000000 4,096msec.....

mind1 már belekavarodtam teljesen. Kiváncsi lennék hogy sikolymester mire gondolt,hogy gondolta.
(#) Suncorgo hozzászólása Márc 5, 2012 /
 
Itt egy 50Mhz frekimérő: Bővebben: Link

Semmi nincs benne csak egy PIC. Ezek szerint a PIC lába nagyobb frekit is fel tud dolgozni mint cpuclk/2? Ezt AVRel is meg lehet oldani szerintem. Még turkálok az adatlapokban...
(#) Suncorgo hozzászólása Márc 5, 2012 /
 
Itt a counter rész. Elvileg semmi köze sincs a cpu órajelnek hozzá. A külső órajel direktbe lépteti a számlálót.

T0.jpg
    
(#) sikolymester válasza Suncorgo hozzászólására (») Márc 5, 2012 /
 
Nos.
Van egy 50MHz -es frekvenciád. Legyen a külső leosztód 128, akkor ~390kHz-es jeled lesz a kimenetén, amit rákötsz az AVR timer capture-re.

Legyen továbbá a timer capture modul leosztója mondjuk 2, az AVR-ed órajele 16MHz. Tehát a timer capture modul 8MHz -cel működik.

Tegyük fel, hogy van egy olyan t időpont, amikor a 390kHz-es jeled pont akkor vált, amikor a timer capture modul elindul 0-ról (később belátjuk, hogy szinkronizálni lehet).

A 390kHz jeled vált, a timer capture modul interruptba lép, ahol automatikusan feltölti az ICR1 regisztert. Te az interruptban ha úgy tetszik gyorsan nullázod a timer számlálóját (ezzel szinkronba hozod a 390kHz-cel). Aztán, hogy az ICR1 regisztert még az interruptban írod be egy bufferbe, vagy később, az rajtad múlik.

Az, hogy pontosan milyen órajeleket mondtam az a véletlen szüleménye, mert csak a hasamra ütöttem.
De az elv szerintem ez.

És hogy miért nem csak egy sima interrupt lábra kötöd? Azért, mert szoftveresen itt többet hozhatsz ki belőle, miután már jól megismerkedtél a modul működésével. Továbbá itt van egy beépített digitális zajszűrő. Ha másért nem, akkor az utóbbiért ezt a megoldást választanám a sima interrupttal szemben.
(#) Suncorgo hozzászólása Márc 5, 2012 /
 
Itt a PICes megoldás: Bővebben: Link

köszönet p_istvan-nak.

Így már érthető.
(#) sikolymester válasza Suncorgo hozzászólására (») Márc 5, 2012 /
 
Igaz, úgy néz ki ennek más a modulja mint az atmega16-nak, de kezdetben nem tudtuk még, hogy mit szemeztél ki magadnak.
(#) Tomi_Bp hozzászólása Márc 5, 2012 /
 
Sziasztok! Eredetileg így irok ki egy karaktert a 3310es kijelzőmre:
  1. for ( i = 0; i < 5; i++ )
  2.         {
  3.             /* Copy lookup table from Flash ROM to LcdCache */
  4.             LcdCache[LcdCacheIdx++] = pgm_read_byte(&( FontLookup[ ch - 32 ][ i ]  ) ) << 1;
  5.         }
, de mivel nem találtam "hardveres" lehetőséget, mint a HD44780 kompatibilis kijelzőknél a kurzor villogtatására, ezért szeretném megoldani szoftveresen. Annyit módosítottam a kódon, hogy a "táblázatban" tárolt hexa értékeket ki szerettem volna vonni 255-ből:
  1. LcdCache[LcdCacheIdx++] = pgm_read_byte(&( (255 - FontLookup[ ch - 32 ][ i ] ) ) ) << 1;
, de ezt a hibaüzenetet adja a fordító:
../pcd8544.c:181: error: lvalue required as unary '&' operand
Hogy tudnám megoldani, amit szeretnék? Előre is köszi!
(#) zombee válasza sikolymester hozzászólására (») Márc 5, 2012 /
 
Valójában az Input Capture interruptban azt kell csinálni hogy az ICR1 értékét letárolod egy pufferbe.
A következő interruptban az új ICR1 értékből kivonod a régit, az eredmény a két lefutó él közti idő lesz
a számláló léptékeiben mérve. 390Hz-nél nem biztos hogy szerencsés mert 8MHz-es IC-vel ez nem mérhető
elég pontosan, túl nagy frekiknél könnyen előfordulhat hogy mire odaér az interrupt, már jön a kövi jel...

Szóval:
- nagy frekinél számláló(Tn) és időmérés másik timerrel
- kis frekinél input capture(ICP1)

A műszered pontosságát döntően meghatározza hogy hová teszed a határvonalat.
(#) sikolymester válasza zombee hozzászólására (») Márc 5, 2012 /
 
Pontosan. Ezt a dilemmát meg fel lehet oldani, hogyha futási időben változtatjuk a timer előosztóját.
(#) Mezoas válasza Reggie hozzászólására (») Márc 5, 2012 /
 
Hát ez bizony Linux.

A Saleae GUI sokkal szimpatikusabb.
Node most az "ez usb logic analyzer" google első találat megadta a választ. (Tegnap már igencsak ma volt.)
(#) Reggie válasza Mezoas hozzászólására (») Márc 5, 2012 /
 
Hat ez bizony platform fuggetlen(Linux, Solaris, Mac, Win), mert java-ban van. Ott van a forrasa is, ugyhogy olyanra alakitod at a kinezetet, amilyenre csak szeretned.
De attol meg, hogy az egyik csilivili, meg nem lesz semmivel sem jobb, a funkcionalitas a lenyeg.

Amugy az ugyen felbuzdulva azt hiszem itt az ideje csinalnom egy nagysebessegu analizatort.
(#) mzozo95 válasza Tomi_Bp hozzászólására (») Márc 5, 2012 /
 
Szia!
Igen, figyeltem a polaritásra, a cikkes program sem működik(pedig az enyém egyszerűbb ) Egyszerűen nem állítja egyetlen bitjét sem logikai "1" re a "makacs" avr...
Próbáltam letiltani a watchdog-ot is, de semmi javulás...
Mellékeltem az általam használt beállításokat... Valaki tudna segíteni a hiba kijavításában?
(avr: atmega48A-pu)

Előre is köszönet!

Zoltán

atmega48.JPG
    
(#) Reggie válasza mzozo95 hozzászólására (») Márc 5, 2012 / 1
 
A forditonak jol van beallitva az AVR tipusa? Biztos, hogy a megfelelo elf fajlt programozod be es az sikeres?
(#) ATtiny válasza Tomi_Bp hozzászólására (») Márc 5, 2012 /
 
Ha jól sejtem valami ilyesmire lenne szükséged:

  1. for ( i = 0; i < 5; i++ )
  2.             {
  3.                 /* Copy lookup table from Flash ROM to LcdCache */
  4.                 LcdCache[LcdCacheIdx++] = 255 - pgm_read_byte(&( FontLookup[ ch - 32 ][ i ]  ) ) << 1;
  5.             }
(#) Tomi_Bp válasza ATtiny hozzászólására (») Márc 5, 2012 /
 
Köszönöm, közben megoldottam így:
  1. invertChar = pgm_read_byte(&( FontLookup[  ch - 32  ][ i ] )) ;
  2. LcdCache[LcdCacheIdx++] = ( 0xFF - invertChar ) << 1;

A problémát az okozta, hogy nem ismertem a pgm_read_byte(& funkcióját, de már utána olvastam, hogy a FLASH-ben tárolt konstansokat keresi elő. Köszönöm a segítséget!
(#) Tomi_Bp válasza mzozo95 hozzászólására (») Márc 6, 2012 / 1
 
Van valami -akár gagyi- multimétered? Rámérnél az AVR valamelyik lába (14-15-16-17-18-19-9-10) és a GND között van feszültség?
A programodba volt pár felesleges sor, elég ennyi is:
  1. #include <avr/io.h>
  2. int main(void)
  3. {
  4. DDRB = 255;  
  5. PORTB = 255;
  6. }

atmega48 lábkiosztása
A programnak működnie kellene...
(#) Tomi_Bp válasza mzozo95 hozzászólására (») Márc 6, 2012 / 1
 
Ugye így van beközve (melléklet) ? Az eltéréseket jelöld be kérlek, ha még mindig nem működik! Üdv
(#) zolee1209 válasza Tomi_Bp hozzászólására (») Márc 6, 2012 / 1
 
Én az AREF-t nem kötném a tápra... Rossz beállítás esetén baj lehet belőle, "összeakadhat" a belső 2.56V-tal. Ha a tápot akarom referencianak, akkor azt valasztom ki az ADMUX-ban.
(#) Tomi_Bp válasza zolee1209 hozzászólására (») Márc 6, 2012 / 1
 
Megszokásból kötöttem be, de a #1182640 hozzászólásban levő progi fog futni a kütyün, ami igencsak nem használ ADC-t, tehát ennek a veszélye csekély de köszi!
Mint olvashatod mzozo95, a 21-es lábat ne kösd tápra a biztonság kedvéért...
(#) kakas92 válasza Reggie hozzászólására (») Márc 6, 2012 /
 
Mozgást érzékelni
(#) Reggie válasza kakas92 hozzászólására (») Márc 6, 2012 /
 
De meg mindig nem tudom, mit jelent nalad az a PIN betuharmas.
(#) Massawa válasza Reggie hozzászólására (») Márc 6, 2012 /
 
PIN (tü) az az IC, konektorok stb. lábát jelenti.
A mozgásérzékelö az PIR (Passive Infra Red) szenzor.
(#) malanc hozzászólása Márc 6, 2012 1 /
 
Kerámia nyákra forrasztási felűletett hogy an lehet vissza varázsolni?
(#) Reggie válasza Massawa hozzászólására (») Márc 6, 2012 /
 
Hat, meglepodnek, ha csak ez az egy jelentese lenne, ugyanis lehet akar rovidites is. Es gyanus, hogy csupa nagy betuvel irta.
(#) Reggie válasza malanc hozzászólására (») Márc 6, 2012 /
 
Vakuumgozolessel.
(#) szdani hozzászólása Márc 7, 2012 /
 
Sziasztom megépítettemezt és nincs kép, valaki tud segíteni?
(#) Massawa válasza szdani hozzászólására (») Márc 7, 2012 /
 
Hova dugtad be?
Következő: »»   421 / 839
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