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   560 / 840
(#) csabeszq válasza csabeszq hozzászólására (») Szept 16, 2013 /
 
3)
Ja és persze eszedbe se jusson malloc-ot/free-t interruptból hívni. AVR alatt a malloc/free értelemszerűen nem threadsafe.
(#) Massawa hozzászólása Szept 16, 2013 /
 
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
(#) tecsa hozzászólása Szept 16, 2013 /
 
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?
(#) tecsa válasza Massawa hozzászólására (») Szept 16, 2013 /
 
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.
(#) Massawa válasza tecsa hozzászólására (») Szept 16, 2013 /
 
Az igen, csak maga a sorkezelés mindenhol mellözve van - vagy nem értem (még).
(#) tecsa válasza Massawa hozzászólására (») Szept 16, 2013 /
 
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!
(#) Massawa válasza tecsa hozzászólására (») Szept 16, 2013 /
 
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:


  1. .include "m644adef.inc"
  2.  
  3. .def temp1 = r16
  4.  
  5.  
  6.  
  7.            ldi temp1, LOW(RAMEND)      ;
  8.            out SPL, temp1
  9.            ldi temp1, HIGH(RAMEND)     ;
  10.            out SPH, temp1
  11.  
  12.            rcall lcd_init              ;
  13.            rcall lcd_clear             ;
  14.  
  15.            ldi ZL, LOW(text*2)         ;
  16.            ldi ZH, HIGH(text*2)        ;
  17.  
  18.            rcall lcd_flash_string      ;
  19.                                      
  20. loop:
  21.            rjmp loop
  22.  
  23. text:
  24.            .db "hobbi elektronika",0


Igy ahogy van egy sorba kiirja , ha nem is az egészet.

Kösz!
(#) kapu48 válasza tecsa hozzászólására (») Szept 16, 2013 /
 
Nincsen!

Amelyik előbb érkrzik.
(#) tursaba válasza tecsa hozzászólására (») Szept 16, 2013 /
 
Szia !
Az adott uP datasheetjében megtalálod az IT listát. Az a sorrend.
Milyen a uP ?

Sanyi
(#) tecsa válasza tursaba hozzászólására (») Szept 16, 2013 /
 
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
(#) gtk válasza Massawa hozzászólására (») 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
(#) kapu48 válasza Massawa hozzászólására (») Szept 16, 2013 /
 
(#) karika200 hozzászólása 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!
(#) csabeszq válasza tecsa hozzászólására (») Szept 16, 2013 /
 
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.
(#) blackdog hozzászólása Szept 16, 2013 /
 
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.
(#) Massawa válasza kapu48 hozzászólására (») Szept 16, 2013 /
 
Kösz, ilyesmit kerestem. Holnap ki fogom probálni
(#) Melphi hozzászólása Szept 16, 2013 /
 
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
(#) zombee válasza csabeszq hozzászólására (») Szept 16, 2013 / 1
 
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
(#) zombee válasza Melphi hozzászólására (») 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.
(#) tecsa válasza zombee hozzászólására (») Szept 17, 2013 /
 
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.
(#) TavIR-AVR válasza tecsa hozzászólására (») Szept 17, 2013 /
 
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!
(#) TavIR-AVR válasza blackdog hozzászólására (») Szept 17, 2013 /
 
A 18B20 eseten a 9 bit az alap!
12 bitesre TE allitod at!
(#) blackdog válasza TavIR-AVR hozzászólására (») Szept 17, 2013 /
 
É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.
(#) kapu48 válasza blackdog hozzászólására (») Szept 17, 2013 /
 
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?
(#) blackdog válasza kapu48 hozzászólására (») Szept 17, 2013 /
 
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.
(#) tecsa válasza TavIR-AVR hozzászólására (») Szept 17, 2013 /
 
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.
(#) csabeszq válasza tecsa hozzászólására (») Szept 17, 2013 /
 
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
(#) TavIR-AVR válasza blackdog hozzászólására (») 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ú.
(#) kapu48 válasza TavIR-AVR hozzászólására (») Szept 17, 2013 /
 
Igen!
blackdog doksija 13. oldal:
CONFIGURATION REGISTER irása Table 3.6.B
és Table 3.6.C olvasás várakozás.
(#) blackdog válasza kapu48 hozzászólására (») Szept 17, 2013 /
 
Mit jelent ez az 'Igen!'?
Hibás a leírás? És nem tudok konfigurálni?
Következő: »»   560 / 840
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