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
Sziasztok!
Korábban írtam, hogy szeretnék egy potméterrel állítható időzítőt is készíteni a kapcsolásomban. Az egyik ADC bemenetre teszek egy 10k potit. Ez eddig rendben. Viszont a referencia lábakkal mit kell teni? Oda is kell fesz. osztó, hogy a referencia a 2,5V legyen és ne 5V? Vagy nem számít, hogy a bemenet sosem éri el az 5V-t?
De, ha jól sejtem akkor elég lenne nekem a 2,56V belső referencia is. De azért érdekel, hogy mi a helyzet, ha külsőt használok.
Egyébként az ADC eredményét, hogyan tudom felhasználni a TIMER0-ban? Az eredmény arra kellene, hogy hány percig tartson egy késleltetés. Vagy ehhez nem szükséges TIMER elég, ha írok hozzá egy saját delay függvényt?
Elnézést! Még egy és befejezem a blogolást:
Az ADC konverzióra úgy vagy szükségem, hogy nem kell állandóan futnia. Ez a poti nem egy állandóan tekergetett poti lenne. Elvileg egyszer be van állítva és kész. Nos oly módon szeretném használni, hogy mikor szükségem van az iőzítőre előtte megnézem az ADC-t (poti állását) és ezután fut le a visszaszámlálás. Más esetben nincs rá szükségem. [off] Mielőtt még megkérdezitek: Azért nem szoftveresen állítom az időt mert több helyre is szánom ezt a panelt és mindenhol más-más időzítés kell. Van ahol nem kell van ahol 2perc vagy 8perc, de 10perc.
Egy kis infó adc-hez: AVR ADC
Habár én inkább beraknék egy kijelzőt és egy enkódet, és mindent menüből lehetne állítani.
Köszönöm megnézem.
Ennél a kapcsolásnál nem cél sőt hátrány és fölösleges az LCD. Vannak még ilyen esetek. Szerk.: Ez nem az amit szeretnék Eddig én is eljutottam.
Arra ügyelj, hogy a referenciád legyen több, mint a lehetséges max fesz a bemeneten. Tönkre nem fog menni, hogyha betartod az abszulút tolerancia határokat, csupán telítésbe megy a mért értéked már esetleg félúton.
Az ADC eredményét eltárolod, majd csinálsz vele késleltetést. a _delay_ms() függvényt viszont, hogyha egy runtime változóval hívod meg, az nagyban növeli a kódméretet. dobd be egy while loopba és a while loopnak add meg hány ms késleltetést akarsz.
Nem kellene melegednie.
Nem tudom amúgy hogyan kötötted be a ledeket, de mindig úgy érdemes, hogy a katódját kötöd az AVR-re, így kevésbé terheled a kimenetét. Ekkor persze kell előtét ellenállás, mert amúgy kidurranna a LED.
Az időzítő lejártakor a D1 lábat magasra állítja.
Az aref bekötése és leírás: #1195608 hozzászólásomban.
Sziasztok,letöltöttem ezt a processing nevű programot , amivel ábrázolni lehet az értékeket.
egy gyorsulás mérőt szeretnék kipróbálni de nem használtam még ezt a programot. Valaki tud ebben segíteni? Köszönöm.
Sziasztok! Egy nem várt -első látásra banálisnak tűnő- jelenséggel szembesültem AVR-GCC-ben, és nem találtam rá megoldási javaslatot.
A következő -leegyszerűsített- kódot fordítom le:
A fordító azonban minden optimalizációs szinten úgy fordít, hogy a végtelen ciklusba lépve, a "case" feltételvizsgálat nélkül (és a késleltető for nélkül) megtörténik először a "holter_mode_actual" értékadása. Ezek után a program futása a c programnak megfelelő. Amit nem sikerült megfejtenem, hogy miért fordulnak be az értékadó utasítások közvetlenül a for ciklus előtti, inicializáló értékadás után? Disassembly listám itt található: Disassembly Megjegyzés: próbáltam már enum helyett konstanssal, switch helyett if-fel, kommentek eltávolításával, különböző gcc verziókkal, stb. de az eredmény ugyanaz. Előre is köszönök minden hozzászólást! Peti
Nem néztem végig, de az enum deklarációd valahogy nem oké. Ez alapján készítsd el Bővebben: Link
delay.h-val mi a problémád egészen pontosan?
Szia!
Típust definiáltam, azért tér el az általad küldött linkben szereplőtől. Enum helyett sima konstansot használva is teljesen ugyanaz a tünet. Én is az enumra gyanakodtam először, de sima
esetén is ugyanaz történik. Peti
Aztán észre vettem, hogy van névtelen enum is (a lap alján van). Szval nem ott van a gond. Ami viszont szintén furcsa (nem láttam még ilyet mint az enum esetében), hogy a case-nél {} operátorokat használod. Enélkül is azt csinálja amit kell.
RE: delay.h-val mi a problémád egészen pontosan?
Szia!
Köszönöm válaszod, minden tipp jól jön! A {}-t csak kínomban tettem oda, anélkül is ugyanaz. Meg if-fel is ugyanaz. Bocs, a delay.h kérdésre nem válaszoltam: egyik ismerősöm szimulátorban kutatja a jelenség okát, ahol nem valós időben fut a delay rutin, ezért cseréltem ki. A várakozás magja csak memóriaszemetet termel, nem lényeges. Peti
Bocsi, hogy így bele kötök mindenbe, de tényleg nem látom okát, hogy miért nem működik.
C szimulátor AVR Studioban? Asszem meg van a hiba . Élesben az eszközön próbáljátok ki, és használjatok delay függvényt. Asm szimulátor se hibamentes, de az legalább használható. Én C szimulátorban egyetlenegy programot se tudtam rendesen végig szimulálni.
Ha jól értem a kérdésedet:
itt feltölti az enum értékkel az R21 és R20 regisztert, hogy később megspóroljon egy-egy utasítást:
illetve
ha előtte nincs az értékadás, akkor utána nem egy hanem két-két utasítás kellene:
illetve
Az egész azért van mert közvetlenül nem lehet memóriának értéket adni, csak regiszteren keresztül. Az alábbi kódrészlet optimalizált változata:
Köszönöm a válaszokat!
sgt: az eszközre is ugyanazt fordította. De az ismerősömnek nem volt hol futtatnia. dc001: ezek szerint csak a debugger "hibája", hogy utasításonkénti léptetés esetén úgy látszik, mintha a feltétel vizsgálata nélkül elvégezné az utasítást, tehát teljes értékadás történne. Valóban, nem figyeltem meg, hogy ott csak regisztert ír, holott a volatile típus miatt állandóan a memóriában kell tartania, s az máshol történik meg. Mindannyiótoknak nagyon köszönöm, hogy foglalkoztatok a problémával, nagyon sokat segítettetek!
Sziasztok!
Még egy dolog van amit nem igazán látok át. RS232-n keresztül szeretném az AVR 1-2 változójának az értékét módosítani. Például a következőre gondolok: Legyen egy LED. Úgy írom meg a programot, hogy óránkét 5 percre bekapcsolja a ledet majd ki. Ezt a kódot felprogramozom az AVR-re. Később, hogyan tudom megvalósítani, hogy újraprogramozás nélkül RS232-n keresztül mondjuk módosítom, hogy óránként ne 5 hanem 10 percre kapcsoljon be a LED. Vagy ne óránként hanem 30 percenként 1 percre?
Addig oké, hogy RS232 és azt is tudom, hogy kell legalább a belső EEPROM.
Csak nem látom át nem értem, hogy hogyan van ez. Példakódot kerestem, de sikertelenül. Vagy nem figyeltem.
Jönnek a bitek rs232-n. UDR-ből amit kiolvasol, azt elmented az eeporom.h-ban lévő függvények valamelyikével, amit majd szintén az ebben lévő függvény valamelyikével tudod kiolvasni. Arra kell figyelni, hogy a legelső bekapcsolást is lekezeld.
A #1192171 hozzászólásomban linkelt cikkben és onnan letölthető forrás kódban nézd meg a SIGNAL(SIG_UART_RECV), isRxCmd(), getRxData() és process_command() függvényeket.
Itt találsz mintát üzenet fogadására, feldolgozására és eeprom-ba történő elmetésére a soros portról. Az alábbi rész kihagyásával (SIG_UART_RECV-ből) RS232-n is használható RS485 helyett.
Ha kérdésed van ezzel kacsolatban írj nyugodtan.
Üdv mindenkinek!
2009-ben feltettem ezt a kérést, de azóta sem kaptam rá választ. most ismét előtérbe került a csengő, mert szeretném megcsinálni. Előre bocsátom, hogy a programozásban gyenge vagyok. A Kapcsolásokban\csengő- leírásban, Topinak csengőjét szeretném megcsinálni. Úgy szeretném megoldani, hogy egy dallamot tudjak beprogramozni az AVR-be. Olyan gondom van, hogy az AVR Studioval nem bírom lefordítani a main.c file-t. Próbáltam egy egyszerű villogó kódját is lefordítani, amit szintén Topi készített, de nem megy. Hiába állítom be a frekvenciát, portot, STK500-at. Szerintem programozó nélkül is menni kellene a fordításnak, de nem hajlandó. Valamit nagyon elrontok, de nem tudom, hogy mit. Ezt a hibát írja ki. rm -rf main.o elso.elf dep/* elso.hex elso.eep elso.lss elso.map Build succeeded with 0 Warnings... mmcu=attiny45 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT main.o -MF dep/main.o.d -c ../csengo/main.c /usr/bin/sh: -Wall: command not found make: [main.o] Error 127 (ignored) Build succeeded with 0 Warnings... Kérlek benneteket, hogy segítsetek. Köszönettel! oregharcos
Segítünk, csak tedd fel a forrás kódot .
Ezt nézted: Bővebben: Link ?
blackdog várja a segítséget.
blackdog: egy kis támpont:
De ez csak egy vázlat, ehhez nem muszáj ragaszkodni. Még sokféleképpen meg lehet oldani, ami teljesen rajtad áll, és hogy hogyan képzelted el.
Sziasztok!
Találtam egy lib-et az LCD kezeléshez gondoltam kipróbálom. De sehogyan sem jött össze. Az LCD-t AVRDuino laphoz kötöttem hozzá. Simán feltöltöttem a programot, de azon kívül, hogy tudom állítani a kontrasztot és ki/be kapcsolni a háttérvilágítást semmi nem történik. Az lcd.h file-ban beállítottam, hogy melyik porton vannak az LCD kivezetései, de semmi akár hova is teszem nem jelenik meg semmi. Én szúrtam el valamit vagy az LCD halt meg? stg, dc001 Köszönöm az iránymutatást most csak ennyi kellett. Eltettem magamnak.
Szia Gtk!
Először ezt próbáltam lefordítani.
Innen másoltam: Bővebben: Link (Moderálás: Máskor használd a kód beillesztést légyszíves. Köszi, -- Topi)
Van feltelepítve WinAVR ?
Sziasztok!
Szerettem volna egy Atmega168-at felprogramozni. STK500 programozóm van tőle: Bővebben: Link Fejlesztő környezet AVR Studio 5.1. Op. rendszer Win7 64bit. FTDI driver elvileg a legfissebb. Az AVR Studio felismeri az STK500-at, de mikor csatlakozni szeretnék hozzá akkor ez a hiba üzenet jön: Timestamp:2012-03-30 17:34:06.928 Severity:ERROR ComponentId:20000 StatusCode:0 Unable to connect to tool context: 'Atmel.VsIde.AvrStudio.Services.TargetService.TCF.Internal.Services.Remote.ToolProxy+ToolContext'. Vajon miért? Úgy viselkedik mintha mégsem lenne csatlakoztatva az STK500. AVR Studio 5.0 és 4 ugyan így nem áll vele szóba. Próbáltam COM1 - COM10 között mindenhol. |
Bejelentkezés
Hirdetés |