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   239 / 840
(#) krkic hozzászólása Jún 21, 2010 /
 
A (val) az egy konstans? Vagy egy általunk létrehozott változó?
(#) edison14 válasza krkic hozzászólására (») Jún 21, 2010 /
 
Azt te adod meg hogy mennyi legyen.
(#) krkic hozzászólása Jún 21, 2010 /
 
Szóval akkor itt a val=10

#
void m_delay_10ms(unsigned char val) {

unsigned char i;
#
for(i=0;i < val;i++) {
#
_delay_ms(10); --> ebből gondolom.
(#) edison14 válasza krkic hozzászólására (») Jún 21, 2010 /
 
Nem szerintem ez nem valami jó.

a val helyére csak egy számot kell beírnod. Ha a késleltetésbe a zárójelbe beírod az i-t akkor fokozatosan fog növekedni a ciklus lefolyásának az időtartama.
_delay_ms (i);
És itt az i egyenlő lesz egyel azután kettővel azután 3-al és így tovább egészen addig amíg a beírt számnál kisebb lesz az i.
(#) edison14 hozzászólása Jún 21, 2010 /
 
Helló!

Egy olyan kérdésem volna hogy milyen paranccsal lehet megszakítani a ciklus futását és visszatérni a main-be?
Úgy rémlik hogy valami BREAK paranccsal tudom megszakítani a program futását. Hogyan kellene ezt használni?
(#) vagnerjazon válasza edison14 hozzászólására (») Jún 21, 2010 /
 
Szerintem ő arra gondol, hogy a _delay_ms(10) sorban levő 10 jelenti a val-t. Bocs ha nem így van, én így értelmeztem a kérdését. Mert ha így van, akkor annak a 10-nek a val-hoz semmi köze, a val az amit meg kell adni.
(#) (Felhasználó 4577) válasza edison14 hozzászólására (») Jún 21, 2010 /
 
  1. break;
(#) krkic válasza vagnerjazon hozzászólására (») Jún 21, 2010 /
 
Igen én arra a 10 re gondoltam de akkor a val értékét hol adom meg Topi villogo programját tanulmányozom.
(#) edison14 válasza vagnerjazon hozzászólására (») Jún 21, 2010 /
 
Igen szerintem is így van csak azért is mert a val értékét még a ciklus előtt kellene megadni. Csak ő nem értette azt a val-t ezért elmagyaráztam. remélem érthetően
(#) vagnerjazon válasza krkic hozzászólására (») Jún 21, 2010 /
 
A létrehozott függvényben, így:
  1. m_delay_10ms(2);
És ebben a konkrét esetben 2*10ms=20ms lesz a várakozási idő. És a 2 a val itt.
(#) krkic hozzászólása Jún 21, 2010 /
 
Már értem. De itt hol van megadva a val értéke?


#
void m_delay_10ms(unsigned char val) {
#
//-------------------------------------
#
//a _delay_ms max 65.535 ms-et képes sleepelni,
#
// tehát nagyobb időzítést többből lehet "összerakni"
#
unsigned char i;
#
for(i=0;i < val;i++) {
#
_delay_ms(10);
#
}>
(#) edison14 válasza krkic hozzászólására (») Jún 21, 2010 /
 
A főprogramban van megadva:

25. m_delay_10ms(100); //100*10ms = 1s

itt a zárójelben levő 100-as a val értéke.
(#) trudnai válasza krkic hozzászólására (») Jún 21, 2010 /
 
Javasolnam, hogy olvass el egy C konyvet -- ugy hamarabb megtanulod es jobban es erthetobben leirt magyarazatokat kapsz, mint itt...
(#) sgt hozzászólása Jún 21, 2010 /
 
Sziasztok!

Lenne egy butuska kérdésem. Atmega16A pinjeit nem tudom normálisan bemenetként használni . Két módszerrel is próbálkoztam. Egyik:

DDRC=0x00;
DDRB=0xff;
....
for(; PORTB=PINC;

És jó magam teszek felhúzó ellenállást. Másik:

DDRB=0xff;
DDRC=0x00;
PORTC=0xff;
....
for(; PORTB=PINC;

Itt meg ugye csak szimplán le kell testelni, ha "0" szintet szeretnénk. És a problémám az, hogy mindkét esetben a PORTB-re 11000011-et tesz ki, az alsó és felső két bit rendesen kapcsol, de a többi nem. Mi lehet vajon a probléma? Segítségeteket előre is köszönöm :yes: .
(#) (Felhasználó 4577) válasza sgt hozzászólására (») Jún 21, 2010 /
 
Nem értem a problémád, de lehet, hogy csak velem van a gond.
Ne hexában add meg a biteket, hanem inkább shiftelj, mert az sokkal átláthatóbb.
Például PB1 kimenet:
  1. DDRB = (1<<PB1);


Bemenetként nem kell beállítani semmit se, mert minden port bemenet, ha nincs konfigurálva.
(#) krkic válasza trudnai hozzászólására (») Jún 21, 2010 /
 
Szívesen elolvasom ha tudsz küldeni egy linket
(#) sgt válasza (Felhasználó 4577) hozzászólására (») Jún 21, 2010 /
 
Probléma az, hogy alsó és felső két bit működik, a többi nem. Hiába kapcsolok marad "0" szinten.

Az odáig világos, hogy shifteléssel átláthatóbb, de ha egész portot teszem kimenetté, akkor időpocséklás. Egyéb esetben érthető, és használom is.
(#) trudnai válasza krkic hozzászólására (») Jún 21, 2010 /
 
(#) krkic válasza trudnai hozzászólására (») Jún 21, 2010 /
 
Köszi ez mind szép és C de nem valami magyar...
(#) vagnerjazon válasza krkic hozzászólására (») Jún 21, 2010 /
 
Olvasd el azokat amiket privátban küldtem néhány órája! Főleg az elsőt. Az jó kezdésnek, és magyar.
(#) (Felhasználó 4577) válasza krkic hozzászólására (») Jún 21, 2010 /
 
A számítástechnika alap nyelve az angol. Angol tudás nélkül szerintem nem is érdemes belekezdeni az AVR-ezésbe, mert csak szenvedés lesz a vége. Nem kell profi angolodnak lennie, de az adatlap lényegét értsd meg, mert anélkül nem tudsz semmihez se hozzákezdeni.
(#) krkic hozzászólása Jún 21, 2010 /
 
A lényeget megértem. De azért ez kicsit erős
(#) trudnai válasza krkic hozzászólására (») Jún 21, 2010 /
 
Nem tudom miert egyszerubb valaszolnod, mikor akar ra is kereshetnel Magyarul... Mindegy, nem veletlen kuldtem ugy a Googlit ahogy, ha abbol nem tanulsz, akkor nem tudok segiteni...
(#) poznamokus válasza sgt hozzászólására (») Jún 21, 2010 /
 
PC2 - PC5 a JTAG port, defaultból engedélyezve van a FUSE-ok között (asszem OCDEN a neve). Ha használni akarod IO portként, akkor ISP-n programozva a JTAG modult tiltani kell előtte.
(#) (Felhasználó 4577) válasza krkic hozzászólására (») Jún 21, 2010 /
 
Szerintem nem erős. Próbálj meg lefordítani egy adatlapot, rengeteg segítség van benne, példaprogramokkal együtt.

Ha egy pár oldalt visszalapozol találsz magyar nyelvű leírást, amit még én csatoltam, nem terjed ki mindenre, de sokminden benne van.
(#) poznamokus válasza krkic hozzászólására (») Jún 21, 2010 /
 
Nem erős. Anno adatlap alapján, pár év AVR után 2 hónap alatt 0-ról eljutottam egy LPC2366-tal oda, hogy ADC, IO, timerek, oprendszer, interruptok, stb működött. Ha megérted az adatlapot, mindent tudsz. És NEM kell ördöngős nyelvtanra számítani, alapszintű angol tudással megérthető.
(#) poznamokus válasza krkic hozzászólására (») Jún 21, 2010 /
 
Tessék guglizni, beírni, hogy C programozás, rengeteg jó anyag van (angolul nem tudó barátomnak is ilyenekből tanítok). De egyébként ajánlom Benkőné Programozzunk C nyelven című könyvét...
(#) Reggie válasza deguss hozzászólására (») Jún 21, 2010 /
 
Esetleg az lehet a problema, hogy a megszakitasok globalisan tiltva vannak, ami az uart_putc fuggveny futasanak ideje alatt feloldodik, es igy le tud futni a timer megszakitas. Viszont ha nincs uart_putc fuggveny, akkor nem fut le a timer imegszakitasod, es igy nem frissul a valtozod. probald meg hogy a while ele irsz egy sei(); -t.
(#) Reggie válasza sgt hozzászólására (») Jún 21, 2010 /
 
Kulso felhuzo ellenallast hasznalsz? Csupan ennyit programozol be, vagy van egyebb kod is?
(#) Bigya hozzászólása Jún 22, 2010 /
 
Feldobom még egyszer, hátha halk voltam...

Sziasztok!

Kis segítségre lenne szükségem.
Atmel egyik digit portján szeretnék megvalósítani egy bistabil nyomógombot, ami felváltva adna 1/0 értéket.

Csak az arretálásra írjatok programkódot plz!
Bascom alatt csinálom.

Köszi!
Következő: »»   239 / 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