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   344 / 840
(#) Petroimro válasza sikolymester hozzászólására (») Júl 25, 2011 /
 
És a .hex fájlt, amit be szeretnék írni, azt hova másoljam, hogy megtalálja a program?
(#) covek válasza Petroimro hozzászólására (») Júl 25, 2011 /
 
No akkor most sokkal jobb már a helyzet.

A -U több paramétert is kaphat. A valami.hex beírása: -U flash:w:valami.hex
LFUSE írása: -U lfuse:w:0x??:m
HFUSE írása: -U hfuse:w:0x??:m
EFUSE írása: -U efuse:w:0x??:m

Példa egy írásra:
avrdude -P /dev/ttyUSB1 -c jtag1 -p m128 -U flash:w:valami.hex -U lfuse:w:0x??:m -U hfuse:w:0x??:m -U efuse:w:0x??:m

A FUSE értékekekt persze célszerű jól megadni.
(#) covek válasza Petroimro hozzászólására (») Júl 25, 2011 /
 
A hex fájlt add meg teljes útvonallal esetleg. Vagy abban az alkönyvtárban add ki a parancsot ahol a hex van.
(#) Petroimro válasza covek hozzászólására (») Júl 25, 2011 /
 
Köszönöm a segítséget. Sikerült .
Már csak az nem világos, hogy mire valók a FUSE bitek, de annak majd utánanézek.
(#) zombee válasza zsezse444 hozzászólására (») Júl 25, 2011 /
 
Ha sehogy sem megy(dw-nél sem) akkor marad a csipcsere, bár én sem értem hogy miért nem írja át a FUSE biteket. Egy új atmega168 kb. 7-800Ft, jóval olcsóbb mint egy új panel. És akkor nem volt hiábavaló a kiforrasztás...
(#) covek válasza Petroimro hozzászólására (») Júl 25, 2011 /
 
(#) Robi98 hozzászólása Júl 25, 2011 /
 
Sziasztok!
Elmagyarázná valaki szájbarágósan ezt a programrészt,mert nekem sajnos nem elég világos
  1. void m_delay_10ms(unsigned char val) {
  2. //-------------------------------------
  3. //a _delay_ms max 65.535 ms-et képes sleepelni,
  4. // tehát nagyobb időzítést többől lehet "összerakni"
  5.            unsigned char i;
  6.            for(i=0;i<val;i++) {
  7.                _delay_ms(10);
  8.            }


Előre köszönöm a válaszokat!
(#) covek válasza Robi98 hozzászólására (») Júl 25, 2011 /
 
A m_delay_10ms(10) például azt teszi szerintem, hogy 10*10ms -ot késleltet.

az i cuklusváltozó kezdeti értéke nulla. a ciklus addig fut ameddig az i értéke még kissebb mint a val értéke. Ha a val értéke 10 akkor 0-tól 9-ig növeljük egyesével az i értékét. Tehát kijön a 100ms késleltetés. Ne feledd, hogy a számlálás 0-ról indult.
Remélem segítettem.
(#) Robi98 válasza covek hozzászólására (») Júl 25, 2011 /
 
Köszönöm. Az unsigned char val mit jelent?
(#) covek válasza Robi98 hozzászólására (») Júl 25, 2011 /
 
unsigned - előjel nélküli
char - karakter típus
val - a változó neve
(#) Robi98 válasza Robi98 hozzászólására (») Júl 25, 2011 /
 
Jahh, és még annyit mondok,hogy sajna nem tudom,hogy mi az a i és a j és nem ismerem a változókat.Sajnos nem találtam olyan cikket amiben ez el lett volna írva.



Köszönöm.
(#) zombee válasza Robi98 hozzászólására (») Júl 26, 2011 /
 
Az "i" jelen esetben a ciklusváltozó ami csak ennél a függvénynél lesz használható, mivel helyileg definiáljuk.

Azaz, a paraméterül kapott "val"-szor 10ms-ot késleltet, és a val értéke 0-255 lehet.
Az egész függvény értelme az, hogy az "_delay_ms()" függvény egy valós számokkal operáló makró, ami csak akkor működik helyesen ha konstans értéket kap, mert ilyenkor a fordító számolja ki a lebegőontos értékeket(az F_CPU-ból) és ebből egy diszkrét kódsorozatot generál. Abban a pillanatban amikor az _delay_ms() egy változót kap értékül, a lebegőpontos számokkal való operálás futás-időben fog végbemenni.
Ez egyrészt elrontja az időzítést, másrészt 3-4KB-al megnöveli a kódméretet. Általában ez utóbbi a látványosabb, és a szegény júzer meg vakargatja a fejét hogy most mi van...
(#) trudnai válasza Robi98 hozzászólására (») Júl 26, 2011 /
 
A valtozokat es a fuggveny neveket a programozo adja meg, ezek nincsenek elore definialva igy leirasuk sincs. Neked kell kideritened a prgrambol mire is hasznaljak a valtozokat -- ha mar a programozo nem olyan neveket adott amik beszedesek. Nem olyan hosszu az a program reszlet, probaldd meg megerteni mit is csinalhat -- pl a 'for' kulcsszonak utana tudsz nezni es abbol mar sokminden kiderulhet...
(#) Fizikus válasza Robi98 hozzászólására (») Júl 26, 2011 /
 
Az alabbi hozzaszolashoz es az utana kovetkezo 2-3-hoz is, csatolva van nehany magyar nyelvu C-programozas jegyzet. Ha ezeket atolvasgatod, az biztosan segit...
Bővebben: Link
(#) painkillerperoxi hozzászólása Júl 26, 2011 /
 
Üdv mindenkinek!

http://dybkowski.net/content/en/node/15
A fenti linken található programozót építettem meg, hogy egy AT89S8253-as avr-t programozzak, de sajna nem ismeri fel a program a mikrovezérlőmet, mi lehet a gond? (winxp alatt, kábelek: 20cm lpt kábel, +20cm szalagkábel.) Minden segítséget szívesen veszek, méginkább ha valaki már sikerrel programozott ijet, akkor egy árban megegyezve kérném a segítségét.
Előre is köszönöm!
(#) Robi98 válasza covek hozzászólására (») Júl 26, 2011 /
 
Sajnos nem tudom mi a kapcsolat az i ciklusváltozó és a val változó között.A val változó az egy szorzó lenne amit delay _ms () után írunk és megszorozza az időzítés értékét?

Köszönöm a lehetséges válaszokat.
(#) BazsiBacsi válasza Robi98 hozzászólására (») Júl 26, 2011 / 1
 
Üdv!

Egy kicsit sántít nekem ez a függvény. Én úgy tanultam az ANSI C-t, hogy a ciklusok iteráció kezeléséhez int (egész) típusú változókat használunk, és mindig adunk a változóknak kezdeti értéket (még ha 0 is). Lehet, hogy működik így, sose próbáltam ki. Nálam ez valahogy így nézne ki:

  1. void m_delay_10ms(int val) {
  2.            int i=0;
  3.            for (i=0;i<val;i++) {
  4.                       _delay_ms(10);
  5.            }
  6. }


Tudom, bele lehet kötni, hogy miért adok az i-nek a kezdetben nulla értéket, ha alapból nulla, pláne, ha utána a ciklusban megint nulla értéket kap, de nálunk ez bukás, vagy kettes kérdése volt.

A magyarázat sorról sorra:
1., létrehozol egy m_delay_10ms() nevű függvényt, aminek paraméterként megadsz egy számot (zárójel közé beírod), melyet eltárol a val változóba.
2., definiálsz egy i nevű, egész típusú változót, amit a for ciklusban fogsz használni, és adsz neki 0 értéket.
3., meghatározol egy ciklust, ami 0-tól indul (i=0), i értéke egyesével növekszik (i++), és addig hajtja végre a kapcsos zárójelben lévő utasításokat, még a feltétel (i
Ha például a main() függvényben meghívod a következő sort:

  1. m_delay_10ms(5);


akkor at olyasmi módon kell elképzelni, mintha az alábbi sorokat írtad volna be:
  1. _delay_ms(10);
  2. _delay_ms(10);
  3. _delay_ms(10);
  4. _delay_ms(10);
  5. _delay_ms(10);


Üdv:
BazsiBácsi
(#) Robi98 válasza BazsiBacsi hozzászólására (») Júl 26, 2011 /
 
Köszönöm szépen a gyors választ.Érthető volt. :worship:
(#) trudnai válasza BazsiBacsi hozzászólására (») Júl 26, 2011 / 1
 
Nem, nem kell int tipusnak lenni, hanem egesz tipusnak, az pedig lehet int, unsigned int, short, unsigned short, char, unsigned char, long, unsigned long stb...

Es nem, a valtozo definicional nem kell nullaznod az i-t, hiszen az inicializalas megtortenik a for ciklus inicializalo reszeben -- az arra valo!

Amugy ha mar itt tartunk:

  1. void m_delay_10ms(unsigned char val) {
  2.            while ( val-- ) {
  3.                       _delay_ms(10);
  4.            }
  5. }


Nem kell bonyolitani a dolgokat es felesleges valtozokat letrehozni Es amit meg meg lehet probalni ennek egy valtozata:

  1. void m_delay_10ms(unsigned char val) {
  2.            do {
  3.                       _delay_ms(10);
  4.            } while ( --val );
  5. }


Ez utobbi azert, mert nehany fordito ill mikrokontroller eseteben a kod igy rovidebb lesz -- ez pedig a fordito optimalizalo kepessegeibol ill. architekturalis adottsagokbol ered.
(#) Robi98 válasza trudnai hozzászólására (») Júl 26, 2011 1 /
 
Azt szeretném kérdezni,hogy mi a különbség a nyolc fajta változó között?
Idézet:
„az pedig lehet int, unsigned int, short, unsigned short, char, unsigned char, long, unsigned long stb...”
(#) trudnai válasza Robi98 hozzászólására (») Júl 26, 2011 /
 
Ezek nem valtozok, hanem tipusok, es a hosszukban ill elojelek kezeleseben ternek el. De miert nem olvasod el a javasolt magyar nyelvu C jegyzetet? Abban ezek le vannak irva... es sokminden mas is.
(#) sikolymester válasza Robi98 hozzászólására (») Júl 27, 2011 /
 
Nagyon kezd flame-elodni a topik. Amik nem kifejezetten AVR re vonatkozo kerdesek, hanem inkabb a C programnyelvre vonatkoznak annak szerintem itt nincsen helye. Az olyan kerdes, hogy : az unsigned int az mi, abszolut nem helyenvalo itt. Ha azt kerdezed, hogy az unsigned int egy atmega8ason hany bitet jelent, az relevans kerdes.
Szoval kernem azokat akik nem ertenek a C nyelvhez, azok faradjanak a konyvtarba, vagy a vegtelen szamu internetes C oldal egyikere, es ne ebben a forum topikban kerdezzenek hulyesegeket.
(#) zolee1209 válasza sikolymester hozzászólására (») Júl 27, 2011 /
 
Lehet átváltok PIC-re... Annak a topikját igyekszenek "topiknak" megtartani, emez rendszerint "eltotyikosodik"... :gumicsirke:
(#) Proci_85 válasza zolee1209 hozzászólására (») Júl 27, 2011 /
 
Felesleges a drámaiság, mert igaza van. Ha teret adunk az ilyen kérdéseknek, akkor hetente újra és újra olvashatnánk, mert ez a réteg ahogy a könyvet, netet nem olvassa, úgy a topikot sem visszafele.
Kár lenne a topik szakmaiságát ledegradálni.
(#) trudnai válasza Proci_85 hozzászólására (») Júl 27, 2011 /
 
Mondjuk ott a piros huvejk ujj lefele gomb, arra rakattinthattatok volna es akkor remelhetoleg a moderator korrigal es fejre koppint
(#) zolee1209 válasza Proci_85 hozzászólására (») Júl 27, 2011 /
 
Drámaiság ide, vagy oda, szerintem ugyanazt vázoltam, mint sikolymester, annyival kiegészítve, hogy a PIC-es témában figyelnek arra, hogy a téma minél inkább arról szóljon, amiről szólnia kell.

PL1.: Igaz, ezt csak most ujjaltam le, de pár sorral lentebb szóltam, mi a fáma...
A második példát 15 oldalra visszamenőleg nem találom, vagy azért, mert visszább van, vagy azért, mert ki lett törölve a negatív értékelés... Ott használtam a piros gombicot, nem is egy hozzászólásnál.
(#) Proci_85 válasza zolee1209 hozzászólására (») Júl 27, 2011 /
 
Elnézésedet kérem. Úgy tűnt, hogy sikolymester ellen beszélsz (neki válaszolsz). Ezek szerint mellette voksolsz, nem szóltam
(#) zolee1209 válasza Proci_85 hozzászólására (») Júl 27, 2011 /
 
Semmi gond, ezek szerint félreérthető volt a mondanivalóm. Inkább én kérnék elnézést! Legközelebb kerülöm a "drámaiságot", csak zavar, hogy másik topikban igyekszenek megtartani a rendet, itt meg gyakran elmászunk. De az is lehet, hogy csak azért tűnik amaz jobban kézben tartottnak, mert nem olvasgatom olyan sűrűn. De majd trudnai leírja, Ő hogyan látja, ha hozzá akar még szólni ehhez... Na meg már elég későn is írtam. Részemről OFF befejezve.
(#) Fish hozzászólása Júl 27, 2011 /
 
Sziasztok! A Fizikus cikkét olvastam, ahol bemutatta az SPI-t az Atmega8-on. Ott egy 74HC595 shift regiszterrel (remélem jól írtam) bemutatta hogy hogyan lehet 8 ledet vezérelni. Kérdésem: lehet-e a 74hc595-el vezérelni LCD-t SPI-n keresztül? Mondjuk HD44780 at? Én úgy okoskodom hogy lehet, és jó lenne, mert ez egy rettentő Port-takarékos megoldás lenne. Köszönöm a hozzászólást.

U.I: És remélem, sikerül egyúttal megszakítanom ezt a maratoni Off-ot
(#) zolee1209 válasza Fish hozzászólására (») Júl 27, 2011 /
 
Igen, lehet. A cikkek között van is rá kapcsolás...

Bővebben: Link Bár ez nem pont az, amire Te gondoltál.
Bővebben: Link Ez meg másik IC-vel van...

De kiindulásnak jó lehet.
Következő: »»   344 / 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