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   426 / 840
(#) blackdog válasza Seton hozzászólására (») Márc 19, 2012 /
 
Idézet:
„Mit is szeretnél akkor?”


Szeretném, ha valaki segítene nekem ennek a kapcsolásnak a megvalósításában. Nem akarom a fórumot heteken át ezzel terhelni persze a végeredményről beszámolnék.
ATMEGA8515 vagy ATMEGA168 jöhetne szóba. Előbbi talán szélesebb határok között használható. Mindenképpen PDIP vagy PLCC tokban, hogy könnyen cserélhető legyen.
A sebesség szerintem itt nem kritikus talán elegendő az AVR belső órajele is.
C-ben van némi programozási ismeretem tehát ebben kellene megvalósítanom.
Szóval várom sgítőszándékú ember jelentkezését aki néha tud rám szánni 1-1 e-mail váltást vagy Skype beszélgetést!
(#) adam.papp924 hozzászólása Márc 19, 2012 /
 
Sziasztok.
Kezdő vagyok a témába. Egy Arduino Mega 2560 eszközöm van és azt szeretném elérni, hogy több logika kaput tudjak megkülönböztetni különböző feszültség értékekkel, amik egy relét kapcsolnának. Hogyan lehetne ezt megvalósítani? Vagy ha nem megfelelő a logikai kapu, akkor milyen más módszerrel? A lényeg az lenne, hogy egy pin-en keresztül továbbított feszültséget meg tudjon különböztetni és csak azt a relét kapcsolja, amihez az adott feszültségértéket kapcsoltam. (Pl.: manuálisan)
Köszönöm szépen a válaszokat.
--
Ádám
(#) Reggie válasza adam.papp924 hozzászólására (») Márc 19, 2012 /
 
Ennek a shield-nek a billentyuzete pont ugy van megoldva, mint amire neked szukseged van.
(#) adam.papp924 válasza Reggie hozzászólására (») Márc 19, 2012 /
 
Köszönöm, tetszik a megoldás, meglátom hogyan tudom alkalmazni.
(#) sikolymester válasza blackdog hozzászólására (») Márc 19, 2012 /
 
Lehet, hogy ez csak az én személyes véleményem, de én azért segítek pl. ebben a fórumban, mert magam is tudom mennyire hasznos, hogyha egy tetszőleges problémára ráguglizva találok megoldást különböző fórumokban.

Én ezért elzárkózok mindenféle privátban történő segítségnyújtásról, mivel annak nem marad nyoma mások számára.

Ez természetesen csak azért címeztem neked, hogy ne csodálkozz azon, hogyha senki sem jelentkezik erre a feladatra, mivel szerintem mások is így érezhetnek.

Ahogy láttam a csatolt kapcsolási rajzod, úgy vélem, hogy nem teljesen újonc vagy az elektronikán. Egy AVR kapcsolási rajzán olyan sok trükk nincsen igazán. Javaslom figyelmedbe az atmel oldalán található app note-okat. Illetve pl. az olimex oldalán vannak proto boardok kapcsolási rajzokkal, pl ez: Atmega16

AVR programozás ügyében nézz körül itt az avrfreaks oldalon: Avrfreaks Tutorials

Aztán, hogyha konkrét kérdésed van és nem akadsz rá válaszra, akkor szerintem nyugodtan terheld ezt a fórumot.
(#) blackdog válasza sikolymester hozzászólására (») Márc 19, 2012 /
 
Szia!

Alapvetően teljesen egyetértek veled. Én csak azért godoltam a privát segítségre mert mostanában kevés az időm és nagyon szétszóródna a téma. Ezért írtam, hogy a végé akár cikk formályában megosztanám az eredményt.
A másik, hogy biztosan lenne 1-2 kérdésem amire csak beszólást kapnék arra meg nincs szükségem.
A kezdőlökést megkaptam most megpróbálok elindulni.
Először csak annyit, hogy figyeljek egy bemenetet és a kimeneten kapcsoljak. Ezzel talán elboldogulok.
Azt a részt viszont egyáltaln nem látom át, hogy később hogyan tudom a logikai feltételeket egy általam írt (C#-ban) 'szervíz' szoftverrel módosítani.
(#) prody hozzászólása Márc 19, 2012 /
 
Nos a kérdésem egyszerű, de egyszerűen nem tudok rájönni mi lehet a galiba...
Lényeg, van egy Atmega16-osom. A feladat az, hogy ugye 8 ADC bemenete van, abból 6-ra küldök 1-1 jelet, azokon szépen egymás után elvégzem az ADC converziót és kiküldöm sorosporton.
Ez eddig szép és jó, a probléma az, hogy amennyiben 1 bemenetet használok mindegy melyiket tökéletesen működik is az elképzelés de ha már 2-t azaz változtatok a beolvasás helyén az egész megzavarodik és első alkalommal jól végrehajtja a konverziót majd második alkalommal már egy fix ugyanolyan karaktert olvas be, és küld ki, de mindig ugyanazt az összes csatornán... egyszerűen nem értem miért?
A kódot mellékeltem, azaz csak azt a részt ami ide kapcsolódik.

  1. volatile char b;
  2. volatile int start=0, vamo,  vvall;
  3. volatile char vamo1, vamo2, vvall1, vvall2;
  4.  
  5. void ADC_init(void)
  6. {
  7. bs (ADMUX,REFS0);// AVcc with external capacitor at AREF
  8. bs (ADCSRA,ADEN);
  9. bs (ADCSRA,ADPS2);
  10. bs (ADCSRA,ADPS1);
  11. bs (ADCSRA,ADPS0);
  12. }
  13.  
  14. void port_init(void)
  15. {
  16. //**************PORT******************
  17. DDRD = (0<<PD0) | (1<<PD1) | (1<<PD2) | (1<<PD3) | (1<<PD4) | (1<<PD5) | (1<<PD6) | (1<<PD7); //Rx0, Tx0, ~~LEDS
  18. DDRA = 0x00;
  19. }
  20.  
  21. void initUSART(void)
  22. {
  23.  
  24. UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE);
  25. UCSRC = (1 << URSEL) | (1 << UCSZ0)| (1 << UCSZ1);
  26. UBRRH = (unsigned char) (((F_CPU/(16UL*baud))-1) >> 8);
  27. UBRRL = (unsigned char) ((F_CPU/(16UL*baud))-1);
  28. }
  29.  
  30. unsigned int ADC_read(unsigned char ch)
  31. {
  32. ch=ch&7;// channel must be b/w 0 to 7
  33. ADMUX = ADMUX|ch;// selecting channel
  34. _delay_ms(100);// Itt próbáltam időt is adni a csatorna kiválasztásához de tettem késleltetést már midnenhová, és nem segít
  35. bs (ADCSRA,ADSC);// start conversion
  36. while(tb(ADCSRA,ADIF));
  37. bc (ADCSRA,ADIF);
  38. return (ADC);
  39.  
  40. }
  41.  
  42. void usartPC_putc(char c)
  43. {
  44. while(!(UCSRA & (1 << UDRE)));
  45. UDR = c; // send character
  46. }
  47.  
  48. ISR(USART_RXC_vect)
  49. {
  50. cli();
  51. b=UDR;
  52. if (b== 'O')
  53. {
  54. start=1;
  55. }
  56. if (b=='!')
  57. {
  58. start=1;
  59. }
  60. sei();
  61. }
  62.  
  63. // ------------------------------------------------
  64. int main(void)
  65. {
  66. port_init();
  67. initUSART();
  68. ADC_init();
  69. sei();
  70. while (1)
  71. {
  72. if(start==1)
  73. {
  74. vamo=0;  vvall=0;
  75. vamo1=0; vamo2=0; vvall1=0; vvall2=0;
  76.  
  77.  
  78. _delay_ms(100);
  79.  
  80. vvall=ADC_read(7);//ha ezt a három sort vagy a másik három sort kiveszem tökéletesen működik és küldi a feldolgozott jeleket, de ha nem és egymás után akarom a 2 ADC folyamatot végrehajtani csak egy random karakter dob ki
  81. vvall1=(char)(vvall & 0xff);
  82. vvall2=(char)(vvall >> 8) & 0xff;
  83.  
  84. usartPC_putc('E');
  85. _delay_ms(1);
  86. usartPC_putc(vvall1);
  87. _delay_ms(1);
  88. usartPC_putc(vvall2);
  89. _delay_ms(1);
  90.  
  91. vamo=ADC_read(6);
  92. vamo1=(char)(vamo & 0xff);
  93. vamo2=(char)(vamo >> 8) & 0xff;
  94.  
  95. usartPC_putc('F');
  96. _delay_ms(1);
  97. usartPC_putc(vamo1);
  98. _delay_ms(1);
  99. usartPC_putc(vamo2);
  100. _delay_ms(1);
  101.  
  102.  
  103. usartPC_putc('S');
  104. start=0;
  105.  
  106. }
  107. }
  108. }


A lényeg van benne csak.
Összefoglalva az ADC megy 1-1 csatornán külön külön, de egymás után már nem...
Folyamatosan ezt küldi ki: 0x00e6 avagy 0x00e7. Azaz ez az eredménye az ADC-nek...
(#) blackdog válasza sikolymester hozzászólására (») Márc 19, 2012 /
 
Nos megpróbálkozom valami értelmessel.
Amit linkeltél megnéztem és rádöbbentem, hogy nagyon jó kiinduló alap számomra:
Bővebben: Link
Feltételezem, hogy JTAG-re nem lesz szükségem.
Ha jól értelmezem a kódot akkor RS232 keresztül számítógépem hyper terminal-al tudom lekérdezni, indítani/leállítani a kimeneteket. Beállítás gondolom ebben nincs.
Első kérdés: az UART pontosan mit takar? tudom goggel. rá is kerestem, de célirányos válasz érdekel. Ezzel tudom megvalósítani a későbbi beállítás lekérdezést/módosítást?
Másik:
Nem világos számomra, hogy miért szórja szét a bemeneteket.
I1 = PD2(int0)
I2-3-4 = PA0-1-2(ADCx)
Ha jól látom PD3-4-5 is szabad. Akkor méis miért?
(#) sgt válasza prody hozzászólására (») Márc 19, 2012 /
 
A probléma azaz, hogy az ADMUX-t nem törlöd a külső föggvény elején. Így a következő csatorna választás mindig hozzá adódik az ADMUX-hoz.

Akad pár dolog, ami teljesen felesleges:
  1. DDRA = 0x00;
  2. ...
  3. bc (ADCSRA,ADIF)
  4. ...
  5. cli(); //ISR-ben
  6. ...
  7. sei(); //ISR-ben

Meg még tuti vannak ilyenek.

A másik dolog, ami teljesen szubjektív, de érdemes oda figyelni olyan dolgokra mint pl.
  1. while(tb(ADCSRA,ADIF));
  2. while(!(UCSRA & (1 << UDRE)));

Ugyanarra való mindkettő, de mégis máshogy írod le. Meg egyszer bs-sel állítod be a biteket máskor meg shifteled. Valamilyen struktúrát alakíts ki magadnak, ami neked megfelel, és ahhoz tartsd magad, mert úgy átláthatóbb lesz neked is.

Továbbá csak ahhoz a változóhoz kell volatile amelyik az ISR makró és a main "áthidalásához" kell.
(#) prody válasza sgt hozzászólására (») Márc 19, 2012 /
 
Ohhhhhh ezzazzzzzzzz Köszi! Na látod erre nem gondoltam... az a baj hogy nagyon nagyon komplikált a projekt 4 Microkontroller van plusz egy pár ezer soros real time term perlben, és ez mind kommunikál egymással mindre külön szoftver és áhhhh, néha kicsit sok, és én hiába debugolom órákon át nem jövök rá, ezért jó a friss gondolkodás Köszi még egyszer!
(#) prody válasza sgt hozzászólására (») Márc 19, 2012 /
 
Illetve igen tudom, hogy sok felesleges dolog van benne és sok helyen hosszabban is írtam amit akartam ,ez mind mind direkt van. Illetve sok minden maradt benne régi debugokból, pl a cli és a sei is ilyen.
Egyenlőre a maximális átláthatóságra törekszem utána jön a tömörítés
(#) norbiv8 hozzászólása Márc 19, 2012 /
 
Sziasztok, tudnátok ajánlani valami jó I2C library-t, vagy megoldást a #1189878 problémára?
Köszi
(#) dc001 válasza blackdog hozzászólására (») Márc 19, 2012 /
 
Gondolat ébresztőnek egy kapcsolás. A soros port felé MAX232 illesztő van használva. Ez helyett lehet FT232 használni, ekkor a soros portot USB felületen kapod. Ez mellett a V-USB lib-et használva lehet szoftveres USB-t is, ekkor csak néhány ellenállás és zener kell. Ha MAX232 használsz, akkor kell 7,3728Mhz kvarc (vagy az atmega adatlapján kell másikat kiválasztani, ami illik adott soros porti sebességhez). Ha V-USB mellett döntesz, akkor 12 MHz javasolt.

A beállításokat egy hyper terminálban is megteheted egyszerű parancsokkal, pl.:

hűtés engedélyezés az 1-es bementere: H1+
fűtés tiltás a 8-as bemenetre: F8-
időzítő 2 perc (120 sec): I120

vagy írni lehet hozzá GUI-s programot is, ami ugyan ezeket a parancsokat küldi el a soros porton (pl: COM1).

Itt találsz kódot a soros port (UART) használatához, igaz ez RS485 buszhoz készült, de ezen inkább majd egyszerűsíteni kell.

hut-fut.png
    
(#) blackdog válasza dc001 hozzászólására (») Márc 19, 2012 /
 
Köszönöm!
Egyre erősebben húzok az AVR felé. Amit te készítettél az, ha jól gondolom 8 bemenetet fogad 16-ot kapcsol.
Ha a 74 595 összes lábát bekötöm és szoftverrel megfelelően (binary) vezérlem.
(#) dc001 válasza blackdog hozzászólására (») Márc 19, 2012 /
 
Igen. Csak azért lett a rajzban 11 felhasználva, mert ha jól emlékszem 8+3 kellett neked. Elvileg lehet több is, ha több shift regisztert használsz fel vagy minden kimenettet bekötsz.
(#) blackdog válasza dc001 hozzászólására (») Márc 19, 2012 /
 
Igen 8+3 volt, de így bővíthetem 13+3-ra ami nekem nem elhanyagolható szempont.
(#) dc001 válasza dc001 hozzászólására (») Márc 19, 2012 /
 
Egy hiba (biztosan) van a rajzban az atmega 7-es lábát VCC-re kell kötni.
(#) kiborg válasza dc001 hozzászólására (») Márc 19, 2012 /
 
És a RESET lábra sem ártana egy kondi, hogy bekapcsoláskor biztos resetelődjön. (100nF)
Szerintem.
(#) patmosis hozzászólása Márc 20, 2012 /
 
Sziasztok
.Mostanában kezdtem ismerkedni az AVR ekkel.
Nagyon tetszik a dolog ,az alap progikat meg is csináltam (led villogtatás...stb)
Van egy gyroszkopom amit rá szeretnék kötni ,hol kezdjem a program írást és hogyan?
Mi kell hozzá?
Köszönöm.
(#) trudnai válasza prody hozzászólására (») Márc 20, 2012 /
 
Mit faragsz ha nem titok amiben 4 kontroller is van? Egy panelen vannak? Osztozkodnak kozos periferiakkal?
(#) Fizikus válasza patmosis hozzászólására (») Márc 20, 2012 /
 
Milyen tipusu a giroszkop pontosan? Milyen jelet allit elo? (analog jel, digitalis jel) Hogyan kommunikal a kulvilaggal? (SPI, TWI(I2C)) Adatlap esetleg?
Ezek nelkul nem nagyon tud segiteni senki...
(#) sikolymester válasza blackdog hozzászólására (») Márc 20, 2012 /
 
Nos, valamilyen módon márpedig kell programoznod az AVR flash-ét, hogy fusson rajta a programod. Már ami a JTAG szükségességét illeti.

Amennyiben szeretnéd számítógéppel összekötni, hogy a paramétereket felprogramozd, akkor erre kvázi két mód van:

UART, vagy RS232, ezzel a perifériával rendelkezik szinte az összes AVR. UART és RS232 közötti különbség a jelszintekben van, előbbi TTL, utóbbi ~ -12/+12V. Ezt szokásos egy un. max232 szintillesztővel megoldani. Ezt szépen rákötöd a PC COM portjára, jobb híján egy USB->RS232 átalakítóra.

Másik lehetőség USB-s AVR használata. Pl. AT90USB162 ezek nincsenek PDIP tokban, csak TQFP vagy QFN tokban. Ez két ok miatt jó: Nem kell programozó, mert hogyha 8 vagy 16MHz -es kristályt használsz, akkor a gyárilag ráhelyezett bootloadert tudod használni. Gyakorlatilag rádugod a gépre USB-vel, lenyomod a reset és hardware reset lábokon lévő gombot (vagy jumpert), ekkor úgy indul el, hogy a PC felismeri és a FLIP nevű programmal tudod programozni.
Másfelől pofon egyszerűen belefordíthatsz egy olyan ingyenesen elérhető forráskódgyűjteményt (libraryt), amivel pöccre pont úgy fog viselkedni, mint egy USB->RS232 átalakító. PC-n COM portként látod, AVR-en pedig egy valamilyen függvénnyel le tudod hívni, hogy milyen adat jött a PC-t nutó hyperterminálból, vagy esetleg saját C#programból, ami a COM porton kommunikál.
(#) H2opok hozzászólása Márc 20, 2012 /
 
Üdv
Egy kis segítség kellene. (igaz van egy avr-ben jártas ismerősöm, de sajnos jó pár napig nem elérhető)
Egy (Dip) ATmega88-20PU kontrollert kellen programozni. Ami meg van hozzá, az ERRŐL a linkről letölthető. HEX stb. A fuse bitek-kel vagyunk gondban, elvileg erre is van egy HIVATKOZÁS de igazából avr-el nem igazán foglalkoztunk még. Így ha lenne valaki, aki ezt megoldaná hálás lennék.
Köszi
(#) sikolymester válasza H2opok hozzászólására (») Márc 20, 2012 /
 
Milyen programozód van?
Illetve milyen programmal próbálod programozni?

Teszem azt: STK200 + avrdude, AVRISP + avrdude, STK500 + AVR Studio4
(#) mzozo95 hozzászólása Márc 20, 2012 /
 
Sziasztok!

atmega48 nál szeretném az uart-on bejövő karaktereket karakterlánccá összeilleszteni, a karakterlánc(sztring) végén mindig a "sorlezárás"(/n) lenne, ezt hogyan lehet megvalósítani?

Segítségeteket előre is köszönöm!
Zoltán
(#) sgt válasza mzozo95 hozzászólására (») Márc 20, 2012 /
 
C-ben a string végén EOS (End Of String) szerepel, aminek az értéke 0. Ez gyárilag van így. Emiatt van az hogy egy 8 elemű string 9 bájt helyet foglal . Amit te említesz a \n az a sortörés.
(#) sgt válasza mzozo95 hozzászólására (») Márc 20, 2012 / 1
 
A kérdésedre is válaszoljak:
  1. #define EOS 0
  2. ...
  3. while(x != EOS) // ahol x a bejövő karater.
(#) sgt válasza sgt hozzászólására (») Márc 20, 2012 / 1
 
Kifutottam az időből .
  1. #define EOS 0
  2. ...
  3. char x = UDR;
  4. char string[20];  // előre le kell foglalni a helyet, ahova majd kerülni fog, ha jól tudom.
  5. while(x != EOS)
  6. {
  7.  *string++ = x;
  8.  x = UDR;
  9. }

Vagy valami ilyesminek kell lennie, persze pár dologgal kiegészítve.
(#) patmosis válasza Fizikus hozzászólására (») Márc 20, 2012 /
 
Szia a gyro egy MMA7361 analog 3 tengelyes .
Az alap pedig egy ARDUINO MEGA 2560 R3
(#) patmosis válasza Fizikus hozzászólására (») Márc 20, 2012 /
 
Következő: »»   426 / 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