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   652 / 837
(#) Droot válasza k3gy3tl3n hozzászólására (») Márc 3, 2015 /
 
Szia!

Én is kipróbáltam! Tutifrankó. Egyébként pont most raktam össze. Köszi szépen a segítséget!
Egyszer majd megcsinálom panelra, úgy hogy több prockót támogasson, és pl a prockó tartalmát is lehessen vele törölni.
Még csak mega8-al próbáltam, a mega8L az SMD, kicsit necces lesz, de majd hétvégén!
(#) k3gy3tl3n hozzászólása Márc 3, 2015 /
 
Sziasztok, próbálom a timertbeüzemelni mega48PA-PU mikrokontrolleren, de a compiler a következő hibaüzenetet küldi:
error: 'TIMSK' undeclared (first use in this function)
error: 'TCCR0' undeclared (first use in this function)
Amint átállítom a mikrokontroller tipusát avrstudioban atmega8-ra máris lefordul, persze igy meg nem fut a program a uc-n. Help plííz!
(#) k3gy3tl3n válasza Droot hozzászólására (») Márc 3, 2015 /
 
Szia, örülök hogy neked is hasznodra vált!
(#) Istvanpisti válasza k3gy3tl3n hozzászólására (») Márc 3, 2015 /
 
Na, de mi ebben a furcsa? Az ATMEGA48-nak nincs TIMSK és TCCR0 regisztere, illetve van csak nem ez a nevük. (pl. TIMSK0, TIMSK1, TIMSK2, vagy TCCR0A, TCCR0B). Az ATMEGA8-nak meg léteznek ilyen nevű regiszterei, emiatt az ATMEGA8-ra írt kód nem minden esetben fog működni az ATMEGA48-on, még akkor sem, ha lenne ugyanolyan nevű regisztere, de azok funkcionalitása eltérő. Jó példa erre pont a TIMER0.
Célszerű lenne megnézni a uC leírásában.
A hozzászólás módosítva: Márc 3, 2015
(#) k3gy3tl3n válasza Istvanpisti hozzászólására (») Márc 3, 2015 /
 
Köszönöm a gyors választ! Átböngészem a datasheet-et.
(#) richt3r hozzászólása Márc 4, 2015 /
 
Sziasztok!

Szeretnék megismerkedni az AVR-ekkel, AVR programozással. Neten is olvastam pár leírást, viszont arra nem találtam választ, hogy különböző programmerek melyik típust támogatják.
Pl:egy ARDUINO - Mini Pro-val lehet-e ATtiny45-öt programozni?
Lehet rossz felé tapogatózom és hülyeséget kérdeztem, ez esetben elnézést kérek.
Ti hogyan kezdtétek, milyen kezdő "szettet" ajánlotok?
(#) k3gy3tl3n válasza richt3r hozzászólására (») Márc 4, 2015 / 1
 
Szia, az arduino kész fejlesztő boardokat csinál. Van rajta egy mikrokonroller fixen és azt tudod programozgatni. Fejlesztőkörnyezet is van hozzá szóval az arra megírt kódot nem tudod csak úgy átpattintani egy mikrokontrollerre, ha valamibe meg be akarod építeni akkor az egész arduino boardot bele kell tenned. Szerintem jobban jársz ha veszel egy próbapanelt, egy mikrokontrollert (pl atmega8L) egy avr isp mkII égetőt (írj zombee -nak), letöltöd az avr studiót egy avr-gcc compilert, pár led, ellenállás és hadszóljon. A képen láthatod hogyan kell összekötözni hogy lehessen programozni és fusson rajta a megírt kód. Itt az AVR ISP MKII-vel programozható kontrollerek listája (nem kevés ): Link
A hozzászólás módosítva: Márc 4, 2015

pelda.jpg
    
(#) k3gy3tl3n válasza richt3r hozzászólására (») Márc 4, 2015 /
 
Ennyi cuccal mint a képen van már lehet játszani, ledeket villogtatni gombnyomkodást felismerni. Az AVR égető nem látszik a képen, az a 6 vezeték felfele ahhoz vezet (MISO, MOSI, SCK, Reset, VCC, GND). KÉP
A hozzászólás módosítva: Márc 4, 2015
(#) k3gy3tl3n hozzászólása Márc 4, 2015 /
 
Sziasztok, az alábbi kódon mit lehetne változtatni/javítani, hogy a motorok szabályzására használt PWM jel állítása ne kavarjon be a timernek és ezzel együtt az interrupt-nak? (Tudom használjak másik timert.. )
  1. // this code sets up timer1 for a 1s  @ 16Mhz Clock (mode 4)
  2.  
  3.  
  4. #include <avr/io.h>
  5. #include <avr/interrupt.h>
  6.  
  7.  
  8. int main(void)
  9. {
  10.     OCR1A = 0x3D08;
  11.  
  12.     TCCR1B |= (1 << WGM12);
  13.     // Mode 4, CTC on OCR1A
  14.  
  15.     TIMSK1 |= (1 << OCIE1A);
  16.     //Set interrupt on compare match
  17.  
  18.     TCCR1B |= (1 << CS12) | (1 << CS10);
  19.     // set prescaler to 1024 and start the timer
  20.  
  21.  
  22.     sei();
  23.     // enable interrupts
  24.  
  25.  
  26.     while (1)
  27.     {
  28.         // we have a working Timer
  29.                
  30.                 data=read_data_from_RFM01();
  31.                 /*adatot várunk, ha nem jön adat ez a függvény megakasztja a kódot ekkor lejár a timer, interruptot csinál és ott leállítom a motort*/
  32.                
  33.                 OCR1A=data; //set motor speed
  34.                 TCNT1 = 0; //reset counter
  35.                 /*ha jött adat itt kinullázom a timer számlálóját, hogy ne csináljon interrupt-ot, valamint beállítom a motorokat szabályzó PWM jelet*/
  36.                 /*ezzel viszont elállítom OCR1A-t belekavarok a timer és az interrupt időzítésébe*/
  37.     }
  38. }
  39.  
  40. ISR (TIMER1_COMPA_vect)
  41. {
  42.     // action to be done every 1 sec
  43.         /*motorok leállítasa mert túl sokáig nem jött adat*/
  44. }
(#) Kovidivi válasza richt3r hozzászólására (») Márc 4, 2015 /
 
Az Arduinora feltöltesz ISP programozó kódot: Fájl-Minták-ArduinoISP, ezzel már tudsz programozni másik AVR-t. Letöltöd az Atmel Studio-t, ebben írod a kódod a kinézett mikrovezérlőhöz (akár ATtiny45-höz is.), majd az elkészült .hex fájlt feltöltöd az avrdude fájl segítségével, az Arduino-n át a mikrovezérlőre. Az Avrdude-t megtalálod az Arduino alkönyvtáraiban, de az a biztos, ha letöltöd az WINAVR-t, mert az tartalmaz minden fájlt, ami kell hozzá. Én Arduino UNO-t használok, Atmega128-at programozok vele.
A hozzászólás módosítva: Márc 4, 2015
(#) Kovidivi válasza k3gy3tl3n hozzászólására (») Márc 4, 2015 /
 
Szia.
Külön kellene választani a két dolgot. A motor most milyen PWM jelet kap? Az 1mp-es időzítésből állítasz elő PWM jelet? Tehát mondjuk 0.3mp-ig magas, aztán 0.7mp-ig alacsony a kimenet?
Használj egy timer-t a PWM-hez, és ha spórolni akarsz a timer-eken, akkor állítsd be a watchdog-ot 1mp-re. Vagy ami még jobb lenne: írd át a függvényed, hogy ne akassza meg a program futását, biztosan megoldható! Beleraksz egy változót, amit növelsz, és ha elér egy értéket, akkor break;.
(#) Kovidivi válasza Droot hozzászólására (») Márc 4, 2015 /
 
A millis() függvényt könnyen lehet implementálni, ha van megszakításod fix időnként. Megnézed, milyen sűrűn fut le, és növelsz egy változót. Készítesz egy millis() függvényt, ami vissszatérési értéke pedig az eltelt idő lesz mS-ban. Nekem nem kell uS-os pontosság, úgyhogy én inkább úgy hívom, hogy kbmillis(); nagyon hasznos kis függvény. Egyébként az Arduino-nál is késik a millis(), ha más interrupt fut pont akkor, amikor a timer1 megszakítást generál. Plusz a kvarc sem pont annyi, amennyi...
A hozzászólás módosítva: Márc 4, 2015
(#) k3gy3tl3n válasza Kovidivi hozzászólására (») Márc 5, 2015 /
 
Szia, a motor olyan pwm jelet kap amire az 1-es timer állítva van, kb 150kHz, a kitöltési tényező pedig OCR1A-tól függ 0-100% között változhat a kapott adattól függően. Ezzel viszont odavágok ennek az 1 seces beállításnak: OCR1A = 0x3D08; Utánanézek mire jó és hogyan működik a watchdog amit javasoltál.
(#) Ivan93 válasza k3gy3tl3n hozzászólására (») Márc 5, 2015 /
 
Szia! Az ICR1 regiszter is használható fix felsőértéknek, szabadon hagyva az OCR1A-t a pwm előállításhoz (adatlap 77. oldal szerint). Lehet hogy nem működik a Te esetedben, annyira nem értek még hozzá. szerk.: gondolom atmega8-ról van szó
A hozzászólás módosítva: Márc 5, 2015
(#) zsozsoX hozzászólása Márc 5, 2015 /
 
Sziasztok!
AVR-el spi-n keresztül 74hc595-tel kapcsolok ULN 2803-at azzal reléket. Müködik, de néhe bekapcsolnak azok a kimenetek is amiket nem is kapcsolok a programból.Olyan mintha az SPI zavart szedne össze.Valaki esetleg találkozott már ilyen problémával?Segítséget elöre is köszönöm.
(#) Kovidivi válasza k3gy3tl3n hozzászólására (») Márc 5, 2015 /
 
Akkor csináld úgy, hogy normál módban használd a timer-t, OCR interrupt-nál billegtesd szoftverből a kimeneti lábat, OVF interrupt-nál növelj egy változót. Ha ez a változó elér egy értéket (1mp alatt ki kell számolni mennyit), akkor leállíthatod a motorokat interruptból. Resetelheted is innen az AVR-t, ha akarod. Ha jön adat, akkor a főprogramból pedig a változót nullázod le, így újraindul az 1mp-es visszaszámlálás.
A hozzászólás módosítva: Márc 5, 2015
(#) csabeszq válasza zsozsoX hozzászólására (») Márc 5, 2015 /
 
Biztosan nem szoftver hiba?

Mellesleg megvennék a helyedben 2300 Ft-ért egy logikai analizátort. Azon látnál mindent.
Link: Logikai analizátor

Az MR (master reset) láb ne lebegjen, az OE (output enable) se.

Nem töltöd fel túl gyorsan? Ahogy emlékszem, az SPDR-ben nincs puffer. Ergo, ha félig elküldted már az adatokat és új értéket állítasz be, akár bele is zavarhatsz az átvitelbe.
A hozzászólás módosítva: Márc 5, 2015
(#) richt3r hozzászólása Márc 5, 2015 /
 
Köszönöm a válaszokat!

A másik kérdésem pedig, hogy szeretném Assemblyvel megtanulni ezeket a jószágokat programozni, csak én úgy tudom, hogy az Assemblynek van egy pár változata, hardver függő. Azt is olvastam, hogy a legtöbbet C-vel is lehet. De ha én még is Assemblyvel szeretném, mondjuk mert szeretném megtanulni a nyelvet, akkor hol kezdjem? Van pl. valami általános Assembly? Mint pl. az ANSI C? Vagy ez hogy valósítható meg?
A hozzászólás módosítva: Márc 5, 2015
(#) Zsolt2 válasza richt3r hozzászólására (») Márc 5, 2015 /
 
Az Assambley az processzor specifikus nyelv. Minden processzornak mas utasitas keszlete van. Ha most kezdesz el foglalkozni AVR-el akkor inkabb a C-t ajanlom. Egyszerubb megtanulni es bonyolultabb programoknal konnyebb vele dolgozni.
Ha megis Asm mellet dontesz akkor a kovetekezo linken megtalalhatod az 8-bites AVR-ek utasitas keszletet.
A hozzászólás módosítva: Márc 5, 2015
(#) richt3r hozzászólása Márc 5, 2015 /
 
Köszönöm a gyors választ ! Nagyon tetszenek a mikrokontrolleres megoldások mindenféle téren, és innen indult az ötlet, hogy jó lenne megtanulni. Még biztos fogok kérdezősködni a közeljövőben.
(#) rolandgw válasza richt3r hozzászólására (») Márc 5, 2015 /
 
Én ezt az elvet vallom,szerintem később hatékonyabb programokat tudsz írni C-ben,ha már jól megy az asm.
Innen indulhatsz.
(#) csabeszq válasza rolandgw hozzászólására (») Márc 5, 2015 /
 
Én Commodore 64 assembly-ben kezdtem programozni és évekbe tellett, míg normális C nyelvű programot képes lettem megírni. Szerintem teljes vakvágány volt.

A magasszintű nyelvekben az a jó, nem kell lemenni fusizni, hogy most be van-e a T bit kapcsolva, vagy nincs, hány regisztered van, meg stb.

Az a fordító feladata, hogy ezekkel foglalkozzon. Képes vagy magasról szemlélni a dolgokat és a megoldásaidat nem korlátozza le a processzorban lévő regiszterek száma, meg egyéb érdektelen baromságok.

Amikor algoritmust készítesz, akkor azt érthetően megtervezed, implementálod, a fordító meg foglalkozik azzal, hogy 3 vagy 32 regisztered van. Hosszú távon a felülről értelmesen elkészített kód nagyobb sebességre képes, mint az assembly fusizás.

Nem győzök röhögni az itt olvasott assembly megoldásokon, mert tudom, hogy a gcc simán szétveri jól megírt C kóddal sebességben.
A hozzászólás módosítva: Márc 5, 2015
(#) killbill válasza csabeszq hozzászólására (») Márc 5, 2015 /
 
Az termeszetes, hogy C-ben sokkal hatekonyabban lehet progtamozni, pont azert, amit te is elmondtal (a lenyegre tuszd figyelni, nem kell elveszned a reszletekben). De azert az assembly kell ahhoz, hogy fogalmad legyen az egesz alapjarol. Memoria, regiszterek, stack, ilyesmi. Ezen dolgok ismerete nelkul mikrokontrollert programozni sosem lehet jol. Termeszetesen a HW ismeretek is fontosak.
A gcc sokszor elkepesztoen sz@r kodot general, de olyat, hogy betolt valamit egy regiszterbe, onnan atteszi egy masikba, majd semmire nem hasznalja. Szoval ha a gcc nalad jobb kodot general, akkor nem vagy jo az assembly-ben.
(#) csabeszq válasza killbill hozzászólására (») Márc 5, 2015 /
 
> Szoval ha a gcc nalad jobb kodot general, akkor nem vagy jo az assembly-ben.

Ez bizony így van. Annyit azért hozzátennék, hogy az itt olvasott assembly megoldások 90%-a alulmúlja a gcc-t. Tisztelet a kivételnek, aki tényleg tud programozni.

Mindig nézem, hogy mit generál a gcc és ha nem Winavr-t használsz, akkor elégedett lehetsz. A Winavr valami 2010-es gcc változatot használ, az meg még gyermekcipőben járt.
(#) killbill válasza csabeszq hozzászólására (») Márc 5, 2015 /
 
Idézet:
„Annyit azért hozzátennék, hogy az itt olvasott assembly megoldások 90%-a alulmúlja a gcc-t. Tisztelet a kivételnek, aki tényleg tud programozni.”
Igen, ez egy hobbi forum.
Idézet:
„Mindig nézem, hogy mit generál a gcc és ha nem Winavr-t használsz, akkor elégedett lehetsz. A Winavr valami 2010-es gcc változatot használ, az meg még gyermekcipőben járt.”
En biztos nem hasznalok win akarmit. Viszont a 2010 nem is annyira gyerekcipo, mert en mar 2001-ben gcc-vel (2.95) forditottam AVR-re Linux-on. De teny, hogy azota nagyon sokat valtozott. Az optimalizacioja nagyon sokat javult, viszont a vegso kodgeneratora egyre rosszabb. Programozoi alaphibakat (pl. ugyanazon ertek ciklusban torteno kiszamolasa, index hasznalata pointer helyett, ciklusban felesleges shift-eles (adat & (1 << i)) es hasonlo dolgok) szepen kiszed, de a vegso kodban megis sok felesleges utasitas van. Nagyon rossz (vagy hianyzik) a forditas vegerol az ugynevezett peephole optimalizacio.
Ennek ellenere en sem allnek neki assembly-ben megirni egy komolyabb programot, mert ha nem eleg ra az AVR C-ben, akkor teszek bele komolyabb mikrokontrollert (olcsobban). De volt olyan munka, ahol az AVR adott volt, viszont egyszeru, de idokritikus feladatot jobb volt assembly-ben megoldani.
(#) Massawa válasza richt3r hozzászólására (») Márc 5, 2015 /
 
Én is csak ASM-ben tudok ugy ahogy programozni ( meg basicban de az ma már nem divat ). Minden AVR-nek van egy többé kevésbé azonos utasitás készlete, a adatlapjukon megtalálod azt a néhány kivételt ami chip specifikus.
Az AVR Studioban megtalálsz minden segitséget az ASM-hez, a hardwaren viszont magadnak kell mindent megtanulni (minden chiphez van több 100 oldalas kézikönyv). Nem leányálom a dolog, de bele lehet szeretni - a kezdetben rengeteg segitség kell meg némi rutin.
Ha tudsz németül vagy angolul vannak elég jo kézikönyvek a témában a neten. Töltsd le és épits meg lépésröl lépésre az áramköröket.

Sok sikert!
S ne add fell az elsö balsiker után. Lesz még több is.....
(#) richt3r hozzászólása Márc 5, 2015 /
 
Köszönöm a tanácsokat, s főként a segítőkészséget! Így az ember is nagyobb kedvvel vág bele a dolgokba ! : )
(#) rolandgw válasza csabeszq hozzászólására (») Márc 6, 2015 /
 
Idézet:
„Mindig nézem, hogy mit generál a gcc és ha nem Winavr-t használsz, akkor elégedett lehetsz.”

Ennyire azért nem profi a gcc.Hirtelen négy fizetős C fordító ugrik be,akik megélnek a piacon,köztük a méregdrága IAR.Igaz a Codevision kivételével a többiek ARM-re is fejlesztenek.
(#) Zsolt2 válasza rolandgw hozzászólására (») Márc 6, 2015 / 1
 
Amitol fizetos meg nem azt jelenti, hogy jobb, mint az ingyenes. Lasd pl. a windows es linux esetet is
(#) rolandgw válasza Zsolt2 hozzászólására (») Márc 6, 2015 /
 
Nem szándékom szapulni a gcc-t,szerintem sem rossz,de ki lehet próbálni.Gcc kontra Codevision-t néztem meg többféle,ua. kóddal tiny2313-al.Szignifikáns a különbség.
Következő: »»   652 / 837
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