Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Generowanie nośnej

WiesioShow
-
-
Posty:25
Rejestracja:18 maja 2007, o 16:26
Lokalizacja:Koszalin
Generowanie nośnej

Postautor: WiesioShow » 18 maja 2007, o 16:45

Potrzebuję wygenerować nośną 36 kHz. Próbowałem najprościej jak się dało czyli Timerem, ale są problemy. Procek mam attiny2313, fusebity na zewnętrzny kwarc, sam kwarc to 8MHz. Niestety maksymalna częstotliwość jaką udało mi sie wygenerować to około 32 kHz i więcej nie idzie. :615:
Wie ktoś może co z tym zrobić ?

Fredy
-
-
Posty:141
Rejestracja:27 mar 2005, o 21:45
Lokalizacja:Małopolska

Postautor: Fredy » 18 maja 2007, o 17:36

Wklej program bo coś się nie chce wierzyć.

Jeśli zrobisz coś takiego:

do
toogle któryś_pin
loop

to przecież uzyskasz ogromną częstotliwość ( w razie czego możesz wstawić opóżnienie ). Myślę że masz błąd w programie - stawiam na to że nie ustawiasz timera po przerwaniu i zawsze liczy od zera :637:

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 18 maja 2007, o 20:04

Ustaw Timer do pracy w trybie CTC , a wyjście OCx w trybie toggle.Wpisz do TOP taką wartość , by Timer zerował się z częstotliwością 72kHz i to wszystko ;)
Np. dla Timera0 w trybie CTC(Mode 2) i OCRA=110 , fala wygenerowana na wyjściu OC0A , wyniesie 36036 Hz.

Piotrek

WiesioShow
-
-
Posty:25
Rejestracja:18 maja 2007, o 16:26
Lokalizacja:Koszalin

Postautor: WiesioShow » 18 maja 2007, o 21:49

No to wklejam kod:


Kod: Zaznacz cały

$regfile = "attiny2313.dat" $crystal = 8000000 $baud = 1200 Config Portd.2 = Output Portd.2 = 0 Dim A As Byte A = 5 Dim Interval As Integer Interval = 111 Config timer1 = Timer , Prescale = 1 Load Timer1 , Interval Enable timer1 Enable Interrupts On Timer1 timer1_int Start timer1 Do Print A Loop timer1_int: Load timer1 , Interval Toggle Portd.2 Return
Zmienną Interval obliczyłem tak, żeby dało to około 72 kHz przy przełączaniu Toogle czyli przebieg prostokątny 36 kHz. Nawet zmniejszając Interval maksymalnie można dojść do około 32 kHz.

Fredy
-
-
Posty:141
Rejestracja:27 mar 2005, o 21:45
Lokalizacja:Małopolska

Postautor: Fredy » 20 maja 2007, o 14:39

A fusy dobrze ustawiłeś? Może masz ustawiony wewnętrzny generator RC?

WiesioShow
-
-
Posty:25
Rejestracja:18 maja 2007, o 16:26
Lokalizacja:Koszalin

Postautor: WiesioShow » 20 maja 2007, o 15:14

Fuse bity na 100% są dobrze ustawione. Wyłączony podział przez 8 i włączony external xtal.

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 21 maja 2007, o 19:43

Fuse bity na 100% są dobrze ustawione. Wyłączony podział przez 8 i włączony external xtal.
Fusy może masz dobrze ustawione , ale program jest do ... niedobry ;)
Tyle wystarczy , by proc wygenerował na PB2/OC0A falę prostokątną 36036 Hz SPRZĘTOWO !!! , czyli właściwie bez żadnego programu , poza kilkoma instrukcjami konfigurującymi Timer0 ;)

Kod: Zaznacz cały

$crystal = 8000000 $regfile = "attiny2313.dat" '.... Config Portb.2 = Output 'PB2/OC0A - wyjście Set Tccr0a.6 'output mode -Toggle OC0A on Compare Match Set Tccr0a.1 'tryb CTC - mode 2 Ocr0a = 110 'top timer0 Set Tccr0b.0 'start timer0 Prescale = 1 '... dalsza Twojego część kodu
Piotrek

Fredy
-
-
Posty:141
Rejestracja:27 mar 2005, o 21:45
Lokalizacja:Małopolska

Postautor: Fredy » 21 maja 2007, o 20:40

Ciekawie tylko dlaczego tamten program nie działał - wygląda raczej OK :615:

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 22 maja 2007, o 18:25

Ciekawie tylko dlaczego tamten program nie działał - wygląda raczej OK :615:
W tym nie ma żadnej tajemnicy ;)
Procedura obsługi przerwania , to około 140 cykli zegara.Jeśli teraz podzielimy 8MHz/140 to łatwo policzyć , że w takich warunkach , zmiana stanu pinu może wystąpić tylko 57142 razy na sekundę , co daje nam 28571 Hz.To wszystko , co można wycisnąć tym sposobem z proca :(

Piotrek

Fredy
-
-
Posty:141
Rejestracja:27 mar 2005, o 21:45
Lokalizacja:Małopolska

Postautor: Fredy » 22 maja 2007, o 21:18

Ciekawie tylko dlaczego tamten program nie działał - wygląda raczej OK :615:
W tym nie ma żadnej tajemnicy ;)
Procedura obsługi przerwania , to około 140 cykli zegara.Jeśli teraz podzielimy 8MHz/140 to łatwo policzyć , że w takich warunkach , zmiana stanu pinu może wystąpić tylko 57142 razy na sekundę , co daje nam 28571 Hz.To wszystko , co można wycisnąć tym sposobem z proca :(

Piotrek
Skąd wiesz że akurat 140 cykli ?

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 23 maja 2007, o 07:47

Skąd wiesz że akurat 140 cykli ?
Ano stąd ;)
Bascom:

Kod: Zaznacz cały

timer1_int: Load timer1 , Interval Toggle Portd.2 Return
Assembler:

Kod: Zaznacz cały

+0000004E: PUSH R0 +0000004F: PUSH R1 +00000050: PUSH R2 +00000051: PUSH R3 +00000052: PUSH R4 +00000053: PUSH R5 +00000054: PUSH R7 +00000055: PUSH R10 +00000056: PUSH R11 +00000057: PUSH R16 +00000058: PUSH R17 +00000059: PUSH R18 +0000005A: PUSH R19 +0000005B: PUSH R20 +0000005C: PUSH R21 +0000005D: PUSH R22 +0000005E: PUSH R23 +0000005F: PUSH R24 +00000060: PUSH R25 +00000061: PUSH R26 +00000062: PUSH R27 +00000063: PUSH R28 +00000064: PUSH R29 +00000065: PUSH R30 +00000066: PUSH R31 +00000067: IN R24,0x3F +00000068: PUSH R24 +00000069: LDI R26,0x60 +0000006A: LD R16,X+ +0000006B: LD R17,X +0000006C: COM R16 +0000006D: COM R17 +0000006E: SUBI R16,0xFF +0000006F: SBCI R17,0xFF +00000070: OUT 0x2C,R16 +00000071: OUT 0x2D,R17 +00000072: LDI R26,0x32 +00000073: LD R24,X +00000074: BST R24,2 +00000075: CLR R24 +00000076: BLD R24,0 +00000077: COM R24 +00000078: BST R24,0 +00000079: LDI R26,0x32 +0000007A: LD R24,X +0000007B: BLD R24,2 +0000007C: ST X,R24 +0000007D: POP R24 +0000007E: OUT 0x3F,R24 +0000007F: POP R31 +00000080: POP R30 +00000081: POP R29 +00000082: POP R28 +00000083: POP R27 +00000084: POP R26 +00000085: POP R25 +00000086: POP R24 +00000087: POP R23 +00000088: POP R22 +00000089: POP R21 +0000008A: POP R20 +0000008B: POP R19 +0000008C: POP R18 +0000008D: POP R17 +0000008E: POP R16 +0000008F: POP R11 +00000090: POP R10 +00000091: POP R7 +00000092: POP R5 +00000093: POP R4 +00000094: POP R3 +00000095: POP R2 +00000096: POP R1 +00000097: POP R0 +00000098: RETI
Do symulacji i podglądania(a fuj...) , używam symulatora z(w) AVRStudio :D
Do pokazanej(zakreślone na czerwono) ilości cykli , należy dodać ilość cykli potrzebnych na rozpoczęcie obsługi przerwania i na wykonanie rozkazu RETI , co daje około 140 cykli zegara.

Teraz jaśniej :?:

Piotrek
Załączniki
Widok_2.gif
Koniec obsługi przerwania
Widok_1.gif
Początek obsługi przerwania

WiesioShow
-
-
Posty:25
Rejestracja:18 maja 2007, o 16:26
Lokalizacja:Koszalin

Postautor: WiesioShow » 23 maja 2007, o 17:20

Widzę, że temat sie rozwiną (i dobrze). Dzięki szymel za wyjaśnienia, na pewno sprawdzę zarzucony przez Ciebie kod.

Fredy
-
-
Posty:141
Rejestracja:27 mar 2005, o 21:45
Lokalizacja:Małopolska

Postautor: Fredy » 23 maja 2007, o 22:13

Szymel -gratuluje !!!! :637:

WiesioShow
-
-
Posty:25
Rejestracja:18 maja 2007, o 16:26
Lokalizacja:Koszalin

Postautor: WiesioShow » 6 cze 2007, o 20:45

Wie ktoś może jak zmienić kod, który napisał szymel, tak aby częstotliwość była generowana na OC0B (chodzi o to, że chciałbym mieś wolny na attiny2313 cały port B). A może zna ktoś źródło informacji o wszystkich chwytach na flet prosty z timerami, bo do tej pory ślaczki:

Kod: Zaznacz cały

Set Tccr0a.6 'output mode -Toggle OC0A on Compare Match Set Tccr0a.1 'tryb CTC - mode 2 Ocr0a = 110 'top timer0 Set Tccr0b.0 'start timer0 Prescale = 1
nie są dla mnie do końca jasne :)

szymel
-
-
Posty:212
Rejestracja:16 sty 2005, o 16:42
Lokalizacja:Włocławek

Postautor: szymel » 6 cze 2007, o 21:46

Wie ktoś może jak zmienić kod, który napisał szymel, tak aby częstotliwość była generowana na OC0B (chodzi o to, że chciałbym mieś wolny na attiny2313 cały port B)...

Kod: Zaznacz cały

$crystal = 8000000 $regfile = "attiny2313.dat" '.... Config Portd.5 = Output 'PD5/OC0B - wyjście Set Tccr0a.4 'output mode -Toggle OC0B on Compare Match Set Tccr0a.1 'tryb CTC - mode 2 Ocr0a = 110 'top timer0 ocr0b=55 ' ;-) Set Tccr0b.0 'start timer0 Prescale = 1 '... dalsza Twojego część kodu
A może zna ktoś źródło informacji o wszystkich chwytach na flet prosty z timerami, bo do tej pory ślaczki
Pewnie nie powiem nic nowego - dokumentacja , a szczególnie zawarte w niej tabelki :611:

Piotrek

WiesioShow
-
-
Posty:25
Rejestracja:18 maja 2007, o 16:26
Lokalizacja:Koszalin

Postautor: WiesioShow » 11 cze 2007, o 20:57

Ponowne podziękowania dla szymela - całość działa transmisja (na diodzie nadawczej podczerwieni i odbiorniku tfms5360) śmiga, jedyny minus to oczywiście zakłócenia od pilotów telewizyjnych, ale mam nadzieję że to dopracuję, a może ktoś już to rozpracowywał i podzieli sie doświadczeniami.

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 9 gości