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   817 / 818
(#) vargham válasza zaza99 hozzászólására (») Júl 22, 2020 /
 
Pont az a lényege, hogy védi a programot az illetéktelen kiolvasástól.
(#) zaza99 válasza Kovidivi hozzászólására (») Júl 22, 2020 /
 
Akkor nem piszkálom, pont az lett volna a lényeg hogy legyen egy mentésem.

Köszönöm mindenkinek a segítséget!
(#) Sipy hozzászólása Júl 24, 2020 /
 
Na hali! Még mindig ugyanaz a robot. Elvileg már mindent tudok hogy beprogramozzam de a szervo motor szemét velem. A vezérlő egy attiny2313, ha csak simán beletöltöm azt a programot hogy fordítsa balra a szemét a szervo akkor megcsinálja, 800us impulzus kell neki. Amint beleírok mást is a programba már csak középre néz 1600us és jobbra 3200us impulzusra. A 800-ra nem reagál semmit. Pedig már tud menni, lát, reagál is a kezemre csak épp balra nem fordul. Már rendeltem másik ict is, hátha a kínai rossz de az eredeti se jobb. Csak 100us eltérést kell írni a programba. Próbáltam már növelni az órajelet kristállyal de az nem változott úgy vettem észre. Engedélyezni kell a fuse bitekkel a külső kristályt? Azokhoz még sohasem nyúltam. Mi lehet a baj? Miért nem néz balra?
A hozzászólás módosítva: Júl 24, 2020
(#) rascal válasza Sipy hozzászólására (») Júl 24, 2020 /
 
Idézet:
„Engedélyezni kell a fuse bitekkel a külső kristályt?”

Igen. Nézd meg az adatlapon. A saját hsz-edben ott az automatikus link a hirdetésre és azon belül a pdf-ben a "fuse"-ra rákeresve az első találat pont erről szól "CKSEL"-re is rákereshetsz. Az alapértelmezett a belső 8Mhz amit tovább osztanak 8-al, és így kb. 1MHz-n ketyeg gyári beállításokkal.
Arra az esetre, ha baleset történne, bővebben: Link
A hozzászólás módosítva: Júl 24, 2020
(#) Sipy válasza rascal hozzászólására (») Júl 25, 2020 /
 
Köszönöm szépen, megnézem napközben. Ha 8MHz van leosztva akkor szerintem nem is kell nekem kristály, csak engedélyezem 4 MHz-re gondolom remélem hogy úgy már jobban fog működni. Csak rájövök hogy bascomban hogy kell beállítani.
(#) k_i_j hozzászólása Júl 26, 2020 /
 
Nem töltötte le véletlenül valaki a http://www.qsl.net/pa3ckr oldalt mintaprogramokkal együtt.
Addig halogattam annak idején, hogy a gazdája törölte a tartalmát.
(#) kendre256 válasza k_i_j hozzászólására (») Júl 26, 2020 / 1
 
Web.archive.org-on nézted?
Bővebben: Link
Szerk: Az itt linkelt tartalom 2018.09.02-i mentés, van több időpontban is.
A hozzászólás módosítva: Júl 26, 2020
(#) k_i_j válasza kendre256 hozzászólására (») Júl 26, 2020 /
 
Köszönöm szépen. Ez nagyon jó lesz!
(#) Sipy válasza rascal hozzászólására (») Júl 26, 2020 /
 
Sikerült elsőre megbabrálni a fuse bitet, 8 MHz lett a belső oszcillátor frekvencia de ugyanaz a helyzet minden más működik de balra nem fordul ki a szervo motor. Most már azt is kitapasztaltam hogy az is elég ha egy változónak lekötök Word hosszúságú memóriát. Már akkor sem fordul ki. Valamit a memória területén ronthattam el? A flash tárhelye csak 55%-ig van kihasználva.
(#) rascal válasza Sipy hozzászólására (») Júl 27, 2020 /
 
Konkrétat nem tudok mondani, valahogy tesztelned kellene, hogy milyen jel jön ki belőle amikor 800us-t próbálsz kiadni. Pl. szkóppal, vagy valamilyen ismert órajellel futó számláló IC-t engedélyezed a szervó vezérlő kimenettel, és megnézed meddig jutott a számlálással. Egy másik AVR-t is felprogramozhatsz mérésre. Valószínű, hogy programhiba, debug lehetőséged nincsen? Assemblyben programozod? Ha nem, akkor a fordító optimalizálója is csinálhat hülyeségeket, mert esetleg nem veszi figyelembe, hogy te valamit időzíteni akarsz és levág egy-két "kanyart" a programodban.
(#) Massawa válasza Sipy hozzászólására (») Júl 27, 2020 /
 
Megmérted szkoppal a jeleket?
A közepállás 1,5 ms, ettöl kevesebb balra, ettöl több jobbra fordit. A modern szervok már nem érzékenyek a jelek frekvenciájára ( eredetileg 50 Hz azaz 20 ms volt). A mai szervoknak mindegy, ha a frekvencia 40-200 Hz között van, azaz az orajellel kár kisérletezni. Csakis az impulzusszélesség számit.
(#) Sipy válasza rascal hozzászólására (») Júl 27, 2020 /
 
Először egy atmega8-al próbáltam megcsinálni de azzal nem volt jó az ultrahangos távolságmérő sehogy sem. Ugyanaz a program az attiny2313-ban azonnal működött. Ha a szervot csak külön balra fordítom akkor tökéletesen működik de amint valami mást is beleírok a programba már nem jó. Emiatt szerintem felesleges most a szkóppal mérni mert biztos hogy nem kap impulzust. Bascom avr-t használok. Most hogy említetted a fordítási hibát lehet hogy azért nem jó valóban. Lehet hogy az atmega8 is azért nem működött. Megpróbálok letölteni egy másik verziót, hátha jó lesz végre.
(#) TavIR-AVR válasza Sipy hozzászólására (») Júl 27, 2020 /
 
A kalóz verziók hibásat fordítanak. A DEMO-val próbáld meg, az 4k kódig free.
(#) Sipy válasza TavIR-AVR hozzászólására (») Júl 27, 2020 /
 
Azzal próbálom de a legújabb verzió is ugyanazt csinálja . Most próbáltam ki. Itt vannak a teszt programok, amiben csak simán a 700 us időt használom abban kifordul balra, de a másikban azt kihagyja és csak középre illetve jobbra nézeget folyamatosan. Más módszert én még nem ismerek impulzus kiadásra csak ezt, ha van más megoldás is azt szívesen kipróbálom.
(#) lazsi válasza Sipy hozzászólására (») Júl 27, 2020 /
 
Ha jól látom, a programod a következőt csinálja:

20x 1: 700us -> 0: 50us
Várakozik 1s
20x 1: 1500us -> 0: 50us
Várakozik 1s
20x 1: 3000us -> 0: 50us
Várakozik 1s
Ezután kezdi az egészet elölről

Vagyis egy teljes periódus ideje változik 750us - 1550us - 3050us
Csak egy tipp:
Próbáld meg a 700us-os ciklusban az 50us helyett 1300us-ot (a 700us maradjon).
Esetleg érdemes lehet kipróbálni ugyanitt az 50us helyett 2350us-ot, és az 1500us résznél az 50us helyett 1550us-ot.
(#) Sipy válasza lazsi hozzászólására (») Júl 27, 2020 /
 
Igen azt csinálja. Próbálkoztam már én is tartani a frekvenciát mert gondolom hogy arra ment ki az ötleted. Sajnos így sem jó kipróbáltam most és most is csak egyenesen meg jobbra nézeget felváltva. Amikor balra nézne azt az időt mozdulatlanul tölti balra fordulva.
(#) rascal válasza Sipy hozzászólására (») Júl 27, 2020 /
 
Maradtál 1MHz-s órajelen, vagy csak régi a kép?
(#) Sipy válasza rascal hozzászólására (») Júl 27, 2020 /
 
Most már működik a robot végre 8 MHz-en működik. Valóban fordítási gond volt, annyit változtattam rajta hogy pin helyett port-ra változtattam a lábak hivatkozását amik kimenetek és a freki is fontos volt mert úgy meg jobbra nem akart nézni. De átírtam azokat is hogy mind 3050 us legyen összesen és most jól működik. Érdekes mert régen mindig pint írtam és sohasem volt baj vele pedig elég komoly programok is voltak pl automata mosógép vezérlő. Évekig mostam egy atmega8-al Köszi a segítséget mindenkinek!
(#) rascal válasza Sipy hozzászólására (») Júl 28, 2020 /
 
Ügyes vagy!
(#) Sick-Bastard hozzászólása Aug 2, 2020 /
 
Üdv!

A következőre nem találom a helyes megoldást:

Van egy általános foo(), TWI_General_WRD(unsigned char *sreg, unsigned char cmd, my_32b addr, unsigned char addr_size, unsigned int data_size, unsigned char data[]), amit #define segítségével "hívnám meg" a különböző slave IC-k estében. Valahogy így:

#define MCP23017_WR(cmd, addr, data) TWI_General_WRD(..., cmd, (my_32b){.b = addr}, 1, 1, (u8p)data)

Ezzel a a fordító nem ír ki hibát, viszont nem működik megfelelően. Random értékeket kapok az MCP23017 kimenetein. A tippem az, hogy a data változóhoz néhol fix értéket rendelek:
MCP23017_WR(cmd, addr, 0x00) vagy MCP23017_WR(cmd, addr, 0xAA) és ez okozza a gubancot, mivel ezeket pointerként kezeli(?)

Ha egy &-t beillesztek a data elé, akkor
#define MCP23017_WR(cmd, addr, data) TWI_General_WRD(..., cmd, (my_32b){.b = addr}, 1, 1, (u8p)&data) hibát kapok:
Idézet:
„error: lvalue required as unary '&' operand”
, de csak a fix értékekkel rendelkező foo()-k nál.

Átmenetei megoldásom: A fix értékeket egy változóba raktam és úgy hívtam meg:
  1. unsigned char my_data = 0;
  2. MCP23017_WR(cmd, addr, my_data);


Így működik, de arra szeretnék választ kapni, hogy van-e ennél jobb megoldás, hogy ne kelljen minden alkalommal a FIX értékeket egy változóba beillesztenem?

Remélem érthetően írtam le a dilemmámat.

SB
(#) vagnerjazon válasza Sick-Bastard hozzászólására (») Aug 3, 2020 /
 
Szia!

Nem minden világos, de van pár észrevételem. Az említett foo() függvény mit is csinál? (És hol van?)
Igen, szerintem is az a gond, hogy pointerként kezeli.
A cím átadásával (&) azért nem fordul le, mert a #define feldolgozásakor a preprocesszor nem tud semmit a változók leendő címéről.
Idézet:
„de csak a fix értékekkel rendelkező foo()-k nál.”
Ezt nem értem.

Meglep, hogy az átmeneti megoldásnak írt módon működik, mert nem látom, mi változott a korábbihoz képest, vagyis szerintem még mindig pointerként kezeli. A my_data más értékével is működik, vagy csak nullával próbáltad? Mert ha a 0 címen éppen a 0 érték van, akkor tűnhet úgy, hogy jól működik, de csak véletlenül. Próbáld ki így (és ne csak 0-val, hanem más értékekkel is):
  1. unsigned char my_data = 0;
  2. MCP23017_WR(cmd, addr, &my_data);
A hozzászólás módosítva: Aug 3, 2020
(#) Sick-Bastard válasza vagnerjazon hozzászólására (») Aug 3, 2020 /
 
Üdv!

Gondoltam lesz amit rosszul fogok megfogalmazni.
-
Idézet:
„Az említett foo() függvény mit is csinál? (És hol van?)”

általános foo() ==> TWI_General_WRD()

1. Ha így hívom meg: (a lényeg az utolsó paraméter -> (u8p)data )
#define MCP23017_WR(cmd, addr, data) TWI_General_WRD(..., cmd, (my_32b){.b = addr}, 1, 1, (u8p)data)

  1. unsigned char my_data = 0;
  2. MCP23017_WR(cmd, addr, 0x00)
  3. MCP23017_WR(cmd, addr, 0xAA)
  4. MCP23017_WR(cmd, addr, my_data)


A kód hiba nélkül lefordul, de nem működik megfelelően.

2. (u8p)data cseréje (u8p)&data -ra
#define MCP23017_WR(cmd, addr, data) TWI_General_WRD(..., cmd, (my_32b){.b = addr}, 1, 1, (u8p)&data)


  1. unsigned char my_data = 0;
  2. MCP23017_WR(cmd, addr, 0x00)            // hiba
  3. MCP23017_WR(cmd, addr, 0xAA)            // hiba
  4. MCP23017_WR(cmd, addr, my_data)   // OK


Idézet:
„error: lvalue required as unary '&' operand”


Átmeneti megoldás:

  1. unsigned char my_data = 0;
  2. MCP23017_WR(cmd, addr, my_data)   // OK
  3. my_data = 0xAA
  4. MCP23017_WR(cmd, addr, my_data)   // OK
  5. my_data = (bármivel megy 0...255)
  6. MCP23017_WR(cmd, addr, my_data)   // OK


Az MCP23017 kimenetén LEDek vannak és értéknek a másodpercek jelennek meg, helyesen. Ebből tudom, hogy így megy.

Szóval csak arra keresnék megoldást, hogy ne kelljen mindenhol egy változóba beillesztenem a fix/konstans értékeket.
(#) cua válasza Sick-Bastard hozzászólására (») Aug 3, 2020 /
 
Itt egy tombot varsz (illetve a cimet)
  1. TWI_General_WRD(unsigned char *sreg, unsigned char cmd, my_32b addr, unsigned char addr_size, unsigned int data_size, unsigned char data[])

Igy probald ha egy erteket akarsz atadni.
  1. TWI_General_WRD(unsigned char *sreg, unsigned char cmd, my_32b addr, unsigned char addr_size, unsigned int data_size, unsigned char one_data)

..mar amennyiben tudo modositani a TWI_General_WRD() fuggvenyt. Ellenkezo esetben a vart parametert kell atadnod
A hozzászólás módosítva: Aug 3, 2020
(#) rolandgw válasza Sick-Bastard hozzászólására (») Aug 3, 2020 /
 
Ha te írtad a TWI könyvtárat, neked kellene tudni milyen paramétereket vár a függvény. A hibaüzenet érthető, lvalue-t vár az operátor, amire memória címmel hivatkozni lehet. Ez nem lehet a hívás után: &0xAA. Az átmeneti megoldásban ezt kipróbálhatod: {0xAA}, így írod be a konstanst, bár szerintem csak alap típusokra működik. Nem értem, hogy erre a makrózásra miért van egyáltalán szükség?
(#) vagnerjazon válasza Sick-Bastard hozzászólására (») Aug 3, 2020 /
 
A foo()-t nem az "általános függvény" kifejezés szinonímájaként szokták használni, hanem egy konkrét, de irreleváns nevű függvény neveként.

1. Azért nem megy, mert nem adatként kezeli az értékeket, hanem pointerként. Amúgy ebben az esetben a második és a negyedik sor értelme ugyanaz.

2. Rájöttem, hogy amit előzőleg írtam erről, az nem jó, a preprocesszoros magyarázatom rossz. rolandgw írta jól, ott az a baj, hogy konstans érték címét kellene képezni változóé helyett (most értettem meg, hogy a "de csak a fix értékekkel rendelkező foo()-k nál." erre vonatkozott).

Én a makró helyett inkább rendes függvényt írnék, valahogy így:
  1. void MCP23017_WR(int cmd, int addr, uint8_t data) //a cmd és az addr típusát hasraütésből írtam, változtasd meg, amire kell
  2. {
  3.     TWI_General_WRD(..., cmd, (my_32b){.b = addr}, 1, 1, &data);
  4. }

Persze fontos megjegyezni, hogy így a TWI_General_WRD függvény az MCP23017_WR függvény lokális data változójának a címét kapja meg, tehát ebben a formában csak akkor jó, ha a TWI_General_WRD nem menti el ezt a címet valahova későbbi használatra (a visszatérése utánra).
(#) Sick-Bastard hozzászólása Aug 3, 2020 /
 
Üdv!

Köszönöm a válaszokat!

Persze a TWI_General_WRD() saját twi.h könyvtáramban van.
  1. TWI_General_WRD(..., unsigned char cmd, my_32b addr, unsigned char addr_size, unsigned int data_size, unsigned char data[])

Ennek a függvénynek a lényege az lenne, hogy ötvözzek 4 függvényt. A TWI szekvenciális és a byte-onkénti írást és az olvasást. A Byte olvasás eredménye (akár a szekvenciálisé) a unsigned char data[]-ba érkezik. Ezzel (elvileg) némi programhelyet takarítok meg... vagy mégsem, mivel a függvény hívások többet fogyasztanak így. Még tesztelem.

rolandgw:
Idézet:
„Nem értem, hogy erre a makrózásra miért van egyáltalán szükség?”

Épp ennek próbálok a végére járni (tesztelem), hogy makró vagy vagnerjazon javaslata:
  1. void MCP23017_WR(uint8_t cmd, uint8_t addr, uint8_t data)
  2. {
  3.     TWI_General_WRD(..., cmd, (my_32b){.b = addr}, 1, 1, &data);
  4. }

a jobb, vagy éppen szituáció függő?...?
Tesztelek, ismerkedek, próbálkozok...
(#) rolandgw válasza Sick-Bastard hozzászólására (») Aug 3, 2020 /
 
Értem a problémát, de fordítva egyszerűbb lenne szerintem. A Fleury I2C könyvtár szinte standard, mindenhol használják. Erre építeném az MCP könyvtárat multiple működésre, ahogy itt is megoldották:
Bővebben: Link
(#) Sick-Bastard válasza rolandgw hozzászólására (») Aug 4, 2020 /
 
Pont ez a twi könyvtár szolgált az enyém alapjául, meg az AVR315 AppNote, pár módosítással. Pl.:

  1. while(!(TWCR & (1<<TWINT)));
  2. helyett
  3. unsigned char TWI_Wait(void)
  4. {
  5.         // wait until transmission completed
  6.         unsigned char i = 0;
  7.         for(;(!(TWCR & (1<<TWINT))) && (i < 200); i++)
  8.         {
  9.                 #ifdef  DEBUG_TWI
  10.                 if(twi_bus_sreg & DEBUG_TWI)
  11.                 {
  12.                         // Print TWI state over UART
  13.                 }
  14.                 #endif
  15.         }
  16.        
  17.         #ifdef  DEBUG_TWI
  18.         if(twi_bus_sreg & DEBUG_TWI)
  19.         {
  20.                 // Print TWI state over UART
  21.         }
  22.         #endif
  23.        
  24.         if(i >= 200)
  25.         {
  26.                 return(1);
  27.         }
  28.  
  29.         return(0);
  30. }


Nem csak használni akarom, hanem amennyire lehet, érteni is, ezért a könyvtáram tele van (szintén saját) ki-/bekapcsolható UART debug funkciókkal.
(#) Sipy válasza rascal hozzászólására (») Aug 11, 2020 /
 
Köszi!
(#) Sipy válasza rascal hozzászólására (») Aug 11, 2020 /
 
Most azon gondolkodom hogy hogyan lehetne megoldani mikrofonnal hogy felismerje ha kimondom a nevét vagy legalább valami hasonlót. Meg hogy ehhez digitális vagy analóg kimenetű mikrofont vegyek?
Következő: »»   817 / 818
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.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