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
Sikerült megoldani végülis marha egyszerűen
Néggyel kell osztani a mért eredményt és kész
>>1 egyenlő /2
Csak míg a >>1 összesen egy utasítás, a /2 meg vagy 100 mert elugrik a sw osztani.
Értem, ha 4el akarok osztani akkor >>1>>1 ?
A masikat is meg tudnad irni hogy mit csinal?
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 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:
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.>>>>
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 ); }
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.
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
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|=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>>>>>>>>>>>>>>
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)
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.
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
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.
Belső 1MHz-s óráról akartad járatni vagy tettél rá kristályt? A Fuse szerint belső 1MHz-ről jár.
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?
I2C EEPROM
24C, 24LC, 24F, 24FC stb... leggyakoribb a 24..256, 24..512
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?
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.
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.
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 !
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.
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.
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.
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....
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..
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 !?
És itt van még a vége.
|
Bejelentkezés
Hirdetés |