реклама на сайте
подробности

 
 
> вызвать прерывание каждые 50мсек
romez777
сообщение Nov 19 2004, 07:54
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Приветствую.

Продолжаю разборки с atmega162. Вот такой кусок кода, использующий прерывание и таймер (использую WinAVR и AVRstudio для отладки):

#include <inttypes.h>
#include <interrupt.h>
#include <io.h>
#include <sig-avr.h>

SIGNAL(SIG_OUTPUT_COMPARE1A)
{
// далее обработка ......
// .........
}

void Timer1_Init(void)
{
SREG = (1 << SREG_I); // enable global interrupt
TCCR1A = 0x00;
TCCR1B = 0x04; // set prescale
TCCR1B = (1 << CS10) | (1 << WGM12);

TIMSK = (1 << OCIE1A);

// load value
TCNT1H = 0xFE;
TCNT1L = 0x7A;

// set compare register for 50ms
OCR1AH = 0x01;
OCR1AL = 0x86;
}

int main(void)
{
Timer1_Init();

// DDRB = 0xFF;
while (1)
;
return 1;
}

На первый взгляд все правильно, но не сдается мне что не получаю я задержки в 50мсек, а проверить в симуляторе, как предложил IgorKossak, не могу (симулятор не позволяет).

Вообщем, я окончательно запутался smile.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
lamerok
сообщение Nov 24 2004, 04:33
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 135
Регистрация: 22-06-04
Из: Челябинск
Пользователь №: 88



Fish
1. Это я взял, из программы, где необходимо было проверять младший байт счетчика сравнения, оставил без изменения, просто для примера.
Кроме того, если быть совсем правильным, то самое лучшее
OCR1B = OCR1B + PERIOD;
Так как к таймеру прибавлять нельзя, из-за того, что его регистры 8 разрядные, пока вы читаете один регистр таймера, это отнимет время, может изменится другой, или вообще произойти переполнение таймера.
Именно, чтобы показать, что запись
OCR1B = OCR1B + PERIOD;
Реально в проце происходит примерно так
IN R16,OCR1BL
IN R17,OCR1BH
SUBI R16,0xXX
SBCI R16,0xYY
OUT OCR1BH,R17
OUT OCR1BL,R16
Я так и написал в Сях, чтобы показать что не все так просто
Если мы сделаем
OCR1B = TCNT1 + PERIOD;
то
IN R16,TCNT1L //Вот тут пока мы его читаем
IN R17,TCNT1H //Значение таймера уже может поменятся, вплоть до того, что произойдет переполнение и TCNT1H станет 0 вместо скажем 0xFF
SUBI R16,0xXX
SBCI R16,0xYY
OUT OCR1BH,R17
OUT OCR1BL,R16


2. Флаг тут скидывается вручную, так как изначально этот код был не в обработчике прерывания, Да и так для надежности smile.gif) Си компилятор вон два раза подряд джампы вставляет без включенной оптимизации. Считаем, что у меня оптимизация была выключена smile.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- romez777   вызвать прерывание каждые 50мсек   Nov 19 2004, 07:54
- - Alex2172   А осциллографа то нет под рукой? (Ну или хотябы св...   Nov 19 2004, 08:13
- - romez777   Цитата(Alex2172 @ Nov 19 2004, 11:13 AM)А осц...   Nov 19 2004, 08:25
- - Styv   Попробуй подели генерируемую частоту (~50мс) на 2...   Nov 19 2004, 08:59
- - KRS   А зачем при инициализации таймера в TCNT писать 0x...   Nov 19 2004, 11:15
- - lamerok   Кодvoid InitTimer (void) {   TCCR1A ...   Nov 19 2004, 11:55
- - lamerok   Блин нечаяно нажалось, первое не смотрите.... Вот ...   Nov 19 2004, 12:07
- - lamerok   Еще поправим маленько. Вечер глучу малость Код#...   Nov 19 2004, 12:10
- - romez777   Цитата(KRS @ Nov 19 2004, 02:15 PM)А зачем пр...   Nov 22 2004, 00:08
- - romez777   Цитата(lamerok @ Nov 19 2004, 03:07 PM)Блин н...   Nov 22 2004, 02:14
- - KRS   Цитата(romez777 @ Nov 22 2004, 03:08 AM)Так п...   Nov 22 2004, 10:27
- - romez777   Цитата(KRS @ Nov 22 2004, 01:27 PM)Изначально...   Nov 22 2004, 10:48
- - KRS   Цитата(romez777 @ Nov 22 2004, 01:48 PM)Но во...   Nov 22 2004, 11:19
- - romez777   Цитата(KRS @ Nov 22 2004, 02:19 PM)Так и долж...   Nov 22 2004, 11:52
- - KRS   Цитата(romez777 @ Nov 22 2004, 02:52 PM)Цитат...   Nov 22 2004, 12:04
- - romez777   Цитата(KRS @ Nov 22 2004, 03:04 PM)А как можн...   Nov 22 2004, 14:37
- - lamerok   romez777 1. В режиме слейва данные передаются толь...   Nov 22 2004, 15:17
- - IgorKossak   Цитата(KRS @ Nov 22 2004, 02:19 PM)Но в любом...   Nov 22 2004, 15:34
- - Fish   Цитата(lamerok @ Nov 19 2004, 03:10 PM)Еще по...   Nov 23 2004, 11:42
- - romez777   Цитата(Fish @ Nov 23 2004, 02:42 PM)2 lamerok...   Nov 23 2004, 12:18
- - lamerok   Там везде должно быть SBCI R17,0xYY вместо SBCI R...   Nov 24 2004, 05:20
- - Fish   Согласен, написал глупость OCR1B = TCNT1 + PERIOD;...   Nov 24 2004, 05:33


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 19:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01396 секунд с 7
ELECTRONIX ©2004-2016