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   193 / 840
(#) Sir-Nyeteg válasza ATtiny hozzászólására (») Feb 28, 2010 /
 
Okés, minden hibátlan! Nem földeltem le a nullázó jelet.
Enkóderem még nincs, mivel egy dual rés optót fogok használni. Ahhoz még nincs meg a nyák.
Engem érdekel a 4x-es kódolás is!
Köszönöm!

(Alkatrész-számláló lesz belőle. Így nem kész enkódert igényel. És nincs szükség nullázásra se. Már elég rendesen átírtam a programot, irányváltással, nullázással, és egy osztóval is rendelkezik. Na meg ezek kijelzésével.)
(#) Tomi20 válasza Menyét hozzászólására (») Feb 28, 2010 /
 
Köszi, akkor beforrasztom, csak nem mertem kipróbálni, mert TQFP tokozású, és azt roncsolás nélkül nem tudnám kicserélni ATMEGA8-ra ha mégsem működne.
(#) ATtiny válasza Sir-Nyeteg hozzászólására (») Feb 28, 2010 /
 
Elküldtem. Remélem valamit megértesz belölle. Sajnos egy nagyságrendel bonyolultabb lett mint szerettem volna. Újra kéne írni. Majd talán valamikor rászánom magam.
(#) Sir-Nyeteg válasza ATtiny hozzászólására (») Feb 28, 2010 /
 
Tagolt, átlátható. Kicsit bonyi.
Csináltam egyszer egy stepper motor tesztert. És ahhoz egy stepper motor teszter-tesztelőt.
Most kapcsoltam, hogy annak a kimenete is (2 tekercs gerjesztés esetén) enkóder jellegű.
Sajnos a kód már nincs meg. Mindig az előző állapotot és a következő állapotot hasonlította össze, így ha jól emlékszem, akkor 16db if feltétel volt a programban.
(4db előző * 4db jelenlegi kombinációja. De 8db-ból is összerakható.) Sebességet nem számoltam. Ha lesz időm, akkor utána gondolok, hogy hogyan is volt. Azt tudom, hogy goto-val ugrottam ki az if-halom elejére, és 10nF-os kondival prell mentesítettem. Kijelző nem volt, egy hibát engedélyeztem, méghozzá a bekapcsolás utánit, hiszen ott nem lehet tudni, hogy hol áll.
(#) (Felhasználó 4577) válasza (Felhasználó 4577) hozzászólására (») Feb 28, 2010 /
 
Van valakinek ötlete?
(#) Sir-Nyeteg válasza (Felhasználó 4577) hozzászólására (») Feb 28, 2010 /
 
Szerintem nézegesd tovább, hogy mi az ami nulla.
Pl: TCNT0, f_avg, stb.
Rengeteg változó van a programban. Én ennyit tudtam segíteni. Jobban nem látom át.
(#) gabi20 hozzászólása Márc 2, 2010 /
 
Sziasztok! AT90S2313 mikrovezérlőt programozok BASCOM AVR - ben. A PORTB felhúzóellenállásokat szeretném bekapcsolni, de nem tudom milyen utasítás van erre. Valaki tud erről valamit? Előre is kösz
(#) tibi0531 válasza gabi20 hozzászólására (») Márc 2, 2010 /
 
A lábat bemenetként konfigurálod (DDRB regiszter), és ezután magas állapotra állítod a PORTB-vel (mintha kimenet lenne, pl. PORTB=&HFF).
(#) gabi20 válasza tibi0531 hozzászólására (») Márc 2, 2010 /
 
Köszi szépen...nem gondoltam hogy ilyen egyszerű
(#) toMI-DBT hozzászólása Márc 2, 2010 /
 
Sziasztok! Kezdő vagyok a témában átnyálaztam a cikkeket és a kapcsolásokat is, de egy olyan problémával találkoztam amit nem tudok rájönni! írtam egy ilyen kis progit atmega8-ra:
#include
#include
#include



#define F_CPU 1000000UL
#define SEI() asm("sei")
#define CLI() asm("cli")

int init_io(void);
int init_timer16bit(void);
int init_all(void);


uint16_t egy=0, tiz=0, szaz=0, ezer=0, kij=0, i=0, b;


int main (void)
{
init_all();

SREG=0b10000000;








while(1)
{
if(b)
{

for(kij=0; kij<30000; kij++)
{
PORTD=0xFF;
}
b=0;
}

}




}

//////////////////////////////////////////////
//////////////////////////////////////////////




//////////////////////////////////////////////
//////////////////////////////////////////////
int init_io(void)
{
DDRD |= 0xFF;
DDRB |= (1< PORTD=0x00;
PORTB=0x00;
return 0;
}

int init_timer16bit(void)
{

TCCR1B |= (1< TIMSK |= (1<

OCR1A=100;
return 0;
}

int init_all(void)
{
init_io();
init_timer16bit();
return 0;
}

//////////////////////////////////////
/////////////////////////////////////


ISR(TIMER1_COMPA_vect)
{

i++;
if(i==10) b=1, i=0;




//return 0;
}



De ebben az a problémám hogy nem jön meg az ISR()-ben végrehajtandó változó növelés és a while()-ban nem csinál semmit! A megszakítás megjön csak nem ugrik az ISR-re! mi a hiba? >>>>>>>>>>>>>>>
(#) szoto válasza toMI-DBT hozzászólására (») Márc 2, 2010 /
 
Az i és a b változót igy deklaráld:

  1. volatile uint8_t i = 0,b;
(#) toMI-DBT válasza szoto hozzászólására (») Márc 2, 2010 /
 
Köszönöm a segítséget! de így se jó!
(#) aticska válasza toMI-DBT hozzászólására (») Márc 2, 2010 /
 
SEI() lemaradt
(#) toMI-DBT válasza aticska hozzászólására (») Márc 2, 2010 /
 
Sreg regiszterben az I bit 1-es akkor van nem? :O
(#) mukievil hozzászólása Márc 2, 2010 /
 
Sziasztok, megin én vagyok! Ismét "megöltem" az avr-em az orajel állítással, most már megépítem az avr visszahozot az oldalról!

Most azt szeretném megkérdezni, hogy mit kell szoftveresen és hardveresen csinálni, hogy tudjam az avr-em egy 3.27 mhz-es (nem tudom pontosan mennyi) kvarcról működtetni ? (attiny2313, avrstudio, bascom, avr-isp égető)

Vagy egy leírása ahol le van írva az sokat segíteni, a 3. chipem nem akarom elrontani !
Köszi a választ előre is!
(#) ATtiny válasza toMI-DBT hozzászólására (») Márc 2, 2010 /
 
A kódod olvashatatlan. Máskor jó lenne ha normálisan illesztenéd be. Esetleg csatolhatod is.
(#) gtk válasza mukievil hozzászólására (») Márc 2, 2010 /
 
(#) (Felhasználó 4577) válasza mukievil hozzászólására (») Márc 2, 2010 /
 
Igazából semmit sem kell tudnod, csak angolul olvasni. Az AVR Studio Fuse bit-eknél az Extarnal crystal-t kell kiválasztanod, azt hogy hány MHz-től hány MHz-ig pedig Te is el tudod dönteni.

A gond csak ott van, hogy már elcsavargattad azokat a biteket.
Kis szerencsével ha rákötöd a 3.27MHz-es kvarcot 22pF-os kondenzátorokkal működni fog, ha nem akkor meg kell próbálni 1MHz-essel és 8MHz-essel is.
Miután felismerte az AVR Studio korrekt módon be kell állítani a megfelelő kvarchoz.
(#) toMI-DBT válasza ATtiny hozzászólására (») Márc 2, 2010 /
 
Esetleg vki elmondhatja hogyan kell "normálisan" beilleszteni és akkor átszerkesztem mert nem találtam sehol...
(#) Moderátor hozzászólása toMI-DBT hozzászólására (») Márc 2, 2010
 
Kód beillesztés. Ott van külön gomb.
(#) toMI-DBT válasza (») Márc 2, 2010 /
 
Köszönöm!
(#) toMI-DBT hozzászólása Márc 2, 2010 /
 
  1. #include <util/delay.h>
  2.  
  3. #include <avr/interrupt.h>
  4.  
  5. #include <avr/io.h>
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13. #define F_CPU 1000000UL
  14.  
  15. #define SEI() asm("sei")
  16.  
  17. #define CLI() asm("cli")
  18.  
  19.  
  20.  
  21. int init_io(void);
  22.  
  23. int init_timer16bit(void);
  24.  
  25. int init_all(void);
  26.  
  27.  
  28.  
  29.  
  30.  
  31. uint16_t  egy=0, tiz=0, szaz=0, ezer=0,  kij=0;
  32.  
  33.  
  34.  
  35. volatile uint8_t i=0,b;
  36.  
  37.  
  38.  
  39.  
  40.  
  41. int main (void)
  42.  
  43. {
  44.  
  45. init_all();
  46.  
  47.  
  48.  
  49. SREG=0b10000000;
  50.  
  51.  
  52.  
  53.  
  54.  
  55. //volatile uint8_t i = 0,b;
  56.  
  57.  
  58.  
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.         while(1)
  68.  
  69.         {
  70.  
  71.                 if(b)
  72.  
  73.                 {
  74.  
  75.                
  76.  
  77.                         for(kij=0; kij<30000; kij++)
  78.  
  79.                                 {
  80.  
  81.                                 PORTD=0xFF;
  82.  
  83.                                 }
  84.  
  85.                 b=0;
  86.  
  87.                 }
  88.  
  89.  
  90.  
  91.         }
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101. }
  102.  
  103.  
  104.  
  105. //////////////////////////////////////////////
  106.  
  107. //////////////////////////////////////////////
  108.  
  109.  
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116.  
  117. //////////////////////////////////////////////
  118.  
  119. //////////////////////////////////////////////
  120.  
  121. int init_io(void)
  122.  
  123. {
  124.  
  125. DDRD |= 0xFF;
  126.  
  127. DDRB |= (1<<DDB0) | (1<<DDB1) | (1<<DDB2) | (1<<DDB3);
  128.  
  129. PORTD=0x00;
  130.  
  131. PORTB=0x00;
  132.  
  133. return 0;
  134.  
  135. }
  136.  
  137.  
  138.  
  139. int init_timer16bit(void)
  140.  
  141. {
  142.  
  143.  
  144.  
  145. TCCR1B |= (1<<WGM12) | (1<<CS10);
  146.  
  147. TIMSK |= (1<<OCIE1A) ;
  148.  
  149.  
  150.  
  151.  
  152.  
  153. OCR1A=100;
  154.  
  155. return 0;
  156.  
  157. }
  158.  
  159.  
  160.  
  161. int init_all(void)
  162.  
  163. {
  164.  
  165. init_io();
  166.  
  167. init_timer16bit();
  168.  
  169. return 0;
  170.  
  171. }
  172.  
  173.  
  174.  
  175. //////////////////////////////////////
  176.  
  177. /////////////////////////////////////
  178.  
  179.  
  180.  
  181.  
  182.  
  183. ISR(TIMER1_COMPA_vect)
  184.  
  185. {
  186.  
  187.        
  188.  
  189.         i++;
  190.  
  191.         if(i==10) b=1, i=0;
  192.  
  193.                
  194.  
  195.                
  196.  
  197.  
  198.  
  199.        
  200.  
  201.         //return 0;
  202.  
  203. }

Timer.c
    
(#) szoto válasza toMI-DBT hozzászólására (») Márc 3, 2010 /
 
Ahogy "aticska" is írta lemaradt a sei() a main-ból;

  1. sei(); /* enable interrupts */
(#) mukievil válasza (Felhasználó 4577) hozzászólására (») Márc 3, 2010 /
 
Köszi a válaszokat linkeket, megnézem majd őket hétvégén, elöbb nem lesz rá idő!

Ám addig igen eljutottam, hogy external crystal oscillator-t beállítom a nekem megfelelő mhz-re, de a vadiúj chipemet ezzel meg is öltem, rajta a kvarc és meg se nyekken, lehet félre nyomtam valamit, és még valamit elállítottam ?
No mind1, hétvégén okosabb leszek
(#) gtk válasza toMI-DBT hozzászólására (») Márc 3, 2010 /
 
Az ilyen nagyobb terjedelmu kodot szerintem mellekeld.
(#) embraced hozzászólása Márc 4, 2010 /
 
Sziasztok! Valaki nem tudna nekem ajánlani egy mikrovezérlőt (nem feltétlen az atmeltől) ami alkalmas lenne ennek a genius hangfal mikrovezérlőjének a helyettesítésére (SN8P2714S)?link
(#) kiborg válasza kiborg hozzászólására (») Márc 4, 2010 /
 
Hali Mindenkinek!

Készítettem egy kis segítséget, remélem csökkentem egy kicsit azoknak az éhségét, akik magyar doksikra vágynak AVR assemblyvel kapcsolatban.
Véleményt kérnék, hogy melyik a jobb illetve használhatóbb és hogy kinek milyen észrevétele van a jobbá/szebbé tételére. Illetve az esetleges hibákat is jelezzétek.

Köszi Kiborg
(#) toMI-DBT válasza gtk hozzászólására (») Márc 4, 2010 / 1
 
Ok! Elnézést, hogy ennyire idiót vagyok, de nem sokat szoktam itt fórumozni és nem tudom mik a szokások!

A probléma ugyan az nem működik és most már sei()-t írtam be!

Timer.c
    
(#) gallz válasza toMI-DBT hozzászólására (») Márc 4, 2010 /
 
Próbáld meg, hogy a megszakítás rutinban ne legyen más csak az i változó növelése. Így a b változót is elhagyhatod. Természetesen ekkor a fő ciklusban (i==10) a feltétel.
Aztán, amíg a for ciklus dolgozik kikapcsolhatnád a megszakítást cli().

ITT találsz leírást a timer használatról.
Következő: »»   193 / 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