Fórum témák
» Több friss téma |
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
Igen, ha normál módban használod, akkor neked kellene a TCNT nullázásával foglalkozni. De erre van a CTC mód, ami ezt automatikusan megteszi.
Tiszteletem!
Érdeklődnék, hogy egyedüli problémával állok-e szemben. Már a 3. Atmega644-20PU-t vettem meg, amit a programozó Amega644A-nak ismer fel. Lehet kapni Atmega644A-PU-t is csak az harmadával olcsóbb. Feltettem az üzletnek is a kérdést, hogy hogyan lehet ez. Válasz: Idézet: Ügy lezárva!!! Most akkor érezzem magam átverve? „A IC felirata megfelel annak típusnak amit annak megfelelő árában a németországi hivatalos ATMEL képviselő szállít. Dip-40 tokban három féle típust szállítható tőle: 644A-PU 644P-20PU illetve a 644-20PU típusokat amiből mi csak az utóbbit tartjuk. Így részünkről a keveredést kizárt. Sajnálattal vesszük, hogy az Ön áramkörében ez a végződésű tok nem megfelelően működik.”
Mivel az A-s verzió a sima "drop-in replacement" utóda minimális karakterisztikabeli különbségekkel (viszont teljesen ugyanolyan funkcionalitással), én nem foglalkoznék a dologgal. Gyanítom, hogy az összes sima végződésű megrendelésre is már az új IC-t szállítja az Atmel, mert a másikat már nem gyártják...
Sziasztok!
Egy olyan kérdéssel fordulok most hozzátok, hogy milyen parancssor képes az AVR belső időzítőjében léptetni egyet? Igazából az a tervem, hogy egy 0-(max.)15000-es percenkénti jelet szeretnék feldolgozni, tehát, maximum 250 jel másodpercenként. Ezt szeretném egy ATmega328P chippel szerelt Arduino nano egyik lábán figyelni, és számolni, hogy egy tized másodperc alatt hányszor jelenik meg a bemeneten (egy stabil 5V). Emellett számolna két jel között eltelt időt, amit arányban átszámolva, egy operátorral betudnám állítani a késleltetést. Jelentkeztem egy tanfolyamra de nem győzöm kivárni a végét, valamint mindenhol túrkálok a neten infók után.. Szeretném megtanulni az AVR-eket! WINAVR-el próbálkozok C nyelven! Köszönöm előre is! Üdv!
Mi a legjelentősebb különbség a két típus között? Vagy az árral van a baj?
Magát a kérdést nem egészen értem.
A feladatot viszont megoldhatod úgy, hogy PCINT megszakítást (vagy INT-et) generálsz, amikor változik a láb. Ha felfutó az él (egybe billen a bemenet), akkor növelsz egy számlálót. Ezt az arányban átszámolva dolgot felejtsd el (ha csak nem akarsz minimumot és maximumot is nézni), hisz elég csak a kapott billenésszámmal elosztani a tizedmásodpercet, hogy kijöjjön az átlagos idő... A tizedmásodpercre pedig bekonfigolhatsz egy időzítőt, ami majd megszakítást generál neked. Ha min/maxot akarsz nézni, akkor pedig a 16bites időzítőt beállítod a kívánt felbontásra és nézheted két billenés között eltelt időt. A hozzászólás módosítva: Feb 23, 2017
Szinte semmi, pár feszszint picit arrébb van és a kisfrekis kristályokhoz más értékű kondikat javasolnak... Csak a gyártástechnológián változtattak, ezért az új modellkód.
A hozzászólás módosítva: Feb 23, 2017
Jelentősebb különbségről nem tudok. Olvastam, hogy talán az "A"-s típusok alacsonyabb feszültségről mennek. Vagyis van egy különbség a két verzió között, mármint a "P" és "A" között, hogy ha bootloader-el programozom fel a procit, akkor az "A"-s proci nem zárja le magát és akárhányszor fel lehet tölteni ugyanazt a programot, holott le csak akkor szabadna frissítést engedélyeznie, ha a feltöltendő fájl is frissül! És mint említettem a Rendelhető 644A olcsóbb is! Jeleztem a tulajdonosnak is, de ha neki így megfelel akkor nekem is. Megrendelem máshonnan.
A hozzászólás módosítva: Feb 24, 2017
Ez egy fordulatszám függő programozható előgyújtás vezérlőnek készül. Ezért fontos hogy a főtengelyfordulat ugye 360 fokos, egy ütemre, mivel 2T.. És a késleltetést úgy gondoltam, hogy a két jel közötti idő lenne a 360 fok és abból vonnám le a 10 fokos előgyújtást pl. Innen tudná mikor kell jelet adni a hall végfoknak.
Szia Jax!
Az a gyanúm, hogy fordulatszámmérőt szeretnél építeni. Megszakítás használata itt fölösleges, ha más komolyabb feladatot nem szánsz a procinak. Ne a jelek számát számláld egy adott időtartam alatt - ez rossz bevett szokás - hanem két jel között eltelt időt kell mérned, majd ez alapján meghatároznod a percenkénti jelek számát. RPM = 60 000 000 us / mért_idő Amikor pl 2 sec-ig nincs jel, akkor a ford.számot nullázod, mert nyilván magától nem fog nullázódni, mivel két jel között mindig lesz eltelt idő. Mindenképpen mikroszekundumban mérd az időt! Ezzel a logikával 1-es pontossággal tudsz fordulatszámot mérni.
Ilyet készítettem pár hete. Ha nem rendelkezel gyári szerelési könyvből származó gyújtás jelleggörbével, akkor nem tudod megcsinálni. Hozzáteszem, az előgyújtás nem csak fordulatszámfüggő, hanem terhelésfüggő is. Ezt a szívócső nyomása adja meg neked.
Bocsi, egy regényt írtam de csak két szót írt ki.. :\
Most nincs időm de majd írok!
Sziasztok!
Már elég régóta kínlódok egy olyan programmal ami egy NEC protokollt használó távirányító jelét olvassa be input capture segítségével és kiírja a beolvasott eredményt a PC terminálablakjába. Viszont nem akar sikerülni sehogy sem. ATmega16-os mikrovezérlőt használok 8Mhz-es belső órajellel és 8-as előosztással. (1MHz-el számol a Timer) Az infra vevő 38KHz-es, a távirányító pedig egy full alap car mp3-as és NEC protokollt használ. (HE Store-ból vettem) Az interneten keresgéltem különböző C nyelvű kódokat a jel feldolgozására, de eddig sehol sem találtam olyat ami input capture-t és megszakításokat használ. Pedig fontos lenne. Tudnátok benne segíteni? Köszönöm előre is. Ez eddig a saját verzióm:
A hozzászólás módosítva: Feb 25, 2017
Sziasztok,
Az Atmel MCU selector-ban nézdelődtem, és találtam valami érdekeset: Az MCU-nak 32 lába van, ebből 34 ki/bemenet. Ez hogy lehetséges? Itt találtam.
Ennek a típusnak négyféle tokozása van. 28, 32, 48 és 64 lábú. A kisebb lábszámú tokozásokban nincs mindegyik IO port kivezetve. Ez más Atmel típusoknál is szokott lenni. (Az MCU selector nem teljesen precíz.)
Köszönöm szépen a választ! Most már értem.
Itt egy SIRC protokollt feldolgozó könyvtár, amit még ATMEGA16U2-re írtam (input capture):
Header:
C:
A működése röviden:
A sony IR protokollja többféle parancsot ismer, ezeket a parancs hossza (bitben) különbözteti meg egymástól (SIRC12, SIRC15, SIRC20). Az, hogy mi jött csak a legvégén derül ki. A használatához, elsőként meg kell hívni a IRRemote_Init-et : ez konfigurálja az input capture-höz használt időzítőt. Kell írni egy függvényt, ami majd feldolgozza a kapott parancsokat. Át kell adni a IRRemote_SetCallbackFunction függvénnyel a feldolgozó függvényedre mutató pointert. pl.:
Majd:
Ez alapján szerintem már meg tudod írni a saját IR protokoll kezelődet.
Szia!
Nem írtad milyen a vevőáramköröd (pl. TSOP4838). A kész vevők fázist fordítanak, tehát, ha az adó LED működik, akkor a vevő kimenetén alacsony jelszint van. Konkrét kódot nem írok, csak a folyamatot próbálom átvenni. A főprogramban, a timer1 beállításánál lefutó él detektálás van beállítva. Ha jön az első lefutó él, akkor lefut az ISR(TIMER1_CAPT_vect) interrupt fv. Ekkor semmi érdekes adatot nem lehet vizsgálni, mert csak most kezdődött el az egész folyamat. Ekkor kellene nullázni a timert TCNT1=0; és beállítani a felfutó élre az input capture-t TCCR1B|=(1 << ICES1). A következő felfutó él esetén az ICP1 regiszterben lesz az előző lefutó él óta eltelt idő, majd meg kell nézni, hogy ez benne van-e a protokollnak megfelelő időablakban (a Te kódodban ez az időablak nagyon szűk, célszerű a protokollnak megfelelő időtől +- 20%-kal szélesebb ablakot figyelni). Ekkor megint nullázni kell a számlálót (TCCR1B&=~(1 << ICES1)), majd beállítani a lefutó élre való érzékenységet és így tovább. Szükség van még arra, hogy tudd, hogy éppen hol állsz a feldolgozással, emiatt kell egy olyan változó, amiben ezt követni lehet. Azt, hogy éppen felfutó, vagy lefutó élre vársz-e, el lehet dönteni a TCCR1B értékéből is.
Amikor beérkezik az első lefutó él ezt onnan fogod tudni, mert az ir_mode==IR_IDLE, akkor kezdődik a folyamat amit fentebb írtam. Az egészet egy switch-case szerkezetben érdemes kezelni.
Célszerű még azt megcsinálni a program kód írásakor, hogy a kódban elhelyezhetsz egy változót (debug), aminek különböző értékeket adhatsz, attól függően, hogy meddig jutott el a program, és ezt a változót a főprogramból kiküldheted a soros porton keresztül, vagy akár ebbe a változóba be lehet írni először a startjel hosszát, stb, hogy érzékelni tudd, meddig jutott el a feldolgozás (ez csak addig kell, amíg a fejlesztés folyik). Ha a folyamat rendesen eljut a végéig, akkor egy változóval jelezni kell a főprogramnak, hogy készen van a vétel, pl. ir_ok=1; A főprogram ekkor kiolvassa a vett értéket, majd újra inicializálja a folyamatot, beállítja a timert, az ir_mode változót, nullázza a vett jeleket tároló változókat, az ir_ok=0; és kezdődik minden elölről.
Köszönöm a segítőkész hozzászólásokat
![]() ![]()
Sziasztok!
Lehet kérni Tőletek egy kis segítséget? Az a problémám, hogy vettem egy eb@y-es JTAG ICE klónt. Tökéletesen lehet vele programozni, mega128-at, mega16-ot. Viszont ha debug-olni szeretnék, (rákattintok a zöld "play" gombra), kidob egy hibaüzit, hogy nem találja a programozót. A portokat 1-től 4-ig kipróbáltam, 9600/19200/115200 bps sebességekkel, mega16 és 128-at is. Minden esetben ezt a hibaüzenetet kapom. JTAGEN bitek bekapcsolva. A programozó CH340T chip-es, avrstudio 4.18SP3, C nyelvben prog. Köszönettel, Dani. A hozzászólás módosítva: Márc 9, 2017
Idézet: „eb@y-es JTAG ICE klón” Esetleg linkelnéd, hogy pontosan mit vettél? Talán úgy könnyebb.
Bővebben: Link
Ilyen. Idézet: Melyik verziót használod? „A JTAG-ICE AVR-Studio 4.x alatt támogatott, AVR-Studio 5 illetve AVR-Studio 6 alatt a támogatását az Atmel nem épített be!”
Próbáltam 4.19-el, 4.18SP3-al, most tesztelem a 4.17-et...
ui.: Ez sem látja. Hiba ugyanaz. ui2.: Hoppá. Működik! Ami máshogy csinálok: Nem kattintok a CON gombra és csatlakozok a célhoz, hanem a Build and Run-t nyomom meg. Így működik... 4.17-el. Megnézem 4.19ben is. A hozzászólás módosítva: Márc 9, 2017
Próbáltam 4.19-et,4.18at SP1-2-3. Egyikkel sem volt jó a debug. Kifagyott, nem találta a JTAG programozót.
Végül sikerült. 4.17 + winavr telepítése megoldja a problémát. Köszi. A hozzászólás módosítva: Márc 9, 2017
|
Bejelentkezés
Hirdetés |