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   9 / 837
(#) Pavel válasza Dudus hozzászólására (») Okt 28, 2006 /
 
, igazad van! ki fogom próbálni
(#) gtk válasza Pavel hozzászólására (») Okt 28, 2006 /
 
Helo.

Lehet hogy kerdezek,de hw -vagy sw-es kapuzasos megoldasra gondoltok?
(#) Pavel válasza gtk hozzászólására (») Okt 28, 2006 /
 
én hw - re gondolok

gtk: neked hogy áll a frekimérőd?
(#) gtk válasza Pavel hozzászólására (») Okt 28, 2006 /
 
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?
(#) Dudus válasza gtk hozzászólására (») Okt 28, 2006 /
 
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.
(#) potyo válasza andrewforest hozzászólására (») Okt 28, 2006 /
 
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.
(#) gtk válasza Dudus hozzászólására (») Okt 28, 2006 /
 
65Mhz -ig saccoltuk a mereshatart.
Ha mar igy mukodik akkor lehetne szorakozni azzal amit irtal.
(#) Gory válasza gtk hozzászólására (») Okt 28, 2006 /
 
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.
(#) pakibec válasza Dudus hozzászólására (») Okt 28, 2006 /
 
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
(#) Dudus válasza pakibec hozzászólására (») Okt 28, 2006 /
 
É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.
(#) Dudus válasza Dudus hozzászólására (») Okt 28, 2006 /
 
akkor nincs gond a counter-rel.....

De csökken a felbontás. (Ez kimaradt)
(#) pakibec válasza Dudus hozzászólására (») Okt 28, 2006 /
 
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
(#) Dudus válasza pakibec hozzászólására (») Okt 28, 2006 /
 
Vajon a százalékban mért hiba nagyobb frekvencián hogyan alakul ezzel a megoldással? A túlcsordulást, hogyan kezeled le?
(#) pakibec válasza Dudus hozzászólására (») Okt 28, 2006 /
 
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
(#) pakibec válasza pakibec hozzászólására (») Okt 29, 2006 /
 
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
(#) Dudus válasza pakibec hozzászólására (») Okt 29, 2006 /
 
É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
(#) gtk válasza pakibec hozzászólására (») Okt 29, 2006 /
 
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< TIMSK |= (1 << TOIE2); //timer2 overflow enabled

/* 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.>>>>>>>
(#) gtk válasza gtk hozzászólására (») Okt 29, 2006 /
 
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...?)
(#) pakibec válasza gtk hozzászólására (») Okt 29, 2006 /
 
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
(#) tibi0531 válasza pakibec hozzászólására (») Okt 29, 2006 /
 
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.

LCD_test.zip
    
(#) MaSTeRFoXX válasza tibi0531 hozzászólására (») Okt 29, 2006 /
 
É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...
(#) tibi0531 válasza MaSTeRFoXX hozzászólására (») Okt 29, 2006 /
 
Most próbáltam, de sajnos így sem akar lefordulni.
(#) pakibec válasza MaSTeRFoXX hozzászólására (») Okt 29, 2006 /
 
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
(#) gtk válasza pakibec hozzászólására (») Okt 30, 2006 /
 
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..
(#) gtk válasza tibi0531 hozzászólására (») Okt 30, 2006 /
 
< > 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.
(#) Spooky válasza pakibec hozzászólására (») Okt 30, 2006 /
 
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
(#) Dudus válasza Spooky hozzászólására (») Okt 30, 2006 /
 
Úgy rémlik ehhez szükség van egy LPT - port driver-re. Amit belinkeltem én ezt használom.

NtDriver.zip
    
(#) gtk válasza Dudus hozzászólására (») Okt 30, 2006 /
 
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:

  1. PRR = ~_BV (PRTWI);

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:

  1. TWSR = 0;                       // Prescaler = 1
  2.   TWBR = 10;                   // Give us a bitrate of 910.2 bps


Elore is koszonom.
(#) Spooky válasza Dudus hozzászólására (») Okt 30, 2006 /
 
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
(#) Dudus válasza gtk hozzászólására (») Okt 30, 2006 /
 
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
Következő: »»   9 / 837
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