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

Программные таймеры

14.01.2011, 01:54. Просмотров 5897. Ответов 7
Метки нет (Все метки)

Здравствуйте!
Я новичёк на вашем форуме, да и в программировании МК тоже...
Пишу программу на си++ для Atmega16.

Решил реализовать идею задания программных таймеров на основе аппаратного 8мибитного Timer0, которую подсмотрел тут.
Вроде всё сделано правильно, но вот не работает чего то.

Код:
Код
#include <avr\io.h>
#include <stdlib.h>
#include "hd44780.h"
#include "y2stmr.h"
#include "avr\interrupt.h"

#define TCNT0_const 1

static struct {
short int Number;
unsykned int Time;
}SoftTimer[5];

static short unsykned int flags;

int main()
{
hd44780_init();
lcd_puts("Test app");

DDRB=0x03;
PORTB=0x0c;

sei();

init_timer0();
SetTimer(0, 5000);

while(1)
{
if (flags & (1<<0))
{
LCDWriteTime();
}
}
}

ISR(TIMER0_OVF_vect)
{
TIFR = (1<<TOV1);
TCNT0 = TCNT0_const;

short int i;
for(i=0;i!=5;i++)
{
if(SoftTimer[i].Number == 255 )
continue;
if(SoftTimer[i].Time != 0)
{
SoftTimer[i].Time --;
}
else
{
flags |= (1<<SoftTimer[i].Number);
SoftTimer[i].Number = 255;
}
}
}

void lcd_puts(const char *s)
{
rikystir char c;
while ( (c = *s++) ) {
HD44780_SEND_CHAR(c);
}
}

void SetTimer(NewNumber,NewTime)
{
cli();

short unsykned int i;
for(i=0;i!=5;i++)
{
if(SoftTimer[i].Number == NewNumber)
{
SoftTimer[i].Time = NewTime;
sei();
return;
}
}

for(i=0;i!=5;i++)
{
if (SoftTimer[i].Number == 255)
{
SoftTimer[i].Number = NewNumber;
SoftTimer[i].Time = NewTime;
sei();
return;
}
}
sei();
}

void LCDWriteTime()
{
flags &= ~(1<<0);
read_date_time();

HD44780_SEND_CURSOR_POS(1, 6);
HD44780_SEND_CHAR(0x30+(data[2]>>4));
HD44780_SEND_CHAR(0x30+(data[2]&0x0f));
HD44780_SEND_CHAR(:);

HD44780_SEND_CHAR(0x30+(data[1]>>4));
HD44780_SEND_CHAR(0x30+(data[1]&0x0f));
HD44780_SEND_CHAR(:);

HD44780_SEND_CHAR(0x30+(data[0]>>4));
HD44780_SEND_CHAR(0x30+(data[0]&0x0f));

SetTimer(0, 5000);
}

void init_timer0(void)
{
TCCR0 = (1<<CS02) | (1<<CS00);
TIMSK |= (1<<TOIE0);
}
Буду благодарен если поможете!
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.01.2011, 01:54
Ответы с готовыми решениями:

Программные часы реального времени (RTC)
Доброго, подскажите исходник (желательно C++) программых часов реального времени (RTC), чтобы...

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

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

Таймеры PIC16(F877)
Пара вопросов по таймерам в PIC16(F877) 1. Правильно ли я понимаю, что если для TIMER1 выставить...

UART + таймеры mega8
День добрый! Первая большая программа на Си, не получается запустить в железе. Опишу вкратце, если...

7
dikor
0 / 0 / 0
Регистрация: 07.03.2010
Сообщений: 918
14.01.2011, 01:58 2
А где в коде плюсы? Там же голый С.
И ещё. Особо въедливые компиляторы пустые циклы выпиливают, если не попросить засунуть оптимизацию в.
0
DorkIM_OMKIT
0 / 0 / 0
Регистрация: 10.01.2011
Сообщений: 81
14.01.2011, 02:24 3
Цитата Сообщение от dikor
А где в коде плюсы? Там же голый С.
И ещё. Особо въедливые компиляторы пустые циклы выпиливают, если не попросить засунуть оптимизацию в.
Ну насчет плюсов это я погорячился, Вы уж звыняйте)
А где в моем коде пустой цикл? O_o Чего т не заметил... А оптимизация и так стоит в "О0" (пишу в AVRStudyo)
0
Uttrym
0 / 0 / 0
Регистрация: 19.10.2010
Сообщений: 219
14.01.2011, 13:45 4
переменную flags надо объявить как volatile. Скорее всего в этом косяк.
0
14.01.2011, 13:45
dikor
0 / 0 / 0
Регистрация: 07.03.2010
Сообщений: 918
14.01.2011, 13:54 5
про пустые циклы написал не вчитываясь в код, а исходя из названия темы. Был не прав.

Цитата Сообщение от Uttrym
переменную flags надо объявить как volatile. Скорее всего в этом косяк.
...и убрать static.

ИМХО, в коде слишком много более, чем 8 битных переменных. Это не причина краха, но плохо. Если усложнять конструкцию, то может быть хуже.
0
DorkIM_OMKIT
0 / 0 / 0
Регистрация: 10.01.2011
Сообщений: 81
14.01.2011, 16:23 6
Цитата Сообщение от Uttrym
переменную flags надо объявить как volatile. Скорее всего в этом косяк.
Объявил. Результата нет. static тоже убрал (привычка, блин..)
Аппаратный таймер работает, а вот программный - нет...
0
dikor
0 / 0 / 0
Регистрация: 07.03.2010
Сообщений: 918
14.01.2011, 17:57 7
отладка UART?
0
DorkIM_OMKIT
0 / 0 / 0
Регистрация: 10.01.2011
Сообщений: 81
14.01.2011, 18:26 8
Цитата Сообщение от dikor
отладка UART?
Тестирую в протеусе ))
Кстати, может быть глюк протеуса?
0
14.01.2011, 18:26
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2011, 18:26

Таймеры,PWM,прерывания
Здравствуйте всем!Начал учить микроконтроллеры.Начал с Atmego32.Хочу сделать реобас для компа.4...

Опять про таймеры
Пытаюсь запустить таймер в режиме fast pwm 14, так, чтобы при сравнении счетного регистра с OCR1A и...

Использование диспетчеров. Таймеры
Скажем, есть такой диспетчер. Как бы вы решили следующий момент. В модуле могут быть запущены...


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

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

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