роботы
робототехника
микроконтроллеры
Главная
Как сделать робота
Новости
Спорт
Статьи
Wiki
Форум
Downloads
Ссылки
Контакты  


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

> Описание: Программа WinAVR
mihail
Отправлено: 25 Сентября, 2011 - 21:28:13
Post Id



Гуру


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





Сайт производителя экранчика http://www.melt.com.ru/
/*******************************************
Program : MT-10T7-7T
Compiler : WinAVR
Chip type : ATtiny2313
System Clock : 8 MHz
*******************************************/

// Пример программы для сегментных индикаторов MT10T7

#include <avr/io.h>
#include <util/delay.h>

/*******************************************
MT-10T7-7T --- ATtiny2313

A0 --- PD5
WR2 --- GND
WR1 --- PD4
DB3 --- PD3
DB2 --- PD2
DB1 --- PD1
DB0 --- PD0
GND --- GND
V0 --- NC
+E --- VCC
*******************************************/

#define DDR_LCD_INIT() DDRD |= 0b00111111
#define PORT_LCD_INIT() PORTD &= 0b11000000

#define A0_SET() PORTD |= 0b00100000
#define A0_CLR() PORTD &= 0b11011111

#define WR1_SET() PORTD |= 0b00010000
#define WR1_CLR() PORTD &= 0b11101111

#define DB_CLR() PORTD &= 0b11110000
#define DB_SET(x) PORTD |= (x)

/*******************************************

a
---
| |
f| |b
| g |
---
| |
e| |c
| |
--- .h
d

0b00000001 g
0b00000010 e
0b00000100 d
0b00001000 a
0b00010000 h
0b00100000 b
0b01000000 c
0b10000000 f

*******************************************/

// Данные для заполнения индикатора
const unsigned char symbol[11] = {
0b11101110, // 0
0b01100000, // 1
0b00101111, // 2
0b01101101, // 3
0b11100001, // 4
0b11001101, // 5
0b11001111, // 6
0b11101000, // 7
0b11101111, // 8
0b11101101, // 9
0b00000000 // clear
};

// Процедура установки адреса для последующих операций записи
void SetAddr(unsigned char a)
{
A0_CLR(); // Будем записывать адрес
DB_CLR();
DB_SET(a); // Выдача 4-х битов индикатору в качестве адреса
WR1_SET();
_delay_us(1); // Пауза
WR1_CLR();
_delay_us(2); // Пауза
}

// Процедура выдачи байта в индикатор
void WriteByte(unsigned char b)
{
A0_SET(); // Будем записывать данные
DB_CLR();
DB_SET(b & 0x0F); // Выдача индикатору младших 4-х битов
WR1_SET();
_delay_us(1); // Пауза
WR1_CLR();
_delay_us(2); // Пауза
DB_CLR();
DB_SET(b >> 4); // Выдача индикатору старших 4-х битов
WR1_SET();
_delay_us(1); // Пауза
WR1_CLR();
_delay_us(2); // Пауза
}

int main( void )
{
// System Clock Prescaler initialization

// Clock Prescale Register
// Bits: CLKPCE - - - CLKPS3 CLKPS2 CLKPS1 CLKPS0
CLKPR = 0b10000000;
CLKPR = 0b00000000;

// MT-10T7-7T initialization

DDR_LCD_INIT();
PORT_LCD_INIT();

SetAddr(0x0F); // Установить адрес для разблокировки шины индикатора
WriteByte(0xFF); // Разблокировать шину индикатора

unsigned char j;

while(1)
{
SetAddr(0x00); // Установить адрес для записи данных изображения

for(j=0; j<10; j++) // Цикл вывода
{
WriteByte(symbol[j]); // Вывод очередного байта в индикатор
}

_delay_ms(1500);
}

return 0;
}

(Отредактировано автором: 26 Сентября, 2011 - 16:28:02)

 
 Top
cjA
Отправлено: 26 Сентября, 2011 - 08:27:47
Post Id



Генерал


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





Тут как раз ни добавить(вру, фотку бы реализации) ни убавить, можно и в вику.
 
 Top
mihail
Отправлено: 26 Сентября, 2011 - 14:44:56
Post Id



Гуру


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





Часики Улыбка
/*******************************************
Program : MT-10T7-7T
Compiler : WinAVR
Chip type : ATtiny2313
System Clock : 8 MHz
*******************************************/

// Пример программы для сегментных индикаторов MT10T7

#include <avr/io.h>
#include <util/delay.h>

/*******************************************
MT-10T7-7T --- ATtiny2313

A0 --- PD5
WR2 --- GND
WR1 --- PD4
DB3 --- PD3
DB2 --- PD2
DB1 --- PD1
DB0 --- PD0
GND --- GND
V0 --- NC
+E --- VCC
*******************************************/

#define DDR_LCD_INIT() DDRD |= 0b00111111
#define PORT_LCD_INIT() PORTD &= 0b11000000

#define A0_SET() PORTD |= 0b00100000
#define A0_CLR() PORTD &= 0b11011111

#define WR1_SET() PORTD |= 0b00010000
#define WR1_CLR() PORTD &= 0b11101111

#define DB_CLR() PORTD &= 0b11110000
#define DB_SET(x) PORTD |= (x)

/*******************************************

a
---
| |
f| |b
| g |
---
| |
e| |c
| |
--- .h
d

0b00000001 g
0b00000010 e
0b00000100 d
0b00001000 a
0b00010000 h
0b00100000 b
0b01000000 c
0b10000000 f

*******************************************/

// Данные для заполнения индикатора
const unsigned char symbol[11] = {
0b11101110, // 0
0b01100000, // 1
0b00101111, // 2
0b01101101, // 3
0b11100001, // 4
0b11001101, // 5
0b11001111, // 6
0b11101000, // 7
0b11101111, // 8
0b11101101, // 9
0b00000000 // clear
};

// Процедура установки адреса для последующих операций записи
void SetAddr(unsigned char a)
{
A0_CLR(); // Будем записывать адрес
DB_CLR();
DB_SET(a); // Выдача 4-х битов индикатору в качестве адреса
WR1_SET();
_delay_us(1); // Пауза
WR1_CLR();
_delay_us(2); // Пауза
}

// Процедура выдачи байта в индикатор
void WriteByte(unsigned char b)
{
A0_SET(); // Будем записывать данные
DB_CLR();
DB_SET(b & 0x0F); // Выдача индикатору младших 4-х битов
WR1_SET();
_delay_us(1); // Пауза
WR1_CLR();
_delay_us(2); // Пауза
DB_CLR();
DB_SET(b >> 4); // Выдача индикатору старших 4-х битов
WR1_SET();
_delay_us(1); // Пауза
WR1_CLR();
_delay_us(2); // Пауза
}

unsigned char time[10];
unsigned char hour = 0;
unsigned char minute = 0;
unsigned char second = 0;

int main( void )
{
// System Clock Prescaler initialization

// Clock Prescale Register
// Bits: CLKPCE - - - CLKPS3 CLKPS2 CLKPS1 CLKPS0
CLKPR = 0b10000000;
CLKPR = 0b00000000;

// MT-10T7-7T initialization

DDR_LCD_INIT();
PORT_LCD_INIT();

SetAddr(0x0F); // Установить адрес для разблокировки шины индикатора
WriteByte(0xFF); // Разблокировать шину индикатора

unsigned char j;

while(1)
{
if( second == 60 )
{
second = 0;
minute += 1;
}

if( minute == 60 )
{
minute = 0;
hour += 1;
}

if( hour == 24 )
{
hour = 0;
}

time[0] = symbol[10];
time[1] = symbol[( hour / 10 )];
time[2] = symbol[( hour % 10 )];
time[3] = symbol[10];
time[4] = symbol[( minute / 10 )];
time[5] = symbol[( minute % 10 )];
time[6] = symbol[10];
time[7] = symbol[( second / 10 )];
time[8] = symbol[( second % 10 )];
time[9] = symbol[10];

SetAddr(0x00); // Установить адрес для записи данных изображения

for(j=0; j<10; j++) // Цикл вывода
{
WriteByte(time[j]); // Вывод очередного байта в индикатор
}

_delay_ms(1000);

second += 1;
}

return 0;
}

Прикреплено изображение
img_0077.png

(Отредактировано автором: 26 Сентября, 2011 - 16:34:25)

 
 Top
Роботов
Отправлено: 26 Сентября, 2011 - 15:18:40
Post Id



Гуру


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





Для часиков лучше использовать часовой кварц (32 768Гц) и таймер в асинхронном режиме. А на делайях хорошей точности не будет.
 
 Top
mihail
Отправлено: 26 Сентября, 2011 - 16:17:12
Post Id



Гуру


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





Роботов пишет:
на делайях хорошей точности не будет
Так её и нет Улыбка Программа часов была написана в демонстрационных целях.

PS Часики спешат на минуту за час. Думал будет хуже Улыбка Это к вопросу о точности внутреннего источника тактового сигнала и качестве задержек формируемых компилятором.

PPS Может позже напишу программу часов на таймере. Изначально не хотел перегружать лишним кодом пример работы с экранчиком.

PPPS А так согласен. Если делать часы, то нужен кварцевый резонатор. И не какой попало, а специальный Улыбка
 
 Top
mihail
Отправлено: 26 Сентября, 2011 - 19:37:14
Post Id



Гуру


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





Схема
Прикреплено изображение
cxema_11.gif

(Отредактировано автором: 27 Сентября, 2011 - 21:01:19)

 
 Top
mihail
Отправлено: 03 Октября, 2011 - 18:31:35
Post Id



Гуру


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





В приложении программа часов на таймере/счетчике 1. Если к ATtiny2313 припаять кварцевый резонатор на 8 МГц, то точность резко повысится Улыбка Вполне сгодится для автоматизации системы полива, проветривания и т.д. т.п.
PS Fuse-bits тоже нужно поправить Улыбка
Скачать файл: clock.zip
Скачан раз: 228
 
 Top
Роботов
Отправлено: 04 Октября, 2011 - 21:13:18
Post Id



Гуру


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





Михаил, а чем обусловлен выбор именно семисегментного индикатора?
Есть же например, знакосинтазирующие. Ими управлять намного проще...
 
 Top
mihail
Отправлено: 04 Октября, 2011 - 22:11:26
Post Id



Гуру


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





Определяющим в принятии решения стал случай. Что было, то и купил. Так получилось Улыбка

PS Не сказал бы, что управлять знакосинтезирующим экранчиком проще. Хороших примеров программ для них в сети много. Это да. А, сами программы не проще. ИМХО.

(Отредактировано автором: 04 Октября, 2011 - 22:14:03)

 
 Top
Роботов
Отправлено: 04 Октября, 2011 - 22:23:37
Post Id



Гуру


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





mihail пишет:
А, сами программы не проще

Есть подключаемые библиотеки.(например my_lcd.c или встроенная в CVAVR) Вставил в заголовочный файл, и выводишь символы или даже целые строки одной командой. Что может быть проще? Улыбка
 
 Top
mihail
Отправлено: 05 Октября, 2011 - 17:07:00
Post Id



Гуру


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





Все просто и легко, когда есть знания и опыт Улыбка
 
 Top
Страниц (1): [1]
« Делимся опытом »


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





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown