Страница 10 из 72
Re: Таймеры/счётчики в AVR
Добавлено: Пт май 16, 2014 11:42:05
ИС-пытатель
Или, раз уж дергаете ногой программно, так:
Код: Выделить всё
#define DL (1000000/40000/2) /* 1 000 000 мкс в секунде */
#include <delay.h>
//...
while (1)
{
PORTB.3 = 1;
delay_us (DL);
PORTB.3 = 0;
delay_us (DL);
}
// ...
И таймер вообще не нужен.
или можете заменить задержку циклом for
for (char i=0; i<92; i++) ;
Re: Таймеры/счётчики в AVR
Добавлено: Пт май 16, 2014 12:33:12
Diola
ИС-пытатель писал(а):
Ну, если фузы выставили правильно, то у Вас получается, что задержка реализует частоту 7,372800 MHz / 1024 (коэффициент деления таймера) / 1 (значение переменной Tim, с которой сравниваете) = 7200 герц. А так как у Вас используются 2 задержки для 1 цикла, то результирующая частота = 7200 / 2 = 3600 Гц. Уменьшайте коэффициент деления таймера и подбирайте Tim нужную частоту
С delay_ms не интересно.)) Хотелось именно с таймером попробовать. А вот как правильно предделитель настроить я и не понял. Собственно о том и вопрос был. Фьюзы хазамы в прикреплении. спс
Re: Таймеры/счётчики в AVR
Добавлено: Пт май 16, 2014 12:38:34
ИС-пытатель
Последние три бита регистра TCCR1B
Спойлер

TCCR1B = 5 - деление на 1024
TCCR1B = 4 - деление на 256
TCCR1B = 3 - деление на 64
TCCR1B = 2 - деление на 8
TCCR1B = 1 - деление на 1
TCCR1B = 0 - таймер выключен
Re: Таймеры/счётчики в AVR
Добавлено: Пт май 16, 2014 13:30:14
Diola
ИС-пытатель писал(а):Последние три бита регистра TCCR1B
Спойлер

TCCR1B = 5 - деление на 1024
TCCR1B = 4 - деление на 256
TCCR1B = 3 - деление на 64
TCCR1B = 2 - деление на 8
TCCR1B = 1 - деление на 1
TCCR1B = 0 - таймер выключен
ЗАРАБОТАЛО!!!! А вот плюсануть автору не смог ((
Re: Таймеры/счётчики в AVR
Добавлено: Пн июн 02, 2014 01:41:53
sergo80zxc
спасите помогите)) прогу проверяю в железе, что я сделал не так?

диод на ноге С0 в десять раз быстрее моргает чем на ноге С1
Спойлер
Код: Выделить всё
;****************************************************************************************
.cseg
.include "m8Adef.inc"
;***********************************************************************
.org $000 rjmp RESET ;Reset Handler
;.org $001 reti ;rjmp EXT_INT0 ; IRQ0 Handler
;.org $002 reti ;rjmp EXT_INT1 ; IRQ1 Handler
;.org $003 reti ;rjmp TIM2_COMP ; Timer2 Compare Handler
.org $004 rjmp TIM2_OVF ; Timer2 Overflow Handler
;.org $005 reti ;rjmp TIM1_CAPT ; Timer1 Capture Handler
;.org $006 reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
;.org $007 reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
;.org $008 reti ;rjmp TIM1_OVF ; Timer1 Overflow Handler
.org $009 rjmp TIM0_OVF ; Timer0 Overflow Handler
;.org $00a reti ;rjmp SPI_STC ; SPI Transfer Complete Handler
;.org $00b reti ;rjmp USART_RXC ; USART RX Complete Handler
;.org $00c reti ;rjmp USART_UDRE ; UDR Empty Handler
;.org $00d reti ;rjmp USART_TXC ; USART TX Complete Handler
;.org $00e reti ;rjmp ADC ; ADC Conversion Complete Handler
;.org $00f reti ;rjmp EE_RDY ; EEPROM Ready Handler
;.org $010 reti ;rjmp ANA_COMP ; Analog Comparator Handler
;.org $011 reti ;rjmp TWSI ; Two-wire Serial Interface Handler
;.org $012 reti ;rjmp SPM_RDY ; Store Program Memory Ready Handler
;********************************************************************************************************************
RESET:
CLI ; запретить все прерывания
ldi r16,low(RAMEND) ;загрузка указателя стека
out SPL,r16
ldi r16,high(RAMEND) ;загрузка указателя стека
out SPH,r16
ldi r16, 0b00000011
out DDRC, r16 ; порт С0, C1 на выход
ldi r16, 0b00000101
out TCCR0, r16 ; пределитель 1024, для таймера Т0
ldi r16, 0b00000101
out TCCR2, r16 ; пределитель 1024, для таймера Т2
ldi r16, 0b01000001 ; разр прер Т2, установив 6 бит (TOIE2) и Т0 установив 0 бит (TOIE0)
out TIMSK, r16
ldi r16, 0b01000001 ; сбрасываем флаг в индикаторе установив 6 бит (TOV2)в еденицу и 0 бит (TOV0) в еденицу
out TIFR, r16
ldi r16, 0b00000011
out SFIOR, r16 ; сброс предделителей (0 бит) PSR10 (1 бит) PSR2 установкой в них 1
SEI ; разрешить все прерывания
;**********************************************************************************************************************
MAIN:
rjmp MAIN
;************************************************************************************************************************
TIM2_OVF:
in r16, PINC ; читаем порт
ldi r17, 1 ; присваеваем 0b00000001
eor r16, r17 ; исключаещее или, если бит 0 порта С =1, то результат =0, если бит =0, то результат =1
out PORTC, r16 ; пишем результат в порт С
reti
;************************************************************************************************************************
TIM0_OVF:
in r16, PINC ; читаем порт
ldi r17, 2 ; присваеваем 0b00000010
eor r16, r17 ; исключаещее или, если бит 1 порта С =1, то результат =0, если бит =0, то результат =1
out PORTC, r16 ; пишем результат в порт С
reti
Re: Таймеры/счётчики в AVR
Добавлено: Пн июн 02, 2014 08:21:09
ИС-пытатель
А заглянуть в даташит не? никак?
У тебя таймер Т2 исполнения 3. чтобы делил на 1024 нужно ставить значение предделителя у него 0b111, а не 0b101.
Re: Таймеры/счётчики в AVR
Добавлено: Пн июн 02, 2014 14:28:26
sergo80zxc
ИС-пытатель спасибо) разобрался) ток не понятно как определить какое исполнение, 1, 2 или 3

Re: Таймеры/счётчики в AVR
Добавлено: Пн июн 02, 2014 18:18:34
ИС-пытатель
В даташите смотрите. )) Обычно Т2 - асинхронный (3-е исполнение), а Т0 - исполнения 1 или 2. 1 - урезанное исполнение, таймер может работать только в режиме Normal. А 2 исполнение - со вкусностями.
Re: Таймеры/счётчики в AVR
Добавлено: Пт июн 13, 2014 02:54:15
sergo80zxc
может поможет кому для себя писал памятку для атмега8 по таймерам Т0 и Т2 режимы нормаль и стс
Re: Таймеры/счётчики в AVR
Добавлено: Сб июн 14, 2014 10:47:28
Freerider
Столкнулся с одной непоняткой при отладке с помощью 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. В чем причина подскажите.
Re: Таймеры/счётчики в AVR
Добавлено: Сб июн 14, 2014 11:39:28
Pink-Pank
почитайте про операции с 16-разрядными регистрами в АВР
Re: Таймеры/счётчики в AVR
Добавлено: Сб июн 14, 2014 20:10:08
sergo80zxc
Freerider как вы круто обучаетесь) отладчик да на иаре)))
Для выполнения цикла записи 16-битного регистра первым должен
быть загружен старший байт значения, который помещается в регистр
TEMP. При последующей записи младшего байта он объединяется с
содержимым регистра TEMP, и оба байта одновременно (в одном и том же
такте) записываются в 16-битный регистр.
Если требуется изменить
несколько 16-битных регистров таймера/счетчика, а старшие байты всех
записываемых значений одинаковы, то загрузку старшего байта достаточно
выполнить только один раз.
Для выполнения цикла чтения 16-битного регистра первым должен
быть прочитан младший байт. При его чтении содержимое старшего байта
помещается в регистр TEMP. При последующем чтении старшего байта
возвращается значение, сохраненное в регистре TEMP. Исключение
составляют только регистры сравнения OCR/7A/B/C, при чтении которых
регистр TEMP не задействуется.
Re: Таймеры/счётчики в AVR
Добавлено: Сб июн 14, 2014 20:15:01
Pink-Pank
Браво, Сергос! ))
Re: Таймеры/счётчики в AVR
Добавлено: Сб июн 14, 2014 21:07:15
Freerider
Спасибо за ответ , забыл просто заглянуть в книжку.
Re: Таймеры/счётчики в AVR
Добавлено: Вс июн 29, 2014 23:32:33
amd9800
Скажите пожалуйста. Для Atmega48
Например если чип работает на частоте 8МГц и мне необходима частота ШИМа 25Кгц.
То можно настроить 16 битный таймер (Timer 1) чтоб он тикал до 320 и потом таймер сбрасывался ?
Поскольку у Atmega 48 два регистра сравнения на каждый таймер то первый регистр сравнения ставим 320, а второй будет принимать динамические значения от 0 до 320. И он будет связан с выходом OC1B. Таким образом ШИМ будет от 0 до 320 по дискретизации и частота будет 25КГц.
Re: Таймеры/счётчики в AVR
Добавлено: Пн июн 30, 2014 06:06:16
akl
По мне, у T1 mega48 есть такой режим, описанный в DS.
FAST_PWM_48.GIF
Замечу, что работа без защитных интервалов сопряжена с непреодолимыми глюками. Т.е. задавать значения сравнения 0 и 320 можно, но работать будет некорректно.
Re: Таймеры/счётчики в AVR
Добавлено: Пн июн 30, 2014 08:40:34
amd9800
Что то не понимаю в какие регистры что я должен написать?
Конечно есть и другое решение проблемы запустить ШИМ на первом таймере в режиме 9 бит и часто микроконтролера 12,8 Мегагерц установить, но тогда нужно ставить кристал.
Re: Таймеры/счётчики в AVR
Добавлено: Пн июн 30, 2014 08:55:33
ibiza11
amd9800, нужно биты WGM13..WGM10 установить в соответствии с режимом. Биты находятся в регистрах TCCR1A, TCCR1B
Re: Таймеры/счётчики в AVR
Добавлено: Пн июн 30, 2014 13:52:09
Neptyn
Добрый день! Столкнулся с проблемой: таймер не выходит на прерывание.
Написал такой код для работы с таймером (atmega 8, avr studio 6.2):
#include <avr/io.h>
#include <avr/interrupt.h>
ICR (TIMER1_OVF_vect)
{
DDRD=1;
PORTD=1;
return 0;
}
int main(void)
{
int i;
TCCR1B = (0<<CS12)|(0<<CS11)|(1<<CS10);
TIFR = (1<<TOV1);
TIMSK |= (1<<TOIE1); // разрешить прерывание по переполнению таймера счетчика
TCNT1 = 65500;
sei();
while(1)
}
В файле Disassembly в ассемблерном коде вижу запрет на глобальные прерывания, хотя я в коде его не ставил. Возможно я что-то не так прописал в директивах препроцессора.
Пожалуйста, помогите уже два дня с этим мучаюсь.
Re: Таймеры/счётчики в AVR
Добавлено: Пн июн 30, 2014 14:57:25
ARV
у меня дежавю?

уже был впрос про макрос ICR... обработчик прерываний правильно называется
ISR - ну читайте же документацию перед писаниной!