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   631 / 837
(#) Koleus válasza Jaedong hozzászólására (») Dec 4, 2014 /
 
OK, azt hiszem világossabb lett a kép. Valójában egy példányt hozok létre a T0-ból, és a függvény a mutató segítségével az "erediti" példányon hajtja végre a módosításokat. De magában az App.c-ben, ahol a T0 deklarálva lett, direkt irhatom bármelyik változót, pl. T0.EN = 1.
A timer0 CTC módban használnám, 1 ms megszakítással, ami volatile uint8_t SysTimer változóban billegteti a biteket (1ms, 10ms, 100ms, 1s, 1p, 1h). A bemeneteket és kimenetek volatile uint16_t D_In és D_Out-ként deklaráltam main.c-ben. Ezek lennének a rendszerváltozóim, ezért ugyanezeket a váltazókat deklaráltam App.c-ben is de extern-ként. Ez eddig OK?
Maga a main.c elég egyszerűnek képzeltem:

  1. #include <avr/io.h>
  2. #include <inttypes.h>
  3. #include <avr/interrupt.h>
  4. #include "Rendszer.h"
  5. #include "main.h"
  6.  
  7. #define F_CPU 16000000UL
  8.  
  9. ISR(TIMER0_COMP_vect){
  10.        
  11.         cli();
  12.         SysTime++;
  13.         ST_1ms++;
  14.         TimerBits ^= (1<<0);                                            // 500Hz negyszog
  15.         if (ST_1ms == 10){
  16.                 TimerBits ^= (1<<1);                                    // 50Hz negyszog
  17.                 ST_10ms++;
  18.                 ST_1ms = 0;
  19.                 if (ST_10ms == 10){                                              
  20.                         TimerBits ^= (1<<2);                            // 5Hz negyszog
  21.                         ST_100ms++;
  22.                         ST_10ms = 0;
  23.                         if (ST_100ms == 10){
  24.                                 TimerBits ^= (1<<3);                    // 0,5Hz negyszog
  25.                                 ST_1s++;
  26.                                 ST_100ms = 0;
  27.                                 if (ST_1s == 60){                              
  28.                                         TimerBits ^= (1<<4);            // 0,01Hz negyszog
  29.                                         ST_1p++;
  30.                                         ST_1s = 0;
  31.                                         if (ST_1p == 60){
  32.                                                 TimerBits ^= (1<<5);           
  33.                                                 ST_1h++;
  34.                                                 ST_1p =0;
  35.                                         }
  36.                                 }
  37.                         }
  38.                 }
  39.         }
  40. }
  41.  
  42. void IOSetupInit(){
  43.         // Bemenetek definialasa
  44.        
  45.        
  46.         // Kimenetek definialasa
  47.        
  48.         DDRD |=(1<<PD4) |(1<<PD5) |(1<<PD6) |(1<<PD7);
  49. }
  50.  
  51. void readIn(){
  52.        
  53. }
  54.  
  55. void writeOut(){
  56.        
  57. }
  58.  
  59. int main(void)
  60. {
  61.         IOSetupInit();
  62.         setup();
  63.  
  64.         for (;;)
  65.         {
  66.                 readIn();
  67.                 core();
  68.                 writeOut();
  69.         }
  70.    
  71. }


Jó úton haladok?
(#) mikrofarad hozzászólása Dec 5, 2014 /
 
Üdv!
Egy soros port <-> usb konvertert építenék atmega8-al. Itt van a kapcsolás. A kapcs. rajzon van egy LED aminek elvileg az lenne a feladata, hogy az feszültségből 5V helyett 3.3V körüli értéket csináljon. Na ezt nem értem. Az atmega8-nak 4.5V a min. tápfeszültsége (az adatlap szerint). Egyáltalán van szükség erre a ledre (a céláramkör is 5V-ról működne mellesleg)??
A válaszokat előre is köszönöm.
(#) gabi20 válasza mikrofarad hozzászólására (») Dec 6, 2014 /
 
Szia az ATmega8L az adatlap szerint működik 2,7V - tól is. Egyébként énsem értem miért van szükség a LED - re, szerintem 5V-ról is kell működnie.
(#) mikrofarad válasza gabi20 hozzászólására (») Dec 6, 2014 /
 
Csak hogy én sima atmega8-akat rendeltem ebayről.
Valószínűleg nem is fogok használni semmit áramkorlátozásra, csak biztos szeretnék lenni, hogy nem rontok el semmit.
(#) Jaedong válasza Koleus hozzászólására (») Dec 6, 2014 / 1
 
Szia!
Jó úton haladsz. A globális változókat szeretjük elkerülni, amikor lehet, de ha még is szükség van rá, akkor egy header fájlba deklaráld őket externként, majd hozz létre egy hozzá tartozó c filet, ahol definiálod őket (azért célszerű nem egy teljesen másik funkciójú modulban tenni, mert így elkerülhető, hogy később véletlen máshol is definiáld őket, ezáltal megőrjítsd a linkert) pl.:
valtozok.h
  1. extern int a;

valtozok.c
  1. include "valtozok.h"
  2. int a;


ahol pedig használni akarod az a változót, ott include-olod a valtozok.h-t és használod. (Sehol se definiáldmég egyszer.) + Célszerű összetartozó adatokat (globális változókat is!!) struktúrába szervezni.


Interruptokban nem kell letiltanod az interruptot, mivel ezt magától megteszi neked a hardver. Ezekbe a rutinokba, csak azt szokás írni amit feltétlenül azonnal el kell végezned. Általában ez csak számláló növelés/flag beállítás szokott lenni (így nem kell minden változódnak volatile-nak lenni, és el kerülheted, hogy két művelet között hirtelen egy interrupt hatására változzon az értéke, aztán keresheted a hibát... mint az előző oldalon csabeszq), és később a főprogramodban dolgozol tovább. Persze ez a kód még nem vészes, csak későbbiekben, azért ezt tartsd szem előtt.
(#) attti hozzászólása Dec 6, 2014 /
 
Sziasztok!
Szeretnék elkezdeni egy projektet, amihez elég sok mindent fel akarok használni, pl. sok ADC kell, sok ki/bemenet, és LCD kijelző, ehhez szeretném felhasználni Bővebben: Link ezt az AVR-t, szerintetek megfelelő vagy van ennél megfelelőbb AVR is? Esetleg ennek az AVR-nek valami hátránya/hiányossága van-e?
(#) killbill válasza attti hozzászólására (») Dec 6, 2014 /
 
Szia!
Ebbol igy nehez ezt megitelni. A szamitastechnikaban a sok az nem szamit tul egzakt fogalomnak. Milyen LCD? (Nem kijelzo, a D eleve a kijelzo roviditese.) Nagyfelbontasu, grafikus vagy 2x16 karakteres? De, ami meg ennel is fontosabb, mekkora szamitasi igeny kell a feladat megvalositasahoz? Ezt a projekt ismerete nelkul nem lehet tudni.
(#) attti válasza killbill hozzászólására (») Dec 6, 2014 /
 
Szia!
Elismerem tényleg elég tág keretek között fogalmaztam, az LCD-nek egy teljesen egyszerű 2*16ost gondoltam, kéne tudnom még egy kicsi EPSON tűs nyomatatót is vezérelnem soros porton, 11 hétszegmenses kijelzőt vezérenem vagy 16 gombot érzékelnem. 8 jelet ADC-znem, és jó pár képletet kiszámolnom.
(#) killbill válasza attti hozzászólására (») Dec 6, 2014 /
 
A felsorolt hardware dolgokra kepes lesz. Az LCD 6 port labon elfer. Esetleg kellhet valami I/O bovites a kijelzok es a gombok miatt. A kijelzokhoz TPIC6C595 shift regiszterek hasznosak lehetnek (meg par P csatornas FET). Ha a gombokat lehet matrixba szervezni (ertsd: nem valami gyarilag megcsinalt billentyuzet mas elrendezessel), akkor a kijelzo meghajtassal es harom port labbal a billentyuk is megoldottnak tekinthetok. A 8 A/D az adja magat, azt hiszem pont annyi A/D csatorna van az emlitett uC-n. Kerdes, hogy nem kell-e egyszerre mintat venniuk, mert arra nem kepes. Csak egy konverter van benne, meg egy analog multiplexer a bemeneten. A soros port szinten nem problema. Egy MAX202 illeszt RS232-re. A kepletek... Ezt megintcsak te tudod, hogy mit kell szamolni. Nem mindegy, hogy bonyolult lebegopontos szamitasokrol van szo, vagy csak egyszeru egeszekrol.
(#) HöTö válasza attti hozzászólására (») Dec 6, 2014 /
 
Minden felsorolt feladat megoldható ezzel az AVR-el, de a 8 jel analóg-digitális átalakítása és a (jó pár képlet kiszámolása) nem biztos, ez ugyanis attól függ, hogy milyen jeleket kell átalakítanod és miket kell kiszámolnod.

Például ha különböző hangfrekvenciás csatornákat kell mintavételezned és szűrési vagy egyéb feladatokat kell elvégezned akkor már nem biztos hogy elegendő ez az AVR. A pontos feladat megfogalmazása sokat segítene. Úgy valószínűleg tudnánk javasolni egy mikrovezérlőt.
(#) attti válasza HöTö hozzászólására (») Dec 6, 2014 /
 
Hát a feladat annyira nem komplex, amit fentebb leírtam azok a részfeladatok, bár egyszerre több DAC is kell sajnos ez az egyetlen gond, és elég sok lengőpontos számítást is kell végezzen a felvett adatokból, viszont csak a DAC után, úgyhogy elég performans kéne legyen. A folyamat, a DACk folyamatosan kell legyenek a kíirással, miután ez lejárt jönnek a számítások, utána nyomtatás.
A hozzászólás módosítva: Dec 6, 2014
(#) csabeszq válasza mikrofarad hozzászólására (») Dec 6, 2014 /
 
Beírod az ebay-en, hogy FTDI USB átalakító és megveszed 742 Ft-ért. Ez hardverből nyomja, szemben az Atmega8-cal, ami szoftverből. Az FTDI bír 2 MHz-es átvitelt, a V-USB 10-100 kHz között.

Hidd el, megéri megvárni az 1 hónapot, amíg kiszállítják, nem hiszem, hogy elkészülnél a szoftverrel ennyi idő alatt. Inkább menj el a haverokkal sörözni.

Igazából én ott toltam el kezdőként a mikrokontroller programozást, hogy 1000 Ft-os cuccokat építettem 4-5000 Ft-os költségen és óráim mentek el vele feleslegesen. Amit bagóért megkapsz, azt ne építsd meg újra.
(#) HöTö válasza attti hozzászólására (») Dec 7, 2014 /
 
Ezzel a mikrovezérlővel nem tudod azt megtenni hogy több analóg bemeneten egyszerre végezz átalakítást, mivel csak egyetlen analóg-digitális átalakítód van, amit multiplexelsz több csatornára.

Viszont mivel analóg-digitális átalakításról van szó ahol ugyebár mintavételi időnek kell lenni nincs is szükség arra hogy több analóg-digitális átalakító egyszerre működjön, mindössze annyit kell tenned hogy szépen egymás után mintavételezed az analóg csatornákat a mintákat pedig letárolod valamilyen változókba vagy egy tömbbe, majd a mintavételi időnek megfelelő idővel késleltetsz. Ezt a késleltetést célszerű egy Timer-ral csinálni így ez alatt az idő alatt elvégezheted a számításokat.

A helyzet viszont az hogy ez a mintavételi idő nem lehet akármilyen hosszú, ennek az időnek a nagysága attól függ hogy mit mintavételezel, ha például egy szobahőmérséklet változást ami egy lassú folyamat akkor ez az idő akár percekben is mérhető, de ha valami gyors jelet akarsz mintavételezni például hang akkor ez az idő mikro szekundum nagyságú. Számodra az a kérdés hogy a mintavételi időn belül az adott valahány MHz-es kvarccal eltudod-e végezni a számításokat és az egyéb műveleteket.

A mintavételi idő a mintavételi frekvencia reciproka (1/fm).

A mintavételi frekvenciát pedig úgy tudod meghatározni hogy megnézed mekkora a legnagyobb frekvenciájú összetevője a mintavételezni kívánt jelnek és ennek veszed a kétszeresét.

További probléma az hogy ha neked különböző frekvenciájú jeleid vannak (egy lassú hőmérséklet és egy gyors hang) akkor ezeket célszerű különböző mintavételi időkkel mintavételezni, viszont te a mikrovezérlőn csak egyet tudsz beállítani.

Csak hogy értsd egy lassú folyamatot is mintavételezhetsz mikro szekundumos idővel csak éppen ez felesleges.
A hozzászólás módosítva: Dec 7, 2014
(#) mikrofarad válasza csabeszq hozzászólására (») Dec 7, 2014 /
 
Valószínűleg az lesz amit mondasz, mert az 5db atmega8-ból amit vettem nem szeretnék egyet elpocsékolni.
(#) mikrofarad válasza csabeszq hozzászólására (») Dec 7, 2014 /
 
Bár a sörözést kihagyom. (15 éves vagyok)
(#) attti válasza HöTö hozzászólására (») Dec 7, 2014 /
 
Szia!
Nagyon szépen köszönöm válaszod, a készülék szerencsére nem kell óriási tudással rendelkezzen(mivel egy Z80-asnak lesz az utódja ). Ahogy írtad nem választok más mikrokontrollert, ez megfelelő és a késleltetések se kell túl picik legyenek, mivel csak néhány szonda egyenáramú jelét kell csak átalakítania(műveleti erősítő van a jeleken, de attól még 0.10-es léptékkel nő a jel), kb. másodperces gyakorisággal.
(#) killbill válasza attti hozzászólására (») Dec 7, 2014 /
 
Idézet:
„a készülék szerencsére nem kell óriási tudással rendelkezzen(mivel egy Z80-asnak lesz az utódja).”
Ne becsuld le a Z80-at!
(#) attti válasza killbill hozzászólására (») Dec 7, 2014 /
 
Utólag rájöttem, hogy hülyeséget írtam.
(#) steelgoofy hozzászólása Dec 7, 2014 /
 
Üdv,

Intigerből string típusú változóvá alakítást, majd a kapott stringek összeadását szeretném megvalósítani. A string átalakítás már jónak tűnik, most már csak össze kéne adni őket és majd később egy változóban eltárolva az összeget, ki is íratni a monitorra.
Program:
  1. #include <avr/io.h>
  2. #define F_CPU 16000000UL                // clock: 16 MHz
  3. #include <util/delay.h>                 // delay
  4. #include <avr/interrupt.h>
  5. #include <string.h>
  6. #include <stdlib.h>
  7.  
  8. int main(void)
  9. {
  10.         int a;
  11.         int b;
  12.         int c;
  13.         char sa[5];
  14.         char sb[5];
  15.         char sc[5];
  16.         char osszeg[20];
  17.         while(1)
  18.         {
  19.            itoa(a,sa, 10);
  20.            itoa(b,sb, 10);
  21.            itoa(c,sc, 10);
  22.         }
  23. }

Az sa,sb,sc változók a intigerek string típúsú változatai, viszont hogyan lehetne ezeket összeadva egy változóban elmenteni ? Mivel valójában tömbök nem tudom őket összeadni. Jó úton járok?
(#) killbill válasza steelgoofy hozzászólására (») Dec 7, 2014 / 1
 
Hogyan akarod oket osszeadni? Matematikailag vagy egyszeruen osszefuzni a string-eket?
Egy string-hez hozzaadni egy masikat az strcat() fuggvennyel lehet.
  1. strcpy(osszeg, sa);
  2.  strcat(osszeg, sb);
  3.  strcat(osszeg, sc);

De ennel talan egyszerubb (bar a kod hosszabb lesz):
  1. sprintf(osszeg, "%d%d%d", a, b, c);
(#) steelgoofy válasza killbill hozzászólására (») Dec 7, 2014 /
 
Köszönöm, csak egyszerűen össze szeretném fűzni a stringeket.
(#) attti válasza killbill hozzászólására (») Dec 7, 2014 /
 
A MAX202-őn keresztül tudok az EPSON nyomtatómnak küldeni ESC/POS utasításokat az AVR-ből?
(#) killbill válasza steelgoofy hozzászólására (») Dec 7, 2014 /
 
A sprintf-es megoldas azert jo, mert atlathatobb lesz a kod:
  1. int a = 2;
  2. int b = 10;
  3. char text[100];
  4. sprintf(text, "A=%d B=%d, osszeg=%d", a, b, a+b);

Erre a text-ben az lesz, hogy : "A=2 B=10, osszeg=12"
(#) killbill válasza attti hozzászólására (») Dec 7, 2014 / 1
 
A MAX202 csak illeszti a TTL sorosvonalat a +/-12V-os RS232-re. Az csak egy HW illeszto. Ha a printer szabvanyos RS232 bemenettel rendelkezik, akkor igen, persze.
(#) attti válasza killbill hozzászólására (») Dec 7, 2014 /
 
Az a baj, hogy a szabványosságot én nem tudom magamtól eldönteni, de csatolom a nyomtató dokumentációjából az erre vonatkozó részt.
A hozzászólás módosítva: Dec 7, 2014
(#) killbill válasza HöTö hozzászólására (») Dec 7, 2014 /
 
Idézet:
„Viszont mivel analóg-digitális átalakításról van szó ahol ugyebár mintavételi időnek kell lenni nincs is szükség arra hogy több analóg-digitális átalakító egyszerre működjön,”
Millio es egy eset lehet, amikor fontos, hogy a tobb csatornarol vett mintak azonos idopillanatban keszuljenek. Pl. ha egy differencial jel mindket agat mered valamiert A/D-val. De egy tobbcsatornas tarolos oszcilloszkop is egyszerre veszi a mintat minden csatornan.
(#) killbill válasza attti hozzászólására (») Dec 7, 2014 / 1
 
Igen, ez RS232. Azt kell meg megtudni a dokumentaciobol, hogy lehet-e software flow control-t (XON/XOFF) valasztani. Ha csak hardware flow control-t tud a printer, akkor a TXD es RXD jel melle kelleni fog még egy bemenet. A MAX202 igy is jo hozza, csak akkor a mikrokontrolleren egy tovabbi port labat el kell erre hasznalni.
A hozzászólás módosítva: Dec 7, 2014
(#) attti válasza killbill hozzászólására (») Dec 7, 2014 /
 
Ha jól veszem ki a dokumentációból akkor ez a nyomtató nem képes a softwares módra. Csatolom a lehetséges beállítások listáját.
(#) attti válasza killbill hozzászólására (») Dec 7, 2014 /
 
A nyomtató pontos típusa: EPSON LQ300+II, dokumentációt csatolom.
A hozzászólás módosítva: Dec 7, 2014
(#) csabeszq válasza mikrofarad hozzászólására (») Dec 7, 2014 /
 
Ha indulsz a mikrokontroller programozásnál, akkor

- szerezz be 2 breadboard-ot (830-as) vezetékekkel (lásd ebay), 2x1300 Ft
- lehet, hogy itt megköpködnek, de még az Arduino UNO-nak / Nanonak is nézz utána (2000 Ft az UNO, 1000 Ft a nano)

Az Arduino egy Atmega328P-s chip és hozzá az USB soros átalakító.

Az Arduino Uno előnye, hogy cserélhető benne az IC. Magyarul ha szétütöd, veszel 500 Ft-ért egy új előre felprogramozott Atmega328P-t. Hátránya, hogy nem tudod bedugni breadboardba. A nano-t be tudod dugni, csak az IC-t nem tudod benne cserélni. Nekem mindkettő van.

Én tesztelésre használom az Arduino-kat. Mindenféle digitális kimenetet relatíve egyszerűen előállíthatsz vele. Kezdetben én is a programozót dugdostam, de az Arduino kényelmesebbnek bizonyult.

Milyen szabályokat tartok be, amikor programozok:
- ha 0, 5V mellett ennél nagyobb feszültséget is használok, a számítógép USB-jére nem dugom rá. Az alaplap drága.
- a teszt áramköreimet 5V-ra csak az utolsó lépésben kötöm rá, mikor már tudom, hogy megy. Előtte a chip egyik lábán kiadok magasat. Ez 40 mA-ig terhelhető, relatíve nagy áramnak mondható, sokmindenre elég. Mikor már látom, hogy megy, kaphat stabilabb 5V-ot.
- elvileg az alaplap bírja a rövidzárat, de ne kísértsd az ördögöt
- áram alatt nem szerelsz. Amikor szerelsz, kihúzod az USB csatlakozót és áramtalanítasz.
Következő: »»   631 / 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