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   386 / 840
(#) gydanee hozzászólása Dec 3, 2011 /
 
Sziasztok!
Meg szeretném kérdezni, hogy Atmel1280 képes-e saját tápfeszültségét be AD-zni? Valamint áramerősség mérés is érdekelne.
Úgy tudom hogy simán rá lehet kötni megfelelő ellenállás osztóval, de meg akarom kérdezni tőletek is!

Köszönöm!
(#) sgt válasza gydanee hozzászólására (») Dec 3, 2011 /
 
Ha minden igaz, akkor ha egy független referencia feszültséget kötsz az AD-re, akkor lehet a saját feszültségét mérni.

Áramerősséget Ohm törvénye alapján tudod a legegyszerűbben megmérni, de figyelni kell hogy ne essen túl nagy feszültség az ellenálláson, és arra is hogy elég nagy feszültség essen ahhoz, hogy pontosan tudd mérni. Szval neked kell tudni, hogy melyik a fontosabb, persze ha van elég hely akkor lehet erősítőt is beépíteni, amivel kisebb ellenállással is lehet ügyködni.
(#) sikolymester válasza gydanee hozzászólására (») Dec 3, 2011 /
 
Adatlapból mire jutottál? Szerintem ott biztos megvan rá a válasz. Olyat keress, hogy van e benne belső referencia feszültség, amit a MUX regiszterrel be tudsz állítani az ADC bemenetének.

Ami az árammérést illeti, ott nem ellenállás osztó kell. Sönt ellenállásra gondolhattál. Az ellenálláson eső feszültséget kell megmérni.
(#) gydanee válasza sikolymester hozzászólására (») Dec 3, 2011 /
 
Köszi a válaszokat!

Igen, elvileg van belső referencia, és ahogy olvasgattam, akkor lehet mérni is.

"Optionally, AVCC or an internal 1.1V or 2.56V reference voltage
may be connected to the AREF pin by writing to the REFSn bits in the ADMUX Register. The
internal voltage reference may thus be decoupled by an external capacitor at the AREF pin to
improve noise immunity."
(#) sikolymester válasza gydanee hozzászólására (») Dec 3, 2011 /
 
Ha jól értettem te azt szeretnéd, hogy képes legyél megmondani az aktuális tápfeszültséget. Amennyiben az AREF pinre-teszel a REFSx regiszterekkel 1,1V-ot , vagy 2,56V-ot, akkor az lesz a baj, hogy a tápfesz, ami legyen mondjuk 5V az ADC mérésnél nemes egyszerűséggel levágódik, hiszen messze több mint 2,56. A mérés ekkor ugye a maximális eredményt adja vissza.

Tehát így bajban lennél, szükséged lenne a tápfeszt leosztani egy ellenállással. De ez szükségtelen plusz fogyasztást is eredményezne. Hiszen két ellenállás tápról földre kötve nem nyerő. Ha persze óriási ellenállásokat teszel be, akkor azon kevés áram folyna, csakhogy, de valami homályosan rémlik nekem, hogy ez nem tesz jót a mérési pontosságnak.

Mi tehát a megoldás? Tekints az adatlap 291. oldalára és lásd a trükköt a MUX regisztereket így állítva: 011110 az ADC bemenetére kötsz 1,1V-ot. Ez feltételezi, hogy a referencia feszültséged a tápfeszed. Ha a tápfesz hipotetikusan leesne 1,1V-ra(Ekkor persze nem működne már az IC), akkor az ADC eredménye ugye a maximális lenne, míg, ha a tápfesz 5V, akkor a megfelelő arányuk szerint.

A tápfeszed tehát mérni tudod.
(#) zombee válasza vagnerjazon hozzászólására (») Dec 3, 2011 /
 
Hello!

Lábkiosztás szempontjából semmi különbség nincs közöttük, egymás helyére be lehet tenni.
Az egyes perifériák címei és az interrupt tábla különbözik, tehát a C kódot újra kell fordítani.
A 8535 interrupt táblája szavas, a többinek pedig duplaszavas a nagyobb programmemória miatt.
Illetve, mintha úgy rémlene hogy a 8535 bootloader támogatása nem teljes, sajna már nem emlékszem erre.
Ja, és az ATMega16 is betehető a helyére, az kimaradt a sorból...

Személyesen engem úgy érint a dolog, hogy az általam gyártott fejlesztőpanelbe ATMega16 és ATMega32
is megy, de ha cserélem akkor a kódot újra kell fordítani. A vicc az egészben hogy azért,
mert az interruptok össze-vissza vannak cserélve, pedig tökugyanazok a perifériák vannak bennük.
(#) gydanee válasza sikolymester hozzászólására (») Dec 3, 2011 /
 
Ohh már értem! Nem is tudtam hogy van ilyen funkció a kis állatkában! 448 oldalas adatlapban könnyű kihagyni részeket.
"The internal 1.1V reference is generated
from the internal bandgap reference (VBG) through an internal amplifier. In either case, the
external AREF pin is directly connected to the ADC, and the reference voltage can be made
more immune to noise by connecting a capacitor between the AREF pin and ground."
Ugyanezzel a módszerrel az áramerősséget is meglehet mérni akkor gondolom, csak söntön keresztül.

Köszönöm szépen a segítségedet!
(#) vagnerjazon válasza zombee hozzászólására (») Dec 4, 2011 /
 
Köszönöm szépen. A kód újrafordítása nem gond, mert még nincs is kód, csak miután megcsináltam a panelt, rájöttem, hogy nem lesz elég a 8KB-os programmemória.
Sajnos nem értek hozzá annyira, az mit jelent, hogy szavas, meg duplaszavas?
(#) zombee válasza vagnerjazon hozzászólására (») Dec 4, 2011 /
 
Erre inkább akkor jössz rá ha assembler-ben programozol. Egy szó az 2 bájt.
Az AVR-ek utasításai kevés kivétellel 2 bájtosak, azaz az utasításkészlet szavas szervezésű.

Na most létezik olyan hogy reltív és abszolút ugrás. A "branch" utasítások relatívak.
Relatív ugrás esetében a címmező 12 bites, azaz 4096 lehetőség van a programmemóriában való ugrásra.
Mivel egy utasítás 2 bájt, ez 8KB memóriát fog össze. A 8KB és kisebb AVR-eknél így nincs abszolút ugrás.

Az abszolút ugrásoknál a címmező 22 bites, ez 8MB memóriát címezhet meg. Ez a cím nem fér bele
a 16 bites utasításokba, így lesz egy abszolút ugrás duplaszavas szervezésű. És hogy jön ide az interrupt?
Hát például úgy, hogy egy interruptnak bárhová el kell tudnia ugrani a programmemóriában,
azaz az abszolút ugrás a preferált. A 8KB és kisebb AVR-ekben csak relatív ugrás van, az abszolút tiltott.
Ez nem is baj, mert a 8KB-on belül relatív ugrásokkal is el lehet jutni akárhová...
(#) vagnerjazon válasza zombee hozzászólására (») Dec 4, 2011 /
 
Köszönöm a választ, én C-ben programozok(legalábbis próbálok), szóval remélem, nem lesz gondom ilyenekkel. A lényeg, az, hogy nyugodtan helyettesíthetem, és ennek örülök.
(#) Ricsi89 hozzászólása Dec 4, 2011 /
 
Sziasztok!
String fogadással nem boldogulok, pedig ezelőtt ment.
Adott egy Atmega8, ahol UART-on kellene stringet fogadnom. Érdekes módon eddig ment, most meg nem akar menni. A fura, hogy a gsm modultól jövő jelekkel nem tud mit kezdeni, de a gps modulból meg sikeresen olvassa az adatokat, az működik.
Szóval kellene nekem egy egyszerű függvény, ami biztosan működik. valakinek van ilyenje?
(#) norbigal hozzászólása Dec 4, 2011 /
 
Mára hivatalosan is kijelenthetem, hogy megöltem életem első mikrokontrollerét, bár fenn tartom a véleményt, hogy nem állítottam el FUSE biteket, csak az órajelét, de még azt sem külsőre.
Külső órajelre, ISP programozásra és JTAG-re sem reagál. A hiba végeredményben mindenhol ugyanaz.
Entering Programing Mode... Failed!!!
Leaving Programming Mode... Failed!!!
Talán nagyfesz-es programozás segítene neki, de mégsem adok ki 20.000-et egy 9000-es kütyü EGYSZERI javításáért.

Bár már pótoltam is az Atmega 128-at egy Atmega 16A-val, aminek méretei az emberi fogyasztásra is alkalmasak, de mégsincs kedvem ott hagyni 9000Ft-ot a szekrényben, szóval valahogy akkor is meg akarom javítani ezt a Thunder-Bird-öt.

1) Említettetek ilyen FuseBit-Doctor kapcsolást. De azt nézegettem, hogy ezekből is van HVPP és HVSP. Mi a különbség a kettő között? És amelyikre szükségem van, ahhoz hol találok a neten angol kapcsolást?!?! MErt pl. HVPP-hez egyetlen használhatót találtam, de az meg nem angol. A HVSP-t meg csak az Attiny chip-ek neve körül látom mindenhol.

2) Ez mégis hogy működik? A hagyományos ISP felületen keresztül programozik- "rak rendbe"? Csak mert ennek a Villám (gyorsan megdöglött) Bird-nek csak adott lábai érhetők el, a többi a NYÁK-on van csak - konkrétan forraszthatatlan - állapotban. (((Már így is forrasztgatnom kellett az alját, hogy az ISP felületet használhatóvá tegyem...)))

3) Továbbá, ami talán legfontosabb: Atmega128-at is képes javítani?!?!?!

4)Ugye a kapcsolást egyszerű filces NYÁK készítési módszerrel is meg lehet csinálni?!?!? Csak mert nincs kedvem előhívót, meg fotoNYÁK-ot, meg anyámkínja dolgokat pluszba vásárolni.

5)Már csak kiváncsiságból kérdezem inkább: a hivatalos Atmel programozók mindegyik tud nagyfesz-ű programozást?
(#) yello hozzászólása Dec 4, 2011 /
 
Hali.
Kezdő vagyok avr ben, nem is ez a fő érdeklődési köröm, de tapasztaltam egy furcsaságot amire érdekelne a válasz.
Vázolom: van nekem egy nixi csöves órám, aminek atmega 8 a lelke, anno mikor készítettem felprogramoztam 3 db-ot, abból 1 rögtön indult a többi nem akart számolni, azt a 2-őt eltettem, most elővettem az egy egyiket, betétem egy fél kész órába, megnézem háta... alapon, megint csak nem kezd el számolni, viszont otthagytam járatom egy kicsit az áramkört, hibát keresve, és arra lettem figyelmes, hogy kb indítás után 30-40p el elindul az óra, számol, és pontos.
Érdekelne hogy ennek még is mi az oka??
Üdv Gábor.
(#) sikolymester válasza Ricsi89 hozzászólására (») Dec 4, 2011 /
 
Peter Fleury uart library-jét itt találod. Szerintem ez tutinak mondható.

Ugyanakkor én már tapasztaltam, hogy belső oszcillátorral nem ment túlzottan jól az uart, bizonyára az órajel pontatlanság miatt. Próbáld ki esetleg kisebb belső oszcillátor frekvenciával, vagy külső kvarccal.
(#) sikolymester válasza yello hozzászólására (») Dec 4, 2011 /
 
Rossz a hardver.
(#) sikolymester válasza norbigal hozzászólására (») Dec 4, 2011 /
 
1. Első találat google-ban : Fusebit doctor csak angolra kell váltani bal oldalt.

A HVPP nagy feszültségű párhuzamos programozás, a HVSP ugyanez csak soros, nem párhuzamos. Uóbbi kvázi olyan mint egy ISP, csak a reset jel 12V-os. Meg kell nézni adott uC milyen módon programozható, erre adatlap ad választ.

2. A HVSP-vel szerencséd lehet, hogyha az AVR-ed olyat kíván, azt hiszem elég az ISP lábakat bekötni. Ha HVPP porttal megy, akkor lehet egy tucat lábat is be kell kötnöd.

3. Szerintem biztosan tud HVPP-t vagy HVSP-t, hiszen ez az egyetlen módja, hogy egy elfuserált fuse bites AVR-t a helyére tegyél.

4. Ha a fusebit doctort építenéd meg erre, akkor az összehozható filctollal is.

5.Nem mindegyik tud. A következők biztosan: Dragon, Stk500, Stk600
(#) Ricsi89 válasza sikolymester hozzászólására (») Dec 4, 2011 /
 
Külső kvarcról jár a cucc, 4,096MHz-es kvarcról. megnézem ezt, használtam már a készítőnek az I2C lib-jét, az tuti volt, szerintem ez is menni fog.
Szerk.: Ahogy elnézem a lib-et nincs benne string fogadás, csak küldés.
(#) sikolymester válasza Ricsi89 hozzászólására (») Dec 4, 2011 /
 
Csak meg kell fejelni egy pufferrel azt. Nem olyan bonyolult. Találsz is nem egy példát. Keress rá olyanokra, hogy ringbuffer, fifo.
(#) norbigal válasza sikolymester hozzászólására (») Dec 4, 2011 /
 
Köszi a választ, jövőhéten nekifogok megvalósítani.

Csak még egyetlen kérdés: Egy egyszerű, már-már primitívnek tekinthető soros programozó, ami rendes soros portra csatlakozik -ergó csak asztali gépről működtethető - , az elvileg nem csak 5V-ról megy, vagyis az képes lenne nagy fesz-ű pprogramozásra????
(#) UbiLinux válasza yello hozzászólására (») Dec 4, 2011 /
 
Hogy néz ki a reset láb környéke?
(#) Berta Viktor hozzászólása Dec 4, 2011 /
 
Sziasztok!
Egy kérdésem lenne! Adott egy Attiny861-es kontroller. Egy külső IC csatlakozik hozzá. Két vezetéken történik a kommunikáció. Egyik az adatvonal, a másik pedig az órajel. Az órajel felfutó élére történik az adat beolvasása. Szükséges figyelni az órajel kitöltési tényezőjét, mert ha nem 50%-os, akkor az adat nem érvényes. A forráskód elméletileg megvan. "Input Capture" megoldást használok, megszakítással, az eltelt idő meghatározására. Az ICP0 lábra van kötve az órajel. A tapasztalatom az, hogy a kontrollernek ez a lába eszméletlenül érzékeny. Ha a kezem közelítem hozzá, már 3-4cm-ről megtörténik a megszakítás, és így téves lesz. Ezt arról tudom, hogy a megszakítás rutinba beraktam egy LED kezelést, és villog amikor a kezemet a közelbe tartom, sőt, néha ha a GND-t megérintem, már akkor is. Szűrőkondikat pedig raktam rá, a kontroller nem szokott lefagyni, vagy újraindulni. A "Noise Canceler" be van kapcsolva, nélküle csak rosszabb. Ti is találkoztatok már hasonlóval? Esetleg megoldás rá? A közelben nincs semmi zavaró tényező, se erősáramú eszköz, stb. Bármerre is nézelődtem, senki se tért ki erre a jelenségre.
Köszönöm válaszotok! Üdv!
(#) sikolymester válasza norbigal hozzászólására (») Dec 5, 2011 /
 
Hát egyrészt nem tudom megmondani, mert nem ismerem a pontos menetét a magas fesz programozásnak.

Mielőtt nekivágsz bárminek, azért én megnézném a helyedben, hogy a brickeld atmegádnál HVSP van-e? És ha igen, akkor olvass utána picit, hogy pontosan mit is jelent a HVSP. Mondom, nem tudom a HVSP hogyan zajlik, de ha teszem azt, csak az a különbség a sima ISP programozáshoz képest, hogy a reset jelet 12V-on adja, a helyett, hogy földre húzná, mint a sima ISP-vel, akkor lehet elég csak egy sima plusz áramkört építened egy meglévő ISP programozódhoz. Ez a plusz áramkör oldaná meg, hogy a H->L irányú jeled H->12V legyen.

De azt önmagában kizártnak tartanám, hogy egy soros port kimenetet csak úgy odacsapj az AVR-re és azzal programozni tudj. Már csak azért is, mert egy órajelet adni kell az AVR-nek, egy minden plusz nélküli soros port kimeneten PC-ről ilyen biztos nem lesz.
(#) sikolymester válasza Berta Viktor hozzászólására (») Dec 5, 2011 / 1
 
Nem lehet, hogy azt a két vezetéket tápra kellene húzni, lévén, hogy egy open collectoros kimenetre van kötve mindkét IC-n? És szó szerint csak a lélek tartja működésben emiatt?
(#) Berta Viktor válasza sikolymester hozzászólására (») Dec 5, 2011 /
 
Nagyon köszönöm a segítséget! Ez a két vonal egy-egy 10K ellenállással fel van húzva, bár ennek ellenére igazad van. Mivel az IC, és a kontroller külön-külön NYÁK-on kaptak helyet (szalagkábellel összekötve), így a felhúzó ellenállások nem a kontroller NYÁK-jára kerültek, ezért ha a két eszköz nincs összekötve a ICP0 láb a levegőben lóg. Így már jó az eredmény . Bár, amikor először próbáltam felhúzó ellenállással ugyanezt tapasztaltam, no de mindegy, most jónak tűnik. Gyanítom a software is közbejátszhatott, hibás lehetett. Kösz még egyszer!
(#) szdani hozzászólása Dec 6, 2011 /
 
Sziasztok, nekem az a problémám hogy a programozó nem látja az új IC-t. ATmega 168-at szeretnék programozni, érintkezési gond nincs az IC és a programozó között. valakinek valami ötlet? ISP-vel programoznám, az adatlapjáról néztem a bekötést!
(#) pi.sta hozzászólása Dec 6, 2011 /
 
Sziasztok,a problémám a következő egy Mega32-est próbáltam programozni STK-200-as programozóval ,bascom szoftvert használtam működött is tudtam olvasni és írni is a fuse biteket de véletlenül a fuse bitek beállításánál a az ext.rc oscillator 8-12Mhz beállítást választottam és megszűnt a kommunikáció a chippel nem tudom se írni se olvasni hogyan lehetne vissza állítani a chip működését?
(#) Tomi_Bp hozzászólása Dec 6, 2011 /
 
Sziasztok! Van egy kütyüm, amivel adatokat írok ki SD kártyára. Ahhoz kéne ötlet, hogy file-ba hogy írjak ki változó értéket, hogy azt később újra átadhassam egy változónak. (Sosem voltam profi programozó és az utóbbi időben elektronikával foglalkoztam ... utána egy csomó ideig nehezen megy a gondolkozás C-ül Már előre érzem, hogy égni fogok... :S )
  1. for(j=0; j<sectorPerCluster; j++)
  2.   {
  3.     SD_readSingleBlock(firstSector + j);
  4.    
  5. for(k=0; k<512; k++)
  6.     {
  7.       LcdChr(FONT_1X, buffer[k]);//adat kiíratása Nokia 3310 LCD-re
  8.       transmitByte(buffer[k]);//adat küldése soros portra
  9.   if ((byteCounter++) >= 10 ) return 0;//most az első 10 karakterteredeti: if ((byteCounter++) >= fileSize ) return 0;
  10.     }

Hogy tegyem buffer[k] tartalmát egy változó értékévé?
Igazából egy számlálót szeretnék, ami minden indításkor növeli egy fájlban tárolt változó értékét, de valahogy úgy hogy szép legyen a programkódom... Előre is köszi!
(#) tecsa hozzászólása Dec 6, 2011 /
 
Sziasztok!

Atmega 128-at programozok, és szeretném az "E" portot kimenetként felprogramozni. A követezőképpen tettem.
DDRE=0xFF;
Ám később az "E" portra adott jel nem megfelelően működik.
Konkrétan egy LED-nek kéne 3sec en keresztül világítani.
PORTE=0b1000;
_delay_ms(3000);
PORTE=0;
Valamiért a LED csak megvillan alig észrevehetően.
Nem tudom mit csinálok rosszul.
Válaszokat előre is köszi
Üdv: Tecsa
(#) dB_Thunder válasza pi.sta hozzászólására (») Dec 6, 2011 /
 
Úgy hogy adsz neki külső órajelet.... ha már azt mondtad neki hogy külső óráról járjon.
(#) TavIR-AVR válasza tecsa hozzászólására (») Dec 6, 2011 /
 
Fordításkor órajel jó?
LED bekötés jó (tipp: ellenállás helyett nem 10µF kondi van sorosan (pl.Tantal))?
Következő: »»   386 / 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