Для большей понятности и достоверности я бы сделал немножко иначе...(+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Юрий_СВ 26 ноября 2006 г. 03:21
В ответ на: Проверил - оказался действительно TCNT0 --> отправлено =AVR= 26 ноября 2006 г. 01:03

Запускаем АЦП (и делаем 1-е преобразование)
Ждём его окончания
Разрешаем прерывание по окончанию преобразования на АЦП

Запускаем оба таймера, но на разную частоту
Чтобы случайно не напутать с частотой генератора, выборами источников и делителями
выводим на вывод ШИМ от нулевого таймера (0-й разряд порта)

В прерывании по АЦП каждый раз инвертируем 3-й бит порта.

После запуска - смотрим частоту ШИМ (бит 0) и частоту на тестовой ноге (бит 3)
Делаем достоверный вывод - с какого таймера он запускается (если вообще не с обоих).

Поправ, если что не так.
(АЦП написано с перестраховками)
-----------------------------------------------------------------------------------

; System clock 1 MHz (Internal RC 8MHz/8)

.include "tn45def.inc"

rjmp main ; Reset Handler
rjmp main ; IRQ0 Handler
rjmp main ; PCINT0 Handler
rjmp main ; Timer1 CompareA Handler
rjmp main ; Timer1 Overflow Handler
rjmp main ; Timer0 Overflow Handler
rjmp main ; EEPROM Ready Handler
rjmp main ; Analog Comparator Handler
rjmp ADC_Int ; ADC Conversion Handler

main:
ldi r16,low(ramend) ; Stack initialisation
out SPL,r16 ;
ldi r16,high(ramend);
out SPH,r16 ;

;------------------------------------------------------------------------------------
ldi r16,9 ; Set up an ADC activity test point (PORTB.3) as output
; Set up an Timer0 freq test point (PORTB.0) as output
out DDRB,r16 ; 0000 1001
;-----------------------------------------------------------------------------------

ldi r16,147 ; Prepare ADC
out ADCSRA, r16 ; 1001 0011

ldi r16,211 ; Start conversion
out ADCSRA, r16 ; 1101 0011

first_conv:
in r16,ADCSRA ; Wait for ADC conversion complete flag (ADIF)
sbrs r16,ADIF ;
rjmp first_conv ;

ldi r16,147 ; Clear flag
out ADCSRA, r16 ; 1001 0011

ldi r16,155 ; Enable ADC Int
out ADCSRA, r16 ; 1001 1011

;-----------------------------------------------------------------------------------
ldi r16, 6 ; Clear all Timer OverFlow Int flags
out TIFR,r16 ; 0000 0110

ldi r16, 64 ; Set PWM value = 1/4 T
out OCR0A,r16 ;

ldi r16, 195 ; Set TCNT0 mode - Activate PWM for Timer freq test point
out TCCR0A,r16 ; Fasr PWM - Set OC0A on Compare Match, clear OC0A at TOP

sei ; Int Enable

ldi r16, 3 ; Run TCNT0 at Fclk/64
out TCCR0B,r16 ;

ldi r16, 4 ; Run TCNT1 at Fclk/256
out TCCR1B,r16 ;
;------------------------------------------------------------------------------------

Loop: rjmp Loop

;------------------------------------------------------------------------------------

ADC_Int:

sbis PinB, 3 ; Inverse test pin
sbi PortB, 3
sbic PinB, 3
cbi PortB, 3

ldi r16, 6 ; Clear all Timer OverFlow Int flags
out TIFR,r16 ; 0000 0110

reti

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа
Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
URL изображения: 
если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
введите число 234:


Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание