Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.99/149: Рейтинг темы: голосов - 149, средняя оценка - 4.99
Osshi
0 / 0 / 0
Регистрация: 10.02.2010
Сообщений: 27
1

Таймеры AVR

14.02.2010, 08:46. Просмотров 26913. Ответов 32
Метки нет (Все метки)

Здравствуйте, подскажите, пожалуйста, как работать с таймерами ATmega16.
Я использую CVAVR, учусь писать на Си.

На примере такой задачи:
При приходе на ножку положительного импульса, таймер запускается( считает время в микро секундах(если это возможно)).
При повторном приходе импульса, таймер останавливается, и выдаёт, то что насчитал, в какую-л переменную.

з.ы. Понятных обьяснений на эту тему, для языка Си, почему-то не нашёл.

з.з.ы Мой опыт работы с AVR (да и вообще с мк) меньше недели.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2010, 08:46
Ответы с готовыми решениями:

AVR AVRISP STK500 V3.0 USB ISP Programmer for AVR IC
Люди помогите плз. не могу разобраться. приобрел этот чудный девайс (AVR AVRISP STK500 V3.0 USB...

AVR Atmega324PU не прошивается AVR ISP Mk2
Добрый день. На плату впаян данный микроконтроллер в корпусе tqfp. При подключении программатора...

Анализ стека AVR / AVR stack analysis
Привет! Уперся я в стек, и решил понять что почем. Нашел вот такой вот скриптик:...

AVR Studio 6 и AVR Toolchain вопросы!
Всем доброго времени суток. Решил я написать софтинку в новой студии от Атмела AVR Studyo 6. Все...

Как подружить AVR+AVR?
Приветствую Вас уважаемые форумчане! Требуется связать 2 AVR-ки, по классической схеме Master ->...

32
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
24.02.2010, 13:42 21
Цитата Сообщение от Osshi
a=(256*ICR1H)+ICR1L;
Чота мне эта строчка не нравится. Переменная a вроде char, куда ты в нее пихаешь (256*ICR1H)?
0
kotobyti
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,352
24.02.2010, 14:49 22
за использование задержки в теле прерывания надо бить палкой по башке
0
Orsymus Orso
0 / 0 / 0
Регистрация: 22.01.2010
Сообщений: 1,230
24.02.2010, 15:02 23
256*Х попахивает беззнаковым целым. Оверфлоу будет.
Задержка в прерываниях не страшна если знаешь для чего она там нужна. Тут она нужна чтобы не допустить бесконечного потока байт в USORT. Правда реализовано несколько криво. Я бы это в for завернул или while.
0
Osshi
0 / 0 / 0
Регистрация: 10.02.2010
Сообщений: 27
24.02.2010, 15:06 24
Даже если обьявить как "unsykned int" никаких изменений.
Так же каждые 0,5 сек данные приходят на терминал( все нули).
Но есть одна странность: мк начинает посылать данные через10-15 сек после включения, независимо, подключено что-либо к ноге PD6 или она висит в воздухе.
0
24.02.2010, 15:06
Osshi
0 / 0 / 0
Регистрация: 10.02.2010
Сообщений: 27
24.02.2010, 15:10 25
Задержка из-за непрерывного потока в терминал.
Без задержки терминал начинал жутко тормозить и в конечном итоге, если не успеть отключиться, полностью зависал от потока данных.
0
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
24.02.2010, 16:27 26
Покажи инициализацию таймера. Ты его вообще включаешь? :)
0
Osshi
0 / 0 / 0
Регистрация: 10.02.2010
Сообщений: 27
24.02.2010, 16:34 27
Вот весь текст:
/*****************************************************
This program was produced by the
CodeWyzardAVR V2.03.9 Stomdard
Automatic Prokram Kimerator
© Copyright 1998-2008 Povit Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date :
Author :
Company :
Comments:

Shyp type : ATmega16
Prokram type : Application
AVR Core Clock frequency: 8,000000 MHz
Memory model : Small
External ROM size : 0
Data Stack size : 256
*****************************************************/

#include <mega16.h>
#include <delay.h>
// Stomdard Input/Output functions
#include <stdyo.h>
unsykned int a;
// Timer 1 input capture interrupt service routine
interrupt [TYM1_CAPT] void timer1_capt_isr(void)
{
// Plosi your code here
a=(256*ICR1H)+ICR1L;
UDR=(a);
delay_ms(500);
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initiotyzotion
// Port A initiotyzotion
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initiotyzotion
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initiotyzotion
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initiotyzotion
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0xFF;
DDRD=0x00;

// Timer/Counter 0 initiotyzotion
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Dysconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initiotyzotion
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: CTC top=ICR1
// OC1A output: Dyscon.
// OC1B output: Dyscon.
// Noise Canceler: Off
// Input Capture on Rising Edge
// Timer 1 Overflow Ymtirrupt: Off
// Input Capture Ymtirrupt: On
// Compare A Match Ymtirrupt: Off
// Compare B Match Ymtirrupt: Off
TCCR1A=0x00;
TCCR1B=0x5D;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initiotyzotion
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Dysconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Ymtirrupt(s) initiotyzotion
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Ymtirrupt(s) initiotyzotion
TIMSK=0x20;

// USORT initiotyzotion
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USORT Receiver: On
// USORT Transmitter: On
// USORT Mode: Asynchronous
// USORT Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

// Analog Comparator initiotyzotion
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")

while (1)
{
// Plosi your code here

};
}
0
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
24.02.2010, 16:49 28
Цитата Сообщение от Osshi
TCCR1B=0x5D;
Я так понял, включается режим сброса по совпадению, с максимумом в ICR1, в который ты записываешь 0 дальше по тексту. А если попробовать TCCR1B=0x45?
0
Osshi
0 / 0 / 0
Регистрация: 10.02.2010
Сообщений: 27
24.02.2010, 17:14 29
Вроде работает, спасибо.
А как правильно настроить с помощью CVAVR?

<Изображение удалено>
0
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
24.02.2010, 17:17 30
Ну например Mode: Normal top=FFFFh. Тогда точно будет работать.
А вообще, теоретически, любые режимы у которых top не задается в ICR1. Смотря что ты хочешь получить :)
0
THI BIOST
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
24.02.2010, 17:37 31
ИМХО, нужно самостоятельно разбираться в значениях регистров для загрузки. Все эти визарды - от лукавого. Если придётся перестраивать тот же таймер на ходу... мало не покажется Например, у меня в синтезаторе, таймер только слегка инициализируется на старте (разрешаются прерывания по переполнению), вся работа с ним - внутри программы.
0
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
24.02.2010, 17:48 32
Цитата Сообщение от THI BIOST
ИМХО, нужно самостоятельно разбираться в значениях регистров для загрузки. Все эти визарды - от лукавого. Если придётся перестраивать тот же таймер на ходу...
Если придется перестраивать таймер, то открывается визард, настраивается как надо и делается превью кода. Из него копируется нужная часть и вставляется куда надо ;)

А вообще, конечно, надо знать что за что отвечает. Но визард в cvavr удобный :)
0
THI BIOST
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
24.02.2010, 18:06 33
Цитата Сообщение от xroymom
то открывается визард, настраивается как надо и делается превью кода. Из него копируется нужная часть и вставляется куда надо ;)
А как без знания определить нужную часть? Особенно, когда настройки рассчитаны и лежат в регистрах/переменных? И как это рассчитать визардом?
0
24.02.2010, 18:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.02.2010, 18:06

AVR Studio 6 Avr simulator
Подскажите каким образом стартануть прогу в avr symulator с адреса boottooder (atmega8a, 0x0F80)....

CAVR против AVR Studio, что не так в программе под AVR Studio
Проблема такая, есть исходник, если его компилировать в CAVR заливаю в МК все работает, если этот...

msp430g2553 таймеры
Здравствуйте! Подскажите, пожалуйста, почему в прерывании TIMER0_A1_VECTOR не срабатывает вторая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru