Асинхронный таймер

Обсуждаем контроллеры компании Atmel.
Ответить
Dessp
Встал на лапы
Сообщения: 136
Зарегистрирован: Ср янв 23, 2013 10:58:31

Асинхронный таймер

Сообщение Dessp »

Привет люди.
Спасите плиз, а то дня 4ре уже мучаюсь.

Написал на attiny4313 генератор 1Mhz на таймере с возможностью деления частоты (500Khz,250Khz и так далее), запитал его от 8Mhz кварца. (использовал таймер 16бит )

Для приема использую Atmega16A, таймер 0 тактую от сгенерированого сигнала (чтобы считал raiseы) и храню значение в 3х 8битных регистрах (один из них сам таймер).

Далее, настроил Таймер 2 на работу от часового кварца, с предделителем 128 и на прерывание по переполнению. Собственно когда идет прерывание, иду в него, беру значение таймера 0 и еше двих других регистров,обнуляю их , обрабатываю значение, шлю на HD44780 и выхожу из прерывания (в прерывании таймер 0 НЕ УСПЕВАЕТ ПЕРЕПОЛНИТСЯ, проверял по тактам, все в порядке).

Собственно вместо 500000 у меня 500062, вместо 250000 у меня 250031, вместо 125000 у меня 125016, вместо 62500 у меня 62508 и так далее....

Народ, откуда берутся лишние такты в таймере 0 ??!!!! притом длительность прерывания Таймера 2 не влияет, очистка предделителя таймера 2 вместе с обнулением таймера 0 и 2 пры выходе из прерывания таймера 2 ничего не дало...

п.с. глупый вопрос конечно, НО, возможно ли что кварц на 8Мгц не совсем 8Мгц дает, и у меня сигнал именно идет не 500000 а 500062 ?? разве может быть такая погрешность?? У меня нету просто осциллографа чтобы посмотреть длительность импульса на линии:((

скину фотки что я собрал, и еше проекты, помогите плиз :))

Добавлено after 8 minutes 13 seconds:
тут фотки:

Изображение

Изображение

Изображение

Изображение

Добавлено after 4 minutes 7 seconds:
есть еше видео, но что то не могу загрузить, 200Мб, все виснет :(
Вложения
pulse_counter.rar
(228.94 КБ) 148 скачиваний
Реклама
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Асинхронный таймер

Сообщение akl »

Dessp писал(а):...возможно ли что кварц на 8Мгц не совсем 8Мгц дает, и у меня сигнал именно идет не 500000 а 500062 ?? разве может быть такая погрешность?? У меня нету просто осциллографа чтобы посмотреть длительность импульса на линии:((
Да, не только возможно, но и как правило. Кварц с маркировкой "8МГц" совсем не то, что "8000к" и уж тем более "8000000". Кстати, часовой кварц далеко не всегда 32'768 и имеет свое отклонение от номинала.
Реклама
Dessp
Встал на лапы
Сообщения: 136
Зарегистрирован: Ср янв 23, 2013 10:58:31

Re: Асинхронный таймер

Сообщение Dessp »

[/quote] Да, не только возможно, но и как правило. Кварц с маркировкой "8МГц" совсем не то, что "8000к" и уж тем более "8000000". Кстати, часовой кварц далеко не всегда 32'768 и имеет свое отклонение от номинала.[/quote]

Как же так? тогда как добиваются точности в временных интервалах?

Мне нужно посчитать количество импульсов во время секунды, как мне быть уверенным в секунде? :О
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Асинхронный таймер

Сообщение akl »

Частотомером в режиме периодомера проверяете сгенерированную секунду. Ну или напрямую подстроечным конденсатором подстраиваете частоту кварца на ATtiny4313 c контролем на лапе PB3.
Спойлер

Код: Выделить всё

	.include "tn2313def.inc"

.equ Fo=8000000
;Definitions
;.def temp = R16
;.def temp1 = R17
;.def temp2 = R18


;Interrupts
rjmp RESET ; Reset Handler
rjmp INT_0 ; External Interrupt0 Handler
rjmp INT_1 ; External Interrupt1 Handler
;reti ; rjmp TIM1_CAPT ; Timer1 Capture Handler
;reti ; rjmp TIM1_COMPA ; Timer1 CompareA Handler
;reti ; rjmp TIM1_OVF ; Timer1 Overflow Handler
;reti ;TIM0_OVF ; Timer0 Overflow Handler
;reti ; rjmp USART0_RXC ; USART0 RX Complete Handler
;reti ; rjmp USART0_DRE ; USART0,UDR Empty Handler
;reti ; rjmp USART0_TXC ; USART0 TX Complete Handler
;reti ; rjmp ANA_COMP ; Analog Comparator Handler
;reti ; rjmp PCINT0 ; PCINT0 Handler
;reti ; rjmp TIMER1_COMPB ; Timer1 Compare B Handler
;reti ;rjmp TIMER0_COMPA ; Timer0 Compare A Handler
;reti ;rjmp TIMER0_COMPB ; Timer0 Compare B Handler
;reti ; rjmp USI_START ; USI Start Handler
;reti ; rjmp USI_OVERFLOW ; USI Overflow Handler
;reti ; rjmp EE_READY ; EEPROM Ready Handler
;reti ; rjmp WDT_OVERFLOW ; Watchdog Overflow Handler
;reti ; rjmp PCINT1 ; PCINT1 Handler
;reti ; rjmp PCINT2 ; PCINT2 Handler


RESET:
; STACK initialization
	ldi		R16,low(RAMEND)
	out		SPL,R16
	;	ldi		R16,high(RAMEND)
	;	out		SPH,R16



; PORT's initialization

	;	ser		R16				
	;	out		DDRB,R16		; PORTB as output
	;	ldi		R16,0b11111101
	;	out		PORTB,R16		; PORTB output value all "1"

		sbi		DDRB,PB3	;OC1A		
		sbi		DDRB,PB4		


		;clr		R16
		ldi		R16,0b11100000
		out		DDRD,R16		; PORTD as input
		ser		R16				
		out		PORTD,R16		; PORTD pull-up is ON

; Turning OFF comparator
	SBI	ACSR,ACD

;		ldi		R16,0x80
;		out		ACSR,temp
/*
; Clock prescaler initialization
		ldi		R16,0b10000000
		out		CLKPR,R16
		ldi		R16,0b00001000	; Divide by 256
		out		CLKPR,R16
		nop
		nop
		nop
		nop
*/
; 8 bit Timer initialization
	LDI	XH,HIGH(Fo/500000/2-1)
	LDI	XL,LOW(Fo/500000/2-1)
	OUT	OCR1AH,XH
	OUT	OCR1AL,XL
;		clr		R16
;		out		OCR1AH,R16
;		ldi		R16,15		; Frequency for CTC mode
;		out		OCR1AL,R16		


;		clr		R16
;		out		OCR1BH,R16
;		ldi		R16,8			; Frequency for CTC mode
;		out		OCR1BL,R16




//		ldi		R16,0b00000010	; TOV0 interrupt
//		ldi		R16,0b00000011	; TOV0 & OCF0A interrupt
;		ldi		R16,0b00000111	; TOV0 & OCF0A & OCF0B interrupt
;		ldi		R16,0b00000000
;		out		TIMSK,R16

//		clr		R16				; NORMAL operation mode
;		ldi		R16,0b00000010	; CTC operation mode
//		ldi		R16,0b01000010	; CTC operation mode & OCR0A toggle
;		ldi		R16,0b00100011  ; Fast PWM mode & OCR0A and OCR0B toggle
;		ldi		R16,0b11100011  ; Fast PWM mode & OCR0A and OCR0B toggle (different toggle mode)

	LDI	R16,1<<COM1A0
	OUT	TCCR1A,R16
;		ldi		R16, 1<<COM1B1 | 1<<COM1B0; | 1<<WGM10 | 1<<WGM11
;		out		TCCR1A,R16		

		;ldi		R16,0b00000001 | 1<<WGM02 ; 1024 Prescaler & PWM TOP 255
;		ldi		R16,0b00001101  ; 1024 Prescaler & PWM TOP OCROA
		ldi		R16,1<<WGM12|1<<CS10 ;1<<WGM13 | 1<<WGM12 | 0<<CS12 | 0<<CS11 | 1<<CS10
		out		TCCR1B,R16	




		ldi		R16,0b00001111		
		out		MCUCR,R16
		ldi		R16,0b11000000
		out		GIMSK,R16
;		ser		R16
		out		GIFR,R16



		sei						; ENable interrupts


; Main program
main:	

		rjmp	main

INT_0:	
		rcall	wait
		sbis	PIND,PD2
		rjmp    exit_int_0


		in		R24,OCR1BL
		in		R25,OCR1BH

		clc		
		rol		R24
		rol		R25

		adiw	R25:R24,1

		out		OCR1BH,R25
		out		OCR1BL,R24

		in		R24,OCR1AL
		in		R25,OCR1AH

		clc		
		rol		R24
		rol		R25
		
		adiw	R25:R24,1

		out		OCR1AH,R25
		out		OCR1AL,R24


exit_int_0:
		ser		R16
		out		GIFR,R16
		reti




INT_1:	
		rcall	wait
		sbis	PIND,PD3
		rjmp    exit_int_1




		in		R24,OCR1BL
		in		R25,OCR1BH

		;
		clc	
		ror		R25
		ror		R24


;		adiw	R25:R24,1

		out		OCR1BH,R25
		out		OCR1BL,R24

		in		R24,OCR1AL
		in		R25,OCR1AH

		clc		
		ror		R25
		ror		R24

		
		out		OCR1AH,R25
		out		OCR1AL,R24

exit_int_1:
		ser		R16
		out		GIFR,R16
		reti








; Delay Sub-program
wait:	ldi		R16,255
		ldi		R17,255
		ldi		R18,1
delay:	subi	R16,1		; (3+2)xR16(255)xR17(255)xR18(100) = 32.5kk ~2sec
		sbci	R17,0
		sbci	R18,0
		brcc	delay
		ret
.EXIT

Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Асинхронный таймер

Сообщение Jack_A »

Dessp писал(а): Как же так? тогда как добиваются точности в временных интервалах?
Абсолютной точности не бывает - даже у государственного эталона есть погрешность. Можно вести речь о максимально допустимой погрешности в данном конкретном дивайсе и ее добиваться.
Изображение
Реклама
Ответить

Вернуться в «AVR»