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   83 / 840
(#) ReFi válasza tibi0531 hozzászólására (») Dec 4, 2008 /
 
Sikerült megoldani végülis marha egyszerűen
Néggyel kell osztani a mért eredményt és kész
(#) Topi válasza ReFi hozzászólására (») Dec 4, 2008 /
 
>>1 egyenlő /2
Csak míg a >>1 összesen egy utasítás, a /2 meg vagy 100 mert elugrik a sw osztani.
(#) ReFi válasza Topi hozzászólására (») Dec 4, 2008 /
 
Értem, ha 4el akarok osztani akkor >>1>>1 ?
A masikat is meg tudnad irni hogy mit csinal?
(#) Topi válasza ReFi hozzászólására (») Dec 4, 2008 /
 
Nem. Ha 4-el akarsz osztani, akkor >>2.
a >> jel jobbra shiftelést jelent. Ha egy számot egyel shiftelsz jobbra, az kettővel osztás. Ha 2-vel shifteled akkor az 4-el osztás. Hogy miért?
2^1 = 2
2^2 = 4
2^3 = 8
...
2^7 = 128

Ergo, ha egy számot pl. 32-vel kell elosztani, akkor shiftelni kell jobbra 5-öt.
Szám, kettes számrendszerben, helyiérték:
128 64 32 16 8 4 2 1
(#) trudnai válasza Topi hozzászólására (») Dec 4, 2008 /
 
Idézet:
„Meg hogy nem while-do hanem do-while. Kis programozási trükk... Optimalizáció. Legalább 2x-es sebesség különbség van a do-while (--i) és egy for ciklus között.”


Tenyleg nem kotozkodeskeppen, Topi, csak erdekel a tema... Hogy ertetted, hogy a while-do es a do-while kozott van egy 2x sebesseg kulonbseg? Szemely szerint meglepodtem volna, ha a gcc ilyen ostobasagot kovetne el, sot, felismeri azt is ha --i es azt is ha i-- -t irsz es minden esetben egy optimalis kodot general ahogy elnezem. Gcc amugy nem a tulzott optimalizacios kepessegeirol hires, de azert nekem ugy tunik az avr-gcc eleg tisztesseges kodot general fuggetlenul a programozasi stilusomtol. Tenyleg erdekelne a velemenyed ill hogy hol jon elo ez a sebessegbeli elteres?

Tamas
PS: A teszt amit vegeztem:
  1. for (i=0; i<15; i++) { PORTB=i; }
  2.   58:   88 bb           out     0x18, r24       ; 24
  3.   5a:   8f 5f           subi    r24, 0xFF       ; 255
  4.   5c:   8f 30           cpi     r24, 0x0F       ; 15
  5.   5e:   e1 f7           brne    .-8             ; 0x58 <main+0x2>
  6.  
  7.   60:   8e e0           ldi     r24, 0x0E       ; 14
  8.         for (i=15; --i; ) { PORTB=i; }
  9.   62:   88 bb           out     0x18, r24       ; 24
  10.   64:   81 50           subi    r24, 0x01       ; 1
  11.   66:   e9 f7           brne    .-6             ; 0x62 <main+0xc>
  12.  
  13.   68:   8e e0           ldi     r24, 0x0E       ; 14
  14.         for (i=15; i--; ) { PORTB=i; }
  15.   6a:   88 bb           out     0x18, r24       ; 24
  16.   6c:   81 50           subi    r24, 0x01       ; 1
  17.   6e:   e8 f7           brcc    .-6             ; 0x6a <main+0x14>
  18.  
  19.   70:   8e e0           ldi     r24, 0x0E       ; 14
  20.         i=15; while(i--) { PORTB=i; }
  21.   72:   88 bb           out     0x18, r24       ; 24
  22.   74:   81 50           subi    r24, 0x01       ; 1
  23.   76:   e8 f7           brcc    .-6             ; 0x72 <main+0x1c>
  24.  
  25.   78:   8e e0           ldi     r24, 0x0E       ; 14
  26.         i=15; while(--i) { PORTB=i; }
  27.   7a:   88 bb           out     0x18, r24       ; 24
  28.   7c:   81 50           subi    r24, 0x01       ; 1
  29.   7e:   e9 f7           brne    .-6             ; 0x7a <main+0x24>
  30.  
  31.   80:   8f e0           ldi     r24, 0x0F       ; 15
  32.         i=15; do { PORTB=i; } while(--i);
  33.   82:   88 bb           out     0x18, r24       ; 24
  34.   84:   81 50           subi    r24, 0x01       ; 1
  35.   86:   e9 f7           brne    .-6             ; 0x82 <main+0x2c>
(#) Topi válasza trudnai hozzászólására (») Dec 4, 2008 /
 
Itt a kérdés inkább az, hogy mennyi művelet a <=
Ugyanis az értékes processzor időt, a <= műveletek viszik el.

Itt, egy egyszerű inkrementálásban szinte alig van különbség. Bár ott, hogy a <15-ös példádban +1 utasítás van, az egyből már igen számottevő különbség.
Pl. veszel 8MHz-et. Ha 3 utasításból áll a ciklus, akkor akkor 1.3MHz-es négyszögjelet tudsz "elvileg" generálni. Abban az esetben, mint a Te példádban is, a <15 még egy, utasításként bejön, abban az esetben 8/4/2 = 1MHz.
Azért ne hunyjunk szemet 300KHz-es különbségen.

Bár, itt még ilyennél elhanyagolható a dolog, de azért én megnézném egy pointer incrementálást. Az nem egy bájt, ott már csúnyán elszalad a ló. És ez tuti, mert találkoztam már ilyennel.>>>>
(#) ReFi válasza Topi hozzászólására (») Dec 4, 2008 /
 
Ok, akkor mar ertem a masik is.
Köszi
(#) zsuscsinyo hozzászólása Dec 5, 2008 /
 
Sziasztok! Minden bizonnyal egyszerű problémával fordulok hozzátok. WinAVR-rel próbálok Atmega16-ba UART-on keresztül infra jelet "besugározni" De valami még nagyon nem megy

így néz ki:

#include < avr/io.h >
#include < util/delay.h >
#include < avr/interrupt.h >

#define FOSC 16000000
#define BAUD 2400
#define MYUBRR FOSC/16/BAUD-1

unsigned char USART_Receive( void ){
while ( !(UCSRA & (1<< RXC )) );
return UDR;
}

ISR(USART_RXC_vect){ //Megszakítás vektor USART
... na elvileg ide kellene az UART megszakítása de nem megy végbe( teszteltem)
}


int main(void)
{
...
USART_Init(MYUBRR);
...
DDRD &= ~(1<< 0); //Bemenet Rx (PD0)
PORTD |= (1<<0); //Felhúzó PD0-ra

...
}


void USART_Init( unsigned int ubrr){

UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;

UCSRB = (1<< RXEN ) | ( 1<< TXEN);

UCSRC = (1<< URSEL ) | ( 1<< USBS) | (3 << UCSZ0 );

}

(#) wg_kezdo hozzászólása Dec 5, 2008 /
 
Memóriát kéne kezelnem, de nem akarok drága AVR-t venni hozzá. Láttam, hogy van AVRDOS, de ahhoz M128 kéne.
Tudtok valami alternatív megoldást?
A méret max 2-4Mb lenne hangot tárolnék benne ami 8Khz-vel kéne kiolvasni. Az írásra pedig akár egy LPT-s megoldás is jó vagy COM vagy hasonló.
A "filerendszer" gyakorlatilag úgy nézne ki, hogy az mondjuk első 1024 byte-on eltárolom, hogy melyik "file" hol kezdődik és milyen hosszú és amikor valamit le akarok játszani akkor innen kiolvasom majd szépen lejátszom a megadott hosszig.
8 bites lenne a lejátszó.

Igazából, ha eljutnék oda, hogy tudom írni és olvasni bármelyik byte-ját akkor a szoftver már nem jelent gondot.
(#) TavIR-AVR válasza wg_kezdo hozzászólására (») Dec 5, 2008 /
 
AVRDOS: M32 elég hozzá. (AVRDOS: 1.4 k SRAM kell)

Kisebb memória:
45DB sorozatú SPI buszos 1...64 Mbit
24LC sorozat: 1 Mbit/db; max 8 lehet, I2Cbusz
(#) dino05 hozzászólása Dec 5, 2008 /
 
Sziasztok!

AT90CAN128-nak az AD konverterét szeretném működésre bírni. A következő kódot írtam hozzá eddig:

//A/D conversion
unsigned int read_adc(unsigned char adc_input)
{
unsigned int result;
ADMUX=adc_input;
ADMUX|= (0< ADCSRA= (1< //Start conversion
ADCSRA|=0x40;
//Wait for complete
while((ADCSRA & 0x10)==0);
result=((ADCH<<8) & 0xFF00) + ((ADCL<<8) & 0xFF);
ADCSRA|=0x10;
return result;
}

A procit hétfőn kapom meg, így nem tudom ez mennyire jó függvény. Légyszíves aki ért hozzá az írja meg, hogy jó-e valamennyire vagy esetleg teljesen rossz-e!

Üdv, dino>>>>>>>>>>>>>>
(#) wg_kezdo válasza TavIR-AVR hozzászólására (») Dec 5, 2008 /
 
Ha 1.4K kell hozzá akkor az ATTiny45-ös nem jó?
Vagy más a probléma vele?
Megnéztem a 32-est, de az is 1000 Ft felett van és nincs is itthon belőle. ATTiny45 meg Mega8-ból meg amúgy is "van raktáron".
A többi memóriát megnézem köszi, bár a beszerzés sem egyszerű sajnos és ez is szempont most.

Amúgy csak egy sima hang lejátszót szeretnék csinálni egy lóba (kb 10 mp-nyi hangot akarok lejátszani)
(#) TavIR-AVR válasza wg_kezdo hozzászólására (») Dec 6, 2008 /
 
A T45-ben A SRAM memória 256 byte! Szóval nem jó az SDhez....

De maradj az I2C-s megoldásnál - szerintem.
PWM hangkimenet, adattárolásra meg 24LC1025 (1Mbit =128K: 8kHz lejátszás esetén: 16 sec-re elég)

Minta: AVR+Bascom zenelejátszó

Olyan IC kell, amiben van HW I2C/TWI. 400 kHz-s busz kell.
(#) wg_kezdo válasza TavIR-AVR hozzászólására (») Dec 6, 2008 /
 
Köszönöm, most átnéztem jobban az adatlapját és hát igen összetévesztettem a két memória fajtát.

Így már érthető, hogy miért kell neki 32-es.

Ilyen 24LC-s memóriát nem tudom honnan lehetne szerezni körbenéztem a neten és sehol sem találtam (ahonnan meg is tudnám venni). Itt vidéken meg nincs egy értelmes bolt sem.

Azért még körbenézek addig meg kitesztelem a hangot 4K flash-ből
(#) ReFi hozzászólása Dec 6, 2008 /
 
Tegnap vettem egy ATMega16-os kontrollert.
Leforditottam hozza a Led villogtatos programot, de 1mp helyett kb 8mp-enként villog.
Előtte ATTiny45-ot használtam, asszem mintha azzal is lett volna ilyen amig a CKDIV8 fusebit be volt alllitva. De most ebben nem vagyok 100ig biztos.
ATMega16nál ilyen fuse nincs.

fuse.PNG
    
(#) Dudus válasza ReFi hozzászólására (») Dec 6, 2008 /
 
Belső 1MHz-s óráról akartad járatni vagy tettél rá kristályt? A Fuse szerint belső 1MHz-ről jár.
(#) ReFi válasza Dudus hozzászólására (») Dec 6, 2008 /
 
Kössz, most már látom csak a szemem bökte ki de nem vettem észre.
A SUT_CKSEL kell nekem, ahol kiválaszhatóm hogy külső vagy belső és mekkora freki.
A saját órájáról szeretném hajtani kristaly hijjan. Meghozza 8MHz-en.

Egyébként milyen előnyökkel jár a külső kristályt használása?
(#) TavIR-AVR válasza wg_kezdo hozzászólására (») Dec 6, 2008 /
 
I2C EEPROM

24C, 24LC, 24F, 24FC stb...
leggyakoribb a 24..256, 24..512
(#) ReFi hozzászólása Dec 6, 2008 /
 
Most egy masik gepen szeretnem hasznalni a HE-s AVR ISP-t, de hülyeségeket olvas a kontrollerből.
Read Signature esetén mindig mas erteket kap, illetve a fuse bitek is mindig masok, akarhanyszor nezem.
Mit ronthattam el?
(#) Topi válasza ReFi hozzászólására (») Dec 6, 2008 /
 
Magas az órajel freki. Állítsd be olyan 115KHz környékére, majd Write. (Ott a sebesség beállításnál write)

Ha ott ezen az értéken van, és még mindig instabil, akkor rövidítsd meg a programozó vezetékeket. Max 20-25 centi.

Ha továbbra is, akkor tegyél kondit a proci tápjára. Ja és mérjél egyébként tápfeszültséget, rendben van-e a proci, kap-e stabil tápot.
(#) wg_kezdo hozzászólása Dec 8, 2008 /
 
Ha ébresztő órát akarok csinálni AVR-ből akkor azt egy sima kristály segítségével meg lehet oldani?
(gondolom a belső órajele nem elég pontos hozzá).
Nem szeretném állandóan beállítani az időt mivel azt majd csak binárisan tudom megtenni (led-es bináris kijelzés) 1 gomb segítségével

Attiny45-öst használnék.
(#) Topi válasza wg_kezdo hozzászólására (») Dec 8, 2008 /
 
Igen.
(#) hátor hozzászólása Dec 8, 2008 /
 
Sziasztok ! Feltettem egy kérdést privát ,de sajnos nem a megfelelő helyen, ezért elnézést kérek a Forum tagjaitól és a moderátortól ! Bocsi !

Az lenne a kérdésem ,hogy volna egy program amit nem én írtam AVR -re írodott Bascom alatt és az eredeti forráskodot megnyitva a Bascommal forditás közben több hiba is jelentkezik . A program egyébként működik ,meg van Hex-a filében is ,de az angol funkció kiíratást szeretném átírni magyarra . Segítségeteket előre is köszönöm !
(#) benci hozzászólása Dec 9, 2008 /
 
szeva. lenne egy problemam. kiszivtam egy atmega procibol a flasht eeprom tartalommal egyutt, ez idaig ok is, csak kellene valamijen progi ami visszaforditsa nekem a program flasht asm-re, szeretnek valamit megvaltoztatni benne. ha valaki tud segitsen.

koszonom elore is.
(#) szilva válasza wg_kezdo hozzászólására (») Dec 9, 2008 /
 
Tapasztalat szerint a MHz nagyságrendű kvarcokkal pontatlanabb órát lehet építeni, mint a kifejezetten órakvarcnak gyártott, 32768Hz-esekkel.

Hogy AVR esetén meg lehet-e oldani, hogy a CPU a belső órajelről járjon, míg a kvarcoszci az órakvarcról, és erről menjen valamelyik timer is, azt nem tudom, PIC-nél ilyen felállással tudtam nagyon pontos és nagyon energiatakarékos órát építeni 3.5 digites LCD kijelzőhöz. Ott én a timerrel rendszeresen felébresztem a CPU-t, gyors órajellel elvégzem a szükséges adminisztrációkat (billentyűkezelés, időszámítás, kijelzőre kerülő minta kikalkulálása), majd alvásba teszem a CPU-t.

Ezzel a módszerrel 3db AA elemről táplálva az órát normál működés esetén (nincs gombnyomkodás, nincs ébresztés) a telepről felvett átlagáram 5 és 10uA között van, ami alkáli elemeket feltételezve olyan 20 év körüli üzemidő (ha tönkre nem mennek az elemek hamarabb).

A másik, óra esetén akár járható út, hogy az egész CPU a 32768Hz-es órakvarc jeléről ketyeg.
(#) ReFi válasza Topi hozzászólására (») Dec 9, 2008 /
 
Egyik napról a másikra megszünt a probléma.
De egyébként másnak is instabil a programozas?
Sokszor megáll "Programming FLASH..." közben ritkabban "Reading FLASH..." közben AVR Studioban.
Ilyenkor USB-ből kihuz-visszadug mondszer segit.
ISP freki nallam 115.2KHz, a vezetek hossza pedig 10-15centi között van. A fesz stabil 4.95V a kontrolleren.
(#) TavIR-AVR válasza szilva hozzászólására (») Dec 9, 2008 /
 
ATMega8 chip esetén járjon a belső 1 MHzről, és a kvarc mehet a 23k kívülre. és el-el küldöd sleep-be... Bascom alatt a Timer használható alapban órafunkciókra....
(#) Hooligan01 válasza hátor hozzászólására (») Dec 9, 2008 /
 
Hello!

Nálam hiba nélkül lefordul. (Bascom 1.11.9.3reg)

A Magyarítás megoldásod nem teljesen jó, mert az ékezetes karaktereket külön kell definiálni használat előtt.
Ez pedig programhelyet foglal, és épp hogy nem fér bele...

Két megoldás lehet így hirtelen:
- Vagy használod "ekezetek nelkul"
- Vagy kiveszel valami "felesleges" dolgot, pl. a telepfesz figyelést. (nekem az tűnt elsőre feleslegesnek)

Ill. lehetne még itt-ott optimalizálni, de most nem megyek bele...

Minden esetre felteszem a két variációt, használd amelyik szimpatikusabb..

Egyébként mi volt a hibaüzenet? Elfelejtetted leírni..


(#) hátor válasza Hooligan01 hozzászólására (») Dec 10, 2008 /
 
Helló ! Először is köszi a segítséget ! .
A program amit módosítottál nekem ez is hibákat ír ki a fordításnál ,nem tudom miért !Felrakom a képeket ,mert lehet hogy csak a programommmal lene valami guban !?
(#) hátor válasza Hooligan01 hozzászólására (») Dec 10, 2008 /
 
És itt van még a vége.
Következő: »»   83 / 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