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   738 / 837
(#) rolandgw válasza Sick-Bastard hozzászólására (») Jún 8, 2016 /
 
(#) Sick-Bastard válasza rolandgw hozzászólására (») Jún 9, 2016 /
 
Sajnos a linktől nem lettem okosabb. Ami nekem kellene, a kondi kapacitásának kiszámítása, nincs benne.

Minden esetre megpróbáltam kiszámolni az adatlap segítségével és nekem 12 ill. 18pF jött ki.
12pF -> Cs(stray) = 6pF esetében (ezt az értéket csak tippelem)
18pF -> Cs(stray) = 0pF esetében (gondolom a linkben is így számolta ki)

Mivel csak 15pF-os van kéznél(ill. 22,27,33), így ezt próbálom ki. Meglátom, hogy így ismét stabil lesz e az óra.

Köszönöm a segítséget.
(#) rolandgw válasza Sick-Bastard hozzászólására (») Jún 9, 2016 /
 
Értem,akkor ezt javaslom:
Bővebben: Link
(#) DJ Szabcsa hozzászólása Jún 10, 2016 /
 
Sziasztok,

Nem igazán értek az AVR\Arduino világához. Szakmámat és munkámat tekintve PLC programozó vagyok és ebben is dolgozom. Kitalálták odabent hogy minden automata gépre rá kell tenni egy külső statisztikát ami adott digitális jelek alapján (ciklus start\stop; hiba; auto\manual üzem; stb..) statisztikát készít a gép működéséről. Vettek egy csoda dobozt a gyártó Moxa, valamilyen ATMega chip van benne. Ez a beérkező digitális jelek alapján etherneten keresztül adatokat küld egy adatbázis szervernek és az elkészíti a statisztikát. Namármost ennek a doboznak vannak hiányosságai, túl kevés digitális IO stb..., ebbe most nem mennék bele. Valamint szerintem olcsóbban és szebben is lehetne ezt kivitelezni.
Itt kérném a ti segítségetek, hogy az alább leírt paraméterek alapján milyen IC lenne a jó választás.
Amit tudnia kellene:
- 11 digitális bemenet
- 11 digitális kimenet
- 3db RS232 port (A dobozra csatlakozik egy RFID olvasó, egy barcode reader, egy numerikus bill. ezek csak adatot küldenek a doboznak, és egy kijelző ami csak adatot fogad a doboztól)
- ethernet port (statikus IP cím beállítási lehetőséggel)

A soros portból igazából lehet hogy egy is elég lenne, mert jelenleg is diódák és ellenállás segítségével van össze kötve a 4 eszköz 1 portra és tökéletesen működik.
Remélem érthető voltam valamennyire. Én a minimális ismereteim alapján az Arduino Mega IC-re gondoltam elsőnek.
Ti mit ajánlanátok a fentebbi feladat megoldására?
Előre is köszönöm mindenki segítségét.
(#) Sick-Bastard válasza rolandgw hozzászólására (») Jún 10, 2016 /
 
Hát szerintem csak az AVR-em Timer2 oszcillátora lehet a hibás.
Egyre többször és egyre hosszabb ideig áll le az oszcillálás.

Jelenleg csak akkor hajlandó elindulni, ha multiméterrel rámérek a GND és a TOSC2 között. TOSC1-nél semmi. Ha elveszem a mérőt, akkor még pár másodpercig megy, aztán megáll.
Belső órajelről hajtva még most is megy.

(Jelenleg megint elindult magától...)
(#) csatti2 válasza DJ Szabcsa hozzászólására (») Jún 11, 2016 / 1
 
Nem létezik olyan, hogy Arduino Mega IC. Amire te gondolsz szerintem az az ATMega2560 (ezt építették be az Arduino Mega-ba is). Erre a feladatra bőven elégnek kell lennie (4db HW soros port és több mint elegendő láb és flash). Az ethernethez külön IC kell természetesen. Puskázhatsz a moxa eszközből (ami oda jó volt, neked is jó lesz).

Mondjuk kicsit fura, hogy saját hardvert akarnak erre fejleszteni, amikor mindez megoldható lenne PLC-vel is, ahhoz pedig már értetek. Gondolom a szokásos legyen olcsó, legyen készen gyorsan és legyen jó szentháromságot nyomatják (az, hogy ebből kettőt választhatnak, az már lemaradt... )
(#) DJ Szabcsa válasza csatti2 hozzászólására (») Jún 11, 2016 /
 
Igen, a PLC túl drága lenne ennyi az összes gond. Azzal 20 perc alatt megoldanám az egészet
Köszönöm, akkor ATMEGA2560 alapján neki állok utána nézni a dolgoknak.
(#) druxter hozzászólása Jún 15, 2016 /
 
Üdvözletem!

Olyan emberkét keresek aki tud avr-t programozni, és hozzá nyáktervet készíteni. Ledeket kellene vezérelni bizonyos sorrendben, kb ennyit elöljáróban, kihez fordulhatnék ilyen jellegű projekt megvalósításával?
(#) ksanci hozzászólása Jún 16, 2016 /
 
Sziasztok!

Mostanában ásom bele magam az AVR-ek világába és olyanokat keresek, amik egy cella (3,7V) Lítiumos akksiról tudnak üzemelni.
A feladat hardverileg nem bonyolult, alapvetően érzékelő(k) jeleit továbbító, CC1101-en alapuló rádiófrekvenciás adó-vevőt(RF1101SE) használó több eszközről, valamint egy, ezeknek a jeleit fogadó és szükség esetén távolról vezérlő (RF panel beállításai), ezeket felügyelő eszközről van szó, ami GSM és GPS modullal is fel van szerelve. Tehát az előbbinek az érzékelőket és az adó-vevőt kell kezelnie, itt gyakorlatilag csak a tápfesz a kérdés, az utóbbinak pedig még a modulokat is.
Most már rengetek avr van a piacon, fogalmam sincs, melyikek lennének jók.
A jelenlegi, csak érzékelős tesztalanyokban éppen egy jó öreg AtMega64 (nem L-es) van, bőven elég a feladatra, a felügyelő pedig egy már meglévő kijelzős eszköz (ebben egyébként egy STM32F103ZE ARM mikrokontroller van) összedrótozva egy cc1101 alapú rf adó-vevővel. Ehelyett mindenképpen kellene egy vadonatúj felügyelő eszköz kijelző nélkül, amit egy külön, érintőkijelzős cuccról lehetne paraméterezni. Ez utóbbi most nem téma
Szóval melyik AVR-eket ajánlanátok? Illetve, mivel végleges panel még ugye nincs, melyik fejlesztői kit jöhetne szóba? (3,7V tápfesz)

Köszi!
A hozzászólás módosítva: Jún 16, 2016
(#) Sick-Bastard válasza ksanci hozzászólására (») Jún 16, 2016 /
 
Ha az ATMega64 bőven elég, akkor a javaslatom az ATMega644PA lenne.
Ha jól értelmeztem az adatlapját ennek 1,8-5,5V-ig bármi jó és 0-20Mhzig bírja.
Én a nagyobbik testévrét (ATMega1284P) használom 12-16Mhz 3,3V-on (igazából 3V).

Egyszer végeztem egy rövid, felületes tesztet 2V-os tápfeszültséggel, 12 vagy 16Mhz mellett és ment.

Ha kevesebb IO is elég, akkor atmega328P.

Fejlesztőkittet nem tudok javasolni.
(#) mineral hozzászólása Jún 16, 2016 /
 
Sziasztok!
Egy ATmega664p-t szeretnék felprogramozni. De teljesen kezdő vagyok a témában. Így lövésem sincs, hogy milyen égetővel, és milyen szoftverrel kellene csinálnom. Ebben kérném a segítségeteket. Amit előre is köszönök.
(Topi féle AVR-ISP-m van. Még itt pecáztam a hirdetések között. De még azóta sem próbáltam. Ez az eszköz megfelelő lenne?)
(#) Sick-Bastard válasza mineral hozzászólására (») Jún 16, 2016 /
 
Én innen ismerkedtem meg az AVR felprogramozásával, ill. a kód írással is.
Ezeket a videókat javaslom kezdésnek.

A Topi féle AVR-ISP hardware az jó, de nekem a firmware-t újra kellett égetnem benne, hogy működjön.

Lehetséges, hogy szükséged lesz egy másik programozóra.
Javaslatom: UM232R
Ez egy USB-Soros (UART) átalakító, amivel úgynevezett Bit-Bang módban az AVR felprogramozható. Ezzel fel/újra lehet programozni az AVR programozót. Igaz ez piszok lassú, de tartaléknak mindig jól jön. Másrészt később nem árt, ha van egy ilyen. Hibakeresésnél felbecsülhetetlen. Ennél már csak a JTAG lenne jobb, már ha az AVR támogatja (atmega644p igen).
(#) Ivan93 válasza mineral hozzászólására (») Jún 16, 2016 /
 
Szia!
Ha van xp-s géped, akkor működni fog a Topi-féle doper is. Ebben a cikkben Topi leírta a telepítését és használatát.
(#) mineral válasza Sick-Bastard hozzászólására (») Jún 16, 2016 /
 
Köszönöm. Megnézem, átolvasom amit küldtél.
(#) mineral válasza Ivan93 hozzászólására (») Jún 16, 2016 /
 
Szia! Köszi a cikket. Akkor aszerint járok majd el. (Csak Xp-s gépem van. Ez nekem elég.)
(#) ksanci válasza Sick-Bastard hozzászólására (») Jún 18, 2016 /
 
Oké, köszönöm a választ!
(#) Max26 hozzászólása Jún 18, 2016 /
 
Sziasztok!

Szervizelés problémám akadt.:

Régi chip: ATMEGA32 16PU 1218 (nem működik)

Új chip: ATMEGA32A PU 1121

Új chip fuse bitje: LO:0xE1 HI:0XD9


A helyettesítő csip fuse bitjét módosítottam 0XFF 0XD9-re ettől fogva nem tudok kommunikálni vele, de van még 1 ugyanilyen AVR-em.
A JTAG-ra nincs szükségem és a kvarc 16MHz-es.

Mi lenne a jó fuse bit beállítás?
A hozzászólás módosítva: Jún 18, 2016
(#) Kovidivi válasza Max26 hozzászólására (») Jún 18, 2016 /
 
Első körben ellenőrizd a kvarcot, jó lábon van-e, a kondik bent vannak-e? A fuse bitek jok: Bővebben: Link Itt tudod ellenőrizni.
(#) slimtomi hozzászólása Jún 18, 2016 /
 
Sziasztok!
Van egy kérdésem. A kapcsolás egyszerű:
Az AVR egyik digitális pinjét földre húzom egy 10K ellenállással és ugyanezt a pint nyomógombbal lehet +5V-ra felhúzni.
A gomb után nem kellene bekötni egy áramkorlátozó (felhúzó) ellenállást, ami természetesen kisebb értékű, mint a lehúzó ellenállás?
Mivel a digitális pineket talán 40mA-rel lehet terhelni, ezért gondolom a felhúzó ell. szükségét.
(#) proba válasza slimtomi hozzászólására (») Jún 18, 2016 /
 
Ha bemenetnek programozod, akkor nem folyik áram, tehát csak zavarna, hiszen feszültségosztót alkot a lehúzó ellenállással. Ha kimenetnek is akarod használni, akkor sokkal kisebb legyen mint a lehúzó ellenállás.
(#) slimtomi válasza proba hozzászólására (») Jún 18, 2016 /
 
Valóban, köszönöm!
Pl egy 1K-os felhúzóellenállásnál a +5V -nak csupán a 10/11 része jutna a bemenetre. Bár ez még magas jelszintnek számít, de azért tényleg logikus, hogy nem kell.
(#) Bakman válasza slimtomi hozzászólására (») Jún 18, 2016 / 1
 
Egyébként sokkal kevésbé zavarérzékeny, ha a lábat folyamatosan magas szinten tartod. A láb és a +5V közé egy 1kOhm-os ellenállás, a nyomógombot pedig a láb és a GND közé.
(#) slimtomi válasza Bakman hozzászólására (») Jún 18, 2016 /
 
Értem. Egyébként ez Arduino IDE-ben található példakapcsolás, de szerintem is érdekes a gomb bekötése, ezért is kétdeztem itt.
Tehát gombok esetén alapesetben legyen felhúzva a láb és a lenyomás húzza le a lábat GND-re.
Ez azért jó, mert az AVR-ben van belső felhúzó ellenállás, ami ki-be kapcsolható.

Egyébként egy 10K ellenállás már nagyon nagy felhúzó tagnak?
Egyelőre többet nem kérdezek, mert fölöslegesen terhelem a topikot.
(#) Bakman válasza slimtomi hozzászólására (») Jún 18, 2016 /
 
Azért van a topik. Lehet használni a belső felhúzót is, ha nincs a közelben nagyobb zajforrás. A kissebb ellenállásal kevésbé zavarérzékeny a bemenet, de jobban is terheli a kapcsolót. 1 kOhm alá nem érdemes menni, 10 kOhm fölé sem.
(#) Ivan93 hozzászólása Jún 19, 2016 /
 
Sziasztok!
Uart interruptal van problémám, nem akar adatot fogadni. ATmega8L @7.3728MHz, 115200baud-al szeretnék adatot fogadni. A küldés megy. Az interrupt létrehoz egy tüskét az egyik lábon a lefutás ellenőrzéséhez. Az a gondom, hogy az interrupt a logikai analizátor szerint (kép) a fogadáson kívül véletlenszerűen lefut sokszor. Nem tudom ezt mi okozza, és miért nem fogad adatot.
esp8266-nak küldök AT/r/n-t, ha érkezne OK, akkor egy led jelezné.
Ez a beállítás, ellenőrzés:
  1. uart_init(57600,2); //115200baud
  2. UCSRB |= (1 << RXCIE)// Enable the USART Recieve Complete interrupt (USART_RXC)
  3. sei();          // Enable the Global Interrupt
  4.        
  5. uart_puts("AT/r/n");
  6. _delay_ms(1000);
  7. if(strstr(buffer,"OK"))
  8. {
  9.         blink();
  10. }

Ez az ISR:
  1. char temp = UDR;
  2. buffer[buff_cnt] = temp;
  3. buff_cnt++;
  4. if(buff_cnt>BUFF_LEN){buff_cnt=0;}
  5. PORTC|=(1<<PC5);
  6. PORTC&=~(1<<PC5);

A '/' jelek fordítva vannak a kódban, de a fórum nem szereti.
A segítséget előre köszönöm!
A hozzászólás módosítva: Jún 19, 2016
(#) Sick-Bastard válasza Ivan93 hozzászólására (») Jún 19, 2016 /
 
Szerintem ott a hiba, hogy nem a while()-ba raktad ezt:
  1. if(strstr(buffer,"OK"))
  2. {
  3.         blink();
  4. }

Így csak akkor villanhat fel a LED ha 1mp-en belül jön a válasz.

Szerintem rakjad a while()-ba az egészet:
  1. while(1)
  2. {
  3. uart_puts("AT/r/n");
  4. _delay_ms(1000);
  5. if(strstr(buffer,"OK"))
  6. {
  7.         blink();
  8. }
  9. }


Így többször is lefut a tesztelés.
(#) killbill válasza Ivan93 hozzászólására (») Jún 20, 2016 /
 
Ha igy van a kod, akkor az tul fogja irni a buffert, mert az index csak 0 es BUFF_LEN-1 kozott lehet.
  1. if(buff_cnt >= BUFF_LEN) buff_cnt = 0;
kellene.
Egesz pontosan:
  1. static char volatile buffer[BUFF_LEN];
  2.  
  3. isr()
  4. {
  5.  buffer[buff_cnt++] = UDR;
  6.  if(buff_cnt >= BUFF_LEN)
  7.    buff_cnt = 0;
  8. }

Ez nem magyarazat a nem kivant interrupt lefutasokra, de mindenkeppen problema.
(#) Ivan93 válasza Sick-Bastard hozzászólására (») Jún 20, 2016 /
 
Este kipróbáltam, de ez nem volt elég, viszont így tesztelem tovább, mert tényleg praktikus. Most tettem rá néhány kondenzátort, meg egy rendes tápot, ez segített rajta, most már néha be tudja olvasni, de még mindig többször lefut az isr. Érdekes, ha a buffer mérete 10, akkor 90%-ban beolvassa, ha 50-re állítom, akkor már csak 20% körül. Most ilyen a fő ciklus:
  1. while (1)    
  2.         {
  3.                 memset(buffer,0,BUFF_LEN);     
  4.                 uart_puts("AT/r/n"); //válasz: AT/r/r/n/r/nOK/r/n
  5.                 _delay_ms(50)
  6.                 if(strstr(buffer,"OK"))
  7.                 {
  8.                         lcd_clear();
  9.                         _delay_ms(1);
  10.                         lcd_string(buffer);
  11.                         blink();
  12.                 }
  13.                 _delay_ms(1000);
  14.         }//while
Ha az első delay-be 500-t írok, akkor megint rosszabb lesz, pedig elvileg nem kap olyankor adatot, így a buffer nem változhatna. Szerintem itt is a véletlen lefutó isr kitolja a bufferből az adatot.
(#) Ivan93 válasza killbill hozzászólására (») Jún 20, 2016 /
 
Igaz, nem figyeltem rá, köszönöm! Röviden le tudnád írni, hogy a static miért kell? A volatile miért a végén van, vagy mindegy?
(#) killbill válasza Ivan93 hozzászólására (») Jún 20, 2016 /
 
Egy fuggvenyen kivuli valtozonal a static azt jelenti, hogy azt a valtozot csak abban forrasfile-ban tudod elerni a nevevel, ahol deklaralod. Ha nem static, akkor mas forrasokbol is tudsz ra hivatkozni a neve alapjan. Ha erre nincs szukseg, akkor erdemes a static-ot kiirni, hogy pl. ne legyen valtozonev utkozes. De a fordito munkajat is megkonnyited, ha nem globalis a valtozo.

Ha egy fuggvenyen beluli valtozo static, akkor az azt jelenti, hogy azt a valtozot nem a stack-en tarolja, hanem fixen lefoglalt memoriaban. Ez tobbek kozott azert jo, mert a valtozo nem veszti el az erteket, amikor a fuggveny kilep:
  1. int random(void)
  2. {
  3. static int init = 0;
  4.  
  5.  if(init == 0){
  6.     init_random( get_timer() );
  7.     init = 1;
  8.  }
  9.  return generate_random();
  10. }

Ennek az lesz az eredmenye, hogy az elso meghivasnal lefut az init_random(), de a tobbinel mar nem.

A volatile ebben az esetben mindegy, hogy hol van, ugyanazt jelenti. De pl:
volatile char *p; es a char * volatile p; mar mast jelent. Az elso esetben az a volatile, amire a 'p' mutat, a masodik esetben maga a 'p' valtozo volatile.
A hozzászólás módosítva: Jún 20, 2016
Következő: »»   738 / 837
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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