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   609 / 839
(#) yohnsee hozzászólása Jún 21, 2014 /
 
Üdv!

Szeretném egy Attiny24 vezérlő 6 különböző lábát egymás után egy for ciklussal magas illetve alacsony szintre váltani. A gond az, hogy a lábak nem 1 porton belül és nem is sorban vannak. Én úgy gondoltam, hogy ha egy tömbbe berakom a portokat és a hozzájuk tartozó lábakat párban, akkor szépen végig tudok rajtuk lépegetni. De ez így nem működik, mint utólag kiderült. Milyen megoldás volna erre?
(#) kapu48 válasza yohnsee hozzászólására (») Jún 22, 2014 /
 
Az elképzelésed jó.
A kivitelezésben lehet a hiba.
Lássuk a programod.
Biztosan lessz rá megoldás.
(#) Zsolt2 válasza yohnsee hozzászólására (») Jún 22, 2014 /
 
Egy állapotautomatával tudnám még elképzelni a megoldást. A for ciklusban egy nagy switch....case utasítás és akkor minden lépésben meg tudod adni, hogy melyik kimentet kapcsolja be vagy ki.
(#) killbill válasza yohnsee hozzászólására (») Jún 22, 2014 /
 
Tokeletes a tombos megoldas, a kerdes csak az, hogy egesz pontosan mit teszel a tombbe. A port regiszternek van cime, azokat lehet tombbe tenni. Es azt is lehet tombbe tenni, hogy az adott porton melyik labat (bitet) kell kapcsolni.
  1. static const struct {
  2.  volatile unsigned char *port;
  3.  unsigned char lab;
  4. } tomb[] = {
  5.  {&PORTA, (1 << 0)},
  6.  {&PORTB, (1 << 3)},
  7.  {&PORTA, (1 << 2)}
  8. };
  9.  
  10. main()
  11. {
  12. int x;
  13.  
  14.    for(x = 0; x < 3; ++x)
  15.       *tomb[x].port |= tomb[x].lab;
  16.  
  17.  ....
  18. }
A hozzászólás módosítva: Jún 22, 2014
(#) Szammer hozzászólása Jún 22, 2014 /
 
Sziasztok!
Sikerült kizárnom magam egy ATMEGA8-ból. Rosszul írtam be a fusebiteket (D9 E1).
Mivel nincs itthon másik Atmega8 és nagyon kellett volna, gyorsan építettem egy Fusebit Doctort (328 legújabb fimware van rajta) és az sem hozza helyre. Ilyenkor mi van? Kuka?
Ja és a "Doctor" tökéletes (másik procival (328) próbálva).
Üdv:
Zsolt
(#) Massawa hozzászólása Jún 22, 2014 /
 
Egy kis interpretácios problémám van.

Nem tudom pontosan értelmezni, hogy mit is kéne csinálnia ennek a funkcionak.

or pl,ph
brne xpulse


A sugo is 2 változatrol beszél összehasonlitja bitenként a két registert. A bajom az, hogy a brne sort csak akkor hagyja ki, ha mind a két regiszter 0 ( pl és a ph).
Minden más alkalommal a brne-re ugrik (xpulse).

Megvilágositana valaki?

Kösz!
A hozzászólás módosítva: Jún 22, 2014
(#) rolandgw válasza Massawa hozzászólására (») Jún 22, 2014 /
 
A brne/breq-t a Z (zero flag) vezérli, ami 1-be áll,ha a művelet eredménye 0,ez esetben ha mindkét érték 0. A brne Z=0-nál ,a breq Z=1-nél ugrik,tehát jól működik Ha nullára akarsz ugrást akkor a breq-t kell használni.
(#) holex hozzászólása Jún 22, 2014 /
 
Elvileg az AVR-ek valahol eltárolják, hogy mi volt a reset oka (áramkimaradás, watchdog, stb). Hogy lehet ehhez az információhoz hozzájutni? Adatlapban nem találtam semmit, de lehet csak figyelmetlen voltam.
(#) rolandgw válasza holex hozzászólására (») Jún 22, 2014 /
 
MCU status regiszter.
(#) holex válasza rolandgw hozzászólására (») Jún 22, 2014 /
 
Köszi!
(#) Massawa válasza rolandgw hozzászólására (») Jún 22, 2014 /
 
Kösz, akkor jo a progi, csak már a sok egyébb aproság miatt itt akadtam meg.
(#) TavIR-AVR válasza holex hozzászólására (») Jún 22, 2014 /
 
MCUSR és környéke:
- bitenként:
jtag reset
external reset
bod
power on
stb...
(#) killbill válasza Massawa hozzászólására (») Jún 22, 2014 /
 
Az "or" az logikai vagy muvelet, ami nem osszehasonlitas. Bitenkenti OR eredmenye akkor nulla, ha mindket ertek nulla.
(#) Massawa válasza killbill hozzászólására (») Jún 22, 2014 /
 
Kösz!
A kiértékelésbe zavarodtam bele, nem a fogalomba.....(mikor 0 az eredménye ).
Közben már megtaláltam a hibát miért nem azt csinálta amit akartam.....
A hozzászólás módosítva: Jún 22, 2014
(#) Simon Balázs hozzászólása Jún 22, 2014 /
 
Sziasztok! Nem igazán fórumtéma, de valaki fel tud programozni nekem egy mega8-ast? Egy nixi csöves órát építek, de a win7 nem kezeli az avr doperemet (hestore-s). Napközben budapest belvárosában tartózkodom Károlyi kertnél.
(#) yohnsee válasza killbill hozzászólására (») Jún 22, 2014 /
 
Először is köszönöm neked, kapu48-nak és Zsolt2-nek a hozzászólásokat.

Nos, valószínűleg több helyen is hibáztam, beszúrom ide az ideillő részletet a programomból, mint látható, én először #define-al szépen sorba raktam a lábakat, neveket adtam nekik, majd ezeket az elnevezéseket tettem egy tömbbe, amit szerettem volna bejárni.

  1. #include <avr/io.h>
  2. #define F_CPU 1000000UL
  3. #include <util/delay.h>
  4. #include <avr/interrupt.h>
  5. #define RD  PA1
  6. #define PRD PORTA
  7. #define R1  PA0
  8. #define PR1 PORTA
  9. #define R2  PB0
  10. #define PR2 PORTB
  11. #define R3  PB1
  12. #define PR3 PORTB
  13. #define R4  PA6
  14. #define PR4 PORTA
  15. #define R5  PA7
  16. #define PR5 PORTA
  17. #define R6  PB2
  18. #define PR6 PORTB
  19. volatile char arrayp[6]={PR1,PR2,PR3,PR4,PR5,PR6};
  20. volatile char arrayr[6]={R1,R2,R3,R4,R5,R6};

Majd futás közben így hívtam meg:
  1. arrayp[i] |= 1<<arrayr[i];

Már látom, hogy ez teljesen rossz, mert így a fordító szó szerint a PR1...PR6 és az R1..R6 argumentumokat adja át, és nem a kódot, amire mutatnak.
A hozzászólás módosítva: Jún 22, 2014
(#) kapu48 hozzászólása Jún 23, 2014 /
 
Inkább: OUT P,Rr
Ldi R16,arrayr[i]
out arrayp[i],r16
A hozzászólás módosítva: Jún 23, 2014
(#) killbill válasza yohnsee hozzászólására (») Jún 23, 2014 / 1
 
Ezzel az a baj, hogy az arrayp[i] |= az a tombot magat irja at, nem a portot. Nem tudom, hogy mennyire ertesz hozza, szoval kerlek, ne sertodj meg, ha az alapokrol kezdek magyarazni. Elsore tisztaban kell lenned azzal, hogy a PORTA |= 1 << PA0; az pontosan mit is csinal. A legfontosabb dolog, hogy ertsd a memoria fogalmat, a valtozok tarolasat es a memorai cimeket.
A PORTA az egy kozonseges 'volatile unsigned char' valtozo, aminek a memoria cime fix. Megpedig annyi, amelyik cimen az AVR-edben a PORTA regiszter van.
Amikor egy valtozonak erteket adsz (pl. PORTA = 3), akkor a programod a memoraiba leteszi az erteket. Hogy a memoriaban hova teszi, azt a valtozo neve adja meg. A nevhez tartozo memoriacimet a C fordito vagy a linker tudja, attol fuggoen, hogy a valtozot hogyan deklaraltak.
A te problemadra az egyik lehetseges megoldas, hogy a tombbe a megvaltoztatni kivant valtozok cimet tarolod el. Ez a topic nem pont a C programozas alapjai, es amugy is kicsit hosszabb lenne a teljes magyarazat, de par sorban megprobalom a lenyeget leirni:
  1. char a;   egy char tipusu valtozo valahol a memoriaban
  2. char b;   egy masik char tipusu valtozo
  3. a = 3;    az 'a' valtozonak erteked ad, azaz a memoria a memgfelelo cimere leteszi, hogy harom
  4. char *p; 'p' egy olyan valtozo, ami egy char tipusu valtozo memoriacimet kepes tarolni
  5. p = &a;  'p' valtozoba betolti az 'a' valtozo memoriacimet
  6. *p = 4;   a 'p' valtozoban levo  memoracimre letesz 4-et (jelen esetben megvaltoztatja 'a' valtozot)
  7. b = *p;  'b' valtozoba betolti a 'p' valtozoban levo memoriacimen levo adatot ('a' erteket)

Ezert aztan neked az arrayp[] tombbe a PORTA es PORTB valtozok cimet kell tarolnod, hogy utana hivatkozni tudj ja:

const volatile char * arrayp[] = {&PORTA, &PORTB};

Hivatkozni meg a '*' operatorral tudsz rajuk, azaz:

*arrayp[i] |= xx;

A const es volatile egy masik kerdes, abba most ne meruljunk bele. A te peldadban az arrayr nem kell volatile legyen. Csak feleslegesen noveli a kodot.
(#) yohnsee válasza killbill hozzászólására (») Jún 23, 2014 / 1
 
Köszönöm, nagyon sokat segített a részletes magyarázatod.
Sajnos azt kell mondjam, hogy nekünk tanították a c++ programozást, de akkor sajnos csak púpnak éreztem a hátamon. Most, hogy szükségem lenne rá, nehezebb felvenni a ritmust. Keresni fogok hozzá tananyagot a neten, hogy jobban megértsem, mert úgy érzem, ha csak lemásolom a kész megoldásokat, azzal nem leszek előrébb. Meg is kell értsem.
(#) rolandgw válasza yohnsee hozzászólására (») Jún 23, 2014 /
 
Elegánsak a közzétett C kódok,de tartok tőle,hogy a fordító nem értékeli és lesz körítés rendesen,amíg a megoldásig,a 6db SBI utasításig eljut assembly-ben
(#) zolek hozzászólása Jún 23, 2014 /
 
Sziasztok! Egy éve építettem meg Topi dallam csengőjét, jól működik . Gondoltam hogy a dallamokat lecserélem. Avr studioval próbálkoztam de ezt a hiba üzenetet dobta ki, mit nem csináltam jól?


Build started 23.6.2014 at 21:17:14
avr-gcc.exe -mmcu=attiny45 -Wall -gdwarf-2 -DF_CPU=8000000UL -O0 -fsigned-char -MD -MP -MT csengo.o -MF dep/csengo.o.d -c ../csengo.c
In file included from ../csengo.c:16:
../global.h:7:1: warning: "F_CPU" redefined
<command-line>: warning: this is the location of the previous definition
In file included from ../csengo.c:19:
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:90:3: warning: #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"
../csengo.c: In function 'm_delay_ms':
../csengo.c:35: error: 'for' loop initial declaration used outside C99 mode
make: *** [csengo.o] Error 1
Build failed with 1 errors and 3 warnings...
(#) csabeszq válasza zolek hozzászólására (») Jún 24, 2014 /
 
Van a szabványos C és a nem szabványos C. Amit te csináltál az nem szabványos, ezért nem fordul.

Nem szabványos (C++ féle):
  1. for(int i=0; i < 10; i++)
  2. {
  3. }


Szabványos:
  1. int i; // a metódus elejére, utasítások közé nem rakhatod
  2. for(i=0; i < 10; i++)
  3. {
  4. }
(#) killbill válasza csabeszq hozzászólására (») Jún 24, 2014 /
 
A C99 szabvany, ami kb. 15 éves megengedi a for-on beluli deklaraciot. A hibauzenet eppen azt mondja, hogy a for-ban deklaracio van, de nem C99 modban van a fordito. Talan
a -std=gnu99 opcio eppen erre valo. Azon felul egy -Os maris ket warning-ot megszuntetne. Meg le kellene venni a -DF_CPU... opciot is, es akkor az utolso warning is eltunne.
Szerintem a gond az, hogy a regi projektet nem ugyanazokkal a beallitasokkal probalja leforditani zolek forumtars.
(#) Massawa hozzászólása Jún 24, 2014 /
 
Egy ujabb kérdésem lenne.
Egy kimenetre jo volna egyszerü modon szimmetrikus impulzusokat kiadni. Az IRQ lépteti a kodot, és ha feltételek teljesülnek akkor állitodik a kimenet bitje (set). Jo volna ugyanebben rutinban vissza is állitani a portot. De ha egyszerüen cbi-t használok akkor nagyon rövid az impulzus. Idözités nem használhato mert a frekvencia változik. Gondoltam a komplemensre csak nem tudom pontosan hogyan is kellene ezt használni.

Kösz a segitséget. ( ha lehet ASM-ben)
(#) rolandgw válasza Massawa hozzászólására (») Jún 25, 2014 /
 
Esetleg,ha kódot mellékelnél.1-es komplemensre gondolsz?Mert az az egész byte-ot negálja,nem jó irány.
(#) zolek válasza killbill hozzászólására (») Jún 25, 2014 /
 
Köszönöm a segítséget mind a kettőtöknek. Sikerült .
(#) Massawa válasza rolandgw hozzászólására (») Jún 25, 2014 /
 
Valahogyan igy néz ki (a többi része már ugy ahogy megy). Szoval ha teljesülnek a feltétételek az IRQ többek között ezt hivja le:
Lehivhatom persze a következö IRQ-vel, de akkor változnak a feltételek.

  1. xmotorrun:     
  2.         setddr  xen    
  3.         setport xen                             ; enable x motor  (low is active)
  4. ;       ret
  5. xpulseon:      
  6.         setddr  xstep                  
  7.         setport xstep                   ; changes the STH port output to High(pulse) low in A4998
  8.         comin2t xstep_in,xstep_bit
  9.         t2out   xstep_port,xstep_bit
  10.         ret
  11.        
  12. xpulseoff:     
  13.         setddr  xstep
  14.         clrport xstep                   ; changes the STH port output to Low (pulse) High on A4988
  15.         ret
(#) Kovidivi válasza kiborg hozzászólására (») Jún 25, 2014 /
 
Jó megoldás lehet, ha soros diódával le van választva az AVR tápja, a dióda után pedig kap egy nagyobb, 470µF-100µF kondit (fogyasztástól függően). Ilyenkor ha leesik a táp, az AVR tápjával nem történik semmi, mert a kondiból nem tud a dióda miatt áram visszafelé folyni.
(#) rolandgw válasza Massawa hozzászólására (») Jún 25, 2014 /
 
Bocs,de ha megadsz egy halom macro hívást,gondolod,hogy bárki is hozzá tud szólni azok ismerete nélkül ?
(#) gabi20 hozzászólása Jún 25, 2014 /
 
Sziasztok ezt az AVR Dopert lehet használni Windows 8 alatt is? Sajnos WIN8 - hoz nem találtam drivert .
A hozzászólás módosítva: Jún 25, 2014
Következő: »»   609 / 839
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