logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Generowanie 500kHz na ATMEGA16 z kwarcem 11.0592MHz - jak to osiągnąć?

crazy_phisic 05 Gru 2005 00:44 3244 7
REKLAMA
  • #1 2054723
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 130
    Witam
    Próbuje zmusić Mega16 do wygenerowania przebiegu o czestotliwości powyżej 100kHz (w domyśle 500kHz) ale niestety pacjent odmawia współpracy... na kwarcy 11059200 maksymala częstotliwość to 40kHz dla 16MHz podskoczyła do 59kHz. I nic nie daje zmiana wartości preskalera i/lub ładowanie wartości do timera (testowane z timerem 1 i 0)... Czy ktoś borykał sie juz z takim problemem? A może to ułomność Bascoma? Nie testowałem w C ani w ASM...

    Pozdrawiam
  • REKLAMA
  • #2 2054855
    genetix
    Poziom 24  
    Posty: 669
    Pomógł: 42
    11059200/500000 = 22 z hakiem.

    Czyli na jeden okres generowanego przebiegu przypadają 22 cykle zegara procesorka, czyli średnio z 10-12 rozkazów. Myślisz, że Bascom sobie poradzi? W życiu!!!

    Musisz się nieźle sprężyć, żeby to zrobić w assemblerze (bo C też odpada). Ja bym zwiększył fXTAL do 16MHz.
  • REKLAMA
  • #3 2054868
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 130
    Mam 16MHz ;) tylko ta fala prostokątna o częstotliwości ~60kHz to sporo za mało(przerwanie 120kHz) to "az" 133 instrukcje pomiedzy przerwaniami, jak na czas procesora to sporo go wolnego zostaje, wskakiwanie do przerwania chyba nie kosztuje az tyle czasu? No cóż, zobacze jak sobie C z tym poradzi ;).
  • #4 2054885
    jotu22
    Poziom 21  
    Posty: 337
    Pomógł: 31
    Ocena: 55
    Z tego co pamiętam to bascom ma w zwyczaju wrzucać na stos wszystkie możliwe zmienne przy wchodzeniu do przerwania - może w tym jest problem? Jeśli dobrze pamiętam to mogła temu zaradzić dyrektywa @nostack ale głowy nie dam.
  • REKLAMA
  • #5 2054929
    genetix
    Poziom 24  
    Posty: 669
    Pomógł: 42
    :arrow: crazy_phisic

    Możliwe, że Bascom generuje pliki .asm a potem je asembluje do .hex-a. Jeśli tak jest, to może umieść w załączniku plik z kodem w asmie i przyjrzymy się coteż tam Bascom nawrzucał.... Możnaby ręcznie to zoptymalizować (od biedy) ale i tak jestem za napisaniem tego "po ludzku".

    pozdrawiam.
  • #6 2055324
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 130
    No i Bascom kolejny raz poległ ;) prawie identyczny program w Fastavr daje przerwanie co 1,3 us ;) czyli mam juz przebieg o czestotliwosci 380kHz, nie wspominając już o różnicach w objętości programu ;)

    plik ASM generowany przez fastavr
    
    ;FastAVR Basic Compiler, ver.4.0.1, by MicroDesign
    ;Created 11:07:00, 05-12-2005
    ;
    .include	"C:\FastAVR\inc\m16def.inc"
    ;
    		.DSEG
    		
    		.CSEG
    .ORG	0
    		rjmp	_Reset
    .ORG		INT0addr
    		reti
    .ORG		INT1addr
    		reti
    .ORG		OC2addr 
    		reti
    .ORG		OVF2addr
    		reti
    .ORG		ICP1addr
    		reti
    .ORG		OC1Aaddr
    		reti
    .ORG		OC1Baddr
    		reti
    .ORG		OVF1addr
    		reti
    .ORG		OVF0addr
    		rjmp	IntN9
    
    _Reset:
    		ldi		yl,low(RAMEND)
    		out		SPL,yl
    		ldi		yh,high(RAMEND)
    		out		SPL+1,yh
    		sbiw	yl,32
    
    
    
    ;******	USERS BASIC CODE **********************
    
    ;-Line--0009----DDRC = &B11111111--
    		ldi		zl,low(255)
    		out		ddrc,zl
    
    ;-Line--0011----$Def Led=PORTC.0--
    
    ;-Line--0012----$Timer0 = Timer , Prescale =1--
    
    ;-Line--0015----Enable Interrupts--
    		sei
    
    ;-Line--0016----Enable Ovf0--
    		in		zl,TIMSK
    		sbr		zl,0x01
    		out		TIMSK,zl
    
    ;-Line--0017----TCNT0=&hf0--
    		ldi		zl,low(240)
    		out		tcnt0,zl
    
    ;-Line--0019----Start Timer0--
    		in		zl,TCCR0
    		sbr		zl,1
    		out		TCCR0,zl
    
    ;-Line--0020----Do--
    L0000:
    
    ;-Line--0021----Loop--
    		rjmp	L0000
    L0001:
    
    ;-Line--0023----Interrupt Ovf0()--
    
    ;-Line--0024----TCNT0=&hf0--
    IntN9:
    		in		r2,SREG
    		ldi		zl,low(240)
    		out		tcnt0,zl
    
    ;-Line--0026----Toggle led--
    		in		zl,PORTC
    		ldi		r23,0x01
    		eor		zl,r23
    		out		PORTC,zl
    
    ;-Line--0027----End Interrupt--
    		out		SREG,r2
    		reti
    
    ;****** END OF USER BASIC CODE ****************
    
    
    ;System Global Variables: 0  bytes
    ;User   Global Variables: 0  bytes
    
  • REKLAMA
  • Pomocny post
    #7 2055402
    tajwoj
    Poziom 26  
    Posty: 559
    Pomógł: 106
    Ocena: 102
    Hej,
    Takie coś generuje 500kHz prodtokąt na PD7 od CTC na Timer2,
    przy kwarcu 16MHz.

    
    #include <avr/io.h>
    
    int main(void)
    {
    	DDRD |= 0x80; 
    	TCCR2 |=  _BV(WGM21) | _BV(COM20) | _BV(CS20);
    	OCR2=0x0F;
    
    	for(;;)
    	{ 							
    	}
    return 0;
    }
    
    

    Pozdrowienia
  • #8 2055687
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 130
    ;D udało się ...
    Kolega tajwoj podpowiedzial jedyna chyba słuszną droge realizacji takiego zadania, zaprzęgnięcie do pracy licznika jako CTC ;)
    Dla fastavr i bascoma:
    
    $Device= m16			
    $Stack = 32				
    $Clock = 16.000000	
    	
    DDRD = &B11111111	
    TCCR2=&b00011010 
    OCR2=&h01
    


    
    $regfile = "m16def.dat"
    $crystal = 16000000
    Ddrd = &B11111111
    Tccr2 = &B00011010
    Ocr2 = &H01
    


    temat zamykam ;)

Podsumowanie tematu

✨ Dyskusja dotyczy problemu generowania przebiegu o częstotliwości około 500 kHz na mikrokontrolerze ATMEGA16 z kwarcem 11,0592 MHz. Próby uzyskania tak wysokiej częstotliwości za pomocą Bascoma i standardowych timerów (Timer0, Timer1) nie przyniosły efektu, maksymalna uzyskana częstotliwość to około 40-60 kHz. Wynika to z ograniczeń liczby cykli zegara przypadających na jeden okres sygnału oraz narzutu wynikającego z obsługi przerwań i generowanego kodu przez Bascom. Sugerowano, że osiągnięcie 500 kHz wymaga programowania w asemblerze lub zwiększenia częstotliwości kwarcu do 16 MHz. Alternatywnie, zastosowanie kompilatora FastAVR Basic pozwoliło na uzyskanie przerwań co 1,3 µs (około 380 kHz). Ostatecznie skutecznym rozwiązaniem okazało się wykorzystanie trybu CTC (Clear Timer on Compare Match) na Timerze2 przy kwarcu 16 MHz, co pozwoliło na generowanie przebiegu prostokątnego o częstotliwości 500 kHz na wyjściu PD7. Przykładowy kod w C pokazuje konfigurację rejestrów TCCR2 i OCR2 do tego celu. Dyskusja podkreśla ograniczenia Bascoma w generowaniu bardzo szybkich przerwań oraz zalety bezpośredniego wykorzystania sprzętowych timerów w trybie CTC dla wysokich częstotliwości sygnałów PWM.
REKLAMA