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   608 / 839
(#) gabi20 válasza Droot hozzászólására (») Jún 18, 2014 /
 
Szia a 16 azt jelenti hogy 16 Kbit, vagyis 2048 Bájtot tárolhatsz. 2KB címezésére 11 bit szükséges (8 bit word adress + 3 bit block adress).
(#) gabi20 válasza csabeszq hozzászólására (») Jún 18, 2014 /
 
Szia köszönöm a választ. Végül is sikerült letöltenem egy szoftveres I2C portot, így nem kell a hardvereset használnom, ráadásul bármelyik portot használhatom.
(#) Droot válasza gabi20 hozzászólására (») Jún 18, 2014 /
 
Nem teljesen tiszta még...
A 2048 bájt azt jelenti hogy 2048 karaktert tárolhatok?
Az atmega32-ben 1024 bájt eeprom van, abban 1024-et? És 0-1023-ig címezhetem?
(#) gabi20 válasza Droot hozzászólására (») Jún 18, 2014 /
 
Igen, ha 1024 Bájt EEPROM van, azt 0-1023 - ig lehet címezni. A 24LC16 EEPROM - ba maximum 2048 Bájtot írhatsz. Nem tudom pontosan mit értesz a karakter alatt, de gondolom számot vagy betűt, ez esetben 2048 - at tudsz irni a külső EEPROMba és 1024 - et az atmega32-be.
(#) holex hozzászólása Jún 18, 2014 /
 
Sziasztok. Van egy DS1307 RTC-m. Ha kiolvasom belőle a dátumot és az időt és elmentem, majd később ismét kiolvasom, hogy tudom kiszámolni, hogy mennyi a két dátum és idő különbsége? Mert bejátszik ugye a szökőév, meg minden. Van erre valakinek ötlete? Egyszer volt hozzá egy kódom, de az istennek nem találom, pedig ma egész nap kerestem.
(#) killbill válasza holex hozzászólására (») Jún 19, 2014 / 1
 
Idézet:
„Egyszer volt hozzá egy kódom, de az istennek nem találom, pedig ma egész nap kerestem”
Egy nap alatt meg is irhattad volna, kb 10 sor
Az a legegyszerubb, ha a dataum/ido adatodat atalakitod linearis ido formatumra (UNIX time). Ez kb. annyit teszt, hogy egyetlen szammal abrazol egy idopontot, megpedig ugy, hogy megmondja, hogy hany masodperc telt el 1970 januar 1. 0:0:0-tol a megadott idopontig. Ha mindket datumot atalakitod ilyen formatumra, akkor csak ki kell oket vonni egymasbol es megkapod a kulonbseget masodpercben.

Itt egy hevenyeszett megoldas, nem garantalom, hogy jo, de kiindulasnak jo lehet. Az egyszeruseg kedveert nem 1970 az EPOCH hanem 1984, mert az szokoev volt. Ha ennel korabbi datumokkal akarsz dolgozni, akkor valassz egy korabbi szokoevet kiindulasnak. Ez a modszer 32 bites eredmenyt ad, es ezzel nagyjabol 136 evet lehet atfogni.

  1. const int table[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
  2.  
  3. // ev - 1984 - akarmennyi
  4. // ho 1-12,  nap 1-31
  5. // ora 0-23, perc 0-59, sec 0-59
  6.  
  7. #define EPOCH 1984
  8.  
  9. uint32_t dtosecs(int ev, int ho, int nap, int ora, int perc, int sec)
  10. {
  11. int  napok;
  12.  
  13.  napok = (ev - EPOCH) * 365 + (ev - EPOCH + 3) / 4;
  14.  napok += table[honap - 1] + !(ev % 4);
  15.  napok += nap - 1;
  16.  
  17.  return = napok*86400 + ora*3600 + perc*60 + sec;
  18. }
A hozzászólás módosítva: Jún 19, 2014
(#) killbill válasza killbill hozzászólására (») Jún 19, 2014 /
 
14. sor hibas, helyesen:
  1. napok += table[honap - 1] +  (!(ev % 4) && honap > 2);
(#) holex válasza killbill hozzászólására (») Jún 19, 2014 /
 
Köszönöm, ez hasznos volt!
Amúgy a table tömb milyen adatokat tartalmaz? Honnan jönnek ezek a számok?
(#) holex válasza holex hozzászólására (») Jún 19, 2014 /
 
Közben rájöttem
Amúgy nekem bőven jó 2000-től kezdeni a számolást, az évszámnak meg amúgy is csak az utolsó 2 számjegyét tárolom (2014 esetén 14-et) tehát én ezt az EPOCH-os dolgot ki is hagyhatom, ugye? És akkor így fog kinézni a kód:
  1. const int table[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
  2.  
  3. uint32_t dtosecs(int ev, int ho, int nap, int ora, int perc, int sec)
  4. {
  5. int  napok;
  6.  
  7.  napok = ev * 365 + (ev + 3) / 4;
  8.  napok += table[honap - 1] +  (!(ev % 4) && honap > 2);
  9.  napok += nap - 1;
  10.  
  11.  return = napok*86400 + ora*3600 + perc*60 + sec;
  12. }
(#) holex hozzászólása Jún 19, 2014 /
 
És még annyi, hogy a
napok = ev * 365 + (ev + 3) / 4;
sor helyett lehet írni
napok = ev * 365 + (ev + 3) >>2;
ezt is, nem? Elvileg ugyanazt jelenti és a shiftelést valószínű gyorsabban végrehajtja mint az osztást.
(#) killbill válasza holex hozzászólására (») Jún 20, 2014 /
 
Akkor jelenti ugyanazt, ha bezarojelezed:

ev * 365 + ((ev + 3) >> 2);

A muveleteknek kulonbozo precedenciaja van.

Amugy egy rendes fordito magatol is tudja, hogy neggyel osztashoz nem osztorutint hiv, hanem shiftelest.
(#) holex válasza killbill hozzászólására (») Jún 20, 2014 /
 
Köszi!
(#) csabeszq válasza holex hozzászólására (») Jún 20, 2014 /
 
Idézet:
„Elvileg ugyanazt jelenti és a shiftelést valószínű gyorsabban végrehajtja mint az osztást.”


A XXI. században a legtöbb fordító képes automatikusan megállapítani, hogy /4 helyett shiftelni is lehetne, sőt amikor 256-tal osztasz egy 16 bites számot, akkor nem is shiftel, hanem a felső byte-ot veszi. 16-tal való osztásnál meg az alsó és felső félbájtot cserélgeti.

A hozzászólás módosítva: Jún 20, 2014
(#) Droot hozzászólása Jún 20, 2014 /
 
Sziasztok!

Szükségem lenne ATmega32-t tartalmazó projektemben óra kijelzésre. 16MHz-en fut.
Azt számoltam hogy 1024-es előosztó (TCCR1A, B-ben beállítom) és OCRH,L=15624.
Jól számoltam?
Így az ISR(TIMER0_OVF_vect); 1 másodpercenként fog lefutni?
(#) killbill válasza holex hozzászólására (») Jún 20, 2014 /
 
Az (ev % 4) helyett meg irhatod azt, hogy (ev & 3).
(#) rolandgw válasza Droot hozzászólására (») Jún 20, 2014 /
 
Miért nem használod ? Bővebben: Link
(#) Droot hozzászólása Jún 20, 2014 /
 
Sziasztok!

Roland: köszi, leellenőriztem.

Olyan problémával állok szemben, hogy egy gsm modul adatait szeretném feldolgozni. Hogy érdemes megcsinálni?
Arra gondoltam hogy az uart isr-ben dolgozom fel. Tök jó lenne de 19200 baudon kommunikál és sok feltétel, lcd kiírás lenne benne, ami idő.
Van rá korrekt megoldás?
(#) tib12 hozzászólása Jún 20, 2014 /
 
Üdv. Egy egyszerű kérdésem lenne. AVR-el szeretnék 7 szegmenses kijelzőt meghajtani. Egy mintaprogramot szeretnék kérni basic nyelven ha lehetséges. Most tanulgatom a nyelvet és nem tudom miként lehet ezt megvalósítani.
(#) kapu48 válasza tib12 hozzászólására (») Jún 21, 2014 /
 
Én még nem is hallóttam AVR + Basic IDE megoldásról?
De holtig tanúl az ember, irhatnál valami linket róla!
(#) Ivan93 hozzászólása Jún 21, 2014 /
 
Üdv!
Egy fura és bosszantó probléma megoldásában kérném segítségetek.
Egy ATmega8-as timer2-vel vezérlek egy servot. Amíg a Topi-féle programozóról kapja a tápot, tökéletesen működik (az usb-ről 5,18Volt jön). A probléma akkor kezdődik amikor 9voltos elemről 5v stabic-n keresztül táplálnám (4,98V). A servo akadozva elfordul, majd az egyik végállásban megáll és zúgó hangot ad ki. Az avr 8Mhz-es külső kristályról fut, 256prescaler a timer2-n, így ~8ms a servo vezérlőjele. (nem hinném hogy ez a gond mert egyik esetben működik így is)
Kipróbáltam másik M8-al is de ugyanezt tapasztaltam.

Minden ötletet, segítséget előre is köszönök!
Üdv: Iván
A hozzászólás módosítva: Jún 21, 2014
(#) Zsolt2 válasza Ivan93 hozzászólására (») Jún 21, 2014 /
 
Mekkora puffer kondi van a stabilizator elott es utan? Van 100nF az m8 labahoz minel kozelebb?
(#) Ivan93 válasza Zsolt2 hozzászólására (») Jún 21, 2014 /
 
Szia! Előtte 100nF, utána 1µF adatlap alapján. Az m8 lábainál a kristály mellett 22pF illetve az adc Aref-nél 10nF szintén adatlap szerint. Az egész egy kisméretű próbapanelon van (dugdosós).
Kipróbáltam a plusz 100nF-t közvetlen a 7-8as láb mellett, de sajnos nem változott.
(#) kiborg válasza Ivan93 hozzászólására (») Jún 21, 2014 / 1
 
Szia!
megránthatja a tápot, bezavarodik a vezérlő.
Induláskor megrántja a tápot szervó motorja és a 7805 "lassan" reagálhat rá.
Próbáld ki, hogy külön 5V-os stabilizátort adsz a szervónak és külön a vezérlőnek.
Illetve nincs merülőfélben az elem ?
A hozzászólás módosítva: Jún 21, 2014
(#) tib12 válasza kapu48 hozzászólására (») Jún 21, 2014 /
 
BASCOM-AVR programot használok, úgytudom az basic nyelvű. Még csak most tanulgatom ezt, lehet hülyeséget írtam.
(#) Ivan93 válasza kiborg hozzászólására (») Jún 21, 2014 /
 
Üdv!
Igazad volt, a táplálás volt gyenge. Nem csak az elem de az első hálózati táp is kevés volt. Találtam egy másik régi tápot is, ami 1,3A-t tud leadni, ezzel jól működik. (az első táp 170mA-t adott, gondoltam annyit csak nem fogyaszt a uC és a szervó, de úgy látszik mégis kevés volt).

Köszönöm a segítséget!
Üdv: Iván
(#) kapu48 válasza tib12 hozzászólására (») Jún 21, 2014 /
 
Akkor ide regisztrálj: avr.tavir.hu

És olvasd a: Tavir honlap > régi oldal > bascom könyvet.

Az alapokat meg tanulhatod.
(#) holex hozzászólása Jún 21, 2014 /
 
Nekem LM2596-tal lesz megoldva a táplálás, ami 3A-t tud, szintén szervo fog menni az AVR mellett róla. A szervó elvileg nem vesz fel 2A-nél többet, ha berakok a szervó elé egy 2,5A-es biztis, akkor nyugodtan mehet egy tápról az uC-vel, nem? Mert ha elakad a szervó vagy ilyesmi 2,5A-nél úgyis leold a bizti és nem resetel az AVR, jól sejtem?
(#) kiborg válasza holex hozzászólására (») Jún 21, 2014 /
 
Szia!
Biztosítéknak mindig van értelme (jobb félni mint megijedni) de egy tápfesz megrántás tizedmásodpercek alatt következik be, amitől újra indul a vezérlő (és keresed a programodban a nemlétező hibát), de a biztosíték még fel se fogta, hogy csinálnia kellene valamit.
Sajnos láttam már több olyan biztosítékot ami megfelelően volt méretezve, de a hirtelen rövid nagy áramlökéssel nem tudott mit kezdeni és inkább az érzékeny félvezető ment tönkre, mint a biztosíték.
Egyébként ökölszabályként ajánlhatom, hogy a teljesítményigényes dolgokat és a vezérlést legjobb külön tápfeszültségről járatni.
Az induktív terhelésekben az a jó, hogy tudnak visszalökni a táphálózatra, ez ellen viszont a stabilizátor IC nem véd és tönkreteheti az vezérlőt.
Legjobb a teljesen külön áramforrás, de már az is sokat jelent, hogy ha egy akkuról megy, de külön stabilizátora van.
(#) holex hozzászólása Jún 21, 2014 /
 
Rendben, akkor külön rakom, bár ez nem a legjobb hír, mert így két kapcsolóüzemű táp kell (35V bemeneti fesz. miatt nem használhatok 7805-öt).
(#) kiborg válasza holex hozzászólására (») Jún 21, 2014 /
 
LM317 és két ellenállás ? A vezérlőnek nincs nagy áramfelvétele, szerintem nem fog melegedni.
Egyébként a 35V a 7805 maximális bemenő feszültsége, szóval még az is elvihetné, de inkább LM317.
Következő: »»   608 / 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