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   606 / 839
(#) Zsolt2 válasza Droot hozzászólására (») Máj 28, 2014 /
 
strstr fuggveny visszadja az idezojel elofordulasi helyet es ezt felhasznalva at tudod masolni az elso 9 karaktert strncpy fugvennyel (szukseges betenni include-ba a string.h).

  1. strncpy(cel, strstr(forras, "\"")+1, 9)
(#) Zsolt2 válasza szaboa1 hozzászólására (») Máj 28, 2014 /
 
A USARTReadChar fuggvenynel tegyel potosvesszot a while cilkus vegere.
  1. char USARTReadChar()
  2. {
  3.     while ( !(UCSRA & (1<<RXC)) );
  4.     return UDR;
  5. }

Maskepp jonak nez ki a kod.
A hozzászólás módosítva: Máj 28, 2014
(#) szaboa1 válasza Zsolt2 hozzászólására (») Máj 28, 2014 /
 
Ugyanaz az a helyzet. Itt van egy pár kép a beállításokról : link

Amúgy a modult 5V -ról táplápom, és nincs feszültség osztó az Rx lába és a microcontroller Tx lába között. (azt mondták máshol hogy amelyik modulnak van baseboardja annak nem kell, amúgy is megkapom jól az adatot ha direkt a kontrollerről küldöm)
(#) Zsolt2 válasza szaboa1 hozzászólására (») Máj 28, 2014 /
 
Ha kulon tudod valasztani a mikrvezerlotol a BT modult akkor probald meg osszekotni az RX-TX labakat es ugy vissza kell kuldje amit kapott.
Nem vagyok meggyozodve, hogy fogja szeretni hosszu tavon az 5V-os tapot, adatlap szerint csak 4.2V-ig mehet
(#) szaboa1 válasza Zsolt2 hozzászólására (») Máj 28, 2014 /
 
Rajta azt írja, hogy 3.6 - 6 V.
Már teszteltem úgy, vissz is küldi amit kiküldök.
(#) szaboa1 hozzászólása Máj 28, 2014 /
 
Valami otlet?
(#) kala1982a válasza szaboa1 hozzászólására (») Máj 28, 2014 /
 
Fórum tetején lévő sárga alapú szövegdoboz 3. pontja, nem? Milyen kristállyal megy az AVR?
(#) szaboa1 hozzászólása Máj 28, 2014 /
 
8MHZ, 2x 22pF kondenzator.
(#) kala1982a válasza szaboa1 hozzászólására (») Máj 29, 2014 /
 
57600-as baudrate-nél 7,84 % a hiba Bascom szerint. 11.0592 Mhz-es kristálynál 0%.
(#) Droot válasza Zsolt2 hozzászólására (») Máj 29, 2014 /
 
Köszönöm!

Más:
Az alábbi stringben a 18-at szeretném egy integer változóba berakni:
  1. forras[]="+CSQ: 18,0";
  2. strncpy(forras, strstr(forras, " ")+1,2);
  3. szam=atoi(forras);

Így szintaktikailag helyes?
Azért a forrast másoltam a forras-ba mert nem akarok plusz változót létrehozni, hogy a memóriát ne foglalja.
(#) Zsolt2 válasza Droot hozzászólására (») Máj 29, 2014 /
 
Igy is helyes szintaktikailag, de lehet egyszerubben is, hogy nem hasznalod a strncpy-t
  1. forras[]="+CSQ: 18,0";
  2. szam=atoi(strstr(forras, " ")+1);
A hozzászólás módosítva: Máj 29, 2014
(#) Droot válasza Zsolt2 hozzászólására (») Máj 29, 2014 /
 
Köszi.
(#) fecus hozzászólása Máj 30, 2014 /
 
Egy kis nixie-s órát készítek. Egyelőre 1Hz-ről járna, és szeretném ha az üres időt "átaludná" a proci. Mindig írtátok, hogy az IT alatt csak egy flag-et állítsunk és a lényeg a fő ciklusban történjen. Ha én csak pár száz utasítást szeretnék lefuttatni másodpercenként (kijelző frissítése és bill. figyelés) akkor sem történhet mindez az IT-n belül?
Ha nem akkor hogyan tudja a főprogram, hogy ő következik?
Elég egy llink ha valahol van ilyen leírva/magyarázva.
(#) gtk válasza fecus hozzászólására (») Máj 30, 2014 /
 
Ha nem akkor hogyan tudja a főprogram, hogy ő következik?

A foprogram egy vegtelen ciklus. Ezen belul van egy
  1. if(flag_akarmi == 1) { flag_akarmi=0; //es ide a tobbi kod
  2. }

Az IT a flaget beallitja, a foprogram meg folyamatosan figyeli (ahogy raer, a proci kihasznaltsagatol fuggoen) a flaget, Amikor beallt a flag, vegrehajtodik a hozza tartozo kod.

Ja most esett le, hogy altatni szeretned, Ebben az esetben valami esemenyre fel kell ebreszteni a processzort, tovabb a fenti ervenyes.
A hozzászólás módosítva: Máj 30, 2014
(#) fecus válasza gtk hozzászólására (») Jún 2, 2014 /
 
Ez lesz az, köszi. Tehát ha a főprogramban altatok és beüt az IT akkor a főprogram is feléled az IT kezelése után, és továbbmegy a következő utasításra és lefut minden ami az altatás után van.?
(#) yohnsee hozzászólása Jún 2, 2014 /
 
Sziasztok ismét!

Újra kérdéssel fordulok a fórumhoz. A-D átalakítást szeretnék a következő módon véghez vinni:
ADC4 és ADC5 lábat használnám egy Attiny24-en. A program egy pontján az ADC5-öt mérném meg, ezt eltárolnám egy globális változóba, majd a program későbbi pontján a másikkal hasonlítanám össze, ami közben free-run módban megy és folyamatosan frissít egy változót.
Utánaolvasás után így csináltam meg:

-Készítettem egy void InitADc() függvényt, ahol az előosztást, balra-tolást, AD megszakítást és a globális megszakításokat (sei) beállítom.
Ezt a fenti függvényt a main-ben hívom meg egyszer, a végtelen ciklusba lépés előtt.

És most jön az a rész, amiben még ennyire sem vagyok biztos, hogy jól csináltam.
Van egy másik függvény, ami akkor hívódik meg, ha az ADC5-öt szeretném egy változóba eltárolni.
Így néz ki:
  1. void potread(){
  2.         int i; 
  3.         ADCSRA &= ~(1<<ADEN);   //ADC kikapcsolása    
  4.         ADMUX |= (1<<MUX0);             //PA5-öt kiválasztottam (ADC5, 8-as láb)    
  5.         ADCSRA |= (1<<ADEN);            //ADC bekapcsolása    
  6.         _delay_ms(10)
  7.         for (i=0; i<16; ++i)
  8.         {
  9.                 _delay_ms(2);
  10.                 ADCSRA |= (1<<ADSC);    //átalakítás, első 16 eredményt eldobom
  11.                 while((ADCSRA & (1<<ADSC)) !=0);        // várás az átalakításra
  12.         }      
  13.         ADCSRA &= ~(1<<ADEN);                   //ADC kikapcsolása    
  14. }

Az ADC megszakításában csak annyit csinál, hogy az ADCH értékét átadja egy változónak.
A kérdésem itt az volna, hogy így szabad-e (szokás-e) A-D átalakítást csinálni? Illetve, az "első 16 mérés eldobása" rész úgy fog-e működni, ahogy én azt szeretném? Vagy inkább az ADIF flag-et kellene figyelnem? A biztonság kedvéért tettem bele szüneteket, de lehet, hogy csak felesleges időpocsékolás.
A hozzászólás módosítva: Jún 2, 2014
(#) Massawa hozzászólása Jún 4, 2014 /
 
Egy kérdésem lenne.
Egy portra küldök ki egy szintet ( impulzussorozat akar lenni).
Hogy ideális kegyen a forma a második lépésben a port kimenetének a komplementáris állapotát küldeném ki.

Ezt egy com (in to t) (a port bit -pin- állapota a T regiszterbe) paranccsal beolvasom Azaz a port állapotának a komplemense kerül a T regiszterbe, majd innen küldöm ki vissza ugyanarra a portra.

Egyben nem vagyok biztos, hogy ilyenkor meg kell e forditani a port adatirányát (ddr), vagy pin leolvasához nem kell irányváltás. ( az egész port elvben mindig kimeneti irányban maradhat)

Kösz.
(#) Istvanpisti válasza Massawa hozzászólására (») Jún 4, 2014 /
 
Szia!
Maradhat kimenet. A mellékletben az ATMEGA48 leírásából az ide vágó részt találod

1.jpg

2.jpg
   
(#) Massawa válasza Istvanpisti hozzászólására (») Jún 4, 2014 /
 
Kösz akkor még valahol hiba van....
(#) rolandgw válasza fecus hozzászólására (») Jún 5, 2014 /
 
Van amikor használható,de általánosságban nem tartom jó tanácsnak a flag-es IT kezelést,pont a valós idejű reagálás a megszakítások lényege.Ha csak egy flag-et akarsz billenteni ,akkor nem sok értelme van a megszakításra ugrásnak,elég ha a konkrét IT flag-et nézed.
(#) fecus válasza rolandgw hozzászólására (») Jún 6, 2014 /
 
Pont nem flag-et akartam kezelni. Klasszikusan nyomógombot az egyik IT-re és léptetni az órát az 1Hz-es IT-re. Csak azért kérdeztem rá, mert előtte sokan írták, hogy inkább a főprogramban kezeljük az eseményeket.
Akkor megy az általam elképzelt módon.
(#) rolandgw válasza fecus hozzászólására (») Jún 6, 2014 /
 
Csak arra mondatodra reagáltam,hogy az IT-t egy flag-el lekezeljük, a megoldásodat nem tartom követendő példának,a megszakítás legyen minél rövidebb,ez alapszabály.
Az Atmel oldalán a dokumentumok közt van egy példaprogram,óra nyomógombokkal,érdemes belenézni. Most nem tudom belinkelni,mert nagyon le van lassulva a weboldaluk.
(#) fecus válasza rolandgw hozzászólására (») Jún 7, 2014 /
 
Megtaláltam. Köszi.
(#) holex hozzászólása Jún 7, 2014 /
 
Hogy lehet elegánsan kiírni LCD-re egy olyan szöveget, amiben saját karakterek is vannak? Peter Fleury LCD könyvtárát használom, így definiáltam saját karaktereket:

  1. static const PROGMEM unsigned char sajatKarakterek[] =
  2. {
  3.         0x4,    0x4,    0xE,    0x1,    0xF,    0x11,   0xF,    0x0,    //a1 lcd_putc(0)
  4.         0x4,    0x4,    0xE,    0x11,   0x1F,   0x10,   0xE,    0x0,    //e1 lcd_putc(1)
  5.         0x4,    0x4,    0x0,    0xC,    0x4,    0x4,    0xE,    0x0,    //i1 lcd_putc(2)
  6.         0x4,    0x4,    0x0,    0xE,    0x11,   0x11,   0xE,    0x0,    //o1 lcd_putc(3)
  7.         0xA,    0xA,    0x0,    0xE,    0x11,   0x11,   0xE,    0x0,    //o3 lcd_putc(4)
  8.         0x4,    0x4,    0x0,    0x11,   0x11,   0x13,   0xD,    0x0,    //u1 lcd_putc(5)
  9.         0xA,    0x0,    0x0,    0x11,   0x11,   0x13,   0xD,    0x0,    //u2 lcd_putc(6)
  10.         0xA,    0xA,    0x0,    0x11,   0x11,   0x13,   0xD,    0x0             //u3 lcd_putc(7)
  11. };


És jelenleg pl azt, hogy hőmérséklet így íratom ki:

  1. lcd_putc('H');
  2. lcd_putc(4);
  3. lcd_putc('m');
  4. lcd_putc(1);
  5. lcd_puts("rs");
  6. lcd_putc(1);
  7. lcd_puts("klet:");


Biztosan van rá valami elegánsabb megoldás, pl valami buffer karaktertömbbe beírni ezeket, és utána egy lcd_puts(buffer) sorral kiíratni. A gond csak az, hogy nem tudom hogyan kéne ezt megcsinálni... Van valakinek ötlete?
(#) killbill válasza holex hozzászólására (») Jún 8, 2014 /
 
lcd_puts("H\4m\1rs\1klet");

Ez a "\nnn" irosamod, ahol "nnn" egy 1, 2 vagy 3 jegyu OKTALIS, azaz nyolcas szamrendszerbeli szam. \4 \5 \6 \7 \10 \11 .. \17 \20 \21 stb.

De \0-t nem javaslom stringekben hasznalni, mivel az a string veget jelenti a C nyelvben, tehat csak addig fogja kiirni:
lcd_puts("alma\0fa") eredmenye a kijelzon csak alma lesz.
(#) 06smici hozzászólása Jún 9, 2014 /
 
Sziasztok
Ezzel kapcsolatban van valakinek tapasztalata? Meglepően olcsó eredeti JTAG-hez képest, ez meglátszik működésében is?
(#) zombee válasza killbill hozzászólására (») Jún 9, 2014 /
 
A kijelzőkben a 0-7 és 8-15 karakterkódok megegyeznek. A '\0' valóban nem szerencsés,
helyette a '\8' javasolt. Így lehet mind a 8 "egyéni" rekeszt kihasználni.
(#) zombee válasza 06smici hozzászólására (») Jún 9, 2014 /
 
A JTAG ICE-ra épülő a klónokkal nem szokott (túl sok) probléma lenni. Érdemes tudni hogy
a valamire való klónok az Atmel eredeti firmware-t használják ezért ugyanazt kell tudniuk.
Az USB drivert, a kimenet meghajtást és a tápellátás részét viszont alaposan el lehet szúrni.

Nem tudom mit tud egy ilyen cucc, de én építettem már jó sok klónt és valahogy van egy
olyan érzésem hogy ez az ár nálam már az anyagár alatt van: ATMega16 mikrovezérlő,
USB illesztő, tápfesz áramkör, kimenet meghajtás, USB kábel, szalagkábel, doboz, kapcsoló, LED.
A hozzászólás módosítva: Jún 9, 2014
(#) hátor hozzászólása Jún 9, 2014 /
 
Sziasztok !
Volna egy olyan gondom ,hogy szeretnék felprogramozni egy ATMega8 avr-t avr - Doperbe . egy éve építettem ,de nem jutottam a végére . Mi módon tudnám ezt most megtenni , STK300 letölt kábelem van ,a gépen Xp fut , avr studió 6 meg Bascom avr demo 4Kb . Forrás kódom Hex - a fájlban van .
Segítségeteket előre is köszönöm !
(#) zombee válasza hátor hozzászólására (») Jún 9, 2014 /
 
PonyProg vagy Bascom tudja ezt a kábelt használni.
Következő: »»   606 / 839
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