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
Létezik AC optócsatoló is.
Lehet, hogy te is belebotlottál, csak gondolom linkelek egyet: TCMT4600
Tudom, hogy létezid, de csak ezt rendelni nem éri meg.
Egyébként 16db ilyen bemenet lesz egymás mellett. Csak "nagyon" brummos volt a kimenet egyutas egyenirányítás nélkül. Hiába volt ott a kondi. (Első kapcsolás szerint.)
Hello
Olvastam az ide tartozó avr asm-et és tennék is fel kérdést. Nagyon kezdő vagyok ASM-be meg elektroba is, szal lehet láma kérdés lesz: LDI és a MOV az miben különbözik? A MOV-al is lehet közvetlen operandust megadni nem? Kösz a válaszokat! u.i.: ha kell akkor C#-ban tudok segíteni...
Én speciel rühellem az AVR assembly-jét, de suliban belénk erőszakolták és úgy rémllik, hogy az LDI egy konstans értéket ad az operandusodnak: LDI op1, konstans
ahol az op1 valamilyen SFR regiszter, vagy általános munkaregiszter (R0, R1, R2,.....) A MOV viszont csak adatmozgatás két regiszter között: MOV op1, op2 ahol op1 és op2 is valamely tetszőleges regiszter lehet A lényeg, hogy az LDI-vel nem töltheted bele egyik regiszter tartalmát egy másikba, a MOV-val pedig nem tölthetsz fel tetszőleges konstans értékkel semmit.
aha értem kösz. Közbe az IDE-vel próbálkozok és felmerült még valami. Az hogy a kimenetet és a bemenetet ugy lehet érteni, hogy pl.:
ldi r11, 0xCC; in r11, DDRB; (r11 |= DDRB) lesz egy bemenet? A többi bit meg marad ami volt (kimenet/bemenet)? Ugye jól tudom hogy egy regiszter lehet bemenet is és kimenet is és ez csak a bitjeitől függ.? És akkor mely regiszterek vagy melyek nem használhatók I/O-ra? r0-r31-ig és a PORT-ok ok? Bocs de még sokat tudok kérdezni a regiszterek hol hogyanjáról. De folyamatosan írom az asm-et és figyelem a biteket.
Elkészült az uartos software pwm, az interruptban a signal os név kell az ISR-nél is, mert ha nem lefagy az avr, és resetel állandóan, de így jól működik.
Mellékelem a kódot, hátha segít majd valakinek...
Üdv.: Zoltán
Hehe. Objektum orientáltról asm-re váltani elég meredek dolog. Itt nincs semmi sem a kezedben. Ha valamit csinálni akarsz, akkor azért vért kell izzadni.
Első szabály: olvasd végig legalább kétszer az adatlapot. AVR CPU core-tól legalább a Timerekig. Második szabály: mindig jobbról balra történik az értékadás. Az in-nel speciális regiszter tartalmát olvasod be, out-al adsz értéket. Ennek megfelelően a rövidke kódod így fog alakulni:
A DDRx - Data Direction Register x-porton. Ha a DDRx 0-ba van állítva, akkor a PINx register segítségével tudsz beolvasni. Ha a DDRx 1-be van állítva, akkor a PORTx segítségével tudsz kitenni értéket a pin(ek)re.
Fogok reagálni, csak ez egy kicsit nagyobb lélegzet lesz, és mert netezni sincs időm.
Azért az 'ldi r11' nem éppen valós... R16 és fölötte használható.
Sziasztok!
Egy nagyon érdekes problémával találkoztam, amikor UART kommunikációt próbáltam megvalósítani két ATmega128-as között. A kódok:
A kód nagyon egyszerű, inicializálom először az UART perifériát, majd ha valamit szeretnék küldeni, beleteszem az UDR0 regiszterbe. Minden adatcsomag második bájtja tartalmazza az adatcsomag hosszát, az első byte a cím, a többi adat. A DIRECTION_RECEIVER vezérli az RS485-ös átalakító adatirányát. Ha a számláló ugyanannyi, mint a fogadott csomag második bájtja, akkor megérkezett a csomag, és egy a New_Value_Com változó értéke. Az a problémám, hogy egyik irányba tökéletesen működik a kommunikáció, a másik irányba pedig az MSB mindig 1, és nem tudok rájönni, hogy miért, kipróbáltam terminallal, és egyértelmű, hogy az adó oldalon van a hiba, próbáltam hexában direkten adni az UDR0 regiszterbe, az se segített, és mind a 2 vezérlőn ez a kód fut. Próbáltam más vezérlővel is, úgy se volt jó, ha csak magát ezt a kódot használom, akkor működik, csak ha hozzáteszem a többi programot, ami működteti a berendezést, akkor jelentkezik a baj. Már egy hete küzdök vele, és nem tudom rájönni a hibára, szerintetek mi lehet a baj?
Ebben a forrás file-ban Bővebben: Link lévő delay.h, lcd.h és uart.h file-okra lenne szükségem.Akinek megvan kérem segítsen.Köszönöm.
Hát van benne valami, nem lesz könnyű. De azért a html layout se volt könnyű abba se vannak változók. Csak hozzá kell szokni. De igaz ez a legnehezebb eddig, de elvagyok vele mert jó érzés, hogy végre nem vagyok rabja egy keretrendszernek se .
A szabályokat vettem és zoli is jól mondta r11 az nem éppen valós. Mindegyik hszolásbol tanultam. Köszöntem . Majd még biztos kérdezek.
Már kérdezek is . Ez mondjuk elvi kérdés lesz, de azért megkérdezem. Hogyan van az hogy ennél az avr-nél van memória. A "sima" intel meg amd mikrochip -eknél külön van a RAM (meg a HDD). Itt meg a uC-be van benne a flash meg az sram (meg persze az regiszterek, de ez ok). Most ezek az integrált memóriák nem feleslegesek? Azért mondom, mert így nem érzem az egységek függetlenségét. Vagy ezek a memóriák cache-ként foghatóak fel?
Ezt is olvasd el. Haza fele a vonaton utána kerestem ennek, hogy az r11 miért nem jó. A lényeg az, hogy vannak bizonyos műveletek (jó részt konstanssal való művelet), amik csak az r16-tól r31-ig működnek. A többi utasításnál szabadon használhatók r0-r31-ig a regiszterek.
HTML igazából nem is programozási nyelv, csak egy szimpla leíró nyelv, mint a latex, vagy az xml. Am tényleg jó néha asm-ben programozni, mert jobban megmozgatja az agyat mint a C vagy éppen a .net.
Számítógép architektúrákat nem tanultál még?
Mikrokontrollerek jellemzően Harvard architektúrára épülnek. Lényeg, hogy a programmemória és az adatmemória külön vannak, így egyszerre történhet írás/olvasás. PC-nél más a helyzet, mert ott a HDD-ről nem tudsz real-time beolvasni programot, emiatt a program futása előtt ezt betölti a memóriába, és majd onnan fogja kiolvasni azt a CPU. Ugyanebbe a memóriába fogja majd az adatokat is rakni, mert még egy nagy sávszélességű memóriát kiszolgálni pazarlás lenne, ha már van egy ilyen.
Kifutottam az időből.
Az adatlapban bővebben is olvashatsz a memóriákról . Az AVR-ekben háromféle memória van: egy flash (programnak, és a megszakítási táblának), egy SRAM ( általános felhasználású regisztereknek, speciális felhasználású regisztereknek, és az adatoknak), és egy EEPROM.
Ezt próbáld meg: USART_RX_vect Bővebben: Link
Amit írtál kód az úgy egészen biztosan nem maradhat, mert tényleg átláthatatlan az egész. Használj pointereket, mert sokkal átláthatóbb lesz. Még akkor is ha 10-15 változót/tömböt adsz át!!! Pointernek az a lényege, hogy az adott változó címét / tömbnek a kezdő címét használod nem pedig magát az objektumot. Így ha több visszatérési értéket kellene megvalósítani a függvényben (amit PERL-ben simán meg lehet), akkor ott ezeket a változóknak a pointerét tedd bele a függvény argumentumába, és így hiába nem lesz benne a return operandausába, meg fog változni, mert a címén keresztül éred el. A tömbökre ugyanez vonatkozik. Alább betettem egy példa kódot, igaz ez PC-re van, de a helyzeten nem változtat.
Azok a tömbök/változók, amiket a megszakításban is használsz azok maradjanak meg globális változóként, míg a többit tedd bele a mainbe. Sőt azt amit kint hagysz globálisként arra nyugodtan mutathatsz a mainen belül egy pointerrel és használhatod a függvény argumentumokban. Azt amit beteszel a main-en belül, arra példa az array tömb, amit pedig kint hagysz a megszakítás miatt, arra példa az i változó. Ha bool-t használsz akkor bátran írj true-t, és false-t. Utána néztem a C99-ben már tényleg benne van a bool változó. Csak én anno egy régebbi szabványon tanultam meg, ami még nem ismerte, emiatt volt kavarodás részemről.
De tanultam szgép architektúrát, csak az olyan is volt hogy semmilyen. De amiket írtál azokat vágom. Inkább megkérdezem máshogy, mert rosszul tettem fel a kérdést. A mikrokontrollerekhez lehet csatolni külső memóri(át/ákat)? (Ugy mint pl a PC AMD-jéhez a RAM. És akkor ebből a RAM-ból betölteni/beleírni a cuccokat.) Persze ha Harvard akkor min 2 külön külső memóriát lehet-e csatolni?
Flash-t tudtommal nem lehet bőveítni, de cáfoljatok meg ha nem így van. Am két lehetőség van. Egyikkel a már meg lévő SRAM-ot lehet kibővíteni, viszont ehhez olyan uC kell, de ekkor az SRAM kiterjesztéseként tudod kezelni, ami nagy előny, mert gyors, és egyszerű használni. Másik lehetőség amikor egy különálló ramot kapcsolsz rá, ami vagy parallel, vagy SPI interfésze van, de ez lassabb, és nehézkesebb kezelni.
Szia!
Köszönöm, így a megszakítás már tökéletes. Amit lehetett, mindent bepakoltam lokális változónak, de sajnos a main sok másik függvényt meghív, amiknek globális változó kell(+ az interruptos változók) A pointert ahol lehetett alkalmaztam(kivéve az interruptban, így láttam ésszerűbbnek), de engem igazából a globális pointerek jobban összezavarnak, mint ahogy most írtam... AZ átláthatatlanságot a sok kis függvény okozhatja, ami a mainban van, a program így tökéletesen működik, 12ch software pwm + 2ch hardware pwm...
Mit gondolsz?
Sziasztok!
Korábban itt a fórumon már írtam, hogy egy dallas IC-s hőmérőt szeretnék ethernetre illeszteni AVR-el. Ehhez kerestem Ethernetes Arduino panelt, amit egyszerűen, akár I2C-n, akár más egyszerű protokollon keresztül tudok hajtani. Ezt találtam a Conradnál: http://www.conrad.de/ce/de/product/191803/Arduino-Ethernet-Platine-...il=005 Ezzel ha jól gondolom megoldható a mutatvány, hogy fogok egy ATmega MCU-t amiben lefejlesztem a hőmérők lekérdezését és a HTTP-n keresztüli küldést, és a TCP/IP dolgokat pedig intézi az Arduino. Csak a biztonság kedvéért, nem szeretnék beruházni egy olyan HW-be ami végülis nem megoldás a problémámra..
Sziasztok!
Írtam egy programot, ami azt csinálná, hogy egy ATtiny 45-ös ic PB4-es lábát ha földre húzzuk, akkor elkezd felváltva villogtatni két led-et, majd ha mégegyszer a földre húzzuk, akkor már párossával villogtatja a ledekt, harmadjára pedig felcseréli a ledek állapotát. A végeredmény abszolút nem az lett amire számítottam: Amikor a lehúzó nyomógombot a földre megnyomom, a ledek nem világítnak. Ha rengetegszer megnyomom, csak akkor kezdenek villogni a ledek, de nem jól. 1. Ha nincs a földre húzva, akkor háromszor párossával, majd kétszer felválta villognak a végtelenségig. 2. Ha folyamatosan lehúzom, akkor felváltva villog, ha még egyszer, akkor párossával. De ha már felengedem a gombot, akkor újra úgy, ahogy az 1-es pontban írtam.
Ebben ott a chip. Nézd meg az Arduino ethernet projektet... Abban ez készen is van...
Tanulni sosem késő...
Mire gondolsz, hogy ez készen van? A TCP/IP vagy maga a hőmérős dolog http-vel? Nekem a fenti linkelt panellal a következő az elgondolásom: kézhez kapom és csak egy programot kell írjak a saját MCU-mra ami lekérdezi a hőmérőket és HTTP GET-el megadott URL-re. Tehát IP szinten nem szeretnék belefolyni, csak "socket" szinten: küld el az x bájtos csomagot y címre ezzel a tartalommal. Aztán olvasom a választ.
Igen, ez.
Arduino ethernet alkalmazáscsomagja.
Tehát akkor ez tökéletes lesz az elvárásaimra, köszönöm! ...és a linket is.
Megvan, hogy nagyjából mi a gond, de a megoldást nem tudom még :S A GCC-vel van gond. A 128K bájt feletti kódmemória megcímzése nem megy neki. Azért ez eléggé dühítő, így első körben...
Rendszerint nincs értelme, untig elég egy, de a lehetö legközelebb a lábakhoz.
Akkor viszont felmerül bennem a kérdés: Mindenhova el kell vezetni a VCC/GND-t vagy elegendő egy helyere?
|
Bejelentkezés
Hirdetés |