Kazalo po Svet elektronike forumu Svet elektronike
Revija za prave elektronike
 
AlbumAlbum   Pomoč pogostih vprašanjPomoč pogostih vprašanj   IščiIšči   Seznam članovSeznam članov   Skupine uporabnikovSkupine uporabnikov   Registriraj seRegistriraj se 
 Tvoj profilTvoj profil   Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil   PrijavaPrijava 

Generator dveh točnih frekvenc z AVR

 
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Digitalna elektronika
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
alex
Začetnik


Pridružen/-a: Čet Jan 2004 15:10
Prispevkov: 14
Kraj: Rečica ob Savinji

PrispevekObjavljeno: Tor Okt 14, 2008 10:06 am    Naslov sporočila: Generator dveh točnih frekvenc z AVR Odgovori s citatom

Problem je naslednji:

Na enem pinu bi rad generiral točno 400 Hz.
Na drugem pinu bi rad generiral nastavljivo frekvenco v rangu od 400 do 420 Hz.
Frekvenca mora biti točna na 0,5 Hz.

Poskusil sem s timerji, za začetek samo za eno frekvenco, vendar mi ne deluje. Prav vseeno je, kaj vpišem v "load timer", zadeva ne deluje.

Kakšne ideje?

Alex
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
alex
Začetnik


Pridružen/-a: Čet Jan 2004 15:10
Prispevkov: 14
Kraj: Rečica ob Savinji

PrispevekObjavljeno: Tor Okt 14, 2008 10:12 am    Naslov sporočila: Še program... Odgovori s citatom

$regfile = "attiny2313.dat"
$hwstack = 32
$swstack = 40
$framesize = 40
$crystal = 8000000
$baud = 19200
Dim Pulz1 As Word , Cas1 As Word
Dim Pulz2 As Word , Cas2 As Word
Levi Alias Portd.4
Config Pind.4 = Output
Desni Alias Portd.5
Config Pind.5 = Output
T1 Alias Pind.2
Config Pind.2 = Input

Config Timer1 = Timer , Edge = Falling , Prescale = 8
On Timer1 Timer_1_int 'interrupt routine
Load Timer1 , 5
Enable Interrupts
Enable Timer1
'cas = 485 - pribl. 412 Hz (pri 5us interupta)
'cas = 500 - pribl. 400 Hz
Cas1 = 500
Cas2 = 485

Pulz1 = 0
Pulz2 = 0
Levi = 0
Desni = 0
Start Timer1
Do
'If Pulz2 = Cas2 Then
' Pulz2 = 0
' Desni = Not Desni
' End If

Loop
End

'***************** prekinitvena rutina *************
Timer_1_int:
Incr Pulz1
If Pulz1 = Cas1 Then
Pulz1 = 0
Levi = Not Levi
End If
'Incr Pulz2
Return
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
alex
Začetnik


Pridružen/-a: Čet Jan 2004 15:10
Prispevkov: 14
Kraj: Rečica ob Savinji

PrispevekObjavljeno: Tor Okt 14, 2008 1:43 pm    Naslov sporočila: druga verzija Odgovori s citatom

Sedaj sem probal s timerjem0 po helpu iz basc AVR. Vendar: pri kvarcu 16MHz in PRESCALE 1, dobim prekinitev na vsakih 32us.
Ta čas bi rad skrajšal z npr. "load timer", vendar nima nobenega vpliva. Čas 32us je predolg zaradi naslednjega:
32us * 78 = 2496us = 400,6Hz
32us * 77 = 2464us = 405,8Hz
Korak je prevelik...
Še program:
------------------------------------------------------------------------------
'IME : sound-L-D-2.bas
'------------------------------------------------------------------------------
$regfile = "attiny2313.dat"
$hwstack = 32
$swstack = 10
$framesize = 40
$crystal = 8000000
$baud = 19200

Dim Pulz1 As Word , Cas1 As Word
Dim Pulz2 As Word , Cas2 As Word

Levi Alias Portd.4
Config Pind.4 = Output

Desni Alias Portd.5
Config Pind.5 = Output

T1 Alias Pind.2
Config Pind.2 = Input

Config Timer0 = Timer , Prescale = 1

Load Timer0 , 50 'nima nobenega vpliva!!!!!!!!!
On Timer0 Prekinitvena_rutina
Enable Timer0
Enable Interrupts
Cas1 = 78
Cas2 = 77
Pulz1 = 0
Pulz2 = 0
Levi = 0
Desni = 0

Do
'tu noter pride program...
Loop

Prekinitvena_rutina:
Incr Pulz1
If Pulz1 = Cas1 Then
Pulz1 = 0
Levi = Not Levi
End If
Incr Pulz2
If Pulz2 = Cas2 Then
Pulz2 = 0
Desni = Not Desni
End If
Return
End
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
alex
Začetnik


Pridružen/-a: Čet Jan 2004 15:10
Prispevkov: 14
Kraj: Rečica ob Savinji

PrispevekObjavljeno: Pet Okt 17, 2008 1:55 pm    Naslov sporočila: CTC Odgovori s citatom

Ker mi nihče ni nič sugeriral, sem se malo poglobil v hardware od ATtiny2313.
Zadeva je dokaj simpl, če poznaš notranjo zgradbo chipa.
Koda:
$regfile = "attiny2313.dat"
$hwstack = 32
$swstack = 10
$framesize = 40
$crystal = 8000000
$baud = 19200

Config Pinb.2 = Output 'izhod OC0A
Config Pind.5 = Output 'izhod OC0B

Tccr0a = &B01010010
Ocr0a = 155
Tccr0b = &B00001011
Ocr0b = 140

End

To je vse!
Na izhodu "OC0A" (pin14) dobim lepo točno 400,6 Hz kar je točno toliko kot sem izračunal.
Na izhodu "OC0B" (pin9) pa dobim prav tako 400,6 Hz, malo zamaknjeno in ne 443,2 Hz kot sem teoretično izračunal.

Korak pri 8-bitnem timerju je prevelik, saj znaša cca 3Hz, za svoj projekt pa potrebujem 1 Hz ali še bolje - 0,5 Hz.

Bom poskusil zadevo še s 16-bitnim timerjem.

alex
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Digitalna elektronika Časovni pas GMT + 1 ura, srednjeevropski - zimski čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
You cannot attach files in this forum
You cannot download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group