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   266 / 841
(#) poznamokus válasza Tomi_Bp hozzászólására (») Szept 28, 2010 /
 
Idézet:
  1. MCUCR |= (1<<ISC01); // lefuto elre megszakitas


Ezzel csak az a baj, hogy ez INT0 falling edge-et állít be, teneked a
  1. MCUCSR |= (1 << ISC2)
kellene.

Aztán a kijelzés végén a maradékosztás felesleges, mivel addig már háromszor osztottad 10-el, ha 10000 alatt van az értéked, akkor már jó amit kaptál

Idézet:
  1. x=x/10;
  2. PORTC = ~nums[(x%10)];
  3. PORTA = 0x01;
  4. _delay_ms(10);
  5. PORTA = 0x00;


Mellesleg frekimérésre van kitalálva az input capture nevű funkciója a timer1-nek, míg a kijelzést hasznosabb lenne timer0 overflow-ba tenni, semmint delay-jel lassítani a kódot. Ráadásul 40 ms-es frissítéssel eléggé villogni fog a kijelződ.

Aztán nem ártana egy cli() a main elejére.
(#) zolee1209 válasza zolee1209 hozzászólására (») Szept 28, 2010 /
 
Próbaképp feltettem egy régebbi verziójú AVR studio-t, a 4.15-öt, de a helyzet változatlan.
(#) zolee1209 válasza zolee1209 hozzászólására (») Szept 29, 2010 /
 
Arra már megtaláltam a megoldást, hogy az "sbi" parancsra miért ír ki hibát, erre a "register summary" rész végén leltem rá. De a többi még mindig rejtély számomra. Azért kutakodom még...
(#) zolee1209 válasza zolee1209 hozzászólására (») Szept 29, 2010 /
 
Megint én voltam a balfék... Pedig bíztam benne, hogy a fordító a hibás... Az SDA/SCL lábak között volt valami oknál fogva zárlat, emiatt nem ment a kommunikáció. Most már szépen működik. Ettől függetlenül továbbra is érdekelne, hogy az AVR studio szimulátorában az I2C azon kódrészlete, amit bemásoltam fentebb, miért viselkedik másként mega8 alatt, mint mega32 alatt?!
(#) trudnai válasza zolee1209 hozzászólására (») Szept 29, 2010 /
 
Idézet:
„Oh, I have tried that one too! That's why I look like this...


Hehe, en mindig abban szoktam bizni, hogy a fordito nem hibas
(#) zolee1209 válasza trudnai hozzászólására (») Szept 29, 2010 /
 
Igen, valószínűleg jobban kellene örülnöm, hogy nem a fordító hibás, mert azt aligha tudnám orvosolni, meg nem is tudom, azt hogyan deríthetném ki, ha mégis az lenne... Csak már nem tudtam tisztán gondolkodni, mert nem értem miért szívat ennyire ez az apró program, hogy hardveres hibára nem is gyanakodtam. Mivel beforrasztás után kimértem a panelt, és akkor nem volt zárlat sehol sem! De hogy pont a busznál tréfált meg...
(#) trudnai válasza zolee1209 hozzászólására (») Szept 30, 2010 /
 
Most mar csak azt nem ertem hogy kerult bele az az idezet az elozo hozzaszolasomba?! Es meg csak eszre sem vettem... lehet tul sokat ittam es meg csak nem is emlekszem ra?

Na mindegy. Szimulacio sokszor azert jo, mert abban kiesik a forrasztasi vagy egyeb szerelesi hiba lehetoseg, sot a kulso elektromagneses zavarok is. Lenyeg, hogy megoldodott
(#) gabi20 hozzászólása Okt 2, 2010 /
 
Hellotok mi lehet az oka annak hogy az AVR - ben levő AD átalakító csak egyszer végzi el a konverziót annak ellenére hogy free modeban vagyok? A következő konverziót csak RESET után hajlandó végrehajtani.
(#) zolee1209 válasza gabi20 hozzászólására (») Okt 2, 2010 /
 
Szia.
Gondolom reset után engedélyezed az interruptokat (sei)... Miután egyszer lefutott az AD, megszakítást generál, ezzel törlődik az I bited, az SREG-ben. Ezt minden konverzió után vissza kell állítani, ha újra mérni akarsz.
(#) FerrGhini hozzászólása Okt 3, 2010 /
 
Egy olyan egyszerű próbaprogramot szeretnék, ami annyit tud, hogy megnyomok egy gombot és bekapcsol egy led, de sajna nem akar működni.

Bascom-ban írtam, így néz ki:

$regfile = "attiny45.dat"
$crystal = 10000000

Config Portb.0 = Output
Config Portb.1 = Input

Portb.1 = 1



Do

If Portb.1 = 0 Then
Toggle Portb.0
Waitms 500




End If

Loop

End


Ha valaki talál benne hibát az kérem szóljon, mert nem tudom miért nem akar működni....

Köszönöm!
(#) FerrGhini hozzászólása Okt 4, 2010 /
 
Valaki tudja, hogy lehet azt megoldani Bascom-ban, hogy egy gombot hosszú ideig nyomva (pl. 3 mp-ig) kapcsoljon egy pl egy ledet.

Engem csak az erre való parancs érdekelne, a sima led kapcsolgatás az már megy.....
(#) Tomi_Bp válasza poznamokus hozzászólására (») Okt 4, 2010 /
 
Köszönöm a választ. Természetesen nem várom el, hogy más írja meg helyettem a kódot, de annyira sajnos nem vágom még a dolgokat, hogy ezekből a félszavakból jelentősen tovább tudnék lépni. A megszakításokat és a timer-eket eddig még sosem használtam, mert nem volt rájuk szükségem.
Ha van lehetőséged kicsit jobban kifejteni a timer0 overflow-s display-s javaslatot, illetve az input capture használatáról valami példa progit, vagy (érthető)leírást a rendelkezésemre bocsájtani, azt megköszönném. A javaslataidat átírtam a kódban.
Azt szeretném még, ha tudnád, hogy meglehetősen alacsony frekit is szeretnék mérni (időjárás mérő állomás szél sebesség mérője, autó üzemanyag átfolyásmérő, autó gyujtásfreki, ...)
A jelenlegi, de még nem kész, hibás kód:
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <avr/interrupt.h>
  4.  
  5. #define F_CPU 8000000
  6.  
  7. unsigned char nums[10] = { 0xd7, 0x14, 0xce, 0x5e,0x1d,0x5b,0xdb,0x16,0xdf,0x5f};
  8.  
  9. void disp(long num) {
  10.   long x=num;
  11.  
  12.   PORTC = ~nums[(x%10)];
  13.   PORTA = 0x08;
  14.   _delay_ms(2);
  15.   PORTA = 0x00;
  16.   x=x/10;
  17.   PORTC = ~nums[(x%10)];
  18.   PORTA = 0x04;
  19.   _delay_ms(2);
  20.   PORTA = 0x00;
  21.   x=x/10;
  22.   PORTC = ~nums[(x%10)];
  23.   PORTA = 0x02;
  24.   _delay_ms(2);
  25.   PORTA = 0x00;
  26.   x=x/10;
  27.   PORTC = ~nums[(x%10)];
  28.   PORTA = 0x01;
  29.   _delay_ms(2);
  30.   PORTA = 0x00;
  31. }
  32.  
  33. volatile int freq = 0;
  34. volatile int z = 0;
  35. volatile int timercounter = 0;
  36.  
  37. /*megszak rutin*/
  38. ISR(INT2_vect)
  39. {
  40. z++;
  41. }
  42.  
  43. /*idozito rutin*/
  44. ISR(TIMER0_OVF_vect)
  45. {
  46. timercounter++;
  47. freq = z;
  48. if (timercounter > 5000) {
  49. timercounter = 0;
  50. z                 = 0;  
  51.  
  52. }
  53. }
  54.  
  55.  
  56. /*
  57. MAIN
  58. */
  59. void main() {
  60. cli();
  61.   DDRA = 0xff;
  62.   DDRC = 0xff;
  63.   DDRB = 0x00;
  64.  
  65.    TIMSK = _BV(TOIE0);
  66.    TCNT0 = 0;
  67.    TCCR0 = _BV(CS00);
  68.  
  69. PORTA = 0x01;
  70.  
  71. /*megszakitas konf*/
  72. GICR |= (1<<INT2);   // INT2 engedelyezese
  73. //MCUCR |= (1<<ISC01); // lefuto elre megszakitas
  74. MCUCSR |= (1<<ISC2);
  75.  sei();
  76.  
  77.   while (1) {
  78.     disp(freq);
  79.  
  80.   }
  81.  
  82. }

A mért adatokat nem feltétlenül kiíratni akarom majd, hanem pl. soroson átküldeni PC-re.
(#) szucs_g válasza gag hozzászólására (») Okt 4, 2010 /
 
Megépítettem a fentiek közül egyet. Az volt csak a baj, hogy túl lassúra sikeredett, de működött vele. Még egy hibája az adapternek, hogy ringyózxp bután kezeli az lpt portokat. Lehet ott némi kavarodás.

http://www-user.tu-chemnitz.de/~heha/bastelecke/Rund%20um%20den%20PC/USB2LPT/index.html.en
(#) boomerang hozzászólása Okt 5, 2010 /
 
Sziasztok !

Most kezdem használni az AVR Studio 4-et, eddig kisebb programokat használtam.
Egy már meglévő projektet szeretnék próba képpen változatlanul beleégeni egy mega8-as kontrollerbe, de nem sikerül. Az STK500-as programozót észleli az avr studio, de valamiért a 3 darab C fájlból és 2 darab H fájlból álló programot nem fordítja le.

A fuse biteket tudom programozni, tehát az összeköttetésekkel nincsen gond.
Bármilyen ötletre vevő vagyok : )

Köszi
(#) echo11 válasza boomerang hozzászólására (») Okt 5, 2010 /
 
Hello! mivel nem most kezdted, ezért gondolom ez nem nagy segítség, de azért elmondom. Az avr studio programozó részében az atmega8- at kell beállítani, ezenkívül a fordító részben is figyelni kell erre. Gondolom nem volt nagy segítség, de aki kezdő az lehet, hogy elfelejti ezeket, és jó ha minél több helyen olvassák...
(#) boomerang válasza echo11 hozzászólására (») Okt 5, 2010 /
 
Szia !

Igazából ezeket beállítottam az "Edit Current Configuration Options" alatt, meg mindent amit csak ott lehet... A hiba amit kiír, szerintem magával a lefordítással kapcsolatos, ír olyat is hogy nem találja a "projekt" . o fájlt....dehát az a fordítással keletkezik, eddig legalábbis így történt.
Na mindegy... próbálkozok, olyan nincs hogy nincs megoldás

Üdv.
(#) chaos89 hozzászólása Okt 5, 2010 /
 
Sziasztok,

Van egy tárgyam, amin mikrokontrollereket tanulunk kezelni, s van egy beadandó feladat amit év végéig, kell megcsinálni. PICkeket kicsit ismerem, de mivel elsősorban AVRekről tanulunk, főleg a 8bitesekről, ezért gondoltam hogy én is azzal csinálom meg a beadandót, hogy azzal is megismerkedjek. A baj csak az, hogy nem tudom melyik uC-t válasszam. Esetleg ha adnátok ötleteket. Az Avr honlapján találtam egy csomó leírást, de nem láttam szűrési lehetőséget.

Amit midnenképpen tudnia kell.
8 bites családba tartozzon

UART

16-24 IO port

Esetleg ha van I2C támogatás nem baj, hogy ne nekem kelljen implementálni

TIMER, WDT,

Néhány byte EPROM (64 bőven elég)
És sok program memória. 32k már elég,de minél több, annál jobb.
Nem annyira RAM igényes a progi, de azért kell majd

Lehetőleg JTAG ICE-al programozható legyen.

AMit cisnálni fogok
WORDCLOCK lcd ledes kijelzővel, hőmérővel, külső RTC chip, ébresztő funkció, csengő, DCF77 vevő, USB-UART átalakítón PC-vel való kommunikáció


Várom a javaslatokat
köszi a segítséget


üdv
(#) Ricsi89 válasza chaos89 hozzászólására (») Okt 5, 2010 /
 
Atmega128 bőven elég lesz neked, vagy egy eggyel kisebb 64-es is elég lenne szerintem.
(#) zolee1209 válasza chaos89 hozzászólására (») Okt 5, 2010 /
 
Hardveresen az ATmega16/32 is megfelel, kérdés, mekkora helyet fog elfoglalni a programod, mire ezeket lekezeled. Szerintem a 16kB-is beleférhet, de akkor legyen tutibb, válaszd a 32-est. Ha meg "worstcase", akkor ahogy gr89 írta, mega64, vagy mega128...
(#) Cavalier válasza chaos89 hozzászólására (») Okt 6, 2010 /
 
Helyedben vennék egy ilyen lapot, és erre rádughatóan lehet csinálni akár lyukacsos panelen is amit akarsz. De vannak egész olcsón már ethernetes panelok is, azzal is lehet vicces dolgokat csinálni, böngészőből kapcsolgatni dolgokat, vagy nézni a mért adatokat.
(#) kiborg hozzászólása Okt 6, 2010 /
 
Hali!
Jobb híján ide teszem fel,mert nem találtam direkt ilyen topicot és hát azért AVR-el lesz megvalósítva.
Szóval viszonylag zajos környezetben (vezérlődoboz,tápegységek,relék (bár viszonylag távol)) szeretnék 5 port expander IC vezérelni egy Mega16-al.
Lehetőség van I2C és SPI-t is választani. Melyik lenne a jobb. Nem a sebesség lenne a lényeg. A köztük lévő távolság max 1m. Vélemények ?
Üdv Kiborg
(#) zolee1209 válasza kiborg hozzászólására (») Okt 6, 2010 /
 
Szia!
Én I2C-t használtam már 10m-es UTP kábelen, működött is lassú kommunikációval, viszont könnyen be lehetett zavarni. Zivatar idején mindig kiakadt... Most 3m-es szakaszon megy, nem a leglassabb órajellel, egyelőre hibátlanul fut. Az SPI-ról nem tudok nyilatkozni, azzal még nincsenek "hosszútávú" tapasztalataim.
(#) kiborg válasza zolee1209 hozzászólására (») Okt 6, 2010 /
 
Aha, köszi.
Akkor ez egy pont au I2C mellett
Másik kérdés a topológia:
bővítő-bővítő-bővítő-vezérlő-bővítő-bővítő
lenne az optimális elrendezés az eredeti kábelezés miatt, viszont így a vezérlőtől 2 felé ágazik el a i2c busz. Árt ez ? vagy inkább oldjam meg hogy ne kelljen vele elágazni. ( a két szélső bővítő között lenne max 1m és ennek a közepén csücsülne a vezérlő)
Üdv Kiborg
(#) zolee1209 válasza kiborg hozzászólására (») Okt 6, 2010 /
 
Szerintem ez teljesen lényegtelen, csak egy buszon legyen, illetve az I2C busz követelményeit ne lépjük túl, mint például a 400pF-os busz- kapacitás... Illetve elvileg van valami korlátozás a busz hosszára is, de ebben nem vagyok biztos. Ha lenne kapacitásmérőm, akkor megmértem volna, hogy a 10m-es vezetéknek a slave eszközökkel meghaladt-e a kapacitása a 400pF-ot és ezért volt bizonytalan a kommunikáció, vagy a nem megfelelő zavarvédettség miatt.
(#) trudnai válasza zolee1209 hozzászólására (») Okt 6, 2010 /
 
RS-485-ot kell hasznalni nagyobb tavok athidalasanal...
(#) boomerang hozzászólása Okt 7, 2010 /
 
Sziasztok !

Kicsivel korábbi hozzászólásomat szeretném tovább bonyolítani. Van egy Topi féle programozóm, hestore.hu-ról. Mostmár működik az AVR Studio-ban, de Programmers Notepad alatt is szeretném használni, ha jól tudom ilyenkor fel kell tenni az USB-HID tüskét.

Beállítottam a programozót és a portot a makefile-ban de nem akar működni.....

Aki használ ilyet az hogy állította be a makefile-t ?
(#) Reggie válasza kiborg hozzászólására (») Okt 7, 2010 /
 
Hasznalj megfelelo lezarast, es akkor biztos nem lesz problema. A reflexio neha jol meg tudja viccelni az embert. (no meg az eszkozt is)
(#) vagnerjazon válasza boomerang hozzászólására (») Okt 7, 2010 /
 
Nekem is olyan programozóm van, és én úgy csinálom, hogy nem teszem rá az USB-HID-et, hanem marad virtuális soros portként, és a Makefile-ban STK500-nak állítom be, a port meg az amit használ(eszközkezelőben lehet megnézni). Még nem próbáltam soha USB-HID módban használni. Remélem segítettem.
(#) russiangt hozzászólása Okt 7, 2010 /
 
Sziasztok!

Segítséget szeretnék kérni.
Van egy 89c2051 -es mikrovezérlőm hozzávaló hex is be van égetve (willem-el), de sehogy nem akar működni.
Szkóppal lehet láni hogy megy a qvartc, 5V rajta van de a kimenetei nem reagálnak.
Kérdésem annyi lenne, hogy van-e valakinek olyan működő hex file-ja ehhez a kontrollerhez ami a kimeneteit váltja alacsony és magas szitnre(p1.0-p1.7).
Amiket találtam hexeket azok sem akarnak menni.
Sajnos az atmel-lel hadi lábon állok.

Előre is köszönöm a segíségeteket.
(#) zsuscsinyo válasza vagnerjazon hozzászólására (») Okt 7, 2010 /
 
Vagy STK500v2-at mert nekem csak azzal ment.
Következő: »»   266 / 841
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