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
Szia!
Ha csak egy kicsit lóg túl a memórián, akkor a programot átnézve sok helyen lehetne pár lépést megspórolni. Pl. az idézett részben miért számoltatod ki háromszor az -atan(xx/yy) *180 / M_PI -t...
Köszönöm a segítségeket, nem találtam gombot, begépeltem. Be is fért, de olyannyira pontatlanul számol, hogy a funkciójának tökéletesen nem felel meg, tehát kénytelen vagyok új nyákot csinálni és megpróbálni ATMega16-ossal ... akkor még a progit is át kell majd írogatnom...
A -ffast-math ezeket a kapcsolokat kapcsolja be:
-fno-math-errno -funsafe-math-optimizations -ffinite-math-only -fno-rounding-math -fno-signaling-nans -fcx-limited-range Szedd ki a -ffast-math -ot es probalkozz ezen kapcsolok kombinaciojaval, tovabb infot es leirast ezekrol a kapcsolokrol ITT talalsz.
Ezt :
Sziasztok!
Egy kérdésem lenne, az AVR Studio 4-ben hogy tudom összecsukni a kapcsos zárójeleket (collapse) mint WinAVR-ben?
Sziasztok!
Egy kódot próbálok megfejteni avr-gcc-vel fordított debug.map-ból. Első ránézésre szép Assembly utasítások vannak benne, ám a 63. sorban olyannal találkozom, hogy rjmp .-1661 Ezzel mit lehet/kell kezdeni? Előre is nagyon köszönöm!
Sziasztok
Még mindig fen ál a porláma, azért teszem fel ezt a kérdést még egyszer Készítetem egy AVR programozott Ezt a fajtát Bővebben: Link Fel is, programoztam saját magával rendben is ment minden, ahogy a cikkben van írva, Feltelepítetem a FTDI driver-t és átalítottam 2 portra, mert alapból 7-est adata neki de programozni szeretetem volna vele de, nem ismeri fel a programok (PonyProg se és az AVROSPII) ezekkel, a programokkal próbálkoztam
Szerk: HIBAS!!!
A debugger elojeles szamnak nezi(kettes komplemens) az elojel nelkuli szamot. Csak siman szamold at. Az rjmp parametere 12 bites konstans, tehat -1661 kettes komplemensben 0b100110000011 ami elojel nelkuli valtozokent 0x983.
Varjal, hulyeseget mondtam. Most nezem az utasitaskeszletet, es az rjmp elojelesen ugrik. Magyarul nem kell semmit sem atirnod, annyit jelent, hogy a 1661-1 gyel visszafele ugrik. Tehat azt az utasitast kell megkeresned, aminek a memoria cime 1660 bajttal elorebb van az rjmp utasitas cimehez kepest.
Na most jött még egy jó dolog ... Eddig xx és yy változó int típusú volt, de ez csak egész lehet, viszont xx és yy csak 1 és -1 közötti értékeket vesz fel, ezért átállítottam, float típusra.
Ezáltal már a ki // ezett ctan függvény mellett sem fér el az ATMega8-as memóriájában.
Hát pontosan ez a bajom. E0-tól vissza 1682-t.
Rögtön az elején van. Ez a kérdéses sor: e0: b7 cc rjmp .-1682 ; 0xfffffa50 <__lock+0xff7cfa50>
Amúgy köszönöm ezt a függvényt! Integráltam a programomba.
Az nem baj, hogy az elejen van. Ez egy optimalizacios lehetoseg ahol kihasznaljak azt, hogy alulcsordul a szamlalo, azaz korbeugrik. Ekkor ugy szamold, hogy a cimhez add hozza a flash meretet, es abbol vond ki a szamot.
Reeggie, szerinted egy ilyen debug map-ból ha kiszedem az elejéről a hexa kódokat, tudok Assembly nyelvű programot futtatni?
AVR Studióba szeretném átrakni. Köszönöm előre is!
Már mindegy. Nem ezzel próbálkozom. Inkább megpróbálom újra megírni.
Elvileg atviheto, a kivitelezesen mulik az egesz.
Üdv.!
Az itt általam említett programom AVR-es részével szívok egy ideje, de nagyon. A program(az AVR-re) már megvan, és tökéletesen működik, addig amíg egy terminálprogrammal küldöm neki a számokat. Viszont ha rendesen a php-ból, akkor már nem jó. Hibakeresési céllal írtam egy olyan programot az AVR-re, hogy amit kap sorosan, azt beírja az eepromba, ahonnan én aztán kiolvasom, hogy mi van ott. Így derült ki, hogy valamiért(fogalmam sincs, hogy miért) kétszer két karakter lesz a kétszer egy-ből, amiknek a második karaktere ami kell, hogy az első mi, abban meg semmi szabályszerűség nincs, volt "B", "D", meg "3" is. A kérdés az lenne, hogy hogyan tudom "levágni" a kapott adat első karakterét? Nagyon köszönöm előre is.
Sziasztok Urak,
Egy atmega8-as assemply-s kérdésem lenne, szubrutin hívás rcall utasítással valamiért nem működik, és nem tudok rájönni hogy mit rontok el, vagy hogy kellene helyesen csinálni? Ha már volt ez a téma, akkor elnézést kérek, de itt rengeteg oldalt kellene átolvasni. Előre is köszönöm a választ fater23
És mi lenne, ha mindenki számára megnyitható formátumban tennéd fel, pl. kép vagy pdf?!
Nem lehet hogy UTF16 kodolas vagy valami ilyesmi okozza a hibat?
Levagni a karaktert pedig mikor szeretned? Vetelkor, vagy eloszor veszed egy bufferbe analizalod, es utana akarod levagni az elsot? Amugy itt egy ilyen pelda(ertelemszeruen BUFFERMERET paros szam legyen):
T1_INI: csak szubrutin, igy a vegere sima ret kene, nem reti. Viszont latom, hogy T1_INI: -vel megegyezo az IDOZITT: ami megszakitasbol kerul meghivasra es ezert kene neked reti. Ezt ugy kell megoldani, hogy T1_INI: vegere sima ret-et teszel, IDOZITT:-et pedig atirod ilyenre:
Nem tudom, hogy mi okozza, levágni az AVR-ben szeretném, amikor megkapja. A kódod az mit is csinál?
Szia, köszönöm a gyors választ, átalakítottam azt a pár sort amit javasoltál, bár az az IDOZITT: címke csak egy szenvedésem eredménye hogy miként tudnám kikerülni a subrutin hívását, de attól még kellene hogy mentjen. A progi elején van a következő rész:
.org $0000 rjmp ELEJE ;reset handle .org $0008 ;timer1 tulcsordulás rjmp IDOZITT ;10 ms időzittéshez .org $0009 ;timer0 kezelés rjmp SZLM ;számlálás .def alsomaszk=r3 .def felsomaszk=r4 .def incf4bit=r5 ;felső 4 bit növelés eggyel 0x10 ldi r16,0x0F ;alsó 4 bit mov alsomaszk,r16 ;az r3-ba betölés ldi r16,0xF0 ;felső 4 bit kimaszkolása mov felsomaszk,r16 ;r4 -be ldi r16,0x10 ;0x10 betöltése a r5-be mov incf4bit,r16 ;felső fél byte incrementhez ELEJE: ;innen kell kezdeni reset után ldi r16,HIGH(RAMEND);stack pointer out SPH,r16 ; ldi r17,LOW(RAMEND) ; out SPL,r17 ;beállittása rcall T1_INI T0_INI: ;időzités kezdeti beállitása ldi r16,0x05;presclalar 1024=0x05 1 az leosztás mentesen out TCCR0,r16 ldi r17,0x00 ;ilyenkor még nem lehet int! A kezdeti stack kezelés után azonnal meghívnám a T1_INI, de átugorja és belép a T0_INI részbe. Persze, az is lehet hogy rosszul képzelem el az egész assembly működését? Az ELEJE: címke lenne a fő ág kezdete és innen történnének az oldal ágak meghívása. Ezen a szakaszon így kell működnie az rcall-nak? Eltudnád nekem mondani hogy mit kezelek rosszul? Esetleg egy pici progin keresztül megnézném hogy mit kell tenni, mert a neten csak nagyon komoly programokat találtam. Előre is köszönöm. fater
Ez a kod a buffer teruleten megtart minden masodik bajtot es eldob minden elsot, mikozben a buffer elejere rendezi a megtartottakat.
Ha csak eldobni szeretnel vetelkor, akkor javaslom csinalj egy rx_count szamlalot, amit minden egyes vetelkor novelj, viszont a vett adatot csak akkor tarold el, ha ez a szamlalo paratlan ( azaz az (rx_count&1)==1 feltetel teljesul)
Egy ic tipust mondjal kerlek. Amugy ezt debuggerrel nezed, vagy be is toltotted egy AVR-be?
Ha az utobbi, akkor mibol latod, hogy atugorja? Ha az elozo akkor a debuggolasnal ugye nem a step over gombot nyomkodod(az okozhatja azt, hogy ugy tunik neked atugorja, mert pont az a lenyege, hogy nem megy bele a szubrutinokba)?
Sziasztok!
Vettem egy Atmegát, amit, gépre rendesen feltelepítettem, látják egymást. Ki szerettem volna próbálni az egyik írt programomat és csatlakoztatás után (AVR-ben), .hex file betöltése közben (EEPROM részben a Program gombra katt) ez fogadott: Get isp parameters: Command of no use for AVR JTAG! FAILED! OK Reading EEPROM input file.. OK Setting device parameters for jtag programming ..OK Entering programming mode.. OK Programming EEPROM .. OK Reading EEPROM .. OK WARNING: EEPROM address 0x0001 is 0x80 (should be 0x94).. FAILED! Leaving programming mode.. OK Ezzel együtt egy hiba üzenet is fogadott: JTAG Mode ERROR Egyszer-egyszer hiba nélkül lefutott és elvileg beletöltötte a mikrokontrollerbe a programot, de a ledek nem világítottak. (Olyan programot írtam, ami a ledeket felkapcsolja és folyamatosan égnek) Ahol a .hex file elérési útját kell megadni, annak az ablaknak a tetején van egy Fuses fül. Semmilyen szándékkal oda kattintottam és ott is a JTAG Mode ERROR hibaüzetetet kaptam, egy kis különbséggel: Setting device parameters for jtag programming ..OK Entering programming mode.. OK Reading fuse bits (low to high).. FAILED! Leaving programming mode.. OK Ha jól olvastam utána, ez az oszcillátornak az értékeit tartalmazza. A LOW és HIGH értéke egyaránt 0x00 volt, ami szerintem nem jó. Nektek mi a tippetek? Köszönöm a segítséget!
Sry, a file nagyon kicsi lett!
|
Bejelentkezés
Hirdetés |