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   279 / 839
(#) Hp41C válasza Tomi_Bp hozzászólására (») Nov 11, 2010 /
 
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...
(#) Tomi_Bp válasza Ricsi89 hozzászólására (») Nov 11, 2010 /
 
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...
(#) Reggie válasza Tomi_Bp hozzászólására (») Nov 11, 2010 /
 
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.
(#) gtk válasza Tomi_Bp hozzászólására (») Nov 11, 2010 /
 
Ezt :
  1. 180 - ( ( atan ( yy / xx) ) * 180 / M_PI );
tedd fuggvenybe.

  1. void azimuth(int param1, char v)
  2. {
  3.  int tmp;
  4.        
  5.  tmp = ( ( atan ( yy / xx) ) * 180 / M_PI );
  6.  if (v == 0)
  7.     azimuth = param1 - tmp;
  8.   else
  9.     azimuth = -1 * tmp;    
  10. }
(#) zsuscsinyo hozzászólása Nov 11, 2010 /
 
Sziasztok!

Egy kérdésem lenne, az AVR Studio 4-ben hogy tudom összecsukni a kapcsos zárójeleket (collapse) mint WinAVR-ben?
(#) kovacsj hozzászólása Nov 11, 2010 /
 
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!
(#) (Felhasználó 56240) hozzászólása Nov 11, 2010 /
 
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
(#) Reggie válasza kovacsj hozzászólására (») Nov 11, 2010 /
 
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.
(#) kovacsj válasza Reggie hozzászólására (») Nov 11, 2010 /
 
Köszönöm szépen. Megpróbálom.
(#) Reggie válasza kovacsj hozzászólására (») Nov 11, 2010 /
 
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.
(#) Tomi_Bp válasza gtk hozzászólására (») Nov 11, 2010 /
 
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.
(#) kovacsj válasza Reggie hozzászólására (») Nov 11, 2010 /
 
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>
(#) Tomi_Bp válasza gtk hozzászólására (») Nov 11, 2010 /
 
Amúgy köszönöm ezt a függvényt! Integráltam a programomba.
(#) Reggie válasza kovacsj hozzászólására (») Nov 11, 2010 /
 
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.
(#) kovacsj válasza Reggie hozzászólására (») Nov 12, 2010 /
 
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!
(#) kovacsj válasza kovacsj hozzászólására (») Nov 12, 2010 /
 
Már mindegy. Nem ezzel próbálkozom. Inkább megpróbálom újra megírni.
(#) Tomi_Bp hozzászólása Nov 12, 2010 /
 
Sziasztok! Mivel sajnos az általam írt program nem fér bele az ATMega8-asomba, ezért összedobtam egy ATMega16-os panelt. Szerintetek mit kellene még rátenni? Mit hagytam le?
(#) Reggie válasza kovacsj hozzászólására (») Nov 12, 2010 /
 
Elvileg atviheto, a kivitelezesen mulik az egesz.
(#) vagnerjazon hozzászólása Nov 12, 2010 /
 
Ü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.
(#) fater23 hozzászólása Nov 12, 2010 /
 
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

99.asm
    
(#) vzoole válasza Tomi_Bp hozzászólására (») Nov 12, 2010 /
 
És mi lenne, ha mindenki számára megnyitható formátumban tennéd fel, pl. kép vagy pdf?!
(#) Reggie válasza vagnerjazon hozzászólására (») Nov 13, 2010 /
 
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):
  1. char buffer[BUFFERMERET];
  2. uint8_t pos;
  3. for (pos=0;pos<BUFFERMERET/2-1;pos++) buffer[pos]=[buffer[pos*2+1];
(#) Reggie válasza fater23 hozzászólására (») Nov 13, 2010 /
 
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:
  1. IDOZITT:
  2. rcall T1_INI
  3. reti
(#) vagnerjazon válasza Reggie hozzászólására (») Nov 13, 2010 /
 
Nem tudom, hogy mi okozza, levágni az AVR-ben szeretném, amikor megkapja. A kódod az mit is csinál?
(#) fater23 válasza Reggie hozzászólására (») Nov 13, 2010 /
 
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
(#) Reggie válasza vagnerjazon hozzászólására (») Nov 13, 2010 /
 
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)
(#) Reggie válasza fater23 hozzászólására (») Nov 13, 2010 /
 
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)?
(#) Langoler hozzászólása Nov 13, 2010 /
 
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!

hiba.JPG
    
(#) Langoler válasza Langoler hozzászólására (») Nov 13, 2010 /
 
Sry, a file nagyon kicsi lett!

hiba.JPG
    
(#) (Felhasználó 56240) hozzászólása Nov 13, 2010 /
 
Sziasztok
Azt szeretném tőletek meg kérdezni, hogy ATMega8 és az ATMega8A között mi a különbség?
Következő: »»   279 / 839
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