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
3)
Ja és persze eszedbe se jusson malloc-ot/free-t interruptból hívni. AVR alatt a malloc/free értelemszerűen nem threadsafe.
Sziasztok
egy kis segitség kellene a 4 soros LCD display vezérlésére ASM-ben. Nem tudom, hogy hogyan kell a kursor ill. a karakter helyét pontosan meghatározni. (mit kell mikor átkapcsolni a displayen). Az elsö sort már szépen kezelem, de a többivel még bajban vagyok. Van erre valahol valami mintaprogram? Kösz Kösz
Sziasztok!
Az interruptok között van prioritás? Tehát mondjukna hardware interrupt magsabb prioritású mint egy pl: 100ms-re beállított timer interrupt?
Találsz itt leírást lcd kezelésre pont az avr cikkek között, ha jól emlékszem akkor ott le van írva hogy 4 v 8 bites vezérlés esetén milyen parancsokat kell kiküldeni.
Az igen, csak maga a sorkezelés mindenhol mellözve van - vagy nem értem
![]()
Bocsánat nem az AVR cikkek, de a keresőbe az LCD betűkombinácót bevésve a következőket találtam:
Az intelligens LCD modulok használata - I. rész Az intelligens LCD modulok használata - II. rész A második részben megtalálod amit keresel, de mindenféleképpen szaladj végig az egészen, tisztába fogja tenni a dolgokat!
Kösz ezeken má régen tul vagyok, inkább egy példa kellene, hogy hogyan is néz ki a sor-és helykezelés egy ilyen esetben.
Pl. Ebben a formában a "hobbi elektronika" szöveget-szeretném kiirni 2 sorba, szimmetrikusan:
Igy ahogy van egy sorba kiirja , ha nem is az egészet. Kösz!
Szia !
Az adott uP datasheetjében megtalálod az IT listát. Az a sorrend. Milyen a uP ? Sanyi
32 v 8 lesz! Egyenlőre 32-esen dolgozok, majd utána szeretnék 8-ra átállni kisebb így is marad üres port rendesen. A dolog ennyi: Jön egy HW interrupt elindít egy számolót lefele 10-től, vagy 30tól. Ha mielőtt eléri a 0-át jön egy másik HW IT akkor felvillant egy led-et, megállítja a vissza számolást. Ha nem érkezik be ez az IT akkor ha eléri a 0-át akkor tiltódik a vissza számolás és felvillant egy másik led-et.
HW IT0 -> sei HW IT1 -> cli Közben pedig egy timer végzi a számolást. A hozzászólás módosítva: Szept 16, 2013
A sorok cimeit kell valtogatnod. SorCimek
mod: Itt van egy kesz driver is ASM-ben: hd44780-assembly-driver A hozzászólás módosítva: Szept 16, 2013
Üdv!
Egy ATmega8-al egy DS1624 hőmérő(és termosztát) IC-t akarok lekérdezgetni és kiírni UART-ra. A 2wire kommunikációt leprogramoztam, de start állapotba billentésen nem megy tovább a programom. Az a gyanúm, hogy az SCL órajelem nem jó. A mikrovezérlő egy külső kvarcról jár 7,3728MHz-en(UART miatt a freki). A DS1624 doksijában az áll, hogy 100 vagy 400KHz-en szeret menni, én úgy gondoltam, hogy a standard 100KHz nekem jó lesz. Az ATmega doksijában szereplő formula szerint (SCL=MCU_Freki/(16+2*TWBR*4^TWPS)) arra jutottam, hogy jelen helyzetben a legideálisabb nekem a 9-es TWBR lesz és a 64-es előosztás, tehát a TWSR mindkét PS bitje 1. Lehet én értek valamit mocskosul férre, de így sem jutottam előrébb a dologgal. Kérném a hozzáértők segítségét, hogy jelen felállásban be tudjam állítani az SCL órajelet pontosan, hogy a debugolásnál kizárhassam. Köszönöm!
Van prioritás: minél közelebb van egy interrupt a 0-s RESET címhez annál nagyobb a prioritása.
Atmega328P alatt az ADC a 0x2A címen van, míg a TWI a 0x30-on. Nálam olyan hiba fordult elő, hogy lassú volt az ADC kezelő interruptom és mire végetért, addigra a következő ADC megérkezett. Azaz: amint kilépett az interruptból végrehajtott egy utasítást és visszalépett az interruptba. Minthogy a TWI prioritása alacsonyabb volt, így sosem hívódott meg. A prioritáskezelés akkor fordul elő, amikor két interrupt egyszerre történik. Egyébként a sorrendiség számít, ami előbb történik, előbb hajtódik végre.
Sziasztok!
Ezen leírás alapján készítek saját DS18x20 kezelést. Bővebben: Link Már minden szép és és jó csak a felbontással nem boldogulok. Tudom, hogy alapból 12bit és állíthatom 9-10-11-12 között. Azt is tudom, hogy a Scratchpad írása a 0x4e címen van. Azt is tudom, hogy itt 0x1F -et kell beállítanom, ha pl. 9 bit felbontást szeretnék. A leírásban van olyan függvény, hogy therm_write_byte. Viszont nem bírok rájönni, hogy hogyan tudom a gyári 0xFF helyett a 0x1F-et beállítani. Nagyon örülnék, ha valaki tudna segíteni. [off] Elnézést a kérdésért, de nem C programozásból élek csak tanulgatom, ha időm engedi.
Kösz, ilyesmit kerestem. Holnap ki fogom probálni
Sziasztok
Érdeklődnék, hogy van e mód hex filet vissza fejteni asm be, annak érdekében hogy a a ciril felirat helyet magyar legyen? Köszönöm a válaszokat. Üdv Lajos
Vicces lenne ha az érkezési sorrend számítana!
![]() Ehhez nem is lenne elég egy regiszter, egy egész várakozási sor kellene ami biztos nincs az AVR-ben! 1. szabály: ha egyszerre (egyazon ASM utasításon belül) érkezik két interrupt, az utasítás végrehajtása után a magasabb prioritású(kisebb ugráscímű) hívódik meg. 2. szabály: ha a globális interrupt(SREG I flag) tiltva van, a tiltás közben "összegyűlt" interruptok közül az engedélyezés után legelőször a magasabb prioritású, még aktív interrupt hívódik meg. Ez utóbbira az a magyarázat, hogy ha a várakozó interrupt meghívása előtt a flag-jét törlik vagy maszkolják, akkor az már nem fog meghívódni. 3. szabály: interrupt meghívásakor a globális interruptok tiltódnak, végetérte után engedélyeződnek. Interrupton belül is lehetséges az engedélyezés(sei utasítás), de aki nem biztos a dolgában, ne tegye! 4. szabály: az interrupt meghívásakor az interrupt flag törlődik Kis háttér: minden interrupt forrásnak van interrupt flag-je, ami "normál", tehát megszakításmentes programban is használható. Jó példa erre az UART RxC vagy UDRE flag. Tartozik még egy interrupt maszk is, szintén 1 bites, amivel az adott eszköz/forrás interruptja engedélyezhető vagy tiltható. A timer esetén a flag-ek és maszkok külön regisztert kapnak: TIFR, TIMSK; egyes AVR-ekben minden timerhez különálló regiszterpár(TIFR1, TIMSK1). Akkor hívódik meg az interrupt, ha 1: interrupt flag 1-es állapotban van(szintvezérlés!) 2: az interrupt maszk 1-es állapotban van 3: a globális interruptok engedélyezve vannak 4: nincs magasabb prioritású interrupt várakozó állásban Az interrupt flag az interrupt hívásakor törlődik. Ezen kívül egyes esetekben valamely kapcsolódó regiszter olvasása és/vagy írása, illetve az interrupt flag-be történő 1-es írásával(!!!) is törlődik. Ezekre szintén az UART a jó példa: az UDR kiolvasásakor törlődik az RxC flag, írásakor (a küldés idejére) az UDRE fog törlődni. A TxC csak kézzel vagy a kapcsolódó interrupt hívásával törölhető. A hozzászólás módosítva: Szept 16, 2013
Persze! AVR Studio-ban a hex-et kell megnyitni, ehhez projektet ajánl fel, majd kiadja a
visszafejtett sorozatot. Hátránya, hogy a visszafejtés nem egyértelmű, egyes adatbájtokat is kódként értelmez, illetve néha bugos is a rendszer.
Sejtettem, hogy nem lesz egyszerű kiigazodnom az IT-k között. Akkor azt kérdezem, hogy így működhet-e:
HW INT0 -> kezdi a visszaszámlálást (sei) HW INT1 -> tiltja a visszaszámlálást (cli) ezeken kívül persze lenne más pár apró dolga, de dióhélyban ennyi.
Simán.
A 2 INT alprogramot defilialod. Engedelyezed a timert. eleje: do-loopp semmitteves INT beesik: indítás. int2 beesik: leallitas Ha atimer regisztert kiolvasod es nem megy, akkor INT tiltas, adatfeldolgozas (timer kiolvasas), INT engedelyezes, a feldolgozas folytatasa... Utana mars eleje Az INT tiltas kozben: a kiolvasaskor nehogy rainditson!
A 18B20 eseten a 9 bit az alap!
12 bitesre TE allitod at!
Én alapvetően DS18S20+ érzékelőt használok, de a leírásban is az van, hogy 12bit az alap felbontás és az adatlapokban is.
De a kérdésem pont az, hogy hogyan tudom ezt át állítani bármi másra az IC-ben.
A Leírásban ez áll:
DS18S20 High-Precision 1-Wire Digital Thermometer http://datasheets.maximintegrated.com/en/ds/DS18S20.pdf FEATURES Unique 1-Wire® Interface Requires Only One Port Pin for Communication Each Device has a Unique 64-Bit Serial Code Stored in an On-Board ROM Multidrop Capability Simplifies Distributed Temperature Sensing Applications Requires No External Components Can Be Powered from Data Line. Power Supply Range is 3.0V to 5.5V Measures Temperatures from -55°C to +125°C (-67°F to +257°F) ±0.5°C Accuracy from -10°C to +85°C 9-Bit Thermometer Resolution Converts Temperature in 750ms (max) User-Definable Nonvolatile (NV) Alarm Settings Alarm Search Command Identifies and Addresses Devices Whose Temperature is Outside Programmed Limits (Temperature Alarm Condition) Applications Include Thermostatic Controls, Industrial Systems, Consumer Products, Thermometers, or Any Thermally Sensitive System Nem tudom, hol látsz te 12 bitre utalást?
Ebben valóban nincs benne. Amit én linkeltem leírást abban benne van.
A Scratchpad kiolvasva a Configuration register 0xFF ad vissza. Így 12bit kell, hogy legyen mert én nem állítottam át. Nem is tudom pont ezt szeretném megtudni. ![]()
Príma, köszönöm a segítséget. Az hogy a tiltás vagy az engedélyezés egymásba fusson nem lesz lehetséges maga a hardware miatt.
Nem értem, amit csinálni akarsz.
INT0 - SEI -> eddig ok INT1 - CLI -> ez sem gáz, mert a függvény végén kilépésnél a RETI visszaírja SEI-re, így kilépéskor az interrupt már engedélyezve lesz. Leginkább a NOP utasításra hasonlít (ne csinálj semmit). De ennek mi köze a számlálóhoz? Emellett, ha a CLI-t sikeresen ki is adnád, utána sem az INT0, sem az INT1, sem semmi más interrupt nem fog meghívódni (erről szól az interrupt letiltása). Nem lenne jobb inkább az órát leállítani? A hozzászólás módosítva: Szept 17, 2013
18S20:
Sehogy. A mérésre hagyott idő határozza meg az adat pontosságát. 93msec: 9bit, 250 msec: 12bit pontosságú.
Igen!
blackdog doksija 13. oldal: CONFIGURATION REGISTER irása Table 3.6.B és Table 3.6.C olvasás várakozás.
Mit jelent ez az 'Igen!'?
Hibás a leírás? És nem tudok konfigurálni? |
Bejelentkezés
Hirdetés |