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   400 / 840
(#) cirpo válasza ATtiny hozzászólására (») Jan 14, 2012 /
 
Köszi a segítséget!
Hozzá is fogok programozni.
Karaktereket már ki tudok írni, bár azt is elég körülményesen. De haladok...
(#) pogany.tamas válasza Reggie hozzászólására (») Jan 14, 2012 /
 
Köszönöm, azt kikapcsolva érzésre jónak tűnik
(#) norbigal hozzászólása Jan 14, 2012 /
 
Kicsit már kitérek az AVR-ektől, de az alapgondolat innen indult, és a végén még valami használható jön ki belőle, szóval ink ide írom, ha már innen indult az egész mizériám.
Próbálkoztam, és elég elkeserítő a 8051 és minden hozzá tartozó mizéria....
TAVIR AVR MKII klón nem képes programozni a z AT89S52-es 8051 chipet
A sablonos Enetring programming mode: FAILED Leaving.....FAILED....
2 próbálkozásom volt eddig. Egyszer XE251 környezetben, assemblyben írtam rá egy programot, és annak a HEX fájlját próbáltam beírni. Ekkor alapban reklamált már a HEX fájl miatt is. Második lehetőségnek próbélkoztam a uVision-ben írt programommal, vagyis annak a HEX fájl-jával. Ekkor a HEX miatt nem panaszkodott, de jól ismert Entering..... FAILED! szöveget megint lenyomta a senkiházija....
Mindkét esetben az AVR Studio 4.18-as verzióját használtam a beégetésre. A programozó választásakor értelemszerűen átállítottam az AT89S52-re. A lábak bekötését legalább 10X ellenőriztem. A mai nap szerintem még fogom vagy 20X.

Még van reményem abban, hoyg AVR Dude alól-ami még az életben nem volt kezemben, szóval szép baleset lesz az is - próbálom beprogramozni. Bár nem tudom elképzelni, hogy nagy különbség lenne.

Sikolymester!

Néhány sorral lentebb írtad hogy te a Silabs debugger-t javaslod, ami olcsó és jó. Hol lehet ilyet venni? Én neten keresgéltem, de nem igen találtam. És mi az-az olcsó? Én a TME-n találtam egy ilyet, de az a 30.000-40.000 FT körüli árával nem tűnik olcsónak, nem is beszélve a képnélküli, szegényes leírású weblapról ahol találtam... Bővebben: Link

Elsődleges szempontom az USB-s felület lenne, de ez 8051-nél ritka mint a fehér holló. Amikor meg engedtem volna az USB felületből, akkor már a 80C552-es chiphez ragaszkodtam volna, ami viszont csak sorosan programozható. Ehhez is csak a suli miatt ragaszkodnék. Bár itt előny, hogy találtam egy oldalt, ahol emberi fogyasztásra alkalmas áron adnak ilyen chip-et, de itt is a falat kaparom a semmitmondó panel leíráson.Bővebben: Link
Bár itt sem írja egy szóval sem, hogy mégis mi a túrón keresztül programozható maga a chip..... Bár tény: ha 80c552-n maradok csak ezt vehetem meg, mert ilyen chip-et magában sehol nem találtam magyar földön, sőt még külföldin is csak 1 weboldal ha volt.

Ne nézzetek hülyének mert én nem ragaszkodnék a 8051-hez semmi téren. AZ tény, hogy talán a lehető legkönnyebben felfogható chip, de csak a Kandó miatt(mivel ott ezt használjuk majd a PLC és PIC mellett) ragaszkodom ennyire a 8051-es chiphez.
Valakinek valami reménysugár szerű ötlete esetleg? Hol lehet kapni USB-s 8051 programozót, vagy ezt az említett emberi árú Silabs debugger-t, vagy akármi 8051-es használható cuccost? Ha annyira lehetetlen a dolog minden téren, akkor kénytelen leszek aszteli gépre bbefektetni... és akkor aztán lesz ne mulass, ha gyakorlatilag bármit programozhatok sorosan.... bár az se olcsó mulatság
(#) sikolymester válasza norbigal hozzászólására (») Jan 14, 2012 /
 
Én konkréten erre gondoltam. 35 USD a gyártótól rendelve, gondolom megcsapva egy kis postaköltséggel. Szóval olyan 10.000 Ft körül. Tessék FDH-nál ~11.000 Ft-ba kerül.

Ezzel a Silabs 8051-eseket tudod debuggolni. Láttam már akcióban KEIL IDE-ben, engem meggyőzött.

Érdemes körülnézni a Silabs oldalán, van mindenféle 8051-esük USB-s is például.

Bár, ha rajtam múlik én lebeszélnélek róluk, de ha 8051 a cél, akkor szerintem Silabs a válasz
(#) zombee válasza sikolymester hozzászólására (») Jan 14, 2012 /
 
Én is lebeszélnélek a drága cuccok és az alacsony (hazai) felhozatal miatt, ettől függetlenül Keil+Silabs a nyerő. A BME-n is van egy 8051-el foglalkozó tárgy, és ha a labort is felveszed akkor egy ILYESMI csomagot is megkapsz tökingyen, de csak akkor tarthatod meg ha el is végzed(5 vagy 6 laboralkalom beugróval, írásbeli, nagyházi paneltervezéssel és programozással). Az én csomagomban elem nem volt, a panelen 2 darab DB9(tehát USB nem) amiből az egyik RS-232 a másik CAN busz, és még egy RS-232 hosszabbító kábel is figyelt benne.
(#) TavIR-AVR válasza norbigal hozzászólására (») Jan 14, 2012 /
 
Az MKII-k (elvileg) ismer(het)ik a 8051-et. Legalábbis a listában felhozzák...

A 8051 fórumokban eléggé vegyes eredményekről számoltak be - volt akinek ment, de a jellemző az inkább nem.

Tipp: olyan 8051, ami beépített USB-s és OTG-vel bír? Igy belső bootloader van és az tölti fel... Bár kérdés mennyire 8x51 a HW így belül.

Atmel oldalon a x51 USB önprogramozós kiadásából a FLIP-l töltheted fel a programot. Ebben a köv. chipeket írja most:
AT89C51 - Rx2/Ex2/Ix2 series:
at89c5115/5130/5131/5132/51ac2/51ac3/51cc01/51cc02/51cc0351ed02/51rb2 ...


Ehhez elég egy USB port + atmel FLIP programja.
(#) norbigal hozzászólása Jan 14, 2012 /
 
Köszi a választ mindenkinek!

Sajnos nekem sem szimpatizál annyira ez a 8051, de hát ha azt mondják ezt is tudni kell, akkor nincs mit tenni

Sikolymester
Szerintem ez lesz az én választottam, de leghamarabb nyáron fogok neki a 8051-es vásárlásnak és programozásnak. De köszi a linket. Pont valami ilyet akartam!

Zombeee
A BME-s meglátás jó, csak én Kandón vok, szóval ez kilőve. Bár ha nagyon akarnám úgytudom lehetne más-más iskolában is végezni adott tárgyakat, de azért ennyi macerát még egy 8051 sem ér meg. Sőt szerintem a TO-s asszisztensek is csak pislognának

TavIR-AVR
Az USB-s OTG számomra már-már kínainak hangzik, de kezdőként ezen nem akadok fel.
Végülis kezdetben sem azért vettem az MKII klónt, hogy 8051-ezzek vele, csak annyira feldobott hogy lehet vele kezelni 8051-et, hogy nem hagyta nyugton a fantáziám. De végülis AVR-re, amire vettem nekem tökéletesen megfelel.
(#) Reggie válasza norbigal hozzászólására (») Jan 14, 2012 /
 
Neked Cypress EZ-USB FX2-re van szukseged. viszi az usb2.0-at, kozvetlen usb-rol programozhato, stb., stb.
(#) ReFi hozzászólása Jan 16, 2012 /
 
Ti milyen megoldással oldottátok/oldanátok meg két egész szám hányadosának kiírását az LCD-re?
Pl int a = 3; int b = 4; és én a/b-t akarom az LCD-re íratni.
(#) ReFi hozzászólása Jan 16, 2012 /
 
Jah, még valami.
Tudnátok ajánlani egy olcsó AVR programozót amivel lehet AVRStudioban debugolni? Steb-by-step futtatni a kódot, stb...
(#) Balint133 válasza ReFi hozzászólására (») Jan 16, 2012 /
 
szia, en ugyan s*** hulye vagyok AVR programozasbol jelenleg, de szoftverfejlesztokent mondhatom, hogy

  1. int a = 3;
  2. int b = 4;


kodot nem tudod egymassal elosztani, ugyanis ezek integerek. Ha tizedes pontossaggal akarod kiiratni, akkor elso korben hasznalj
  1. float
-ot


Esetleg ezt a tutorialt nyalazd vegig, szerintem egesz jo:Bővebben: Link
(#) zsozsoX válasza sikolymester hozzászólására (») Jan 16, 2012 /
 
Ha már érthető a kapcsoló, akkor valami tanácsod lenne az eredeti problémára. 9v-os táp (elem) egyik állás óra előre számol, másik állás óra vissza számol. Vagy jó az Én elgondolásom a zéner meg a sok dióda? Köszi
(#) sgt válasza ReFi hozzászólására (») Jan 16, 2012 /
 
Itt keress pl. JTAG-ICE USB 2 vagy Dragon.

  1. int a = 3;
  2. int b = 4;
  3. float c = (float) a/b;


Sokan elfelejtik, hogy a típuskonverziót "ki kell kényszeríteni", mert ha csak simán float c, akkor is levágja mert a hányados képzés int-ben történik.

Kiíratáshoz pedig gondolkozz egy kicsit , mert ez nem szintaktikai probléma, hanem szemantikai.
(#) ReFi válasza sgt hozzászólására (») Jan 16, 2012 /
 
Úgy látszik több hibát is vétettem:
1. változók deklarálását be kellett tennem a main()-be
2. "ki kellett kényszeríteni" a konverziót (köszi a tippet!)

Kiírást csak ilyen bonyolultan tudtam megoldani, de hogy kellene ezt igazából?

  1. char char1[200];              
  2. char char2[200];
  3. int a = 3;
  4. int b = 4;
  5. int m = a%b;                     //osztás maradéka
  6. float c = (float) a/b;
  7. float d = (float) m*1000/4; // tizedes vessző utáni rész
  8.  
  9.   lcd_init ();
  10.   lcd_control (1, 0, 0);
  11.   lcd_cls ();
  12.  
  13.   itoa (c, char1, 10); //string-re konverzio
  14.   itoa (d, char2, 10);
  15.  
  16.   lcd_putstr (char1,0x00); // kiiras 1.sor 1.karakter
  17.   lcd_putstr (".",0x01);     // kiiras 1.sor 2.karakter
  18.   lcd_putstr (char2,0x02); // kiiras 1.sor 3.karakter
(#) zombee válasza ReFi hozzászólására (») Jan 16, 2012 /
 
Az MSC-s "JTAG USB 2" mellett (ami nem keverendő a JTAGICE mkII-vel!) utánépített változatok is léteznek kb. fele/harmada áron, és a JTAG ICE sokak által(köztük jómagam ) ismert szerkezetéből adódóan körülbelül ugyanazt tudják.

Ha valami gyári eszközre fáj a fogad akkor is lebeszélnélek, helyette a Dragont venném meg.

integer vs. LCD:
Hát ez jó kérdés, egy részét megválaszolták előttem: Nem szintaktikai kérdés hanem formai.
Én fixpontos logikát használok, de nem ajánlom kezdőknek mert matek is kell hozzá.

Egyébként úgy érdemes konvertálni hogy az osztandók már eleve float-ban legyenek, vagy osztáskor kasztold őket. Több memóriát és stack-et zabál de másképp nem megy:
  1. int a = 3;
  2. int b = 4;
  3. float c = ((float)(a))/((float)(b));
  4. int c_egeszresz = c;
  5. float c_tortresz = c-c_egeszresz;
  6. if(c_egeszresz<0) c_tortresz*=-1;

Ezután először lebontod az egészrészt 10-esével osztogatva, majd a törtrészből 10-esével szorozgatva a törtrészből építed fel a tizedesponttól jobbra álló számsort tetszőleges pontossággal, de a sztring méretét ne lépd túl! Felesleges 200 karakter, egy átlagember számára olcsón elérhető LCD-n is max. 24 karakter van egy sorban...
(#) sgt válasza ReFi hozzászólására (») Jan 16, 2012 /
 
Én ennél csak bonyolultabb kiíratást tudok , ami nem mellesleg lassabb is, mint a tiéd.
(#) zombee válasza sgt hozzászólására (») Jan 16, 2012 /
 
Valószínű nekem címezted, az itoa() épp nem jutott eszembe és kapásból írtam a saját kreálmányom...
Ettől függetlenül a műveleteket a már azelőtt float-ba kasztolt változókon kell elvégezni.
(#) Auf hozzászólása Jan 16, 2012 /
 
Sziasztok!
Valaki tudna segíteni nekem ebben?
Bővebben: Link

Köszönöm!
(#) sikolymester válasza Auf hozzászólására (») Jan 17, 2012 /
 
Nos, bajban vagyunk. Googlenak egy találata van erre: M9S08AC128 , mégpedig az általad feltett kérdés.

Pontosíts légyzi a kérdéseden, szerintem ezért sem kaptál senkitől választ, mert senki sem érezte magát relevánsnak.
(#) trudnai válasza zombee hozzászólására (») Jan 17, 2012 /
 
Gyerekek, mar miert ne lehetne ket int tipust elosztani egymassal? Max az egesz reszet kapod csak meg -- viszont egy kis trukk:

Tegyuk fel, hogy ket tizedes pontossag nekunk elegendo, ekkor ugye 10^2 azaz 100-al szorozzuk az osztandot, majd ugyanennyivel osztunk az egesz reszhez, es ha a tort resz kell akkor az egesz reszt kell kivonni az eredmenybol:

  1. int a = 3;
  2.     int b = 4;
  3.     int c = a * 100 / b;
  4.     int egesz = c / 100;
  5.     int tort = c - egesz * 100;
  6.  
  7.     printf("c = %i.%i\n", egesz, tort);


Ennek azt kell kiirnia, hogy 0.75... 4/4 eseten 1.00 es 5/4 eseten 1.25 (gcc-vel teszteltem)
(#) sikolymester válasza trudnai hozzászólására (») Jan 17, 2012 /
 
Jó trükk.
Arra érdemes figyelni, hogy értelemszerűen egy uint16_t változó maximális lehetséges értéke csökken két helyjeggyel. Vagy eleve tudjuk, hogy nem lesznek ekkora számok, vagy éppenséggel typecastoljuk uint32_t re a művelet közben.

Amúgy szerintem nem úgy értették, hogy osztani nem lehetséges int-tel, hanem arra gondoltak, hogy a tizedesjegyek elvesznek. Közben meg ugye pont tizedest akart kiíratni a kérdező.
(#) zombee válasza trudnai hozzászólására (») Jan 17, 2012 /
 
Röviden ez lenne a lényege a fixpontos logikának. Köszi, ennél egyszerűbben nekem se ment volna a leírása...
(#) Auf válasza sikolymester hozzászólására (») Jan 17, 2012 /
 
Szia!

Közben agyaltam a folyamaton, és arra gondoltam, hogy az általam beírni kívánt programot nem is muszály kiolvasnom, ha nem megy, megvan egy bootloaderes formában a hex. Viszont az egy üres chip-be nem fog belemászni.
Arra gondoltam, hogy esetleg így is be lehetne tölteni. Viszont bootloadert még nem alkalmaztam. És az avr-ekkel is nemrégiben kezdtem el foglalkozni, és még csak az információgyűjtés fázisában tartok.

Erről a chipröl van szó és egy kisebb volt eredetileg, csak a frissebb programja már ebben fér el csak, az eredeti chipben nem.
Azt akartam kiolvasni, hogy a régi progit beteszem az új chipbe, majd bootloaderrel frissítem. Ez volt a tervem. De nem olvassa eddig nem jött össze.

ezt ajánlotta az eladó, a probléma megoldására, miután felkerestek, hogy segítenek szivesen.
Bocs, ha sokat írtam.
(#) ReFi válasza trudnai hozzászólására (») Jan 17, 2012 /
 
Ez is működik de hogy etetem meg az lcd_pustr() függvénnyel?
(#) ReFi válasza ReFi hozzászólására (») Jan 17, 2012 /
 
Jóvan, megtaláltam Ricsibácsi C könyvében.
Csak meg kell tanulni ezt a nyamvadt C nyelvet...
(#) gabi20 hozzászólása Jan 18, 2012 /
 
Sziasztok nézegettem az ATmega8 - ban a Timer1 működését, de nem teljesen világos. Egy dallamcsengőt szeretnék készíteni, ehhez kellene először egy jelgenerátor, ami pl. létrehoz egy 880Hz frekvenciájú 50% - os négyszögjelet. Szóval a Timer1 inicializálásában szeretnék segítséget kérni (TCCR1A , TCCR1B beállítása) előre is kösz
(#) zombee válasza gabi20 hozzászólására (») Jan 18, 2012 /
 
Lehet hogy a Timer0 is kielégíti az igényeidet, de mind1, megmutatom hogy kell Timer1-ben.
Első a timer előosztója. Mivel kis frekik kellenek de nem árt ha pontos is, az előosztó legyen 1.
Nem írtál órajelet(minél nagyobb annál pontosabban időzíthető) így most a 8MHz-es belső oszcillátorra építek.
A jeledhez azt a Fast PWM módot ajánlom, ahol a "TOP" mezőben az "ICR1" áll. Ez azt jelenti hogy a számláló,
amikor eléri a 16 bites ICR1-be beállított értéket, az lenullázza magát és az elejétől indul újra az egész.
Mivel 8000000/880~=9091, az ICR1-be 9090-et kell beállítanod. Ezután jön a kimenet beállítása.
Ha azt akarod hogy 50% legyen a kitöltés, akkor a számlálónak ezen érték felénél 4545-ön kell
valamit csinálnia. Ez a valami a komparálás, ilyenkor a kimenet polaritást vált.
A másik váltás a számláló újraindulásakor történik, ellenkező irányban.
Ha az OC1A kimenetet használod akkor a szintén 16 bites OCR1 regiszterbe kell a 4545-öt beleírni.
Ezután az OC1A kimenetetet kell a timer számára beállítani a COM1A1:COM1A0 bitekkel("1:0" érték).
Ennek hatására komparáláskor(OCR1A) LO, a timer újraindításakor(ICR1) HI állapotba kerül a láb.
(#) gabi20 válasza zombee hozzászólására (») Jan 18, 2012 /
 
Köszönöm a választ sikerült megoldani a problémát. Egyébként a CTC módot használtam, tehát amikor a TCNT1 eléri az OCR1 - ben megadott értéket, az lenullázza magát és átbillenti az OC1A lábat. Köszi a segítséget
(#) zombee válasza gabi20 hozzászólására (») Jan 18, 2012 /
 
CTC-ben is működik, de hangmagasság váltásakor problémákat okozhat. Kis szerencsével egy kattanást vagy semmit nem hallani, szerencsétlen esetben a számláló körbe fog futni és rövid időre csönd lesz...
(#) ReFi hozzászólása Jan 18, 2012 /
 
Most próbáltam egy ADC-s példát. Ha tápfeszre kötöm, akkor 1023 az érték, ez ok, de ha a földre akkor olyan 15 körül ugrál. Ez jó ez így?
Következő: »»   400 / 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