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
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
-
- -
- Posty:25
- Rejestracja:18 maja 2007, o 16:26
- Lokalizacja:Koszalin
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.
Wie ktoś może co z tym zrobić ?
Wie ktoś może co z tym zrobić ?
-
- -
- Posty:25
- Rejestracja:18 maja 2007, o 16:26
- Lokalizacja:Koszalin
No to wklejam kod:
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.
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
-
- -
- Posty:25
- Rejestracja:18 maja 2007, o 16:26
- Lokalizacja:Koszalin
Fusy może masz dobrze ustawione , ale program jest do ... niedobryFuse bity na 100% są dobrze ustawione. Wyłączony podział przez 8 i włączony external xtal.
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
W tym nie ma żadnej tajemnicyCiekawie tylko dlaczego tamten program nie działał - wygląda raczej OK
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 ?W tym nie ma żadnej tajemnicyCiekawie tylko dlaczego tamten program nie działał - wygląda raczej OK
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
Ano stądSkąd wiesz że akurat 140 cykli ?
Bascom:
Kod: Zaznacz cały
timer1_int:
Load timer1 , Interval
Toggle Portd.2
Return
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 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
-
- -
- Posty:25
- Rejestracja:18 maja 2007, o 16:26
- Lokalizacja:Koszalin
-
- -
- Posty:25
- Rejestracja:18 maja 2007, o 16:26
- Lokalizacja:Koszalin
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:
nie są dla mnie do końca jasne
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
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
Pewnie nie powiem nic nowego - dokumentacja , a szczególnie zawarte w niej tabelkiA może zna ktoś źródło informacji o wszystkich chwytach na flet prosty z timerami, bo do tej pory ślaczki
Piotrek
-
- -
- Posty:25
- Rejestracja:18 maja 2007, o 16:26
- Lokalizacja:Koszalin
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 7 gości