ИС-пытатель писал(а):Ну, если фузы выставили правильно, то у Вас получается, что задержка реализует частоту 7,372800 MHz / 1024 (коэффициент деления таймера) / 1 (значение переменной Tim, с которой сравниваете) = 7200 герц. А так как у Вас используются 2 задержки для 1 цикла, то результирующая частота = 7200 / 2 = 3600 Гц. Уменьшайте коэффициент деления таймера и подбирайте Tim нужную частоту
С delay_ms не интересно.)) Хотелось именно с таймером попробовать. А вот как правильно предделитель настроить я и не понял. Собственно о том и вопрос был. Фьюзы хазамы в прикреплении. спс
in r16, PINC ; читаем порт ldi r17, 1 ; присваеваем 0b00000001 eor r16, r17 ; исключаещее или, если бит 0 порта С =1, то результат =0, если бит =0, то результат =1 out PORTC, r16 ; пишем результат в порт С reti
in r16, PINC ; читаем порт ldi r17, 2 ; присваеваем 0b00000010 eor r16, r17 ; исключаещее или, если бит 1 порта С =1, то результат =0, если бит =0, то результат =1 out PORTC, r16 ; пишем результат в порт С reti
В даташите смотрите. )) Обычно Т2 - асинхронный (3-е исполнение), а Т0 - исполнения 1 или 2. 1 - урезанное исполнение, таймер может работать только в режиме Normal. А 2 исполнение - со вкусностями.
Столкнулся с одной непоняткой при отладке с помощью JTAG ICE.Програмка такая записать значение TCNT1H и 1L и вывести на экран. TCNT1H=0; TCNT1L=0; _delay_us(1000);
f=TCNT1H; l=TCNT1L; x=( f<<8 )+l;
LCD_Goto(0,1);
vivod_zifer(x); Смотрел в отладке не выполняется f=TCNT1H (asm IN r16,0x2d пишу в IARe) Что интересное TCNT1L записывается в регистр, а TCNT1H нет.В отладке Avr Simulator все идет.Еще заметил если записать сверху TCNT1H=1; то и в f пойдет 1. В чем причина подскажите.
Freerider как вы круто обучаетесь) отладчик да на иаре)))
Для выполнения цикла записи 16-битного регистра первым должен быть загружен старший байт значения, который помещается в регистр TEMP. При последующей записи младшего байта он объединяется с содержимым регистра TEMP, и оба байта одновременно (в одном и том же такте) записываются в 16-битный регистр. Если требуется изменить несколько 16-битных регистров таймера/счетчика, а старшие байты всех записываемых значений одинаковы, то загрузку старшего байта достаточно выполнить только один раз. Для выполнения цикла чтения 16-битного регистра первым должен быть прочитан младший байт. При его чтении содержимое старшего байта помещается в регистр TEMP. При последующем чтении старшего байта возвращается значение, сохраненное в регистре TEMP. Исключение составляют только регистры сравнения OCR/7A/B/C, при чтении которых регистр TEMP не задействуется.
Например если чип работает на частоте 8МГц и мне необходима частота ШИМа 25Кгц.
То можно настроить 16 битный таймер (Timer 1) чтоб он тикал до 320 и потом таймер сбрасывался ? Поскольку у Atmega 48 два регистра сравнения на каждый таймер то первый регистр сравнения ставим 320, а второй будет принимать динамические значения от 0 до 320. И он будет связан с выходом OC1B. Таким образом ШИМ будет от 0 до 320 по дискретизации и частота будет 25КГц.
По мне, у T1 mega48 есть такой режим, описанный в DS.
FAST_PWM_48.GIF
Замечу, что работа без защитных интервалов сопряжена с непреодолимыми глюками. Т.е. задавать значения сравнения 0 и 320 можно, но работать будет некорректно.
Что то не понимаю в какие регистры что я должен написать?
Конечно есть и другое решение проблемы запустить ШИМ на первом таймере в режиме 9 бит и часто микроконтролера 12,8 Мегагерц установить, но тогда нужно ставить кристал.
Добрый день! Столкнулся с проблемой: таймер не выходит на прерывание. Написал такой код для работы с таймером (atmega 8, avr studio 6.2): #include <avr/io.h> #include <avr/interrupt.h>
int main(void) { int i; TCCR1B = (0<<CS12)|(0<<CS11)|(1<<CS10); TIFR = (1<<TOV1); TIMSK |= (1<<TOIE1); // разрешить прерывание по переполнению таймера счетчика TCNT1 = 65500; sei(); while(1) } В файле Disassembly в ассемблерном коде вижу запрет на глобальные прерывания, хотя я в коде его не ставил. Возможно я что-то не так прописал в директивах препроцессора. Пожалуйста, помогите уже два дня с этим мучаюсь.