Sygnał wyjsciowy na porcie mikrokontrolera

Jesli jesteś początkującym elektronikiem, to tu z pewnością znajdziesz pomoc. Miejsce dobre do dyskusji nad podstawami elektroniki w zakresie teorii i praktyki.
Awatar użytkownika
Amugilap
Użytkownik
Posty: 480
Rejestracja: 19 cze 2011, 9:28
Lokalizacja: UK

Sygnał wyjsciowy na porcie mikrokontrolera

Post autor: Amugilap » 13 cze 2012, 13:45

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 :shock:

Jony130
Moderator
Posty: 3170
Rejestracja: 11 sie 2005, 16:33
Lokalizacja: wrocław

Post autor: Jony130 » 13 cze 2012, 13:50

Pokaż może jeszcze program.

Awatar użytkownika
Amugilap
Użytkownik
Posty: 480
Rejestracja: 19 cze 2011, 9:28
Lokalizacja: UK

Post autor: Amugilap » 13 cze 2012, 13:58

OOO! glupote popelnilem, zegar przepelnia sie co 256 cykli o czym zapomialem...wszystko sie zgadza. Po podzieleniu przez 256 i pomnozeniu * 2 uzyskuje dokladnie czestotliwosc mojego zegara. Jeszcze sprawdze na oscyloskopie jak to wyglada.

Awatar użytkownika
Amugilap
Użytkownik
Posty: 480
Rejestracja: 19 cze 2011, 9:28
Lokalizacja: UK

Post autor: Amugilap » 13 cze 2012, 14:11

Jest lepiej ale nie tego sie spodziewalem:
program to takie cos wywolaywane przepelneniem licznika:

Kod: Zaznacz cały

ldi acc,0xff
out tcnt0,acc
com acc3
out porte,acc3
Teraz mam czestotliwosc ok 130kHz
a oscylogram z funkcja prostokatna ma malo wspolnego, zaraz wrzuce fotke

Jony130
Moderator
Posty: 3170
Rejestracja: 11 sie 2005, 16:33
Lokalizacja: wrocław

Post autor: Jony130 » 13 cze 2012, 14:15

No to już podaj cały program z konfiguracją timera włącznie.
I czy uwzględniłeś ile taktów zegara zajmuje dana instrukcja?

Awatar użytkownika
Amugilap
Użytkownik
Posty: 480
Rejestracja: 19 cze 2011, 9:28
Lokalizacja: UK

Post autor: Amugilap » 13 cze 2012, 14:37

powycinalem smieci i tak to wyglada:

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
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?

Awatar użytkownika
Amugilap
Użytkownik
Posty: 480
Rejestracja: 19 cze 2011, 9:28
Lokalizacja: UK

Post autor: Amugilap » 13 cze 2012, 14:42

Amugilap pisze:Jest lepiej ale nie tego sie spodziewalem:
program to takie cos wywolaywane przepelneniem licznika:

Kod: Zaznacz cały

ldi acc,0xff
out tcnt0,acc
com acc3
out porte,acc3
Teraz mam czestotliwosc ok 130kHz
a oscylogram z funkcja prostokatna ma malo wspolnego, zaraz wrzuce fotke
Obrazek

Jony130
Moderator
Posty: 3170
Rejestracja: 11 sie 2005, 16:33
Lokalizacja: wrocław

Post autor: Jony130 » 13 cze 2012, 16:52

Hmm, dziwnie ten program wygląda. Ale wydaje się, że przerwie plus inne instrukcje powinny dać zmianę stanu potru E co 265 cykl.
Choć w symulatorze AVR studio wynika że co około 15 cykli.
Więc ja już sam nie wiem o co chodzi.

Awatar użytkownika
Amugilap
Użytkownik
Posty: 480
Rejestracja: 19 cze 2011, 9:28
Lokalizacja: UK

Post autor: Amugilap » 13 cze 2012, 16:57

Program dziwny bo pozostalosci zostaly z innego ktory pisz i na szybko tylko chcialem sprawdzic co sie dzieje wyciawszy niepotrzebny kod.

Jony130
Moderator
Posty: 3170
Rejestracja: 11 sie 2005, 16:33
Lokalizacja: wrocław

Post autor: Jony130 » 13 cze 2012, 17:40

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.
Załączniki
NewFile6.PNG
NewFile6.PNG (1.87 KiB) Przejrzano 9600 razy

Awatar użytkownika
Amugilap
Użytkownik
Posty: 480
Rejestracja: 19 cze 2011, 9:28
Lokalizacja: UK

Post autor: Amugilap » 13 cze 2012, 22:12

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.

Jony130
Moderator
Posty: 3170
Rejestracja: 11 sie 2005, 16:33
Lokalizacja: wrocław

Post autor: Jony130 » 14 cze 2012, 7:28

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

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


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.
Ostatnio zmieniony 14 cze 2012, 14:37 przez Jony130, łącznie zmieniany 1 raz.

Awatar użytkownika
Amugilap
Użytkownik
Posty: 480
Rejestracja: 19 cze 2011, 9:28
Lokalizacja: UK

Post autor: Amugilap » 14 cze 2012, 11:45

Bardzo ciekawe. Dzieki!
Teoria jest zrozumiala ale powyzszy program nie daje sygnalu prostokanego o czetotliwosc 1/6 zegara. Jaki masz oscylogram dla np 4 Mhz?

Jony130
Moderator
Posty: 3170
Rejestracja: 11 sie 2005, 16:33
Lokalizacja: wrocław

Post autor: Jony130 » 14 cze 2012, 14:41

Amugilap pisze:Narazie mam 500kHz i sygnal prostokatny jest bardzo znieksztalcony, wydawalo mi sie ze spokojnie mozna wiecej, musze jeszcze poeksperymentowac z tym
A masz poprawnie skalibrowaną sondę oscyloskopu ?

Jony130
Moderator
Posty: 3170
Rejestracja: 11 sie 2005, 16:33
Lokalizacja: wrocław

Post autor: Jony130 » 14 cze 2012, 14:58

U mnie też sonda nie jest najlepiej skalibrowana.
Widać ślady różniczkowania i sonda w trybie X10

Obrazek

A tu sonda w trybie X1

Obrazek

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
NewFile7.PNG (2.26 KiB) Przejrzano 9916 razy
NewFile9.PNG
NewFile9.PNG (2.32 KiB) Przejrzano 9481 razy
Ostatnio zmieniony 14 cze 2012, 14:59 przez Jony130, łącznie zmieniany 1 raz.

ODPOWIEDZ