Описание: Немного не понимаю работу таймера) или что-то не правильно делаю.. |
Поиск в теме | Версия для печати |
3bugatti |
Отправлено: 27 Апреля, 2012 - 18:18:57
|
Рядовой
Сообщений всего: 9
Дата рег-ции: Апр. 2012
|
Добрый день!
Недавно решил разобраться с МК. С языком СИ вообще не знаком. Первые программки пошли на ура) помигать светодиодом, кнопка и т.п. Взялся за более сложное. Хочу вывести на матрицу 7х8 с общим анодом, при помощи tiny2313 хотябы букву, в последствии бегущую строку. Суть проблемы в следующем, нашел кучу статей по динамической индикации. Самая полная и разжеванная показалась мне эта: http://arv.radioliga.com/content/view/172/49/
Сделал. Зашиваю на МК никаких результатов... а код компилируется без ошибок.. что не так? помогите чайнику...
Вот исходник, что пытаюсь впихнуть)
CODE:
#include <avr/io.h>
#include <avr/iotn2313.h>
//#include <avr/delay.h>
#define F_CPU 8000000UL // 8МГц
#define SCR_SZ 7 /* число знакомест дисплея */
#define ROWS PORTB /* порт «строк» дисплея, т.е. управления сегментами */
#define COLS PORTD /* порт управления «столбцами», т.е. общими катодами */
#define SKIP 15 /* число пропускаемых прерываний таймера */
unsigned char SCR[SCR_SZ]={0x80, 0x77, 0x77, 0x77, 0x80}; /*Массив вывода символа (A)*/
ISR (TIMER0_OVF_vect)
{
static unsigned char pos = 0;
static unsigned char skip = SKIP;
if (--skip) return;
skip = SKIP;
COLS = 0x00;
ROWS = SCR[pos];
COLS |= (1 << pos);
if(++pos == SCR_SZ) pos = 0;
}
int main(void)
{
DDRB=0xff; //инициализация как выводы
DDRD=0xff; //инициализация как выводы
TIMSK=0x10;
TCCR0B=0x01;
TCNT0=0x00;
TIFR = 0x10;
while(1)
{
}
}
|
|
|
mihail |
Отправлено: 27 Апреля, 2012 - 22:30:55
|
Гуру
Сообщений всего: 1065
Дата рег-ции: Март 2010
|
3bugatti пишет:что не так? Как минимум, прерывания запрещены глобально, а должны быть разрешены.CODE:// Global enable interrupts
sei(); (Отредактировано автором: 27 Апреля, 2012 - 22:31:37) |
|
|
3bugatti |
Отправлено: 28 Апреля, 2012 - 19:58:43
|
Рядовой
Сообщений всего: 9
Дата рег-ции: Апр. 2012
|
Пробовал менять на TIMSK |=(1<<TOIE0) без разницы. А так это взято из DataShet. Все скомпилировалось, прошил - и ничего(
Кто нибудь подскажет проверенные способы индикации, чем сами пользуетесь?
CODE:
#include <avr/io.h>
#include <avr/iotn2313.h>
//#include <avr/delay.h>
#include <avr/interrupt.h>
#define F_CPU 8000000UL // 8МГц
#define SCR_SZ 7 // число знакомест дисплея
#define ROWS PORTB // порт «строк» дисплея, т.е. управления сегментами
#define COLS PORTD // порт управления «столбцами», т.е. общими катодами
#define SKIP 15 // число пропускаемых прерываний таймера
unsigned char SCR[SCR_SZ]={0x80, 0x77, 0x77, 0x77, 0x80}; // Массив вывода символа (A)
int main(void)
{
DDRB=0xff; //инициализация как выводы
DDRD=0xff; //инициализация как выводы
TIMSK=0x10; // внешние прерывания разрешены
TCCR0B=0x01; //включить таймер
TCNT0=0x00; // с чего начинать считать
TIFR = 0x10; //
sei(); // глобальные прерывания
while(1)
{
}
}
ISR (TIMER0_OVF_vect)
{
static unsigned char pos = 0; // первое число массива
static unsigned char skip = SKIP; // число пропусканий таймера
if (--skip) return; // пропускаем, пока условие истина и уменьшаем на 1
skip = SKIP;
COLS = 0x00; // выключаем все столбны
ROWS = SCR[pos]; // выводим строку
COLS |= (1 << pos); // зажигаем столбец
if(++pos == SCR_SZ) pos = 0; // переходим к следующей строке массива
}
|
|
|
|
Поиск в теме | Версия для печати |
Страниц (1): [1] |
« Программирование микроконтроллеров » |
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
|
|
|
|
|