роботы робототехника микроконтроллеры


 Страниц (1): [1]   

> Описание: Немного не понимаю работу таймера) или что-то не правильно делаю..
3bugatti Post Id



Рядовой


Сообщений всего: 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)
{

}
}
 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



3bugatti пишет:
что не так?
Как минимум, прерывания запрещены глобально, а должны быть разрешены.
CODE:
// Global enable interrupts
sei();

(Отредактировано автором: 27 Апреля, 2012 - 22:31:37)

 
 Top
3bugatti Post Id



Рядовой


Сообщений всего: 9
Дата рег-ции: Апр. 2012  



CODE:

int main(void)
{
DDRB=0xff; //инициализация как выводы
DDRD=0xff; //инициализация как выводы

TIMSK=0x10;
TCCR0B=0x01;
TCNT0=0x00;
TIFR = 0x10;

sei();



правильно понимаю?
А есть еще какие нибудь проверенные алгоритмы индикации?

(Отредактировано автором: 28 Апреля, 2012 - 10:08:13)

 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



3bugatti пишет:
правильно понимаю?
Да.
 
 Top
Роботов Post Id



Гуру


Сообщений всего: 1350
Дата рег-ции: Июнь 2011  



Кстати, проверте. У вас похоже у таймера 0 прерывание не включено.
Если мне не изменеяет склероз, включается оно так: TIMSK=0x01;
(Добавление)
Или я путаю с мегой 8?
 
 Top
3bugatti Post Id



Рядовой


Сообщений всего: 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; // переходим к следующей строке массива
}
 
 Top
Роботов Post Id



Гуру


Сообщений всего: 1350
Дата рег-ции: Июнь 2011  



В качестве индикации использую светодиод подключеный к свободному порту. Вставляю функцию включения светодиода в то место программы, которое хочу проконтролировать, если светодиод зажегся, значит все нормально, незажегся - программа не дошла до этого места по какой то причине.
 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



+1 за светодиодик

/*******************************************
Program : LED matrix 8x7
Compiler : AVR GCC
Chip type : ATtiny2313
System Clock : 8 MHz
*******************************************/

#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 8000000UL // 8МГц

#define SCR_SZ 7 // число знакомест дисплея
#define ROWS PORTB // порт "строк" дисплея, т.е. управления сегментами
#define COLS PORTD // порт управления "столбцами", т.е. общими катодами

// Массив вывода символа (A)
const unsigned char SCR[] = {0b10000000,
0b01110111,
0b01110111,
0b01110111,
0b10000000};

unsigned char pos = 0; // первое число массива

void Ports_Init( void )
{
// Port A initialization
DDRA = 0b00000000;
PORTA = 0b00000000;

// Port B initialization
DDRB = 0b11111111;
PORTB = 0b00000000;

// Port D initialization
DDRD = 0b11111111;
PORTD = 0b00000000;
}

void Timer0_Init( void )
{
TCCR0A = 0b00000000;
TCCR0B = 0b00000100; // clk_I/O / 256
TCNT0 = 0b00000000;
TIMSK = 0b00000010; // Разрешено прерывание по переполнению
}

int main(void)
{
// Input/Output Ports initialization
Ports_Init();

// Timer/Counter 0 initialization
Timer0_Init();

// Global enable interrupts
sei();

while(1)
{

}

return 0;
}

ISR (TIMER0_OVF_vect)
{
COLS = 0b00000000; // выключаем все столбны
ROWS = SCR[pos]; // выводим строку
COLS = (1 << pos); // зажигаем столбец
pos += 1;
if(pos == SCR_SZ) pos = 0;
}

(Отредактировано автором: 28 Апреля, 2012 - 23:54:57)

 
 Top
3bugatti Post Id



Рядовой


Сообщений всего: 9
Дата рег-ции: Апр. 2012  



Роботов Со светодиодом - сильно! Обязательно приму на заметку! Спасибо)

mihail Спасибо за код, попробую) Кстати RETURN 0; - что эта строка делает? Понимаю, что возвращает "0" но куда и по какой причине, для чего не пойму(

Подскажите еще? Допустим из-за неправильно выставленных FUSE может не работать таймер?

(Отредактировано автором: 02 Мая, 2012 - 09:50:02)

 
 Top
cjA Post Id



Генерал


Сообщений всего: 3291
Дата рег-ции: Янв. 2010  



легко может не работать.
функция main() я тут уже с кем то спорил- обычная фунция и должна завершаться оператором return. В MAKEFILE Вы можете настроить вход в программу где угодно, даже сделать ее не програмой а эльфом или демоном.
Просто так принято в Си, даже если речь об маленьких МК. Улыбка
(Добавление)
Если этот код работает в ОС и произойдет ошибка ОС получит не 0 как код возврата, а другое число.
 
 Top
mihail Post Id



Гуру


Сообщений всего: 1065
Дата рег-ции: Март 2010  



3bugatti
В программе для МК завершение функции main() конструкцией return 0; исключительно для соответствия стандарту С (читай для красоты Улыбка ).
3bugatti пишет:
из-за неправильно выставленных FUSE может не работать таймер?
Врядли. Обычно, после изменения fuse bits МК либо работает, либо нет. Еще, изменением fuse bits можно отключить возможность внутрисхемного программирования. Тогда нельзя будет прошить МК посредством ISP. Но, зашитая ранее программа будет работать.
 
 Top
Роботов Post Id



Гуру


Сообщений всего: 1350
Дата рег-ции: Июнь 2011  



mihail пишет:
В программе для МК завершение функции main() конструкцией return 0; исключительно для соответствия стандарту С (читай для красоты ).

Во-во, именно для красоты. Особенно когда перед ней бесконечный цикл стоит Голливудская улыбка

(Отредактировано автором: 03 Мая, 2012 - 18:22:04)

 
 Top
3bugatti Post Id



Рядовой


Сообщений всего: 9
Дата рег-ции: Апр. 2012  



Спасибо огромное! кто откликнулся))) все получилось! заработала конструкция mihail-а с инициализацией таймера как отдельная функция (если правильно все называю)

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 10 // число пропускаемых прерываний таймера

unsigned char SCR[SCR_SZ]={0x41, 0x3e, 0x3e, 0x3e, 0x41}; // Массив вывода символа (0)

void Ports_Init( void )

{
// Port B initialization
DDRB = 0b11111111;
PORTB = 0b00000000;

// Port D initialization
DDRD = 0b11111111;
PORTD = 0b00000000;
}



void Timer0_Init( void )
{
TCCR0A = 0x00;
TCCR0B = 0x01; // clk_I/O / без деления частоты процессора
TCNT0 = 0x00;
TIMSK = 0x02; // Разрешено прерывание по переполнению
}


int main(void)
{
// Input/Output Ports initialization
Ports_Init();

// Timer/Counter 0 initialization
Timer0_Init();

// Global enable interrupts
sei();

while(1)
{

}
return 0;
}

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; // переходим к следующей строке массива
}


P.S. С фьюзами разобрался) нашел разжеванное тут http://www.getchip.net/posts/068...-fyuzy-fuse-bit/ может кому поможет)
 
 Top
3bugatti Post Id



Рядовой


Сообщений всего: 9
Дата рег-ции: Апр. 2012  



Добрый день!

Подскажите, двумя таймерами одновременно можно пользоваться? Допустим, один на отображении символов, а второй как счетчик ?

У меня AVRStudio в debug только один таймер работает, пока принудительно стрелочку не переставишь... При компиляции ошибок нет!
 
 Top
Страниц (1): [1]
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru