Zakladajac ze mikrokontroler jest zasilany 5V i taktowany 7,3728 Mhz jaki sygnal o jakiej amplitudzie i czestotliwosci powinno sie uzyskac na wyjsciu danego portu jezeli co takt zegara negowany byl by rejestr wyjsciowy tego portu? NIe wiem o co chodzi bo mam sygnal 2Vpp i czestotliwosc 14.5 kHz
Sygnał wyjsciowy na porcie mikrokontrolera
Sygnał wyjsciowy na porcie mikrokontrolera
Hej,
Zakladajac ze mikrokontroler jest zasilany 5V i taktowany 7,3728 Mhz jaki sygnal o jakiej amplitudzie i czestotliwosci powinno sie uzyskac na wyjsciu danego portu jezeli co takt zegara negowany byl by rejestr wyjsciowy tego portu? NIe wiem o co chodzi bo mam sygnal 2Vpp i czestotliwosc 14.5 kHz
Zakladajac ze mikrokontroler jest zasilany 5V i taktowany 7,3728 Mhz jaki sygnal o jakiej amplitudzie i czestotliwosci powinno sie uzyskac na wyjsciu danego portu jezeli co takt zegara negowany byl by rejestr wyjsciowy tego portu? NIe wiem o co chodzi bo mam sygnal 2Vpp i czestotliwosc 14.5 kHz
Jest lepiej ale nie tego sie spodziewalem:
program to takie cos wywolaywane przepelneniem licznika:
Teraz mam czestotliwosc ok 130kHz
a oscylogram z funkcja prostokatna ma malo wspolnego, zaraz wrzuce fotke
program to takie cos wywolaywane przepelneniem licznika:
Kod: Zaznacz cały
ldi acc,0xff
out tcnt0,acc
com acc3
out porte,acc3
a oscylogram z funkcja prostokatna ma malo wspolnego, zaraz wrzuce fotke
powycinalem smieci i tak to wyglada:
W sumie obsluga przewania 4 cykle. wywolanie przewania 1, odlozenie na stosie statusow 1 skok do przerwania 1, zdjecie powrotu ze stosu 1 i powrot 1. 9 cykli?
Kod: Zaznacz cały
.include "m8515def.inc"
.def acc = r16
.def acc2 = r17
.def acc3 = r18
.def poz = r20
.def digit = r21
.def tik = r22
;---------makra
.macro pushf
push acc
in acc,sreg
push acc
.endm
.macro popf
pop acc
out sreg,acc
pop acc
.endm
;---------zmienne
.dseg
dispdigit: .byte 1 ;cyfra do wyswietlenia
number: .byte 6 ; caly numer do wyswietlenia (6 cyfr)
;------- tablica wektorow przerwan
.cseg
.org 0 ;
rjmp ResetProcessor ;
reti ;
reti
reti
reti
reti
reti ;
.org OVF0addr ;Overflow0 Interrupt Vector Address
rjmp TC0OvfInterrupt ;
reti
reti
reti
reti
reti
reti
reti
reti
reti ;
;-----------------------------------------------------------
ResetProcessor:
;-----------------
ldi acc,0b00000111 ;dioda ststusu
out ddre,acc
ldi acc,0b00000000
out porte,acc
ldi acc,0b00111111
out ddrd,acc
ldi acc,0b00000000 ;wybor wyswietlacza
out portd,acc
ldi acc,0b11111111
out ddra,acc
ldi acc,0b11111111 ;wybor segmentu
out porta,acc
ldi acc,0b00000001 ; (00000101)preskaler /1024
out tccr0,acc
ldi acc,0b00000010 ; zezwolenie na przerwanie przy przepelnieniu timera0
out timsk,acc
;----------------inicjalizacja_stosu
ldi acc,low(ramend)
out spl,acc
ldi acc,high(ramend)
out sph,acc
;---inicjalizacja zmiennych
ldi acc,0
;--------cyfra do wyswietlenia (tymczasow)
ldi acc,4
sts number,acc
ldi acc,5
sts number+1,acc
ldi acc,6
sts number+2,acc
ldi acc,7
sts number+3,acc
ldi acc,8
sts number+4,acc
ldi acc,9
sts number+5,acc
;---------glowna petla--------------------------
;-----------------------------------------------
ldi acc3,0b00000111
main:
sei
rjmp main
;------------
;obsluga przerwania licznika
TC0OvfInterrupt:
;pushf
;push acc2
ldi acc,0xff
out tcnt0,acc
com acc3
out porte,acc3
;pop acc2
;popf
reti
Amugilap pisze:Jest lepiej ale nie tego sie spodziewalem:
program to takie cos wywolaywane przepelneniem licznika:Teraz mam czestotliwosc ok 130kHzKod: Zaznacz cały
ldi acc,0xff out tcnt0,acc com acc3 out porte,acc3
a oscylogram z funkcja prostokatna ma malo wspolnego, zaraz wrzuce fotke

Po przemyśleniu całości jestem skłonny przyjąć że jednak AVR studio ma rację.
Bo skoro wpisujemy do tcnt0 FF ale przerwanie te nie może się wykonać w "przerwaniu". Ale flaga TOV0 kolejnego przerwania został już ustawiona.
Dlatego po wyjściu z przerwania zastanie przywrócone globalne zezwolenia na przerwanie, flaga I w SREG. I program znowu skoczy do obsługi przerwania.
A tak swoją drogą jaki końcowy efekt chcesz uzyskać ?
W załączniku Sygnał na nóżce PD0 dla zegara 1MHz.
Bo skoro wpisujemy do tcnt0 FF ale przerwanie te nie może się wykonać w "przerwaniu". Ale flaga TOV0 kolejnego przerwania został już ustawiona.
Dlatego po wyjściu z przerwania zastanie przywrócone globalne zezwolenia na przerwanie, flaga I w SREG. I program znowu skoczy do obsługi przerwania.
A tak swoją drogą jaki końcowy efekt chcesz uzyskać ?
W załączniku Sygnał na nóżce PD0 dla zegara 1MHz.
- Załączniki
-
- NewFile6.PNG (1.87 KiB) Przejrzano 9588 razy
Chcialem sie przekonac jaką maksymalna czestotliwosc sygnalu prostokatnego moge uzyskac za pomoca przerwania zegara przy przy danym taktowaniu uC np przy moich 7 mHz. Jaka jest zaleznosc miedzy tymi dwoma parametrami. Narazie mam 500kHz i sygnal prostokatny jest bardzo znieksztalcony, wydawalo mi sie ze spokojnie mozna wiecej, musze jeszcze poeksperymentowac z tym.
edit:
Do tcnt0 wstawilem FF wlasnie po to zeby co cykl przeplnial sie licznik i zeby przerwania generowaly sie jak najczesciej i oczekiwalem czegos rzedu 2 Mhz ale zle policzylem ilosc cykli zuzywanych na instrukcje, przy 15 faktycznie wychodzi ze uzyskac mozna max 500 khz ale sygnal wygla wlasnie jak na zdjeciu czyli znacznie odbiega od prostokata.
edit:
Do tcnt0 wstawilem FF wlasnie po to zeby co cykl przeplnial sie licznik i zeby przerwania generowaly sie jak najczesciej i oczekiwalem czegos rzedu 2 Mhz ale zle policzylem ilosc cykli zuzywanych na instrukcje, przy 15 faktycznie wychodzi ze uzyskac mozna max 500 khz ale sygnal wygla wlasnie jak na zdjeciu czyli znacznie odbiega od prostokata.
Takie zadania to się robi w całości sprzętowo a nie programowo.
Poczytaj sobie o pracy timera w trybie CTC z porównaniem.
Zobacz sobie na przykładowy program
Gdzie timer liczy do 2 i sygnał na nóżce 1 PB0 będzie podzielony przez 6.
A jak dasz by liczył do 1 to będziesz miał podział przez 4.
A dla zero przez 2.
Poczytaj sobie o pracy timera w trybie CTC z porównaniem.
Zobacz sobie na przykładowy program
Kod: Zaznacz cały
.include "m8515def.inc"
.def acc = r16
;------- tablica wektorow przerwan
.cseg
.org 0 ;
rjmp ResetProcessor ;
reti ;
reti
reti
reti
reti
reti ;
reti ;
reti
reti
reti
reti
reti
reti
reti
reti
reti ;
;-----------------------------------------------------------
ResetProcessor:
;-----------------
; PortB jako wyjście PBO jako OC0
ldi acc,0b11111111
out ddrb,acc
ldi acc,0b00011001 ;TIMER0 w trybie CTC z porównaniem
out tccr0,acc ;bez preskalera z toggle
ldi r16,2 ;TIMER0 zliczancza do 2
out OCR0,r16 ; PB0 = FCK/6
;---------glowna petla--------------------------
main:
rjmp main
A jak dasz by liczył do 1 to będziesz miał podział przez 4.
A dla zero przez 2.
Ostatnio zmieniony 14 cze 2012, 14:37 przez Jony130, łącznie zmieniany 1 raz.
U mnie też sonda nie jest najlepiej skalibrowana.
Widać ślady różniczkowania i sonda w trybie X10
A tu sonda w trybie X1
Jak widać nie ma się zbytnio do czego przyczepić. Przebieg bardzo ładny jak na tak dużą częstotliwość i płytkę stykową.
Widać ślady różniczkowania i sonda w trybie X10
A tu sonda w trybie X1
Jak widać nie ma się zbytnio do czego przyczepić. Przebieg bardzo ładny jak na tak dużą częstotliwość i płytkę stykową.
- Załączniki
-
- NewFile7.PNG (2.26 KiB) Przejrzano 9904 razy
-
- NewFile9.PNG (2.32 KiB) Przejrzano 9469 razy
Ostatnio zmieniony 14 cze 2012, 14:59 przez Jony130, łącznie zmieniany 1 raz.