Niby banał a nie wiem dlaczego.

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Tom27
-
Posty: 62
Rejestracja: 28 sie 2005, 12:07

Niby banał a nie wiem dlaczego.

Post autor: Tom27 » 05 sty 2011, 15:35

Witam
Czy może mi ktoś wytłumaczyć, dlaczego poniższy program daje na Port Pd.5 przebieg o częstotliwości ok. 690 kHz, kiedy kwarc taktujący procesor ma 8MHz???
Procesor to Atmega8, program pisany w Bascomie.

Kod: Zaznacz cały

Do
Toggle Portd.5

Loop
End

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 05 sty 2011, 17:05

Czy nie jest tak że mikroprocesor działa z wewnętrznym generatorem RC? Czy fabrycznie ustawienia Fusebit'ów zostały zmienione aby mikrokontroler współpracował z rezonatorem kwarcowym?
W wyżej prezentowanym programie generowana częstotliwość zależy od ilości cykli maszynowych maszynowych jakie zajmuje wykonanie instrukcji "Toggle" oraz "skoku" do początku pętli "Do".
Generalnie do odmierzania czasu (generacji częstotliwości) stosuje się timery (które przecież są zawarte w mikroprocesorze i są po to aby ich używać).

Tom27
-
Posty: 62
Rejestracja: 28 sie 2005, 12:07

Post autor: Tom27 » 06 sty 2011, 0:21

Tak wiem, że Timer-y to pożyteczne wynalazki, ale poprzez powyższy program wcale nie zamierzam odmierzać czasu, bo do tego stosuję właśnie Timer. Powyższy program jest tylko po to, aby sprawdzić właśnie, dlaczego jest tak, że procesor z kwarcem 8MHz generuje 690kHz. W Fusebitach ustawiony jest na kwarc zewnętrzny.
Próbuję napisać większy program z wykorzystaniem Timera0 i właśnie w czasie pisania napotkałem problem, posługując się oscyloskopem i miernikiem częstotliwości chciałem ustalić, co jest przyczyną problemu. Kiedy podłączyłem oscyloskop pod jeden z pinów wydało mi się bardzo dziwne, że mam tak niską częstotliwość. Myślałem najpierw, że coś nie tak jest z mikrokontrolerem, później sprawdziłem ustawienia Fusebitów ale wszystko było ok. więc wyrzuciłem wszystko z programu zostawiając tylko to, co powyżej i jakież było moje zdziwienie, że pusty program generuje tak niską częstotliwość. Procesor jest ok. sprawdzałem na innym programie z wykorzystaniem Timera, który generuje, co sekundę sygnał i jest prawidłowo myślę, że brakuje mi wiedzy, dlaczego tak jest jak jest i stąd moje pytanie.

Awatar użytkownika
mr_x
Użytkownik
Posty: 385
Rejestracja: 12 gru 2010, 19:05
Lokalizacja: /bin/bash
Kontakt:

Post autor: mr_x » 06 sty 2011, 1:07

Spróbuj może napisać ten sam program w asemblerze, bo być może Bascom dodaje dużo instrukcji "po drodze".

keruseykaryu

Post autor: keruseykaryu » 06 sty 2011, 9:44

Wszystko się zgadza. Cała operacja Toggle trwa 0.75us czyli cały przebieg t=2*0.75us co po przeliczeniu f=1/(2*.75us) daje nam diabelsko prostą liczbę 666kHz.

A cały program wygląda tak jak chcesz liczyć takty.

Kod: Zaznacz cały

; test.asm
__vector:
    RJMP      __init      
    RETI                     
    RETI                     
    RETI                     
    RETI                     
    RETI                     
    RETI                     
    RETI                     
    RETI                     
    RETI                     
    RETI                     
__init:
    LDI       R24,(_IRAMSTART+_RAMSIZE)
    OUT       SPL,R24       
    LDI       R28,0xC0       
    LDI       R30,0xB8       
    MOV       R4,R30         
    CLR       R29            
    MOV       R5,R29         
    LDI       R30,lo(_RAMSIZE)
    LDI       R31,hi(_RAMSIZE)
    LDI       R26,lo(_IRAMSTART)
    LDI       R27,hi(_IRAMSTART)
    CLR       R24            
__initclriram:
    ST        X+,R24         
    SBIW      R30,1       
    BRNE      __initclriram
    CLR       R6             
;2:        Toggle Portd.5
__lbl0001:
    IN        R24,PORTD
    LDI       R25,0b00100000       
    EOR       R24,R25        
    OUT       PORTD,R24       
;4:        Loop
    RJMP      __lbl0001
;5:        End
__lbl0002:
    CLI                      
    RJMP      __lbl0002
__dec_Z:
    SBIW      R30,1       
    BRNE      __dec_Z        
    RET                      
__seterr:
    SET                      
    BLD       R6,2           
    RET                      
__clrerr:
    CLT                      
    BLD       R6,2           
    RET
C.b.d.u.

Tom27
-
Posty: 62
Rejestracja: 28 sie 2005, 12:07

Post autor: Tom27 » 06 sty 2011, 14:23

Dziękuję keruseykaryu, że chciało Ci się poświęcić trochę czasu na rozpisanie niby banalnej instrukcji. Niestety pozostaje mi uznać po trochę „ w ciemno”, że tak właśnie jest, bo nic nie rozumiem z tego, co napisałeś. To jest odpowiednik mojego krótkiego programu w asemblerze?
Nie od dzisiaj wiadomo, że Bascom to narzędzie dla dzieci. Ja takim dzieckiem właśnie jestem (nie z racji wieku, bo trochę już latek mam raczej z racji doświadczenia w programowaniu), ale na razie tylko tym potrafię się posługiwać i to z tym potrafię to też mocno na wyrost. Powtórzę po autorze artykułu z jednej z ostatnich EdW, że niech każdy pisze w tym, w czym czuje się najlepiej, a ode mnie to, że na kolejne kroki zawsze będzie czas.
Dzięki jeszcze raz za zainteresowanie


Pozdrawiam
Tomek

keruseykaryu

Post autor: keruseykaryu » 06 sty 2011, 20:23

Tom27 pisze:Niestety pozostaje mi uznać po trochę „ w ciemno”, że tak właśnie jest, bo nic nie rozumiem z tego, co napisałeś.
Pełen okres sinusoidy to dwie jej połówki: dodatnia i ujemna. Jak może i Ci wiadomo okres (przejście z punktu wyjścia do kolejnego punktu wyjścia sinusa) jest odwrotnością częstotliwości ze znanego z fizy wzoru: f = 1/t. Tak samo jest tu. Mamy stan wysoki i stan niski i ich czas trzymania sumuje na pełen okres. To z tego jest to 0,75us razy dwa a resztę już wyliczono.
Tom27 pisze:To jest odpowiednik mojego krótkiego programu w asemblerze?
To jest dokładnie twój program wydobyty z czeluści BASCOM.
Pozornie gupszy program:

Kod: Zaznacz cały

Do
Set Portd.5
Reset Portd.5
Loop
End
Da lepszy wynik, ale generator z niego nie jest ideał, bo nie ma 50% wypełnienia. Tak przy okazji.

ODPOWIEDZ