Страница 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
спасите помогите)) прогу проверяю в железе, что я сделал не так? :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

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

Добавлено: Пн июн 02, 2014 08:21:09
ИС-пытатель
А заглянуть в даташит не? никак? ;)

Изображение

У тебя таймер Т2 исполнения 3. чтобы делил на 1024 нужно ставить значение предделителя у него 0b111, а не 0b101.

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

Добавлено: Пн июн 02, 2014 14:28:26
sergo80zxc
ИС-пытатель спасибо) разобрался) ток не понятно как определить какое исполнение, 1, 2 или 3 :shock:

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
у меня дежавю? :shock: уже был впрос про макрос ICR... обработчик прерываний правильно называется ISR - ну читайте же документацию перед писаниной!