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   157 / 840
(#) sargarigo hozzászólása Okt 16, 2009 /
 
Sziasztok!

Remélem csak nekem van ilyen bajom...
Van egy pár atmega8-asom, de nem tudom őket felprogramozni külső kristály használatára, így mind 1MHz-en jár. Tudnátok ebben nekem segíteni? Küldök egy minta Makefile-t

Köszönöm!
Krisz
(#) gtk válasza sargarigo hozzászólására (») Okt 16, 2009 /
 
1,2,4,8 MHz is lehet a belso RC oszcival. Kuldok egy linket, kivalasztod a proci tipusat, a Features -nel meg ami kell, es lent a Current settings-nel lathatod is a beallitasokat.Bővebben: Link
(#) Robi98 hozzászólása Okt 17, 2009 /
 
Sziasztok

Nem tudom, hogy egy AVR dallamcsengőhöz hozzá lehet--e kötni egy mikrokapcsolót ajtónyitásriasztó képpen.
(#) TavIR-AVR válasza sargarigo hozzászólására (») Okt 17, 2009 /
 
Azt a fusebiteknél állítod, nem a programban....
(#) TavIR-AVR válasza Robi98 hozzászólására (») Okt 17, 2009 /
 
Igen, ha van egy szabad lábad és kezeli a dallamcsengő-program.
(#) Robi98 válasza TavIR-AVR hozzászólására (») Okt 17, 2009 /
 
Köszi a választ.

Aszabad lábat a mikrokapcsolóra érted?
(#) trudnai válasza Robi98 hozzászólására (») Okt 17, 2009 /
 
Szabad lab == kihasznalatlan I/O port lab az AVR-en...
(#) edgaar válasza Robi98 hozzászólására (») Okt 17, 2009 /
 
Nem, arra érjük, hogy a procin kell egy szabad láb amire rákötöd a mikrokapcsolódat.. és a programnak meg ezt le is kell kezelnie.
(#) sargarigo válasza gtk hozzászólására (») Okt 17, 2009 /
 
Hát az oldal valóban nagyon jó! Szépen kiszámolja a dolgokat, csak... Hát ez nagyon érdekes. Ez a "csak". Nem változik semmi a beállításoktól. Van egy kis led villogtató programom, ami kb másodpercenként villan egyet (nem timerrel, hanem _delay_ms()-el).
Nos akárhogy is állítom a dolgokat, továbbra is másodpercenként villan. Próbáltam külső nagyfrekvenciás kristállyal (ami egy 10MHz-es), aztán próbáltam RC-kkel 8 megán, és 1 megán is. Semmi változás. Mi okozhatja ezt???

" avrdude -p parport0 -c STK200 -p $(MCUP) -U lfuse:w:0xef:m -U hfuse:w:0xc9:m"

Krisz
(#) edgaar válasza sargarigo hozzászólására (») Okt 17, 2009 /
 
Hali !
Még jó, mivel a _delay_ms() _delay_us() az F_CPU def alapján müködik. (az ugyebár meg beállítódik valahol a programodban az mcu óra jelére). Pont ez a lényeg, h az 1ms delay 4MHz-n is és 10en is 1 ms legyen, nem !?
(#) gtk válasza sargarigo hozzászólására (») Okt 17, 2009 /
 
Van e Makefile-ban egy F_CPU bejegyzes, oda ird be pontosan az alkamlazott frekvenciat, Hz-ben. Ezt hasznalja a _delay szamolashoz. Azon kivul a _delay_ms -nek is van felso hatarerteke, azt hiszem 65. E folott mar nem pontos. (?)
(#) edgaar válasza gtk hozzászólására (») Okt 17, 2009 /
 
pontosan, vagy a delay.h -t használo file-ba v a makefile-ba kell definálni az F_CPU -t (anélkül warningot is dob a fordító..)
Itt a delay leírása, olvasd át alaposan
(#) zebra3 hozzászólása Okt 18, 2009 /
 
Sziasztok!

Építettem agy stk500v2-es klón programozót (Link). Az avrdude-al működik (com4-en) de az AVRStudo 4.17 nem találja. Több helyen találtam képet a beállító panelről ( Bővebben: Link ) ahol a beállítások között lehet választani az "STK500 or AVRISP"-t. A 4.17-es verzióban viszont ez a kettőt külön választották és nekem egyikkel sem megy. Itt van egy táblázat amiben az AVRStudio 4.19 szerepel de szerintem a 4.17 a legfrissebb. Egy régebbi verziót kellene kipróbálnom?
(#) atiotezer válasza zebra3 hozzászólására (») Okt 18, 2009 /
 
A Windows-os drivert felraktad hozzá?
(#) zebra3 válasza atiotezer hozzászólására (») Okt 18, 2009 /
 
A libUSB-Win32-t raktam fel.
(#) sargarigo válasza edgaar hozzászólására (») Okt 18, 2009 /
 
Nem jó. Átírtam a programot delay nélkülire, egyszerűen egy for ciklus csinálja a késleltetést, a magjában egy __asm__("nop"); utasítással. Tehát most már semmi időzítés nincs benne. Próbáltam átírni a fuse biteket 1, 8MHz-es RC-re, és külső kristályra (tegnap a "high freq", ma "low freq" változatban is). Továbbra is ugyanaz a villogás sebessége, tehát nem változott az órajel. Ja, átírtam az F_CPU-t is, lementem vele egész extrém 100000Hz-re. Semmi változás. Ez most akkor egy X-akta???

Krisz

u.i: avrdude 5.5-ös verziót használok linuxon. Lehet hogy bug van benne? De ekkora???
Megpróbálok egy bascom-ot is, hátha tényleg szoftverhiba lesz..
(#) gtk válasza sargarigo hozzászólására (») Okt 18, 2009 /
 
Lehet hogy nem irtad be a prociba modositas utan a fuse biteket?
Lehet hogy nem a modositott .c fileoddal dolgozik a Makefile? (elmentetted mas neven, es nem modositottad a Makefile-ban) Nem tudok jobbat. (ilyen X aktas esetre olvastam korabban valami hasonlot: "jo gep elott ulsz ?"
(#) Sir-Nyeteg válasza gtk hozzászólására (») Okt 18, 2009 /
 
Bővebben: Link
sargarigo: Csak ez most a szoftveres részre vonatkozik
(#) gtk válasza sargarigo hozzászólására (») Okt 18, 2009 /
 
Idézet:
„átírtam az F_CPU-t is, lementem vele egész extrém 100000Hz-re.”
F_CPU erteke annyi kell legyen mint a hasznalt proci orajel frekvenciaja. Ez szerint szamol a _delay_us, es a tobbi, vagyis a loop-ok, amelyeket hasznalja a _delay_xx.
(#) sargarigo válasza gtk hozzászólására (») Okt 18, 2009 /
 
Működik!
Átmentem dózeba, és bascomban megírtam ugyanezt a programot. Áttöltöttem, és hozta a szokásos 1s -os villogást. Aztán megnéztem a fuse biteket az áttöltő panelon, és beállítottam külső nagyfrekis kristályt 0ms indítási késleltetéssel. És jé, gyorsabban villog! Ez már jó jel volt. Megnéztem a fuse biteket hogy miként definiálta: ee:d9 volt. Vissza linuxba, átírtam a Makefile-ban hogy ee:d9-et írjon ki. És most már itt is működik. Nem tudom miért nem volt jó a számított változat(ok), de ezzel úgy tűnik hogy rendben van. Most örülök!

Köszönet mindenkinek az ötletekért!!

Krisz

u.i: Ja, és meggyőződtem róla, jó gép előtt ülök!
(#) gtk válasza sargarigo hozzászólására (») Okt 18, 2009 /
 
Jol ertem en, hogy nem jol szamolja a korabban belinkelt oldal a fuseokat? (Meganal meg nem hasznaltam.) E_E : D_9, az oldal szerint is Ext crystal/resonator high freq, 0ms. Vegulis nem ertem mi volt a gond, de nem is fontos, az a lenyeg hogy te ertsd
(#) sargarigo válasza gtk hozzászólására (») Okt 18, 2009 /
 
Nem-nem! Az oldal jó!
Éppen ezt mondtam, hogy jól számolt mindent, csak rosszul választottam ki!

Szóval okés a dolog!

Krisz
(#) sargarigo válasza sargarigo hozzászólására (») Okt 19, 2009 /
 
Érdekes problémába botlottam! Egy timert futtatok, ami egy szinusz jelet adogat kifelé a PORTD-re.

  1. void startPlayback(unsigned long ocr)
  2. {
  3.         // FOR ATMEGA8! Set up Timer 1 to send a sample every interrupt.
  4.         TCCR1B |= (1 << WGM12);           // Configure timer 1 for CTC mode
  5.         TIMSK |= (1 << OCIE1A);           // Enable CTC interrupt
  6.         sei();                            // Enable global interrupt
  7.         // NOW starting the timer! SAMPLE_RATE=8000
  8.         // F_CPU = 10000000.
  9.         // Target Timer Count = (1 / Target Frequency) / (1 / Timer Clock Frequency) - 1
  10.         OCR1A = ocr;
  11.         TCCR1B |= _BV(CS10);              // start with NO pre-scaling.
  12.         DDRD = 0xff; // minden bit kimenet
  13. }
  14.  
  15. ISR(TIMER1_COMPA_vect) {
  16.         CurSinVal += SWa;
  17.         // normalize temp - pointer
  18.         TmpSinVal = (char)(((CurSinVal+4) >> 3)&(0x00ff));
  19.         PORTD = sinewave256[TmpSinVal];
  20. }


ahol SWa határozza meg a frekvenciát.

A hang idejét egy delay_ms() -el állítom be a főciklusban. Érdekesség az, hogy minél magasabb hangot szólaltatok meg, annál rövidebb ideig tart. Tehát a mély hangot hosszú ideig kitartja, a magasakat pedig egyre rövidebben. Próbáltam delay-független késleltetést csinálni a timer0-val, de a szitu ugyanez.

  1. volatile unsigned int tick;
  2.  
  3. ISR (TIMER0_OVF_vect)
  4. {
  5.         if (tick>0) tick--;
  6. }
  7.  
  8. void init_timer()
  9. {
  10.     TIMSK |= (1 << TOV0);
  11.     TCNT0 = 0x00;
  12.     TCCR0 |= (1 << CS00);
  13.     sei();
  14. }
  15.  
  16. void delay(long delay_time)
  17. {
  18.     tick = delay_time;
  19.     while (tick>0)
  20.     {
  21.         __asm__("nop");
  22.     }
  23. }


Vajon miért lehet ez?

Krisz
(#) gtk válasza sargarigo hozzászólására (») Okt 19, 2009 /
 
Nehany eszrevetel: long helyett unsigned int, OCR1A 16 bites. Bar a fordito elintezi... TCCR1B configot egyben irni ki, OR nelkul. Korabban itt volt szo rola, ezek okoznak furcsasagokat. Mikor mar rendezett a kod, lehet tovabb gondolkodni.
(#) sargarigo válasza gtk hozzászólására (») Okt 19, 2009 /
 
Megtörtént a szépítés, jelenleg így áll a helyzet:

  1. void startPlayback(unsigned int ocr)
  2. {
  3.         // FOR ATMEGA8! Set up Timer 1 to send a sample every interrupt.
  4.         TCCR1B = (1 << WGM12) | (1 << CS10);    // Configure timer 1 for CTC mode
  5.                                                 // start with NO pre-scaling.
  6.         TIMSK |= (1 << OCIE1A);                 // Enable CTC interrupt
  7.  
  8.         // NOW starting the timer! SAMPLE_RATE=8000
  9.         // F_CPU = 10000000.
  10.         // Target Timer Count = (1 / Target Frequency) / (1 / Timer Clock Frequency) - 1
  11.         OCR1A = ocr;
  12.         sei();                            // Enable global interrupt
  13.  
  14.         DDRD = 0xff; // minden bit kimenet
  15. }


Egyébként feltöltöttem a programot, hátha máshol van a hiba.
main.c
freq.inc
Makefile


(#) Norberto válasza sargarigo hozzászólására (») Okt 19, 2009 /
 
Esetleg ide is feltöltheted fájlmellékletként ezeket, és akkor az utókornak is megmaradnának tutira...
(#) wir12 hozzászólása Okt 19, 2009 /
 
Hello mindenki!

Azt szeretném kérdezni hogy mit tudtok a ATF16V8BQL-es AVR-ről ha egyáltalán az? Adatlap Link
Mert most szeretnék elkezdeni foglalkozni az AVR programozással és nem tudom honnan de ebből az AVR-ből nekem van 3 is és ha ezzel is el tudom kezdeni a 'gyakorlást' már nyert ügyem van.

A választ előre is köszönöm
(#) edgaar válasza wir12 hozzászólására (») Okt 19, 2009 /
 
Hali !

Nem, ez nem mikrokontroller, hanem PLD (programable logic device) mint ahogyan a datasheet is irja. Nagyon leegyszerüsítve úgy kell elképzelni, hogy vannak bemeneti lábai, és kimeneti lábai. A kimenetek a bemenetek és a program függvényében állnak be. Kb olyasmi mint egy programozható logikai kapu. A programozással gyakorlatilag a bemenet/kimeneti igazságtáblát deklarálod le.
mikrokontrollerrel ez utánozható viselkedés, de ez közel sem olyan okos áramkör, nincsenek perifériái satöbbi..
(#) wir12 válasza edgaar hozzászólására (») Okt 20, 2009 /
 
Okés köszönöm
Azért kérdeztem meg itt mert:
1 Itt sok az okos ember...
2 Nagyon szegényes az angol tudásom...

Amúgy én onnam gondoltam hogy MCU mert rajta van az ATMEL felirat de tévedni emberi szokás.

Akkor mégis kell vennem egy marék AVR-t
(#) edgaar válasza wir12 hozzászólására (») Okt 20, 2009 /
 
Az Atmel elég sokmindent gyárt, igaz az egyik fő profiljuk az MCU.
Amúgy azokkal is lehet mit kezdeni, de én személy szerint nem foglalkoztam PLD-kkel, nem tudom hogyan/mivel kell programozni, de gyanúm szerint nem lehet egy túl bonyolult dolog..
Következő: »»   157 / 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