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   34 / 837
(#) huba válasza potyo hozzászólására (») Szept 6, 2007 /
 
Benezni betudok, kiveszem azt a nevet ahogy szerintem a függvényt hívják, de nem vergödök zöldágra Valami nem tetszik neki. Beirom a kódot létszi javitsatok ki
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #define F_CPU 4000000UL  // 1 MHz
  4.   //#define F_CPU 14.7456E6
  5.  
  6. int main(void)
  7. {
  8.  PORTB=0x00;
  9. delay_ms(100);
  10. //PORTB = 0x70;
  11.  
  12. }



Valamiért egysorba jelenik meg
(#) potyo válasza huba hozzászólására (») Szept 6, 2007 /
 
felül a két #include mi akar lenni? Mert a delay.h-t így nem includoltad be!

Hogy rendesen jelenjen meg, a kapcsoszárójelben a "code" helyett írd, hogy "code=c"
(#) huba válasza potyo hozzászólására (») Szept 6, 2007 /
 
kicsit böngészve az avrfreaks-et meglett a baj. Csúnya álat ez a c. Csak meg kell szelidíteni

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #define F_CPU 4000000UL  // 1 MHz
  4.     //#define F_CPU 14.7456E6
  5.  
  6.  
  7. int main(void)
  8. {
  9.  
  10.         while(1)
  11.         {
  12.                 PORTB=0x00;
  13.                 _delay_ms(100);
  14.                 PORTB = 0x70;
  15.                 _delay_ms(100);
  16. }
  17. }

végül is így lett jó
(#) Thowra hozzászólása Szept 6, 2007 /
 
Üdv mindekinek!
Találtam ezen az oldalon egy avr el felépített csengőt ami képes bármilyen, pc ről felmásolt hangot lejátszani amikor csöngetnek.
Mivel még soha nem foglalkoztam avr el így első kérdésem az, hogy hogy kell belejuttatni a programot, milyen égetővel, és progival?
A rajzon lévő memóriát nem tudom beszerezni, így második kérdés, hogy csak az a fajta jó hozzá, vagy ha az nincs akkor mivel helyettesíthető?
Előre is köszönöm!
(#) MaSTeRFoXX válasza Thowra hozzászólására (») Szept 6, 2007 /
 
Szia

Memóriát a www.ret.hu címen elérhető boltból tudsz szerezni. Szegedi a központjuk, de van pesti boltjuk is.
Az AVR-be a programot STK-200-as programozóval lehet belevinni. PL ezen oldal alján találod meg a programozó kapcsolását.
Ezen kívül kell még azon oldalról a BAscom amivel a fusebiteket állítgatod az AVR-ben, hogy kvarcról menjen.
Illetve ezzel elvileg a hexet is be tudod égetni. Vagy fel kell tenned a winavr-t, abban tudsz kódot fordítani, illetve felprogramozni. De a Ponyprog nevű progi is jó hex beégetésére, sőt ez a legegyszerűbb erre a célra, de ne nyúlj a fusebitekhez ezzel a programmal mert könnyen véglegesen kizárhatod magad... A fusebitekhetz a bascom a jó
(#) ktibi007 hozzászólása Szept 11, 2007 /
 
szaisztok!

én is teljesen kezdő vagyok és szeretném folytatni Thowra kérdéseit. tegyük fel meg van az égető és a megfelelő progi, akkor hogyan tudom pontosan belejuttani a progit a cuccba??
van erről valami jó leírás a neten?

előre is ksöz!!
(#) huba hozzászólása Szept 11, 2007 /
 
A megszakitassal valahogy nem boldogulok. Valaki elmagyarázza nekem hogy hogy aktivájak és hasznájak egy külsö megszakitast at90s2313-en?

Azért nem attiny mert ezt tudom szimulálni proteuszban
(#) TEK válasza huba hozzászólására (») Szept 12, 2007 /
 
Most rohanok dolgozni, de talan egy kis peldaprogram segit. PB labaira tegyel ledeket, a PD2-es labra meg negyszogjelet.
En is meg csak most kezdek ismerkedni az AVR-rel, szal remelem nincs hiba a kodban.

.include "2313def.inc"
.cseg
.org 0x0000

rjmp reset
rjmp ext_int0 ; int0 (PD2)
rjmp ext_int1 ; int1 (PD3)


reset: ldi r16,RAMEND ; stack beallitasa
out SPL,r16 ; a ram vegere

ldi r16,0xFF
out DDRB,r16 ; PORTB mint kimenet

ldi r16,0b00001010 ; mikor legyen megszakitas
out MCUCR,r16 ; (falling edge)

ldi r17,0x01

ldi r16,0b11000000
out GIMSK,r16 ; int0 es 1 engedelyezese

bset SREG_I ; megszakitasok enedelyezese


ever: rjmp ever ; nem csinalunk semmit


ext_int0: out PORTB,r17 ; knight rider
sbrc r17,0x00
ldi r18,0x00
sbrc r17,0x07
ldi r18,0x01
sbrs r18,0x00
lsl r17
sbrc r18,0x00
lsr r17
reti

ext_int1: reti ; egyelore semmi


Hat ez igy eleg hitvanyul nez ki TAB-ok nelkul.
(#) huba válasza TEK hozzászólására (») Szept 12, 2007 /
 
Hajjaj ezt ahogy elnézem assambler kód. Én a c-vel bajlódok de azért kösz
(#) Gory válasza huba hozzászólására (») Szept 12, 2007 /
 
Itt egy példa bár ez Atmega128-ra van. A SIGNAL után zárójelben levő részt azt valamelyik fájlból kell kinézni a megfelelő interrupthoz, de már nem tudom melyikből.
például exterbnal interrupt 5:

//először inicializálod
void EXT_IT5_Init(void)
{
EICRB=EICRB|0b00001100; //00110000 rising edge
EIMSK= EIMSK | (1 << INT5);
}

//ez pedig maga az interrupt kiszolgáló rutin
SIGNAL(SIG_INTERRUPT5)
{
//ide jön a kódod
}>>
(#) huba válasza Gory hozzászólására (») Szept 13, 2007 /
 
kicsit de szeretnék tisztában lenni pár dologgal. a void EXT_IT5_Init -et a main elé irom be és a main-be a végtelen ciklus elött meghívom. A megszakitast kiszolgáló rutin hova kerüjön pontosan?

Jah és az inicializálást nevezhetem másképpen mert alprogram.
(#) TEK válasza huba hozzászólására (») Szept 13, 2007 /
 
Nemfigyeltem.
De azert gondold at. Az assembly sokkal egyszerubb mint a c.
(#) Moderátor hozzászólása TEK hozzászólására (») Szept 13, 2007
 
Idézet:
„Az assembly sokkal egyszerubb mint a c.”


Ez teljesen szubjektív dolog, szóval ezt nem érdemes emlegetni sem most, sem a jövőben...tételezzük fel, hogy mindenki van olyan okos, hogy saját maga el tudja dönteni, hogy neki személy szerint mi az egyszerűbb!
(#) huba válasza huba hozzászólására (») Szept 13, 2007 /
 
ha nem irom be a progiba hogy sei(); akkor nem hivodik meg a megszakitas
(#) gtk válasza huba hozzászólására (») Szept 14, 2007 /
 
A lenyeg hogy a hivas elott barhol lehet a fuggveny definicio.Ha hivas utan van, akkor a file elejen deklaralni kell egy prototipust.
A megszakitas rutin johet barhova, asszem az makro es behelyettesitodik.
(#) Reggie válasza Gory hozzászólására (») Szept 14, 2007 /
 
mega128 eseten:

WinAVR\avr\include\avr\iom128.h

Ebben ra kell keresni a "/* Interrupt vectors */"-ra, es alatta van felsorolva.
(#) Reggie válasza Gory hozzászólására (») Szept 14, 2007 /
 
Juteszembe

"SIGNAL(vector)" helyett mar "ISR(vector)"-t illik hasznalni, a SIGNAL a jovoben nem lesz tamogatot.

valamint:
"ISR(vector) {}" helyett "EMPTY_INTERRUPT(vector)" hasznalando, mert igy rovidebb kodot eredmenyez(nem general prolog epilog kodot);
(#) Gory válasza Reggie hozzászólására (») Szept 14, 2007 /
 
Köszi, ez hasznos infó, nem is tudtam. De ha nem lesz támogatott, akkor gondolom kapok rá hibaüzenetet majd. Vagy legalább a fordító lesz olyan okos hogy egyből a legoptimálisabbat helyettesíti.

Huba: Én úgy szoktam felépíteni a programot, hogy az ilyen konkrét init dolgokat megirkálom külön függvényekben. Aztán az összeset ami kell meghívom egy valami Init_System() vagy hasonlóban, amit main() elején hívok meg a végtelen ciklus előtt. De ez szerintem szokás kérdése. A sei utasítást azt értelem szerűen szoktam valahova odatenni, mondjuk a fő inicializálás végére. A megszakítást és egyéb szubrutinokat a main() után szoktam betenni a legvégére, tehát kb mint egy assembly kód úgy van felépítve nekem C-ben is.

„Az assembly sokkal egyszerubb mint a c."
Feladatfüggő. Egy hálózati kommunikációs protokoll stackjét nem szeretném assemblyben írni
(#) Slope hozzászólása Szept 15, 2007 /
 
Hali!

Lenne egy olyan kérdésem, INT0 megszakítás esetén használhatom-e IO lábként PD2 lábat (természetesen magában a megszakításban)?

Szóval az lenne a történet, hogy INT0 (PD2) lábon lefutó élre generálok egy megszakítást, majd magában a megszakításban normál IO lábként kellene használnom a PD2-t. Kilépve a megszakításból a PD2 lábnak újra az INT0 funkciójára lenne szükségem.

Ja ez egy tiny2313.
Köszi a válaszokat!
(#) Gory válasza Slope hozzászólására (») Szept 15, 2007 /
 
Szerintem használhatod.
(#) Slope válasza Gory hozzászólására (») Szept 15, 2007 /
 
Csak azért kérdeztem mert a konfigban a D portot INT0-ként inicializálom, de megszakításban meg tiltva van minden új megszakítás, tehát elvileg nem lehetséges ugyanazon megszakítási rutin újrahívása a kellős közepén... viszont ekkor nem tudom, hogy képes-e IO lábként működni.

Na mindegy kipróbálom, és meglátjuk... ha megy akkor visszaírok (ennyivel is okosabb lesz ez a topik)

Amúgy egy elég érdekes SPI busz féle történetet alkotok...
Biztos emlékszel még az I2C Slave módú üzemeltetésével kapcsolatos kérdésemre, nos ez annak a fejleménye. Így a mega128-nak nem kell megszakítás, hanem egy szoftveres DRQ lábat használok, az érvényes adat jelzésére.
Egyébként ha érdekel, hogy hogyan lehet I2C Slave módban használni az USI-t, akkor ajánlom az AVR312-es AN-t. Le van benne írva, C-s forrással...

Ja mégvalami: Az AVR-t sehogysem lehet rávenni megszakítási priorításra?
(#) Gory válasza Slope hozzászólására (») Szept 16, 2007 /
 
Hi!

A D port INT lábát sima IO lábként inicializálod valójában, csak épp az interrupt regiszterben engedélyezed hozzá az interruptot. Nem tudom mit értessz IO láb alatt megszakítás közben. De például ha interruptot hányt az a bemeneted, akkor attól még az IT rutin közben be tudod olvasni annak a bemenetnek az értékét.
Gondolom az interrupt lábat nem akarod kimenetnek használni a megszakítás rutin közben, de szerintem még akár azt is meghteheted.
Azt nem értem hogy miért akarod újrahívni a közepén ugyanazt a rutint. Bemásolod legfeljebb azt kódot a rutin közepébe is amit újrahívnál, ha máshogy nem megy.
Kicsit zavaros nekem amit leírtál, mert ha meghívod az IT rutint önmagából, az egy jó nagy végtelen ciklus lenne, (és például assemblyben ezt meg lehet tenni egy sima rjmp vagy jmp utasítással odaugrassz a rutin kezdőcímére és kész, szóval gondolom C-ben egy jól elcseszett GOTO is képes erre )

Ha kicsit pontosabban leírod mit akarsz összehozni és hogy akkor többet tudok segíteni. Ha jól emlékszem 7 külső interrupt lába van a mega128-nak úgyhogy biztos akad még szabad. Azon a tiny tudja jelezni hogy érvényes adata van. Vagy pedig a mega128 ún polling-al lekérdezi a másik procit.

Ha jól emlékszem azt írtad hogy az SPI lábak használva vannak valamire. Ha épp SPI-ra vagy valami olyanra, hogy a két proci közti kommunikáció idejére SPI-ra is lehet őket használni, akkor szerintem egy bufferral leválasztva végső esetben az is szóbajöhet.

Az USI meg általában az összes funkció használatához én simán az adatlapot szoktam használni. Eddig mindigsikerült az alapján megírni.

Az AVR egyszintű megszakítást használ, nem lehet prioritást beállítni. Amelyik előbb jön azt szolgálja ki. Elvileg egy IT kiszolgálása alatt a többi letiltódik és csak a végén engedélyeződik újra. Ennek ellenére nekem már volt hogy IT szubrutinban törölgetni kellett megszakítást jelző flageket. De ez szerintem valami egyedi probléma volt.
(#) Slope válasza Gory hozzászólására (») Szept 16, 2007 /
 
Akkor pontosítok, mert ezekszerint kusza lett

A tiny2313 szolgáltatja az adatot. Akkor ha érvényes adat van a tiny pufferében, a DRQ lábon jelez a mega128-nak. A mega128 nem használhat erre megszakítást (pont a prioritás miatt). Ezért ha a mega PC-je épp odaér, akkor megnézi a DRQ-t, és csak akkor kérdezi le, ha az érvényes.
A lekérdezés az SCK láb első lefutó élére kezdődik, ez egyben az INT0. (Tehát a megszakítás az SCk első lefutó élre következik be.) A megszakításban a tiny figyeli a mega által szolgáltatott órajelet, melynek minden lefutó élére kitesz egy bitet a bájtból (LSB-vel kezd). Egy bájt átvitele így 9 SCK ciklus. A 8 bit átvitele után a tiny törli a puffert, és kilép a megszakításból.
Így a megának nem kell megszakítás, mert csak érvényes adat esetén olvas (a PC-t meg ráér megvárni), illetve a tiny is csak akkor lép be a megszakítás rutinba, ha az szükséges.
Vagyis az SCK első lefutó élre meghívja a megszakítást, a maradék 8 ciklusban pedig a soros adatot szinkronizálja.

Konkretizálva a dolgokat, a tiny egy 4×4-es billentyűzetet, és egy RC5 IR távrángatót kezel. Az átvinni kívánt adatok pedig az adott funkció utasításkódjai.


Lényegében a kérdésemre választ kaptam
(#) TavIR-AVR hozzászólása Szept 16, 2007 /
 
Bascom plusz AVR programozói verseny indul:
Versenykiírás

Sok sikert hozzá. NINCS regisztrációs díj, smmi hasonló. Csak a versenyszellem...
(#) TavIR-AVR válasza Slope hozzászólására (») Szept 16, 2007 /
 
Az avrekben 1szintű int van.
Trükk van, hogy amikor belépsz egy int-be, belül tudod meglesni a regiszterekben, hogy valaki okozott-e rajta kívül megszakítást...
(#) Topi hozzászólása Szept 20, 2007 /
 
Kedves AVR guruk. Már párszor foglalkoztam AVR-ekkel, csak úgy programozás szinjéig.
Most bele akarok vágni komolyan az AVR témába. PIC-et mikor kezdtem még magyarországon nem volt annyira elterjedt, mint manapság. Nem voltak olyan leírások sem, mint amik akár manapság itt az oldalon olvashatók.

Nem akarom, a programozóval szenvedés útját végigjárni, mint PIC esetében. Mivel programozni és égetni már égettem avreket, tudom milyen a JTAG interface.
Néztem pár debuggert, de nem igen tetszett a megvalósítás. Természetesen csak USB-s jöhet nálam szóba.
A következőre gondoltam, hogy építek nálam már bevált FTDI chippel egy usb-parallel átalakítót, és abból már valszeg menni fog a JTAG használat.

Egy szó mint száz, ha van valami jó USB-s JTAG debugger + programozó kapcsolási rajzotok, ne tartsátok magatokban!

Köszönöm. Topi.

Ne fújjogjatok, nem biztos hogy átszokom rájuk...
(#) Gory válasza Topi hozzászólására (») Szept 20, 2007 /
 
Én építettem már debuggert, van hozzá kapcsolási rajzom is, de csak soros porti. Esetleg mellédobsz egy FT232-t és akkor USB-s lesz.
Viszont nekem néha érdekes dolgokat művelt, nem állt meg a program futása azt hiszem valamikor. Meg nem akar már elindulni se nagyon, elég macerás a központi Atmega16 vagy 166-ot beprogramozni megfelelően.

Létezik az FT2232 nevű chip, azt hiszem azzal szoktak JTAG debuggereket építeni, mert valamit hardverből tud.

Milyen fejlesztőkörnyezethez kell egyébként? AVR studió? Mert tudomásom szerint abban csak az assembly kódot tudod debuggolni (C program esetén fordításnál keletkezik egy fájl amit AVRStudioban meg tudsz nyitni) Szóval fordít megnyit debuggol átír fordít megnyit...
De lehet hogy tévedek.
(#) Topi válasza Gory hozzászólására (») Szept 20, 2007 /
 
Jézusom... Ennyire nem megoldott lenne a debugolása az AVR-nek?
Igen, én is FT2232-t nézegettem még.
99%-ban C-ben fogok rá programozni, tehát ha nem megy úgy mint a PIC-nél, hogy teljesen nyelv független a debugolás, akkor szomorú leszek.
(#) Gory válasza Topi hozzászólására (») Szept 20, 2007 /
 
Tévedtem Mégiscak megy a C debuggolás az AVRStudioban a mellékelt tutorial szerint. Illetve ha vlamit átírsz, akkor azt nem az AVR Studióban írod át hanem a C-s fejlesztő környezetben, viszont nem kell újra megnyitni az AVRStudioban a coff fájlt, hanem magától frissít.

Bővebben: Link
(#) Topi válasza Gory hozzászólására (») Szept 20, 2007 /
 
Rémisztgetsz már itt... Szimuláció megoldva, már csak a való életben kellene debugolni
Következő: »»   34 / 837
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