Fórum témák
» Több friss téma |
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
Helo.
Lehet hogy kerdezek,de hw -vagy sw-es kapuzasos megoldasra gondoltok?
én hw - re gondolok
gtk: neked hogy áll a frekimérőd?
Elmeletben keszen van,gyakorlatban nincs
Gond volt az idoalap valtasokkal; Aztan ujra kellene strukturalni az egeszet..Unom leprogizni:no: Most 7szegmens multiplexalok,aztan meglatjuk mi lesz ebbol.. De ha mar itt szo van rola... Az analg reszet hogy epitenetek fel?
Azon nem gondolkoztatok, hogy a mérendő jelet előosztani? Így nagyobb frekvenciájú jeleket is gond nélkül (persze nagyobb hibával és kisebb felbontással) lehetne mérni.
Ha például 14-el kellene osztani, akkor szorozd meg 256/14=18-al, és vedd az eredmény felső bájtját.
Vagy ha 3-al kell osztani, és mondjuk C az osztandó, akkor C/3=C/2-C/4+C/8-C/16+C/32-..., tehát az osztás jobbra léptetésre és összeadás/kivonásra bontódik.
65Mhz -ig saccoltuk a mereshatart.
Ha mar igy mukodik akkor lehetne szorakozni azzal amit irtal.
Hi!
Szerintem az oldalon fennlevő vicsys-féle PIC-es frekimérő programjából meg kapcsolásából át lehetna írni AVR-re. Ha jól emlékszem ott is valami kapuzásos technika van meg automatikus méréshatár váltás.
Tehát beépítek egy 32.768 Khz-es órakristályt, az XTal1-Xtal2-re. A fusebiteknél low external crystal-ra állítom? Akkor a proci órajel is a kristályról fog menni? Mivel a 7szegmens kijelzés is a mikrovezérlőről megy ez gond lehet.
Pontosan hogyan lehet megoldani, hogy a belső rc oszcillátorról menjen a proci, és külső kristlyról pedig az egyik számláló? Vagyis hogyan csinálok időalapot? Mennyire lenne pontos, ha szoftveres lenne a kapuzás: Az első bejövő jelre int0 megszakítás, ez elindítja a timert, ami külső kristály segítségével pont 1s-ig fut (ott túlcsordul és megszakítást generál), addig int0 által generált megszakításkor egy változó értéke nő 1-el, számolja a beérkezett jeleket. A végén a timer megszakítás letiltja az int0-t és engedélyezi a kijelzést. Így a változó értéke pont a frekvencia lesz Hz-ben. Mi a véleményetek? Üdv
Én a kapuzást és az időalapot kívülről oldanám meg, szerintem így pontosabb, és a kapujel felfutó éle egy megszakítást generálna, ami a számláló lekezeléséhez szükséges rutint indítja. Mondjuk ebben a megoldásban az AVR majdnem csak egy BCD számláló maradna
A kisfrekvenciájú oszcillátort szerintem a TOSCx - re kell kapcsolni. At XTALx-re pedig a rendes órakristályt rakd. A gond, hogy valószínűleg a túlcsordulást is kezelned kell, mert nem hiszem, hogy nagyobb frekvenciájú jelnél nem fog megtörténni, tehát a 3. esetleg 4. byte a túlcsordulások lekezelésével programból áll elő, ez pedig újabb bizonytalanságot vihet a rendszerbe. (ennek utánna kéne számolni) A kapujelet addig érdemes csökkenteni, amíg nem csordul túl a számláló, és akkor nincs gond a counter-rel.
akkor nincs gond a counter-rel.....
De csökken a felbontás. (Ez kimaradt)
Gyorsan átprogiztam a meglévő kapcsolást, nagyon jó lett, úgy is hogy nem cseréltem ki a hardveren még semmit. Egy megszakítás van, az int0. A timer 1-et beállítottam, hogy 1 s-ot fusson (egy ciklus pörög eddig). Utána a megszakítás letilt és kijelzés.
A 440 Hz-en próbáltam, 438-442-ig jöttek ki értékek. De a belső RC oszc. tényleg elég pontatlan, pedig 1 Mhz-en elvileg kalibrált. A mega8-on egybe esik a Toscx és az Xtalx. Szoftveresen hogy tudom levenni a 32.xxx -es kirstály által generált frekit? Üdv
Vajon a százalékban mért hiba nagyobb frekvencián hogyan alakul ezzel a megoldással? A túlcsordulást, hogyan kezeled le?
Lemérem a nagyobb frekit, amint visszajutok a chip-be
Átálítottam a fusebiteknél az internal clockot external low frekvency crystal-ra.. és sajnos se kép se hang. Pedig az óra kristály a helyén. Hát ha így nem akkor fogalmam sincs hogy állítom be a timert külső időzítésre... Ami érdekes, hogy a progi -igen lassan, de fut az avr-en, csak a pc-vel nincs kapcsolat. A timer nálam semmielyen esetben sem csordul túl. A főprogram rögtön egy ciklussal indul, ami akkor ér véget ha timer1 >= 15625 (ez nálam egy sec). A cikus alatt int0 engedélyezett. Az első int0 meghívás indítja csak el a timer1-et. Ha a ciklus -amiben egyébként csak egy nop van- végetér, timer1 megáll, nullázódik, int0 letiltásra kerül. Ez után jön a kijelzés. Üdv
Sziasztok!
Keresgéltem kicsit és a mega 8 leírásában ezt találtam: The Asynchronous Timer clock allows the Asynchronous Timer/Counter to be clocked directly from an external 32 kHz clock crystal.(...) The Asynchronous Timer/Counter uses the same XTAL pins as the CPU main clock but requires a CPU main clock frequency of more than four times the Oscillator frequency. Thus, asynchronous operation is only available while the chip is clocked on the Internal Oscillator. Nekem ebből az jön le hogy a belső oszcillátor mellett használhatunk külső órakristályt a timerekhez, feltéve, hogy a belső oszcillátor frekije több, mint 4x nagyobb. Arra még nem jöttem rá, hogy kell beállítani. Az biztos, hogy ha a cksel-t 1001-ra állítom akkor az egész chip 32Khz-ről megy. Egyébként van egy nagyon jó kis progi "avreal" névre hallgat, kizárt chipekbe könnyen be lehet jutni vele (a párhuzamos potról ad az Xtal1-re órajelet), így ha rossz a cksel beállítás, nem kell forassztagtni - ha kell valakinek felrakom) Üdv
Én mindíg berakok 2 tüskét a panelra, és van egy kristályom, amire ráraktam egy csatlakozót, amit rádugok, ha elrontottam
Szia!
Odaadnam a C-forraskodot amit irtam,de az az igazsag hogy /pill fogalmam nincs hogy melyik allapotaban van,hogy egyaltalan mukodik-e ,volt -e modositva es milyen iranyban. A probapanelt meg modositottam elegge ugy hogy kirpobalni nem tudom. Ami biztos: Idoalap: KUlso 32768 orakvarc Timer2-nek ,prescaler:128 Impulzus szamlalo: Timer1 --> PD5 lab. A timers init resz: /* TIMER2 , kulso 32768 oszc. XTAL labakon*/ TCCR2 |= (1 << CS22)| (1 << CS20); //elooszto 128 ASSR |= (1 << AS2); //aszinkron uzemmod bekapcs /* TIMER 1 */ /* * egy-be allitott bitek TCCR1B reg.ben: * CS10,CS11,CS12: kulso orajel forras,felfuto elre lep. * --> 00000111 --> */ TCNT1 = 0x0; //timer1 nulla TCCR1B |= 0x07; //timer 1 indul,felfuto elre lep. _BV(CS10) | _BV(CS11) | _BV(CS12); /* megszakitas engedelyezes */ TIMSK |= (1< /* PORTD / T1 bemenet */ DDRD &= ~( 1 << PD5 ); // PD5 a timer 1 clock-->imp.szamlalo /* PORTB kimenet*/ DDRB = 0xFF; /* PORTC kimenet */ DDRC = 0xff; } FUSE BITEK: lfuse:w:0xE4:m hfuse:w:0xD9:m Tovabba: (Ahogy en csinaltam Ha impulzusok szama > 10000 (10Khz),akkor idoalapvalatas,0.001S-re. Timer2 overflow rutinban az impulzusok szamanak kiolvasasa: imp = TCNT1; //timer1 erteke Megszakitast nem kapcsoltam ki: amig az ovf.rutinbol ki nem lepik a program addig megszakitas ki van kapcsolva.>>>>>>>
Tul.keppen timer1, -es 2 -t hasznalja a frekimeresre,(a proci belso oszcirol megy)igy nem sokat kavarhat be a belso oszci pontatlansaga a meresnel..
Dudus: Kulso osztot hogy kepzelted el?mondjuk 4040 -nek a clockjara menne a merendo negyszogjel,a binaris kimenetet meg kapuzni AND -el a megfelelore (kapcsoloval ?; vagy nagyobb ioval rendelkezo procit hasznalni es osszekotni egyik portjaval,majd szoftbol...?)
Köszönöm!
C-ben még nem vagyok túl erős, de azért sejtegetem miről van szó. Közben én is megtaláltam a megoldást: az ASSR regiszter harmadik bitjének 1-re állításával kell aktiválni az asyncron timert. Nem tudom, hogy a bascom tudje-e ezt, lehet, hogy c lesz vagy asm belőle. Még 1x köszi! Üdv
Sziasztok!
Még kezdő vagyok C programozás terén és a WinAVR-rel kapcsolatban szeretnék segítséget kérni (20060421-es verzió). Letöltöttem a Peter Fleury féle HD44780 kompatibilis LCD header fájlt. Írtam egy LCD teszt progit: #include #include #include #include "lcd.h" int main (void){ lcd_init(LCD_DISP_ON); lcd_clrscr; lcd_puts("Hello World"); lcd_gotoxy(1,1); lcd_puts_p("Hello!!!"); } A program elején megadom a header fájl nevét, és amikor fordítani akarom mindíg ezt a hibaüzenetet kapom: Linking: main.elf avr-gcc -mmcu=atmega8515 -I. -gstabs -DF_CPU=4000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wundef -Wa,-adhlns=obj/main.o -std=gnu99 -Wundef -MD -MP -MF .dep/main.elf.d obj/main.o --output main.elf -Wl,-Map=main.map,--cref -lm obj/main.o: In function `main': main.c:15: undefined reference to `lcd_init' main.c:19: undefined reference to `lcd_puts' main.c:21: undefined reference to `lcd_gotoxy' main.c:23: undefined reference to `lcd_puts_p' make.exe: *** [main.elf] Error 1 > Process Exit Code: 2 > Time Taken: 00:02 Az lcd.h és az lcd.c fájlt ugyanabba a könyvárba tettem. Az op.rendszer amit használok XP, SP2.
Én is kezdő vagyok C-ben de próbáld meg így include-olni:
#include < lcd.h > Az 'lcd' és a kacsacsör között nincs szóköz, csak a fórummotor máshogy nem tudja megjeleníteni...
Most próbáltam, de sajnos így sem akar lefordulni.
Sziasztok!
Szóval megoldottam a külső kristályt (kondik nélkül). Bascom-ban van a timer2-nek az aszinkron timert aktiváló beállítása. Először csináltam egy órát, 20 percet teszteltem, ez alatt nem mutatott eltérést. A frekimérés: a négyszögjel a timer1-re (T1) jön be. Az első jel után indul timer2 az órakristályról. 1s után túlcsordul. A megszakításkor leáll mindkét timer és jöhet a kiírás. Azt hiszem Gtk is ezt a megoldást írta. Pontatlanság annyi lehet, hogy a külső impulzus már fut, mikor a t2 elindul, de ez megoldható úgy, hogy t2 folyamatosan megy. Ekkor az első érték pontatlan lehet ugyan, de a folyamatos frissülés miatt ez nem zavaró. Holnap letesztelem nagyobb frekvenciasávon is, majd megirom az eredményt. Üdv
A kijelzest ne a megszakitas rutinba tedd hanem a main -loop-ba,a megszakitas rutinban csak egy flag-et allits be (kijelz_flag=1) hogy johet a kijelzes,majd kijelzesnel ezt torlod (kijelz_flag=0),igy biztonsagos es szep ...
Idézet: „Pontatlanság annyi lehet, hogy a külső impulzus már fut, mikor a t2 elindul” Erre en is gondoltam.. Csinaltam a timer1-nek egy maskot,es mikor timer 1 elmozdult--> erteke 1,akkor kinullaztam es indult a timer2,de rajottem hogy csak bonyolultsagot okoz,ugyanis nyugodtan lehet merni 2*idoalapnyi ideig ,akkor meg pontos lesz..
< > Globas headereket huz be
" " lokalis headereket huz be. A gond az lehet hogy a Makefile-ban az lcd.c filet nem adtad hozza a forditani kivant alomanyok sorahoz,igy nincs amire valoban hivatkozzon hiaba a header.. SRC asszem..space -el add hozza az lcd.c filenevet is. Nekem most elkeszult egy lcd driverem amiben sajat karakterek megjelenitesere ,meg CGRAMal emulalt vertical scroll -ra is fuggvenyek megvannak irva. Ha erdekel adok ra linket,a honlapomon meg ez a verzio nincs fent.
Sziasztok!
Építettem egy SPI programozót. Pony proggal szeretném felprogramotni az AVR-emet, de a Pony prog nem látja az LPT portomat. A LPT port I/o tartománya 9C00-9C07 9800-9807 Szerintetek lehet az a probléma oka, hogy ezek nem a default értékek? Egyik haveromnál kipróbáltuk és ott simán műlödött. Az én alaplapomon nincs LPT port így vettem Egy PCI portba helyezhető bővítő kártyát. Előre is köszi Spooky
Úgy rémlik ehhez szükség van egy LPT - port driver-re. Amit belinkeltem én ezt használom.
Sziasztok.
Kerlek segitsetek nekem I2C init-ben mega8 -on. Kaptam egy C-ben eleg szepen megirt DS1621/I2C drivert. Eredetileg mega88 -ra volt irva. Az INIT resznel ez volt:
Ez a 2 regiszter nem letezik mega8 -nal. Van megfeleloje ennek,vagy mas regisztert kell beallitani? Tovabba nem tudom a baudrate -t hogy kell szamolni. 32768 kvarccal igy nezett ki egyik peldaprogiban:
Elore is koszonom.
Helló!
Nekem ezzel sem megy. Először bemásoltam a windows\system32\drivers\ -be, aztán elindítottam. Ezek az alapbeállítások 200-37f 3bc-3bf 3e8-3ff Milyen értékekre változtassam? Én kipróbáltam így: 378 - 37A 278 - 27A 3BC - 3BE Elvileg ezek lennének az alapértékek, nem? Nekem semmi változás nem történt. Bocs az értetlenkedésemért. Előre is köszi Spooky
Power Reduction Register - nek a 7. bitje a PRTWI.
Ilyen nincs az ATmega8-on, szerintem ne törődj vele. TWI órajel= CPU Clock/16+2(TWBR)x4^TWPS |
Bejelentkezés
Hirdetés |