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   417 / 840
(#) zombee válasza Suncorgo hozzászólására (») Feb 25, 2012 /
 
Én fotózom, több-kevesebb (de már egyre több) sikerrel. Vasalással kezdtem, de nagy volt a "selejtarány", egész egyszerűen nem tudtam átvasalni úgy, hogy a hozzávezetések fele ne maradjon a műnyomón.
Sokszor összefolytak az érintkezők, a TQFP-32 már nem is ment, TSSOP-ról meg álnodni sem mertem.
A fotózásnál másra kell ügyelni, nem olcsó a lakk, de legalább az esetek többségében jól sikerül.
A marató nátrium-perszulfát, melegítve hamar leviszi(kb. 20-30 perc).
(#) Tomi_Bp hozzászólása Feb 25, 2012 /
 
Sziasztok!
Aki már ismer, tudja, hogy nem vagyok profi és sajnos az alapok hiányoznak...
Csak egy "esztétikai hibát" szeretnék kijavítani a sagítségetekkel, mert a program tökéletesen lefut, de dobja rá a Warning-ot. A kód részlet a következő:
  1. uint16_t cntr;
  2. uint16_t addr = 24;
  3. uint8_t test = 16;
  4.  
  5. ...
  6.  
  7. eeprom_busy_wait();
  8. eeprom_write_byte((uint16_t*)addr, test);
  9.  
  10. ...
  11.  
  12. test = 11;
  13. test = eeprom_read_byte((uint16_t*)addr);
  14. cntr = test;

../main.c:468: warning: passing argument 1 of 'eeprom_write_byte' from incompatible pointer type
../main.c:562: warning: passing argument 1 of 'eeprom_read_byte' from incompatible pointer type
...
Build succeeded with 4 Warnings...
(1 írás, 3 olvasás van, azért 4 warning van összesen...)
Előre is köszi!
(#) sgt válasza Tomi_Bp hozzászólására (») Feb 25, 2012 /
 
Szia!

A warning oka hogy a függvények vélhetően unsigned int-et várnak nem pedig uint16_t típusú változó pointerét.
(#) sgt válasza sgt hozzászólására (») Feb 25, 2012 /
 
Nem tudtam már időben módosítani.

uint8_t-t várnak a függvények, mert BYTE-ról van szó.

eeprom.h-ból egy részlet:
  1. uint8_t eeprom_read_byte (const uint8_t *__p) __ATTR_PURE__;
  2.  
  3. uint16_t eeprom_read_word (const uint16_t *__p) __ATTR_PURE__;
  4.  
  5. uint32_t eeprom_read_dword (const uint32_t *__p) __ATTR_PURE__;
  6.  
  7. float eeprom_read_float (const float *__p) __ATTR_PURE__;
  8.  
  9. void eeprom_read_block (void *__dst, const void *__src, size_t __n);
(#) Reggie válasza zombee hozzászólására (») Feb 25, 2012 /
 
Nos. Nezelodtem es eleg szegenyes a kinalat a tobbcsatornas illesztobol, igy en arra jutottam, hogy SN74LVC1T45 lenne neked a megfelelo. Ez csak egycsatornas, megfelelo tobbcsatornasat nem talaltam.
(#) zombee válasza Reggie hozzászólására (») Feb 25, 2012 /
 
Nos van fejlemény az ügyben, ma méregettem párat és kicsikét elvette a kedvemet.
Először a 4 csatornát kötöttem át hidakkal. Ekkor működött, ahogy a nagykönyvben meg van írva.
Egyenként kezdtem kiszedni/visszatenni a hidakat hogy melyik csatornánál cseszekszik és melyiknél nem.

A MISO és a RESET esetében úgy néz ki hogy nem kell híd, a másik kettőnél igen. A MISO-n nem csodálkozom
a RESET-nél tapasztaltak és a pár perce újra-elolvasott adatlap talán megoldja az összes rejtélyt.
RESET lábat a TXB0108 folyamatosan lehúzza, és ezen nem sokat javít az sem ha 10kOhm felhúzót kap.
Utóbbi esetben kb. 1.6V, ami még mindig RESET-nek számít, hát persze hogy ettől még működik
a programozás! A pontot az i-re az adatlap adta, ráadásul a LEGELSŐ sor:
1.2 V to 3.6 V on A Port and 1.65 to 5.5 V on B Port (VCCA <= VCCB)

Egy FET, 2 ellenállás: igen, ezt ismerem, és van pár BSS139-em is. Az a bajom ezzel hogy egyrészt
ott van az a felhúzó ellenállás, a másik hogy pár tized voltos GATE fesz esetén is képes 20-30mA-t átvinni?
Mert ugye a GATE fesz az feszültségesésként jön át(H1 felhúz, L1 = 3.3V-Vg), a másik hogy az a dióda
sem tetszik, biztos van valami nyitófeszültsége is(H1 lehúz, L1=Vd). 1.2-1.6V-os rendszernél is működne?>
(#) Reggie válasza zombee hozzászólására (») Feb 25, 2012 /
 
A dioda meg nem nagy gond, ugy kell bekotni, hogy csak akkor nyisson ki, ha szukseges, azaz a katod legyen a nagyobb feszultsegu oldalon. A nehany tized voltos gate feszultseg csak akkor fordulhat elo, ha magas szintet szeretnel, ekkor pedig a felhuzoellenallasok a meghatarozoak, nem a fet, az aramot is az ellenallasok szolgaltatjak. De ha van a fiokban FET, akkor probald ki, semmibe sem kerul. Alacsony feszultsegu rendszernel akkor mukodik a dolog, hogyha a FET ki tud nyitni, magyarul olyat celszeru valaszani, amelyek nyitofeszultsege 0.7V korul van.
(#) zombee válasza Reggie hozzászólására (») Feb 25, 2012 /
 
Egy ideig én is ilyet kerestem mint a SN74LVC1T45, de végül rájöttem hogy ebből 5 darab is kell, na meg ez egyirányú és kapcsolgatni sem árt amivel át kell írni a LUFA programot. Lényegében nem sokkal jobb
mint a 74HC126-os, azóta megnéztem és tud 2V-os tápfeszt is. Az IC egyben adja is a 4 kimenő csatornát.

A FET-es megoldásnál nagyon gáz ha 10kOhm húz fel, ennél még a MAX3002 6kOhm csatornaellenállása is jobb, főleg ha azt is nézzük hogy elegendő sebességnél már csak a FET-ek dolgoznak 50-70 Ohm ellenállással.

Lehet hogy én vagyok béna, de úgy látom hogy amikor a magasabb oldal húz fel, akkor a 3.3V-Vgs
szint eléréséig nem az ellenállás, hanem maga a FET húz fel hiszen a DRAIN-t húzzuk fel, a SOURCE követi.
(#) Tomi_Bp válasza sgt hozzászólására (») Feb 25, 2012 /
 
Köszönöm, az bejött, unsigned int-re átírtam.
Jött közbe egy másik:
  1. unsigned char password[13];
  2. unsigned char log[140]; //ezzel a sorral van baja

../main.c:59: warning: built-in function 'log' declared as non-function
Mi baja van ezzel? Van valami ilyen parancs és nem szeretné ezt, vagy mi a baja?
Köszi az előbbi segítséget is!
(#) Dudus válasza Tomi_Bp hozzászólására (») Feb 25, 2012 /
 
A log egy beépített függvény neve, ne használd itt.
(#) Tomi_Bp válasza Dudus hozzászólására (») Feb 25, 2012 /
 
Köszi!
Végre:
Build succeeded with 0 Warnings...
(#) zombee válasza zombee hozzászólására (») Feb 25, 2012 /
 
Közben megvolt a mai mérés. TXB0108 - 2.5V-os VL fesz fölött használhatatlan, alatta tökéletes 1MHz-en is.
Szóval marad a MAX3002, GTL2003, és a FET-es híd. A MAX-hoz még új áramkört sem kell készíteni...
(#) savanyu hozzászólása Feb 26, 2012 /
 
Amikor a SASOK szárnyalnak, a verebek hiába csivitelnek. Bocs, hogy kérdeztem, megpróbálom eltüntetni valahogy. Remélem ez menni fog. Minden jót.
(#) Reggie válasza zombee hozzászólására (») Feb 26, 2012 /
 
Ebben igazad van, csak kompromisszumos megoldas van a szamodra, bar az irany atkapcsolasa azert nem olyan nagy problema. De szerintem nezd meg, mit hasznalnak a JTAG ICE MK2-ben a szintillesztesre.
A FET-es megoldasnal jol latod, a kozbenso szinteknel a FET is megy, nem csak az ellenallas.
(#) zombee válasza Reggie hozzászólására (») Feb 26, 2012 /
 
Fél évig az AVR általi átkapcsolósdit tartottam a legjobb ötletnek, a LUFA program módosításával.
Valóban nem nagy cucc mert az ISPTarget.c és XPROGTarget.c - be kellett volna szúrni pár sort.
A baj az, hogy minden LUFA verziónál meg kell csinálni, és tegyük fel hogy kijön egy új de én
nem foglalkozom vele, vagy valami régebbit is kipróbálnék esetleg mást is módosítani kell, szóval macera.
Például a driver-mód váltáshoz a leírótáblát(Descriptors.c) kétszerezni kell, nem csak egy számot átírni.

Akkor még a korrekt szintillesztés fogalmát nem nagyon alkalmaztam. Az STK500 NPN-tranzisztor+1kOhm
felhúzóellenállásos verziója fogott meg, és tudtam hogy ez távol áll a korrekt meghajtástól.
Ennél valamivel jobb az én 100Ohm-os leválasztásom, ez már meg tud hajtani egy LED-es programozólábat.
Akkor az foglalkoztatott hogy a buffer IC vegye át a terhelést az AVR-től(pl. LED-es programozóláb).

Most pedig az illesztő IC-k gondolata fogott meg nagyon, remélve hogy tisztességes áramot(~20mA)
le tud adni, de a TXB0108 most nagyon elcsúszott. Nem az áram(mert dinamikusan biztos lead 20mA-t),
hanem a max. 2.5V-os VL szint miatt, persze a gyári 3.6V is édeskevés mert 1.2V-5.0V között kellene.
Még a MAX3002-ben bízom valamennyire, de a FET-es vagy GTL2003-as(ez is hasonló mint FET-es) megoldás
felé kacsintgatok. Meg is álmodtam egy FET-es kapcsolópárt ami a RESET-et figyeli és az XCK-t kapcsolja.

Egy gyári AVRISP-mkII-t már láttam belülről, a szintillesztő IC-ket is megtaláltam(3 vagy 4 darab).
Ezeket még nem sikerült beazonosítani, de az egyetlen ismerős cucc az ATMega128 volt, a többi mind idegen.
Gyanúsan sok a tranzisztor benne, és egyelőre nem értem a funkciójukat. Talán épp az XCK-t kapcsolják át.
(#) prody hozzászólása Feb 26, 2012 /
 
Lehet sőt biztosan nagyon egyszerű erre a válasz de megkattanok nem tudom..

Szóval van egy szimpla megszakításom, jelen esetben egy szimpla soros portos kommunikáció, kapok egy stringet az stringet beledobom egy tömbbe a megszakításon belül, de a főprogramomban mintha nem is történt volna értékadás.... A tömbböm üres. Miért? És hogy tudom ezt kijátszani.. a változót tuti globálisan deklaráltam szóval feladom... ötlet?
(#) vegyészmérnök válasza prody hozzászólására (») Feb 26, 2012 /
 
Működik a megszakításod? Engedélyezted a megszakításokat globálisan és a soros kommunikációhoz tartozót külön is?
(#) prody válasza vegyészmérnök hozzászólására (») Feb 26, 2012 /
 
A megszakítás tökéletesen működik, szépen beeugrik megszakításon belül az értékátadás is tökéletesen működik folyamatosan tesztelem a komplett PORTA-ra kiteszem a kapott értéket és megy minden de például a soros adatfolyam végén belövöm hogy start=1, majd a főprogramom ugye egy végtelen ciklus és ellenőrzi, hogy a start==1? és ha igen akkor be kellene ugrania de hiába a start értéke ténylegesen egy a megszakításon belül (a PORTA-ra kitéve mutatja hogy 1) mire a megszakítás lefut már 0, és direkt úgy is deklaráltam hogy extern int start=0; az egész program legelején, szóval nem tudom, de rohadt bosszantó...
bezzeg ha nem változót használok, hanem mondjuk azt mondom hogy PORTA=1, azt látja a főprogram...
megszkítást így triggereltem:
  1. //*********DEKLARÁCIÓ******************
  2. extern int start=0;
  3. //***************MEGSZAKÍTÁS***********
  4. ISR(USART1_RXC_vect)
  5. {
  6. cli();
  7. .
  8. .
  9. .
  10. .
  11. if (b == '!') {start=1;};
  12. sei();
  13. }
  14.  
  15.  
  16. //**************FŐPROGRAM***************************
  17. int main (void)
  18. {
  19. initPORT();
  20. initUSART();
  21. initPWM();
  22. sei();
  23. while(1)
  24. {
  25. if (start==1)
  26. {
  27. .
  28. .
  29. .
  30. .
  31. .
  32. }
  33. }
  34. }
(#) prody válasza prody hozzászólására (») Feb 26, 2012 /
 
nah megvan csak fentebb kellett volna olvasnom.... volatile a kulcsszó... :S
(#) Ricsi89 hozzászólása Feb 26, 2012 /
 
Sziasztok!
Nekem is van egy apró gondom uart-nál. Valamiért nme hajlandó normálisan olvasni és mindig csak egy a képen látható karakter íródik ki a kijelzőre. Ez lenne az olvasó rutin. Nem tudom miért csak ennyit ír bármire.
  1. void UART_read_string(){
  2. int i=0;
  3. do{
  4. data[i]=USART_Receive();
  5. ++i;
  6. }while(!(data[i-1]==0x0A));
  7. data[i+1]='\0';
  8.  
  9.  
  10. }
(#) lfuli hozzászólása Feb 26, 2012 /
 
Sziasztok!
Egy amatőr kérdéssel fordulok hozzátok. Ha van már egy felprogramozott AVR (esetemben Atmega8), abból hogyan tudom kiolvasni a programot?
(#) sgt válasza lfuli hozzászólására (») Feb 26, 2012 / 1
 
Abban az ablakban amiben programozod (write gombot nyomsz), ott tudod visszaolvasni is (read gomb).
(#) lfuli válasza sgt hozzászólására (») Feb 26, 2012 /
 
Köszönöm! Igazság szerint mostanában szeretnék nekikezdeni az AVR-ezésnek, és van egy Atmega8-am egy LED lámpában. Ez lesz a kísérleti alany, de nem szeretném ha elveszne a programom.
(#) sikolymester válasza lfuli hozzászólására (») Feb 26, 2012 / 1
 
Nos, mielőtt meglepődnél, ha nem megy a visszaolvasás, akkor jó ha tudod, hogy van lehetőség egy AVR-t úgy felprogramozni, hogy többet ne lehessen visszaolvasni a programot belőle.
(#) Reggie válasza zombee hozzászólására (») Feb 27, 2012 /
 
Ezek jol automatizalhato feladatok, javaslom melyedj el a Perl nyelvben es a perl regularis kifejezesekben(Perl Regugal Expression avagy regexp).

A jtag ice mkii-ben MAX4712,MAX3379,MAX3391,MAX3392 illetve SP720 van, lehet neked is ezeket kene hasznalnod.
(#) Reggie válasza Ricsi89 hozzászólására (») Feb 27, 2012 /
 
Az elso problema amit latok, hogy a 0 lezarot nem az i+1, hanem az i pozicioba kene rakni.
(#) painkillerperoxi válasza sikolymester hozzászólására (») Feb 27, 2012 /
 
köszi, próbálkozom!
(#) lfuli válasza sgt hozzászólására (») Feb 27, 2012 /
 
Sima STK200-al megoldható, ugye?
(#) TavIR-AVR válasza lfuli hozzászólására (») Feb 27, 2012 /
 
5V-os rendszer esetén igen - és persze nem lezárt chip esetén...
(#) Zsolt36 hozzászólása Feb 27, 2012 /
 
Sziasztok!
Rendeletem egy ilyet http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&item=390369630154#ht_...wt_952 és az lenne a kérdésem hogy ehhez jó e az avrstudio 4? Tiny 45-öt szeretnék programozni vele és azt írják jó lesz hozzá. Ugye ezzel ha már megvan az avrstudio tudok programozni?
Következő: »»   417 / 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