Таймеры/счётчики в AVR

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Re: Таймеры/счётчики в AVR

Сообщение ИС-пытатель »

Или, раз уж дергаете ногой программно, так:

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

#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++) ;
Diola
Родился
Сообщения: 3
Зарегистрирован: Чт май 15, 2014 14:42:05

Re: Таймеры/счётчики в AVR

Сообщение Diola »

ИС-пытатель писал(а):Ну, если фузы выставили правильно, то у Вас получается, что задержка реализует частоту 7,372800 MHz / 1024 (коэффициент деления таймера) / 1 (значение переменной Tim, с которой сравниваете) = 7200 герц. А так как у Вас используются 2 задержки для 1 цикла, то результирующая частота = 7200 / 2 = 3600 Гц. Уменьшайте коэффициент деления таймера и подбирайте Tim нужную частоту


С delay_ms не интересно.)) Хотелось именно с таймером попробовать. А вот как правильно предделитель настроить я и не понял. Собственно о том и вопрос был. Фьюзы хазамы в прикреплении. спс
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Re: Таймеры/счётчики в AVR

Сообщение ИС-пытатель »

Последние три бита регистра TCCR1B
СпойлерИзображение


TCCR1B = 5 - деление на 1024
TCCR1B = 4 - деление на 256
TCCR1B = 3 - деление на 64
TCCR1B = 2 - деление на 8
TCCR1B = 1 - деление на 1
TCCR1B = 0 - таймер выключен
Вложения
123.png
(75.02 КБ) 1160 скачиваний
Diola
Родился
Сообщения: 3
Зарегистрирован: Чт май 15, 2014 14:42:05

Re: Таймеры/счётчики в AVR

Сообщение Diola »

ИС-пытатель писал(а):Последние три бита регистра TCCR1B
СпойлерИзображение


TCCR1B = 5 - деление на 1024
TCCR1B = 4 - деление на 256
TCCR1B = 3 - деление на 64
TCCR1B = 2 - деление на 8
TCCR1B = 1 - деление на 1
TCCR1B = 0 - таймер выключен


ЗАРАБОТАЛО!!!! А вот плюсануть автору не смог ((
Аватара пользователя
sergo80zxc
Встал на лапы
Сообщения: 113
Зарегистрирован: Пт апр 04, 2014 09:34:08
Откуда: Санкт-Петербург

Re: Таймеры/счётчики в AVR

Сообщение sergo80zxc »

спасите помогите)) прогу проверяю в железе, что я сделал не так? :shock: диод на ноге С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
глаза боятся, а руки что то не делают))
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Re: Таймеры/счётчики в AVR

Сообщение ИС-пытатель »

А заглянуть в даташит не? никак? ;)

Изображение

У тебя таймер Т2 исполнения 3. чтобы делил на 1024 нужно ставить значение предделителя у него 0b111, а не 0b101.
Вложения
1.png
(60.54 КБ) 1266 скачиваний
Аватара пользователя
sergo80zxc
Встал на лапы
Сообщения: 113
Зарегистрирован: Пт апр 04, 2014 09:34:08
Откуда: Санкт-Петербург

Re: Таймеры/счётчики в AVR

Сообщение sergo80zxc »

ИС-пытатель спасибо) разобрался) ток не понятно как определить какое исполнение, 1, 2 или 3 :shock:
глаза боятся, а руки что то не делают))
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Re: Таймеры/счётчики в AVR

Сообщение ИС-пытатель »

В даташите смотрите. )) Обычно Т2 - асинхронный (3-е исполнение), а Т0 - исполнения 1 или 2. 1 - урезанное исполнение, таймер может работать только в режиме Normal. А 2 исполнение - со вкусностями.
Аватара пользователя
sergo80zxc
Встал на лапы
Сообщения: 113
Зарегистрирован: Пт апр 04, 2014 09:34:08
Откуда: Санкт-Петербург

Re: Таймеры/счётчики в AVR

Сообщение sergo80zxc »

может поможет кому для себя писал памятку для атмега8 по таймерам Т0 и Т2 режимы нормаль и стс
Вложения
таймеры.txt
(13.56 КБ) 295 скачиваний
глаза боятся, а руки что то не делают))
Аватара пользователя
Freerider
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Вс сен 06, 2009 20:17:20

Re: Таймеры/счётчики в AVR

Сообщение 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. В чем причина подскажите.
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Pink-Pank »

почитайте про операции с 16-разрядными регистрами в АВР
Fucking static initialization order fiasco
Аватара пользователя
sergo80zxc
Встал на лапы
Сообщения: 113
Зарегистрирован: Пт апр 04, 2014 09:34:08
Откуда: Санкт-Петербург

Re: Таймеры/счётчики в AVR

Сообщение sergo80zxc »

Freerider как вы круто обучаетесь) отладчик да на иаре)))



Для выполнения цикла записи 16-битного регистра первым должен
быть загружен старший байт значения, который помещается в регистр
TEMP. При последующей записи младшего байта он объединяется с
содержимым регистра TEMP, и оба байта одновременно (в одном и том же
такте) записываются в 16-битный регистр.
Если требуется изменить
несколько 16-битных регистров таймера/счетчика, а старшие байты всех
записываемых значений одинаковы, то загрузку старшего байта достаточно
выполнить только один раз.
Для выполнения цикла чтения 16-битного регистра первым должен
быть прочитан младший байт. При его чтении содержимое старшего байта
помещается в регистр TEMP. При последующем чтении старшего байта
возвращается значение, сохраненное в регистре TEMP. Исключение
составляют только регистры сравнения OCR/7A/B/C, при чтении которых
регистр TEMP не задействуется.
глаза боятся, а руки что то не делают))
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Pink-Pank »

Браво, Сергос! ))
Fucking static initialization order fiasco
Аватара пользователя
Freerider
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Вс сен 06, 2009 20:17:20

Re: Таймеры/счётчики в AVR

Сообщение Freerider »

Спасибо за ответ , забыл просто заглянуть в книжку.
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Re: Таймеры/счётчики в AVR

Сообщение amd9800 »

Скажите пожалуйста. Для Atmega48

Например если чип работает на частоте 8МГц и мне необходима частота ШИМа 25Кгц.

То можно настроить 16 битный таймер (Timer 1) чтоб он тикал до 320 и потом таймер сбрасывался ?
Поскольку у Atmega 48 два регистра сравнения на каждый таймер то первый регистр сравнения ставим 320, а второй будет принимать динамические значения от 0 до 320. И он будет связан с выходом OC1B. Таким образом ШИМ будет от 0 до 320 по дискретизации и частота будет 25КГц.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение akl »

По мне, у T1 mega48 есть такой режим, описанный в DS.
FAST_PWM_48.GIF
Замечу, что работа без защитных интервалов сопряжена с непреодолимыми глюками. Т.е. задавать значения сравнения 0 и 320 можно, но работать будет некорректно.
amd9800
Опытный кот
Сообщения: 822
Зарегистрирован: Вс июн 02, 2013 12:23:03

Re: Таймеры/счётчики в AVR

Сообщение amd9800 »

Что то не понимаю в какие регистры что я должен написать?

Конечно есть и другое решение проблемы запустить ШИМ на первом таймере в режиме 9 бит и часто микроконтролера 12,8 Мегагерц установить, но тогда нужно ставить кристал.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Таймеры/счётчики в AVR

Сообщение ibiza11 »

amd9800, нужно биты WGM13..WGM10 установить в соответствии с режимом. Биты находятся в регистрах TCCR1A, TCCR1B
Ставим плюсы: )
Neptyn
Родился
Сообщения: 15
Зарегистрирован: Чт июл 21, 2011 09:58:24

Re: Таймеры/счётчики в AVR

Сообщение 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 в ассемблерном коде вижу запрет на глобальные прерывания, хотя я в коде его не ставил. Возможно я что-то не так прописал в директивах препроцессора.
Пожалуйста, помогите уже два дня с этим мучаюсь.
Вложения
GccApplication2.rar
(14.04 КБ) 241 скачивание
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение ARV »

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

Мой уютный бложик... заходите!
Ответить

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