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   379 / 840
(#) Reggie válasza Krisszes hozzászólására (») Nov 12, 2011 /
 
8 bitesen nincs.
(#) UbiLinux válasza Krisszes hozzászólására (») Nov 12, 2011 /
 
Nagyon kínkeservesen meg tudod csinálni, ha az interruptokon belül oda-vissza maszkolgatod az interruptokat, de ez nagyon ingoványos talaj és nagyon tudnod kell, mit csinálsz.
Egy bizonyos interruptot ki tudsz úgy emelni, hogy nagyobb prioritása legyen, mint a többinek. Ezt úgy teheted meg, hogy a többi interruptban rögtön engedélyezed a további megszakítást - a nagyobb prioritásúban meg nem csinálsz ilyet, ott majd csak a reti engedélyez.
Ezzel semmi illegális dolgot nem csinálsz, hiszen ha minden IT rendesen le van kezelve és ment mindent, akkor a megszakítás akár másik megszakítást is felfüggeszthet, csak a stack használat lesz intenzívebb.
Ezt akár assemblyben, akár C-ben is el lehet játszani.
(#) kovacsj válasza UbiLinux hozzászólására (») Nov 12, 2011 /
 
Köszönöm ismét! Arra gondoltam - lehet, hogy hibásan - hogy a 9600 b/s és a 7372800 Hz között elég nagy a különbség ahhoz, hogy többször is meg tudjam vizsgálni. De majd megpróbálom az általad leírt módon inkább.
(#) UbiLinux válasza kovacsj hozzászólására (») Nov 12, 2011 /
 
A baj ott van, hogy véletlenszerű olvasással nem tudod garantálni, hogy nem egy félig beérkezett üzenetbe kapkodsz bele...
(#) kovacsj válasza UbiLinux hozzászólására (») Nov 12, 2011 /
 
Ez nálam nem véletlenszerű. Úgy néz ki, hogy if (rx_buffer[64] == 'X' && rx_buffer[65] == 'Y'') { történjen valami. }
És mivel a főciklusom sokkal gyorsabb mint az USART 9600 b/s. így ezt pontosan tudom ellenőrizni. (Legalábbis remélem!) A te megoldásod biztosan sokkal jobb, de egyelőre ez is működni látszik. És nekem (most még) kicsik az igényeim.
(#) UbiLinux válasza kovacsj hozzászólására (») Nov 12, 2011 /
 
Idézet:
„És mivel a főciklusom sokkal gyorsabb mint az USART 9600 b/s. így ezt pontosan tudom ellenőrizni.”

Hát amit erénynek gondolsz, ez a baj.
Mert ha azt tapasztalod, hogy teljesül a két feltétel, akkor azt hiszed, hogy itt az üzenet. Pedig dehogy. Mivel egy sms 140 karakter hasznos információt hordozhat és egy karakter 9600Bd esetén durván 0.1msec alatt érkezik be, a Te vizsgálatod meg a 65. karakter után már készre jelenti a buffert, a hátralevő 140-65 = 75 karakterszer x 0.1ms = 7.5 ms-ig még özönlik a modemből a karaktersorozat, Te meg közben nekiállsz feldolgozni azt az üzenetet, aminek a fele még meg sem jött a modemből.
(#) UbiLinux válasza UbiLinux hozzászólására (») Nov 12, 2011 /
 
Még el is csesztem a számítást, a helyzet sokkal rosszabb. 9600Bd esetén ugyanis egy bit ideje 0.1 msec, egy byte - figyelembe véve a start-stop jeleket is - tízszer ennyi. A Modemből még 75 msec ideig jön az adat, amit nem dolgozol fel.
(#) morgo hozzászólása Nov 12, 2011 /
 
Sziasztok!
Egy egyszerű frekvenciagenerátorral vagyok elakadva.
Bővebben: Link - itt találtam.
Az a gondom, hogy közel sem azokat a frekiket adja, mint kéne, a kvarc semmit nem befolyásol, akár ki is vehetem. Az a gyanúm, hogy belső oszcillátorról fut. Az AVR-t viszont nem tudom újra programozni, mert a programozóm már nem látja. Szerintem a fusebiteket állítottam be hibásan, ezért próbáltam külső órajelről, de arra sem reagál.
Van valami ötletetek?
(#) kovacsj válasza UbiLinux hozzászólására (») Nov 12, 2011 /
 
Ebben teljesen igazad van. De nekem csak annyira van szükségem, hogy egy ledet be- és kikapcsoljak. A sokkal nagyobb probléma azonban most jelentkezik. Most a modulnak kellene SMS-t küldenie felém, és ha így hívom meg, működik is.
  1. if (rx_buffer[64] =='f' && rx_buffer[65] =='0' && rx_buffer[66] =='0') {
  2.  
  3. send_analog_sms();
  4.  
  5. }


A baj az, hogy amíg az rx_buffer-ben ezek az adatok vannak, addig küldi is szorgalmasan. Csak túl sokat. Viszont ha átírom, vagyis úgy kezdem a függvényt, hogy rx_buffer[64] =' '; akkor nem küld egyet sem.
Az sms küldő függvény tartalma:

  1. void send_analog_sms() {
  2.  rx_buffer[64] =' ';
  3. itoa(analog,szambuffer,10);
  4. const char sms[] = "AT+CMGS=\"06703146459\"\nAz eredmeny : ";
  5. const char vege[] =" (GSM)\x1A";
  6. USART1_puts((unsigned char*) sms);
  7. USART1_puts((unsigned char*) szambuffer);
  8. USART1_puts((unsigned char*) vege);
  9. _delay_ms(1000);
  10.  
  11. }


Vajon miért kell ezt többször is meghívni amíg elküldi?

Köszönöm előre is!
(#) UbiLinux válasza kovacsj hozzászólására (») Nov 12, 2011 /
 
if (rx_buffer[64] =='f' && rx_buffer[65] =='0' && rx_buffer[66] =='0') {
//rontsd el a vevőbuffert a küldés előtt, pl így:
rx_buffer[64] = '0';

send_analog_sms();

}
(#) kovacsj válasza UbiLinux hozzászólására (») Nov 12, 2011 /
 
Úgy is próbáltam, de úgy sem küldi. Ha viszont nem rontom el, küld vagy 10-et mire leállítom. Olyan, mintha többször is meg kellene hívni mielőtt egyszer elküldi.
Mennyit kell várni? Elég a _delay_ms(1000)?
(#) sikolymester válasza morgo hozzászólására (») Nov 12, 2011 /
 
Ha a program fut rajta, de programozni nem tudod, akkor elég jó eséllyel a RSTDBL vagyis reset disable fuse-t programoztad be. Ez arra való, hogy tudod általános célra használni a reset lábat is.

Megoldás:

-Szerzel egy STK500 panelt (nem a klónt, hanem a marha drága igazit)

-Szerzel egy Avrdragont

-Megépíted az un. fusebit doctort

Mindhárommal lehet programozni a reset disable -s AVR-eket is. Tehát van lehetőséged arra, hogy a fuseokat rendbe tedd,

-További lehetőség: Ha ez egy JTAG képes AVR, akkor megpróbálkozhatsz JTAG-es programozóval rendbe rakni.
(#) kovacsj válasza UbiLinux hozzászólására (») Nov 12, 2011 /
 
Én csak annyit szeretnék, hogy ez az eszköz is tudjon küldeni nekem egy SMS-t, lehetőleg valami mért vagy vett belső adattal.

Az elküldés módja a következő lenne:
Teljesül a feltétel.
Megszüntetem a feltételt;
Meghívom az SMS-küldő függvényt.
Visszamegyek a főciklusba.

Az SMS-küldő függvény USART1-en küldi az AT-parancsot a kontroller felé. De nem múködik és nem jövök rá, hogy miért.
(#) kovacsj válasza kovacsj hozzászólására (») Nov 12, 2011 /
 
Vagyis működik, ha nem rontom el az rx_buffer[64]-et. De akkor küldi ám folyamatosan.
Az időzítéssel lehet a baj. Vagy nem jól csinálom? De hiszen az előbb kaptam vagy 6-ot ismét.
(#) UbiLinux válasza kovacsj hozzászólására (») Nov 12, 2011 / 1
 
Egy régebbi post-ban már írtam - lehet, hogy nem Neked - hogy a modem OK válasza nem jelenti azt, hogy a parancsot végre is hajtotta. Az OK csak annyit jelent, hogy "értettem". A parancs végrehajtásának időigénye attól függ, mi volt a parancs.
Még tiszta viszonyok között is ügyelni kell erre, de ezek egyáltalán nem tiszta viszonyok, ahogy próbálkozol. Valószínűleg a rendesen le sem kezelt üzenet miatt bolondul meg a modem, pláne ha orrba-szájba zúdítod rá a parancsokat.
A feladat egyszerűsége nem jelenti azt, hogy ezeket felületesen lehet kezelni. Tudnod kell, hol tart a modem, nincs-e még közlendője, a küldési parancsot nyugtázta-e, tudja-e teljesíteni, nem küldhetsz találomra parancsokat. Amíg nem teremtesz korrekt viszonyokat, addig minden véletlenszerűen fog működni
(#) Gery válasza Reggie hozzászólására (») Nov 12, 2011 /
 
Szia,

Nos a probléma az volt, hogy a panelen volt egy rövidzárlat és rengeteg lábat földre húzott. Amint ez megszünt azonnal műkködött a rendszer, szóval a probléma ott volt.
Azota felmerült egy új kérdés bennem. Sajnos most nincs lehetőségem szkóphoz jutni, de szeretném tudni a pwm frekveniáját. Szóval a programban megadom a cprd értékét. Ebből a periódusidőt az adatlapon látható
(2 × X × CPRD)/CLK_PWM képletből számolandó ahol, ha cpre=0b0000, akkor x=1. Jól gondolom?
(#) kovacsj válasza UbiLinux hozzászólására (») Nov 12, 2011 /
 
Szerintem az egy rendesen lekezelt üzenet. Tudom, hogy mit küldök és tudom azt is, hogy erre mit kellene csinálni. Én a 3-4 elküldött karakterem után nem várok további 140-et, hanem ott a vége és kész. Erre kellene reagálnia az eszköznek. És amíg a ledeket pontosan kapcsolgatja, addig az SMS-t nem küldi el, csak ha a ciklus milliószor lefut közben. Ez itt a nagy baj.
(#) girhes.main hozzászólása Nov 12, 2011 1 /
 
Sziasztok!

Olyan gondom lenne, hogy atmel atmega8-as avr mikrovezérlőhöz kellene csatlakoztatni rf segítségével két hőmérőt, és egy vérnyomsámérőt.
Körülnéztem de nem nagyon találtam semmit...

Teljesen új vagyok ebben a témában, ezért kérem a segítségetek!

Előre is köszönöm!
(#) UbiLinux válasza kovacsj hozzászólására (») Nov 12, 2011 / 1
 
Akkor jól van. Nem fogom ismételgetni, amit már leírtam. :yes:
(#) kovacsj válasza UbiLinux hozzászólására (») Nov 12, 2011 /
 
A különbség az, hoigy amíg te timeout-tal teszel 0-t a végére, én tudom, hogy az enyémnek hol a vége. Én meg akkor teszek. És mivel én küldöm az SMS-t, jól tudom, hogy fejeztem be. Ebből a szempontból nincs sok különbség a két eljárás között. Majd kitalálok valami mást, ami nem SMS-re küld SMS-t, hanem más feltétel teljesülése esetén. Csak arra kell vigyáznom, hogy az a feltétel egyszer következzen be. vagy legalábbis ritkán. Megszakításra gondoltam, lefutó élre. Szerinted egy megszakítás rutinba illik tenni SMS-küldő függvényt? Valami azt súgja, hogy nem tanácsos, de inkább megkérdezek tőlem sokkal nagyobb tudásúakat, pl. téged.
(#) kovacsj válasza UbiLinux hozzászólására (») Nov 12, 2011 /
 
100%, hogy neked van igazad. 7-es interruptra (lefutó él) küldi.
(#) UbiLinux válasza kovacsj hozzászólására (») Nov 12, 2011 /
 
Interruptba nagyon nem illik ilyen hosszadalmas procedurát tenni.
Nem az a lényeg, hogy mikor történik a vételi puffer lezárása, hanem hogy elegendő időt kivársz-e, miután vettél valamit, ha válaszolni akarsz, nézed-e hogy lenyugtázta-e a modem a parancsot, ha nem nyugtázta le a küldési parancsot, milyen hibakódot ad vissza, vársz-e eleget, míg megpróbálkozol újra küldeni. Ez nem úgy működik, hogy ó, én egyelőre csak a szomszéd faluba szeretnék repülni, de majd utána megtanulom rendesen a repülővezetést. Ha nem hibátlanul repülsz, lezuhansz. Nem számít hogy öt vagy ötezer kilométert akartál repülni, ha nem a nagykönyv szerint csinálod, az öt kilométer sem fog menni.
Ha nem ment el az sms, akkor hiába próbálod újra és újra erőszakolni, ha nem figyelsz a modemre, hogy vette-e a parancsot, csak azt éred el, hogy kiakad és zavaros válaszokat ad, esetleg csak resetre vagy tápfesz kikapcsolásra tér magához.
Soha nem kell ismételni az sms küldést, ha nem bolondítottad meg a modemet. De hát úgy tűnik, hogy semmit nem ellenőrzöl, csak szólongatod a modemet, az meg hiába panaszkodik, nem figyelsz rá. Én meg hiába koptatom a számat.
(#) röntgen válasza girhes.main hozzászólására (») Nov 12, 2011 /
 
Már RF terén nem találtál semmit, vagy elképzelésben?
(#) kovacsj válasza UbiLinux hozzászólására (») Nov 12, 2011 /
 
Megcsinálom a te eljárásod szerint inkább.
(#) Thowra hozzászólása Nov 13, 2011 /
 
Üdv mindenkinek!
Építettem egy USBASP programozót és a benne lévő Atmega48 felprogramozásához szeretnék segítséget kérni.
A programot egy Willem 5 égetővel írnám be. A konfig beállítása lenne a kérdés, hogy mit mire állítsak.
Az ITT található oldalon az usbasp.2006-12-29.tar.gz mappába lévő atmega 48 forrást szeretném beírni. A szerkezet 12MHz es kvarcról jár. Mellékelem az égető beállítást.
Mit mire állítsak?

config.JPG
    
(#) Reggie válasza Gery hozzászólására (») Nov 13, 2011 / 1
 
Attol fugg, ha kozepre igazitott, akkor igen, ha nem kozepre igazitott, akkor 2xCPRD/CLK_PWM.
A 32 bites AVR-nel nagy elony, hogy a PWM alap orajele joval nagyobb lehet a CPU orajelenel, igy eleg nagy frekvenciaju jelet elo lehet allitani.
(#) UbiLinux válasza Thowra hozzászólására (») Nov 13, 2011 /
 
* LFUSE=lfuse:w:0xff:m*
* HFUSE=hfuse:w:0xdd:m*
* EFUSE=efuse:w:0xff:m*
(#) kovacsj válasza UbiLinux hozzászólására (») Nov 13, 2011 /
 
Nagyon köszönöm UbiLinuxnak a privátban nyújtott segítséget mind a jelenre, mind a jövőre vonatkozólag!
(#) UbiLinux válasza kovacsj hozzászólására (») Nov 13, 2011 /
 
Nincs mit. Csak szólj magánban, hátha még hozzá tudok szólni!
(#) sikolymester válasza girhes.main hozzászólására (») Nov 13, 2011 /
 
1. szerzel egy programozót, egy atmega8-as fejlesztő boardot/próbapanelt atmega8-cal.

2. megvillogtatsz pár ledet, ahogyan illik, megbarátkozol az adatlappal.

3. Szerzel egy hőmérőt, vérnyomásmérőt(?), és működteted őket a villogó led mellett.

4. megnézed milyen rf lehetőségek vannak, választasz egyet.

5. megpróbálod összehozni az egészet egyben.
Következő: »»   379 / 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