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   685 / 837
(#) Gj hozzászólása Aug 19, 2015 /
 
Üdv!

Egy mcp2200 IC-t használok a PC-m és egy ATMega8L között. Ha adatokat küldözgetek, az mcp2200 egy idő után (pár perc, de mindig változó idő) fogja magát és leválik az oprendszerről. Többé nem elérhető az emulált soros port. Hallani is a hangot a win10-ben, amit hardver leválasztásakor (pl. pendrive kihúzása) hallat. Eszközkezelő azt írja, hogy rendben van, jól működik, de nem lehet adatokat küldeni neki.

Mitől van ez?
A hozzászólás módosítva: Aug 19, 2015
(#) csatti2 válasza Gj hozzászólására (») Aug 19, 2015 /
 
Milyen baudrate-t használsz? Mennyire telhet meg a puffere az eszköznek? Mennyire folyamatos a kommunikáció, amikor elkezdesz adatokat küldeni/fogadni? Mit használsz órajel (kristály / kerámia) generálásra? Milyen stabil , illetve tiszta a betáp feszültség? Hogy oldottad meg az USB csatlakozó összekötését a saját elektronikáddal (RC szűrő [árnyékolás és föld között], ESD védelem, VBUS leválasztás [ha saját betápja van az áramkörödnek])?

Az oprendszer akkor szokta elengedni a CDC-ACM-es eszközöket, ha a control endpoint-on nem érkezik reakció fél másodpercen belül (tiszta CDC-nél három endpoint szokott lenni, control, data in, data out). Mivel értelemszerűen te egy ilyen chip esetén nem férsz hozzá a belső részekhez, ezért a külső körülményekben kellene megkeresni a hiba okát.
A hozzászólás módosítva: Aug 19, 2015
(#) Gj válasza csatti2 hozzászólására (») Aug 19, 2015 /
 
9600-as baud rate
Kb. 3 másodperc nulla forgalom után max sebességgel megy 9 bájt oda, közben 9 bájt vissza (majd ismét 3 sec szünet és újra 9-9 bájt)

Kvarc oszcillátort használok

A tápfeszt az USB kábelen át kapja (kb. 3m árnyékolatlan kábel) az IC mellet van rajta egy 100nF-os kerámia kondi.

Az áramkör többi részével csak az RX és a TX pinek állnak kapcsolatban. (Egy ATMega8L-lel)
A hozzászólás módosítva: Aug 19, 2015
(#) csatti2 válasza Gj hozzászólására (») Aug 19, 2015 /
 
Azt akarod mondani, hogy az USB jel egy 3m-es árnyékolatlan kábelen jön? Ha igen, akkor máris megvan a válasz, hogy mi is a gond...
Egy USB csatlakozás helyes megvalósításának, azért vannak feltételei...
Csak röviden:
1, Induláskor (ha az USB-ről jön a táp), max 100mA áramfelvétel, majd ha a host engedélyezte max. 500mA (különben ledobhat).
2, max. 10µF össz kapacitás (esetleg lehet több, de csak áramkorlátozással, nem lépheted túl a 100mA-t, szintén csak USB-s tápnál érvényes).
3, szükséges árnyékolás, a földnek közösnek kell lennie, az árnyék és a föld között RC szűrés (tipikusan egy 1MOhm ellenállás és egy 4,7nF kondi párhuzamosan).
4, javasolt még ESD védelem az USB IC és a csatlakozó között, a csatlakozóhoz minél közelebb.
5, szükséges lehet még (van olyan IC, amibe alapból beépítik): 27Ohm körüli ellenállások sorosan a D- és D+ ágakon, 50pF körüli kondik a D- föld és D+ föld között. Javasolt lehet ferrit (100Mhz@600 Ohm vagy hasonló) a VBUS-on sorosan.

Ha ezeket nem tartod be, akkor mindenféle érdekes élményed lehet az USB busszal.
(#) Gj válasza csatti2 hozzászólására (») Aug 19, 2015 /
 
Kívánom, hogy tényleg ennyi legyen csak a baja
Vasárnap este érek haza, majd írok, ha kipróbáltam.
Köszi szépen!
(#) dc001 válasza yoman917 hozzászólására (») Aug 20, 2015 / 1
 
"Elvileg működhetne ilyen logikával?"

Elvileg igen, gyakorlatilag nem. Van néhány gond a megvalósításoddal:

1, A flash írása page-enként történik, aminek a méretét a példa programban a SPM_PAGESIZE adja meg (ez pl.: atmega168-328 esetén 128 byte). Csak ilyen blokkokban tudod módosítani a flash-t. Ha csak 1 byte-ot akarsz átírni, akkor is el kell küldened az egész page-et. Ezt akár úgy is megteheted, hogy először a C# beolvassa az adott page-et, módosítja a kívánt byte-okat, majd vissza küldi a teljes page-et benne a módosítással. Persze ezt bele lehetne tenni a bootloader-be is, de ott általában helyszűke van, ezért az ilyen logikát inkább a PC oldalon kell megvalósítani ott nem kell a program mérete miatt aggódni.

2, A flash írása viszonylag sokáig tart és addig az AVR nem is csinál mást (elején pl. a cli(); letiltja a megszakításokat), ezért az írás befejezése után kell küldened a visszajelzést a PC-nek.

3, A bootloader a flash végén van, amit vele módosítani akarsz: a fő programod az elején. Ami fontos, hogy a megszakítási vektorok is a flash elején vannak, vagyis a bootloader-ben ne használj megszakítást (pl.: USR(USART_RX_vect)-et)!

4, Amire még figyelni kell, hogy a fuse bitekkel ne legyen letiltva a flash írása (és lehetőleg ne legyen fuse-ból bekapcsolva a watchdog sem, nehogy írás alatt reset-eljen).

Én a helyedben két külön programot készítenék:
1, Magát a bootloader-t, amelyet ISP-s programozoval fel kell tölteni az AVR-be.
2, A főprogramot. Ezt már ISP helyett a soros porton a bootloader-eddel is feltöltheted vagy módosíthatod. Ehhez már nem kell hozzáfűzni a bootloader-t (srec_cat), csak arra kell figyelni, hogy ne legye olyan nagy, ami már "rálóg" a bootloader területére.

A lényeg, hogy lehetőleg ne keverd a kettőt. A kettő között csak annyi a kapcsolat, hogy frissítés végén a bootloader elindítja a főprogramot.

A fordítás végén létrejött hex file-t egyszerűen be tudod olvasni a C# programoddal, mert nem túl bonyolult az formátuma:
https://hu.wikipedia.org/wiki/Intel_HEX
Ekkor a főprogramodat is tudod frissíteni bootloader-en keresztül, illetve annak egy részét is pl.: csak az általad említett táblázatot, de ez már a vezérlő C# megvalósításán múlik.
A hozzászólás módosítva: Aug 20, 2015
(#) magery hozzászólása Aug 21, 2015 /
 
Sziasztok!

Van egy pár 433MHz-es adó vevő modulom, FS1000A(adó) és XY-MK-5V(vevő). Ezekkel szeretnék szoftveres UART-on keresztül adatokat küldeni és fogadni. PIC-el már működik rendesen és most AVR-el is szeretném megcsinálni BASCOM-ban, de sajnos nem működik rendesen. Már elég sokat keresgettem róla, de valahogy nem akar rendesen működni. Mindenféle fals adatokat olvasok ki a vevőből. Tud valaki segíteni nekem, talán már van akinek sikerült biztonságosan megoldani ezt? Előre is köszönöm.

Így küldöm:

Open "comb.1:2400, 8, n, 1, inverted" For Output As #1
Printbin #1 , Serdata
Close #1

Így fogadom:

Open "comd.2:2400, 8, n, 1, inverted" For Input As #1
Inputbin #1 , Serdata
Lcd "Serdata:" ; Serdata
Close #1
A hozzászólás módosítva: Aug 21, 2015
(#) gerry válasza magery hozzászólására (») Aug 21, 2015 /
 
Szia! >>ITT<< és >ITT< is van egy egy letőlthető program bascomban. Hátha
(#) fifadani hozzászólása Aug 21, 2015 /
 
Sziasztok!
Ismerkedtem az UART szépségeivel. Sikerül karakterekből álló tömböt billentyűzetről eljuttatni egy m8 uC-be... Azaz, ha egy megfelelő "azonosítót" gépelek be, akkor OK-al válaszol az uC.
A kérdésem a következő. Ha vásárlok (eb.y khm, külföldről) 433,92 MHz-es modulokat, amiket szintén lehet UART-al vezérelni, megtudok-e valósítani egy olyan rendszert, hogy 1 master és 2-3 slave egység kommunikáljon az éterben?

Pl, egy helyiségnek több pontján hőmérsékletet mérni... Gondolok itt pl., egy olyan megoldásra, hogy a master küldi ki az azonosítót, hogy melyik végponttal szeretne kommunikálni. Ha lezajlott egy kom., akkor megszólítja a következő egységet. (Természetesen így a master és a slave oldalon is lenni-e kell egy adónak és egy vevőnek....)

Szóval, szerintetek halott ötlet, vagy lehet belőle egy működő "rendszer"?

Köszönöm szépen!
A hozzászólás módosítva: Aug 21, 2015
(#) magery válasza gerry hozzászólására (») Aug 21, 2015 /
 
Az első linken hardveres UART-ot használ, tehát kilőve. A második pedig ugyanúgy printbin-t és inputbin-t használ mint én. Igaz ő még megfűszerezi egy manchester kódolással is. Holnap megnézem szkóppal is az adót, hátha közelebb kerülök a megoldáshoz.

Köszi.
(#) magery válasza fifadani hozzászólására (») Aug 21, 2015 /
 
Szia!

Én is hasonló kommunikáción töröm a fejem. Ha találok rá bombabiztos megoldást, megosztom veled.
(#) fifadani válasza magery hozzászólására (») Aug 21, 2015 /
 
Ühm, most láttam csak. Okés, köszi szépen.
(#) 06smici válasza fifadani hozzászólására (») Aug 21, 2015 /
 
Szia.
Ha mindnekép akarsz uC-t rakni a slave oldalra is akkor én az RS485-öt ajánlanám. Egy filléres IC-vel megoldható az illesztése is a buszra. És akkor már csak arra kell figyelni, hogy egyszerre több device ne beszéljen a buszra.
(#) csatti2 válasza magery hozzászólására (») Aug 22, 2015 /
 
A machester kódolás biztosítja, hogy ne mehessen el az olcsó eszköz szaturációba (például több nulla vagy egy egymás után "beragaszthatja" az eszközt egy rövid időre) , elég fontos ilyen adó vevőknél a használata (emellett garantált a jel váltakozása, így jobban szinkronizálható a vett jel).
(#) csatti2 válasza fifadani hozzászólására (») Aug 22, 2015 / 1
 
Természetesen lehet működő rendszer, hisz a legtöbb buszos kommunikáció pont így működik (több master eszköz esetén valamilyen token adogatással vagy hasonlóval megspékelve, de erre itt szerintem nincs szükség).
Az egyetlen feltétel, hogy csak a master kezdeményezhet kommunikációt (a salve csak válaszolhat a lekérdezésre), illetve javasolt valamilyen CRC algoritmus az esetleges hibás csomagok kiszűrésére.
(#) csatti2 válasza 06smici hozzászólására (») Aug 22, 2015 /
 
Vagy kihasználja a gyakran beépített multi-processore communication mode-t és megoldja ugyanezt a funkciót a mikrokontroller hardveresen mindenféle kiegészítő IC nélkül...
(#) Max26 hozzászólása Aug 23, 2015 /
 
Sziasztok!

Feszültséget mérés: 3.7V-os akkumulátor mérése.

Ha az AVR 4.2V-ról üzemel, de használni szeretném az ADC-t, akkor elég ha rákötöm a VREF lábat a +4.2V-ra? A forráskódban meg a 4.2V-os referenciát definiálom fesz. méréshez.
Kell-e nekem 10k felhúzó ellenállás fesz méréshez?
(#) csatti2 válasza Max26 hozzászólására (») Aug 23, 2015 /
 
Megírhatnád, hogy milyen mikrokontrollert szeretnél használni. Akkor könnyebb lenne jó tanácsot adni.

A 3,7V és 4,2V feszültségekből feltételezem, hogy esetleg LiPo akksiról van szó (persze lehet, hogy csak lítiumion). Mivel a maximális javasolt töltőfeszültség 4,2V ilyen akkuknál ezért jobb lenne, ha az ADC-d picit fölé tudna mérni, hogy esetleges problémánál érzékelni tudja a túlfeszültséget (rossz akku bekötése, túlfeszültség valamiért a kimeneten, stb.).

Ha a betáp feszültséget akarod használni referenciaként, akkor semmit sem kell kötnöd az AREF lábra (esetleg csak kondit, ha az adatlap azt javasolja), elég ha az AVCC (amit természetesen be kel kötnöd) feszültségét választod ki referenciának. A LiPo akksik azonban nagyon kényesek a túltöltésre (jobb esetben csak hamarabb tönkremennek, rosszabban viszont heves lángok és füstjelenségek közepette kisebb pirotechnikai bemutatóként is funkcionálhatnak), ezért javasolt nagyon pontosan mérni a töltőfeszültséget. Egy olcsó TL431 megfelelhet feszültségreferenciának (az akku feszültségét pedig leoszthatod válogatott 1%-os ellenállásokból készített feszosztóval).

Ezt a 10k felhúzó ellenállás dolgot nem értem. Szerintem te egy áramkorlátozó ellenállásra gondolsz inkább. Természetesen javasolt bemenet védelem kialakítása minden olyan bemenetre, ami külső jelekkel is érintkezik (ebben az esetben egy áramkorlátozó ellenállás és két schottky dióda megtenné [túlfeszültség védelem], az áramkorlátozó ellenállás se legyen túl nagy [a diódákhoz kell választani], mert a védődiódákon szivárgó áram hibaként jelentkezik az ADC-n [az áramkorlátozó ellenálláson feszültségesést okoz]).
A hozzászólás módosítva: Aug 23, 2015
(#) 06smici válasza csatti2 hozzászólására (») Aug 23, 2015 /
 
Szia. Erről még nem hallottam de érdekesen hangzik. És ez hardwaresen hogy van kialakítva? Mert ha a buszon az egyik slave Tx-e nullába van egy másik meg írni próbál rá akkor az rövidre zárjná az egészet. Vagy felhúzó ellenállások lennének rajta...? Megnéztem az adatlapot de nem találtam olyan blokvázlatot mmiből kiderülne.
A másik érdekes meg, hogy slave-nél csak arról ír hogy mikép fogadja az üzenetet, küldésről nincs benne szó, de pár sorral lejjebb meg már full-duplexként emlegeti a kommunikációt.
(#) csatti2 válasza 06smici hozzászólására (») Aug 23, 2015 /
 
Több résztvevő esetén a nem aktív eszközöknek (a nem megszólított slave-k) high-Z-be (nagy impedancia) kell kapcsolni a kimenetét (magyarán át kell állítani inputnak a Tx lábat). Ezen felül 1-2k-s soros ellenállásokkal biztosítható, hogy ne tudják egymást kinyírni, ha az előző feltétel mégsem teljesülne. Persze line buffer IC-kkel is megoldható a leválasztás (olyan kell, aminél engedélyezni kell a kimenetet [egyébként high-z-ben van]).
A hozzászólás módosítva: Aug 23, 2015
(#) Max26 válasza csatti2 hozzászólására (») Aug 24, 2015 /
 
Atmega32. Igen, a betápot, a +4.2V-ot akarom használni referenciaként. Li-ion akksit mérek. Tehát az AREF láb a 2.56V-os referenciának szolgál?
(#) csatti2 válasza Max26 hozzászólására (») Aug 24, 2015 /
 
Nem csak. Az AREF lábon az a feszültség jelenik meg, amit kiválasztottál az ADC regiszterein keresztül referenciának. Lehet tehát ott az AVCC, 2,56V belső referencia vagy valamilyen tetszés szerinti külső referencia feszültség (persze nem haladhatja meg a betáp feszt). Amire viszont nagyon kell vigyázni, hogy ha külső feszültséget kötsz rá, akkor nem választhatod ki se az AVCC-t, se a belső referenciát mivel akkor rövidzár alakul ki a mikrokontrolleren belül és tönkremegy tőle.
(#) pont hozzászólása Aug 24, 2015 /
 
Sziasztok! Az lehet, hogy az Attimy13-74595-ös fix összekötése miatt nem tudom programozni a kész panelon USBASP-al a kontrollert, csak kivéve, másban.
(#) csatti2 válasza pont hozzászólására (») Aug 24, 2015 /
 
Természetesen lehetséges. Ha megmutatnád az áramkört, akkor valószinűleg még azt is meg tudnánk mondani, hogy mit rontottál el. Tippem szerint, kis impedanciás terhelést használsz valamelyik programozó lábon.
(#) zombee válasza Max26 hozzászólására (») Aug 24, 2015 /
 
A +4.2V-ot inkább ne használd referenciaként, mert az tápfesz és az akku miatt (3.5-4.2V) egyáltalán nem pontos. Helyette ajánlani tudom - ahogy kolléga eggyel fentebb írta - a 2.56V belső referencia használatát. Ehhez csak egy kondit (1-100nF) kell kötni az AREF és a GND közé, az AREF lábra tápfeszt vagy valami mást nem szabad kötni! Figyelni kell rá hogy a bemenő jel amit mérni akarsz, nem lehet 2.56V-nál nagyobb. Például ha magát a tápfeszt akarod mérni, egy 1/2-es osztót be kell iktatnod.

Az AREF láb egyébként is tabu, sajnos elterjedt divat tápfeszre kötni, pedig ha nem használjuk akkor szabadon kell hagyni...
(#) pont válasza csatti2 hozzászólására (») Aug 24, 2015 /
 
Erről lenne szó: Bővebben: Link és a nyákterv:

K.JPG
    
(#) csatti2 válasza pont hozzászólására (») Aug 24, 2015 /
 
Ha jól látom (ti nem csináltok rendes kapcsolási rajzot? ), akkor az 555 kimenetét (3-as lába) kötötted ugyanoda, ahol az SCK jelet (7-es láb) várja programozáskor. A másik két jel, ahogy nézem bemenetet hajt így valószínűleg nem okoz majd gondot. Azt az átkötést próbáld meg kicserélni egy 10k-s ellenállásra (a tiny még ugyanúgy érzékeli majd a jelet, viszont így nem nyomja el majd a programozó jelét).

Lenne viszont egy kérdésem. Ha már úgyis tettél mikrokontrollert az áramkörbe, akkor mégis minek az 555?
A hozzászólás módosítva: Aug 24, 2015
(#) csatti2 válasza pont hozzászólására (») Aug 24, 2015 /
 
Lenne még pár megjegyzésem, ha nem haragszol meg. Mivel ezt a fűtésrendszeredbe szeretnéd beépíteni, így gondolom hosszú távra tervezel. Ne spórolod ki a védelmet. Legalább egy PTC-t (filléres alkatrész) tegyél be védelemnek a regulátor elé (én betennék egy üvegbiztit is). Megmentheti több napi munkád.
Nem tudom mennyit eszik majd a végleges áramkör, de elég ha csak 100mA körül alakul a fogyasztás máris 1W-ot kell majd eldisszipálnia a regulátornak (gondolom LM7805 vagy hasonló, 15V-5V = 10V, 10V*0,1A = 1W). Iszonyú meleg lesz (T = Ta + Rja * P = 90°C, 25°C környezeti hőmérséklet esetén) és nincs rajta hűtőborda, ráadásul az elektrolit kondi felé áll a regulátor (nagyon közel is van) így lelkesen fűti majd azt (hamar tönkremegy majd).
(#) pont válasza csatti2 hozzászólására (») Aug 24, 2015 /
 
Idézet:
„Lenne még pár megjegyzésem, ha nem haragszol meg.”
Ellenkezőleg. Én az elektronikát csak itt lesem/tanulom Tőletek, és tényleg nem csinálok kapcsolási rajzot

Már a tavalyi fűtésszezonban tökéletesre vizsgázott, teljesen ilyen funkciójú TTL ic-kből (74193-asokból) kapcsolás. Ott a PLC jelét 555-össel kellett formálni, hogy kellően meredek legyen, innét maradt benn az 555-t. Most másik helységben is szükség van több portra, időközben ismerkedem az avr-ekkel, ezért építettem most ebből. Gondolom az is jó ha egy jumpert teszek az átkötés helyére. A próbák során hideg maradt a regulátor, de figyelni fogom, későbbiekben majd úgy tervezek.
A hozzászólás módosítva: Aug 24, 2015
(#) csatti2 válasza pont hozzászólására (») Aug 24, 2015 /
 
Hmm, mégis milyen jel jön abból a PLC-ből, hogy formázni kell? Milyen PLC amúgy?

Persze, a jumper is jó. Ellenállással viszont elegánsabb. Meg aztán akkor látod, hogy működik és legközelebb már úgy tervezed meg az áramkörödet.
Következő: »»   685 / 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