| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
AVR и экран MT10T7
07.07.2010, 23:28
|
|
|
Временная регистрация
Регистрация: 11.06.2006
Сообщений: 89
Сказал спасибо: 25
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
AVR и экран MT10T7
Прошу помощи.
Подключил экран MT10T7 к ATtiny2313. По даташиту всё посмотрел. Для начала хотел написать просто программку, чтобы выводил "2" на первом знакоместе, но выводится крякозябра на всех сегментах. Писал на IAR, код корявый, но целью сначала было просто разобраться в дисплее.
P.S. тактовая частота тиньки - 8Мгц
|
Код:
|
#include ‹ioavr.h›
#include ‹intrinsics.h›
#define DB0 PB1
#define DB1 PB0
#define DB2 PD6
#define DB3 PD5
#define WR1 PD4
#define A0 PD3
int main( void )
{
DDRB = 0xFF;
DDRD = 0xFF;
//Установка адреса
PORTB |= (1‹‹DB0)|(1‹‹DB1);
PORTD |= (1‹‹DB2)|(1‹‹DB3);
PORTD &= ~(1‹‹A0);
PORTD |= (1‹‹WR1);
__delay_cycles(1);
PORTD &= ~(1‹‹WR1);
__delay_cycles(2);
//Разблокировка шины
PORTD |= (1‹‹A0);
PORTB |= (1‹‹DB0);
PORTB &= ~(1‹‹DB1);
PORTD &= ~(1‹‹DB2);
PORTD &= ~(1‹‹DB3);
PORTD |= (1‹‹WR1);
__delay_cycles(1);
PORTD &= ~(1‹‹WR1);
__delay_cycles(1);
PORTB |= (1‹‹DB0);
PORTB |= (1‹‹DB1);
PORTD |= (1‹‹DB2);
PORTD |= (1‹‹DB3);
__delay_cycles(1);
PORTD |= (1‹‹WR1);
__delay_cycles(1);
PORTD &= ~(1‹‹WR1);
__delay_cycles(2);
//Установка адреса (первое знакоместо)
PORTB &= ~(1‹‹DB0);
PORTB &= ~(1‹‹DB1);
PORTD &= ~(1‹‹DB2);
PORTD &= ~(1‹‹DB3);
PORTD &= ~(1‹‹A0);
PORTD |= (1‹‹WR1);
__delay_cycles(1);
PORTD &= ~(1‹‹WR1);
__delay_cycles(2);
//пишем "2"
PORTD |= (1‹‹A0);
PORTB |= (1‹‹DB0);
PORTB |= (1‹‹DB1);
PORTD |= (1‹‹DB2);
PORTD |= (1‹‹DB3);
PORTD |= (1‹‹WR1);
__delay_cycles(1);
PORTD &= ~(1‹‹WR1);
__delay_cycles(1);
PORTB &= ~(1‹‹DB0);
PORTB |= (1‹‹DB1);
PORTD &= ~(1‹‹DB2);
PORTD &= ~(1‹‹DB3);
__delay_cycles(1);
PORTD |= (1‹‹WR1);
__delay_cycles(1);
PORTD &= ~(1‹‹WR1);
__delay_cycles(2);
} |
Даташит: http://lib.chipdip.ru/076/DOC000076089.pdf
|
|
|
|
08.07.2010, 01:20
|
|
|
Временная регистрация
Регистрация: 04.01.2007
Сообщений: 90
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Re: AVR и экран MT10T7
а почему ноги сикось/накось используешь? не проще подцепить девайс на весь байт и работать по человечески с цыфрами а не выпинывать побитно?
2я страница
|
Цитата:
|
|
входы WR должны использоваться оба, или один из них заземлить
|
Последний раз редактировалось vitecd; 08.07.2010 в 01:28.
|
|
|
|
08.07.2010, 01:49
|
|
|
Временная регистрация
Регистрация: 11.06.2006
Сообщений: 89
Сказал спасибо: 25
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Re: AVR и экран MT10T7
Сообщение от vitecd
|
|
а почему ноги сикось/накось используешь? не проще подцепить девайс на весь байт и работать по человечески с цыфрами а не выпинывать побитно?
|
Да вот уже поздняк метаться =( остальные ноги заняты. Сначала не думал, что потребуется дисплей...
Про WR, у меня как раз пин WR2 и заземлён.
|
|
|
|
12.07.2010, 20:34
|
|
|
Временная регистрация
Регистрация: 11.06.2006
Сообщений: 89
Сказал спасибо: 25
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Re: AVR и экран MT10T7
Перепаял ножки и повесил DB0..DB3 на один регистр DDRD, переписал код, теперь всё читается попроще и работать с битами удобнее, но всё равно не работает. Помогите, пожалуйста.
|
Код:
|
#include ‹ioavr.h›
#include ‹intrinsics.h›
#define DB0 PD3
#define DB1 PD4
#define DB2 PD5
#define DB3 PD6
#define WR1 PB0
#define A0 PB1
#define ClrBit(reg, bit) reg |= (1‹‹bit)
#define SetBit(reg, bit) reg &= (~(1‹‹bit))
void SetAddr(int adr)
{
PORTD |= adr‹‹3;
PORTB &= ~(1‹‹A0);
PORTB |= (1‹‹WR1);
__delay_cycles(1);
PORTB &= ~(1‹‹WR1);
__delay_cycles(2);
}
void WriteByte(int adr)
{
PORTB |= (1‹‹A0);
PORTD |= (adr‹‹3);
PORTB |= (1‹‹WR1);
__delay_cycles(1);
PORTB &= ~(1‹‹WR1);
__delay_cycles(1);
PORTD |= (adr‹‹1);
__delay_cycles(2);
PORTB |= (1‹‹WR1);
__delay_cycles(1);
PORTB &= ~(1‹‹WR1);
__delay_cycles(2);
}
int main( void )
{
DDRB = 0xFF;
DDRD = 0xFF;
//установка адреса
SetAddr(0x0F);
//разблокировка шины (пишем байт)
WriteByte(0x01);
while(1)
{
SetAddr(0x00);
WriteByte(0x11);
}
} |
|
|
|
|
12.07.2010, 22:09
|
|
|
Прописка
Регистрация: 28.09.2006
Сообщений: 144
Сказал спасибо: 11
Сказали Спасибо 95 раз(а) в 51 сообщении(ях)
|
Re: AVR и экран MT10T7
http://forum.cxem.net/index.php?showtopic=36661
Держи ссылку тут библиотека для данного дисплея под WinAvr, думаю поможет
Кстати задержка в библиотеке составляет 200мкс, а не 200нс как в даташите
Последний раз редактировалось harchenko_pavel; 12.07.2010 в 22:53.
|
|
|
|
Сказали "Спасибо" harchenko_pavel
|
|
|
12.07.2010, 23:35
|
|
|
Временная регистрация
Регистрация: 11.06.2006
Сообщений: 89
Сказал спасибо: 25
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Re: AVR и экран MT10T7
Почему настолько различается со значением в даташите?
Запутанный код, попробую разобраться. Спасибо =)
|
|
|
|
12.07.2010, 23:42
|
|
|
Прописка
Регистрация: 28.09.2006
Сообщений: 144
Сказал спасибо: 11
Сказали Спасибо 95 раз(а) в 51 сообщении(ях)
|
Re: AVR и экран MT10T7
Сообщение от Lockdog
|
|
Запутанный код, попробую разобраться. Спасибо =)
|
А в чем собствено запутанный?
|
|
|
|
13.07.2010, 00:28
|
|
|
Прописка
Регистрация: 28.09.2006
Сообщений: 144
Сказал спасибо: 11
Сказали Спасибо 95 раз(а) в 51 сообщении(ях)
|
Re: AVR и экран MT10T7
Разбираться с библиотекой и соответствием даташиту не стал, поправил как смог под ваши пины и IAR, может че то и упустил.
Задержку можно попробовать поставить меньше (как у вас __delay_cycles(2)), а может и больше,
200мкс ставить бы не стал ИМХО это уж слишком.
Дергал каждый вывод отдельно так как не знаю что та у вас висит на портах.
|
PHP код:
|
#include ‹ioavr.h›
#include ‹intrinsics.h›
#define XTAL_MHz 8.0
#define _delay_us(us) __delay_cycles((unsigned long int)us*XTAL_MHz)
#define _delay_ms(ms) _delay_us(ms*1000)
#define DB0 PD3
#define DB1 PD4
#define DB2 PD5
#define DB3 PD6
#define WR1 PB0
#define A0 PB1
#define delay _delay_us(4)
#define ClrBit(reg, bit) reg |= (1‹‹bit)
#define SetBit(reg, bit) reg &= (~(1‹‹bit))
//инициализация индикатора
//индикатор распиновка *******************
//индикатор*****порты
// A0 - PB1
// WR1 - PB0
// WR2 - GND
// DB3 - PD6
// DB2 - PD5
// DB1 - PD4
// DB0 - PD3
//*****************************************
//младшая тетрада-старшая тетрада
// DB0(L)-g DB0(H)- h
// DB1(L)-e DB1(H)- b
// DB2(L)-d DB2(H)- c
// DB3(l)-a DB3(H)- f
//*****************************************
// a
// * *** *
// f * g * b
// * *** *
// e * * c
// * *** *
// d *н
//*****************************************
// цифры младшая тетрада***старшая тетрада
// 0-1110 0-1110
// 1-0000 1-0110
// 2-1111 2-0010
// 3-1101 9-0110
// 4-0001 4-1110
// 5-1101 5-1100
// 6-1111 6-1100
// 7-1000 7-0110
// 8-1111 8-1111
// 9-1101 9-1110
//********************************************
//адреса регистров молуля *******************
//знакоместо 0----1----2----3---4----5----6----7----8----9
//адрес 0x00*0x01*0x02*0x03*0x04*0x05*0x06*0x07*0x08*0x09
//********************************************
void mt_setp(char p);
void mt_init();
void mt_clear();
void mt_putc(char c);
void mt_puts(unsigned int c);
int main( void )
{
DDRB = 0xFF;
DDRD = 0xFF;
char i;
mt_init();
mt_clear();
mt_setp(0x00);
for (i=0; i‹=9; i++) mt_putc(i);
while(1);
}
/*
в данном дисплеи регистр по адресу 0xf включает блокировку
так как при включение значения данного регистра не определенно,
возможно дисплей будет блокирован. Для снятия блокировки надо
послать по адресу 0xf значение 1 или x&1;
*/
void mt_init()
{
// разблокировка шины
PORTD |= (1‹‹DB0) | (1‹‹DB1) | (1‹‹DB2) | (1‹‹DB3);
PORTB &=~(1‹‹A0);
PORTB |= (1‹‹WR1);
delay;
PORTD &=~(1‹‹DB1) | (1‹‹DB2) | (1‹‹DB3);
PORTB &=~(1‹‹WR1);
PORTB |= (1‹‹A0);
PORTB |= (1‹‹WR1);
delay;
PORTD &=~(1‹‹DB0) | (1‹‹DB1) | (1‹‹DB2) | (1‹‹DB3);
PORTB &=~(1‹‹A0);
PORTB &=~(1‹‹WR1);
PORTB |= (1‹‹WR1);
}
/*
очистка дисплея представляет из себя отключение всех сегментов индикатора
Отсчет длится до 20 потому что имееться 2 регистра(тетрады) установки сегментов
*/
void mt_clear()
{
char i;
// очистка дисплея
PORTD &=~ (1‹‹DB0) | (1‹‹DB1) | (1‹‹DB2) | (1‹‹DB3);
PORTB &=~(1‹‹WR1);
PORTB |= (1‹‹A0);
for(i=0; i‹20; i++)
{
PORTB |= (1‹‹WR1);
delay;
PORTB &=~(1‹‹WR1);
}
}
/*
Установка позиции производится при установки а0 в 0
*/
void mt_setp(char p)
{
PORTB &=~(1‹‹WR1);
PORTB &=~(1‹‹A0);
if (p&1) PORTD |=(1‹‹DB0);
else PORTD &=~ (1‹‹DB0);
if (p&2) PORTD |=(1‹‹DB1);
else PORTD &=~ (1‹‹DB1);
if (p&4) PORTD |=(1‹‹DB2);
else PORTD &=~ (1‹‹DB2);
if (p&8) PORTD |=(1‹‹DB3);
else PORTD &=~ (1‹‹DB3);
PORTB |= (1‹‹WR1);
delay;
}
/*
Вывод одиночной цифры
*/
void mt_putc(char c)
{
char digits[]={0xe,0x00,0xf,0xd,0x1,0xd,0xf,0x8,0xf,0xd};//младшая тетрада
char digits1[]={0xe,0x6,0x2,0x6,0xe,0x0C,0x0C,0x6,0xe,0xe};//старшая тетрада
PORTB &=~(1‹‹A0);
PORTB &=~(1‹‹WR1);
if (digits[c]&1) PORTD |=(1‹‹DB0);
else PORTD &=~ (1‹‹DB0);
if (digits[c]&2) PORTD |=(1‹‹DB1);
else PORTD &=~ (1‹‹DB1);
if (digits[c]&4) PORTD |=(1‹‹DB2);
else PORTD &=~ (1‹‹DB2);
if (digits[c]&8) PORTD |=(1‹‹DB3);
else PORTD &=~ (1‹‹DB3);
PORTB |= (1‹‹A0);
PORTB |= (1‹‹WR1);
delay;
PORTB &=~(1‹‹A0);
PORTB &=~(1‹‹WR1);
if (digits1[c]&1) PORTD |=(1‹‹DB0);
else PORTD &=~ (1‹‹DB0);
if (digits1[c]&2) PORTD |=(1‹‹DB1);
else PORTD &=~ (1‹‹DB1);
if (digits1[c]&4) PORTD |=(1‹‹DB2);
else PORTD &=~ (1‹‹DB2);
if (digits1[c]&8) PORTD |=(1‹‹DB3);
else PORTD &=~ (1‹‹DB3);
PORTA=digits1[c];
PORTB |= (1‹‹A0);
PORTB |= (1‹‹WR1);
}
/*
Разделение числа на 1,10...10000; что представляет собой unsigned int
Работает медлено(из-за деления), но в тех целях где оно у меня было
использованно быстродействие было не к чему
*/
void mt_puts(unsigned int c)
{
char t[5];
t[4]=c/10000;
t[3]=c/1000-t[4]*10;
t[2]=c/100-((t[4]*100)+t[3]*10);
t[1]=c/10-(t[4]*1000)-(t[3]*100)-t[2]*10;
t[0]=c-(t[4]*10000)-(t[3]*1000)-(t[2]*100)-t[1]*10;
mt_putc(t[4]);
mt_putc(t[3]);
mt_putc(t[2]);
mt_putc(t[1]);
mt_putc(t[0]);
}
|
З.Ы. Спасибо надо кнопкой нажимать
Последний раз редактировалось harchenko_pavel; 16.07.2010 в 00:20.
|
|
|
|
Сказали "Спасибо" harchenko_pavel
|
|
|
13.07.2010, 10:39
|
|
|
Временная регистрация
Регистрация: 11.06.2006
Сообщений: 89
Сказал спасибо: 25
Сказали Спасибо 12 раз(а) в 12 сообщении(ях)
|
Re: AVR и экран MT10T7
Спасибо за проделанную работу, но тоже не работает. ( Буду по задержкам смотреть.
Последний раз редактировалось Lockdog; 13.07.2010 в 11:29.
|
|
|
|
13.07.2010, 13:38
|
|
|
Прописка
Регистрация: 28.09.2006
Сообщений: 144
Сказал спасибо: 11
Сказали Спасибо 95 раз(а) в 51 сообщении(ях)
|
Re: AVR и экран MT10T7
Сообщение от Lockdog
|
|
Спасибо за проделанную работу, но тоже не работает. ( Буду по задержкам смотреть.
|
Ам сори дико тупанул, правильно так:
|
PHP код:
|
#include ‹ioavr.h›
#include ‹intrinsics.h›
#define XTAL_MHz 8.0
#define _delay_us(us) __delay_cycles((unsigned long int)us*XTAL_MHz)
#define _delay_ms(ms) _delay_us(ms*1000)
#define DB0 PD3
#define DB1 PD4
#define DB2 PD5
#define DB3 PD6
#define WR1 PB0
#define A0 PB1
#define delay _delay_us(4)
#define ClrBit(reg, bit) reg |= (1‹‹bit)
#define SetBit(reg, bit) reg &= (~(1‹‹bit))
//инициализация индикатора
//индикатор распиновка *******************
//индикатор*****порты
// A0 - PB1
// WR1 - PB0
// WR2 - GND
// DB3 - PD6
// DB2 - PD5
// DB1 - PD4
// DB0 - PD3
//*****************************************
//младшая тетрада-старшая тетрада
// DB0(L)-g DB0(H)- h
// DB1(L)-e DB1(H)- b
// DB2(L)-d DB2(H)- c
// DB3(l)-a DB3(H)- f
//*****************************************
// a
// * *** *
// f * g * b
// * *** *
// e * * c
// * *** *
// d *н
//*****************************************
// цифры младшая тетрада***старшая тетрада
// 0-1110 0-1110
// 1-0000 1-0110
// 2-1111 2-0010
// 3-1101 9-0110
// 4-0001 4-1110
// 5-1101 5-1100
// 6-1111 6-1100
// 7-1000 7-0110
// 8-1111 8-1111
// 9-1101 9-1110
//********************************************
//адреса регистров молуля *******************
//знакоместо 0----1----2----3---4----5----6----7----8----9
//адрес 0x00*0x01*0x02*0x03*0x04*0x05*0x06*0x07*0x08*0x09
//********************************************
void mt_setp(char p);
void mt_init();
void mt_clear();
void mt_putc(char c);
void mt_puts(unsigned int c);
int main( void )
{
DDRB = 0xFF;
DDRD = 0xFF;
char i;
mt_init();
mt_clear();
mt_setp(0x00);
for (i=0; i‹=9; i++) mt_putc(i);
while(1);
}
/*
в данном дисплеи регистр по адресу 0xf включает блокировку
так как при включение значения данного регистра не определенно,
возможно дисплей будет блокирован. Для снятия блокировки надо
послать по адресу 0xf значение 1 или x&1;
*/
void mt_init()
{
// разблокировка шины
PORTD |= (1‹‹DB0) | (1‹‹DB1) | (1‹‹DB2) | (1‹‹DB3);
PORTB &=~(1‹‹A0);
PORTB |= (1‹‹WR1);
delay;
PORTD &=~(1‹‹DB1) & ~(1‹‹DB2) & ~(1‹‹DB3);
PORTB &=~(1‹‹WR1);
PORTB |= (1‹‹A0);
PORTB |= (1‹‹WR1);
delay;
PORTD &=~(1‹‹DB0) & ~(1‹‹DB1) & ~(1‹‹DB2) & ~(1‹‹DB3);
PORTB &=~(1‹‹A0);
PORTB &=~(1‹‹WR1);
PORTB |= (1‹‹WR1);
}
/*
очистка дисплея представляет из себя отключение всех сегментов индикатора
Отсчет длится до 20 потому что имееться 2 регистра(тетрады) установки сегментов
*/
void mt_clear()
{
char i;
// очистка дисплея
PORTD &=~ (1‹‹DB0) & ~(1‹‹DB1) & ~(1‹‹DB2) & ~(1‹‹DB3);
PORTB &=~(1‹‹WR1);
PORTB |= (1‹‹A0);
for(i=0; i‹20; i++)
{
PORTB |= (1‹‹WR1);
delay;
PORTB &=~(1‹‹WR1);
}
}
/*
Установка позиции производится при установки а0 в 0
*/
void mt_setp(char p)
{
PORTB &=~(1‹‹WR1);
PORTB &=~(1‹‹A0);
if (p&1) PORTD |=(1‹‹DB0);
else PORTD &=~ (1‹‹DB0);
if (p&2) PORTD |=(1‹‹DB1);
else PORTD &=~ (1‹‹DB1);
if (p&4) PORTD |=(1‹‹DB2);
else PORTD &=~ (1‹‹DB2);
if (p&8) PORTD |=(1‹‹DB3);
else PORTD &=~ (1‹‹DB3);
PORTB |= (1‹‹WR1);
delay;
}
/*
Вывод одиночной цифры
*/
void mt_putc(char c)
{
char digits[]={0xe,0x00,0xf,0xd,0x1,0xd,0xf,0x8,0xf,0xd};//младшая тетрада
char digits1[]={0xe,0x6,0x2,0x6,0xe,0x0C,0x0C,0x6,0xe,0xe};//старшая тетрада
PORTB &=~(1‹‹A0);
PORTB &=~(1‹‹WR1);
if (digits[c]&1) PORTD |=(1‹‹DB0);
else PORTD &=~ (1‹‹DB0);
if (digits[c]&2) PORTD |=(1‹‹DB1);
else PORTD &=~ (1‹‹DB1);
if (digits[c]&4) PORTD |=(1‹‹DB2);
else PORTD &=~ (1‹‹DB2);
if (digits[c]&8) PORTD |=(1‹‹DB3);
else PORTD &=~ (1‹‹DB3);
PORTB |= (1‹‹A0);
PORTB |= (1‹‹WR1);
delay;
PORTB &=~(1‹‹A0);
PORTB &=~(1‹‹WR1);
if (digits1[c]&1) PORTD |=(1‹‹DB0);
else PORTD &=~ (1‹‹DB0);
if (digits1[c]&2) PORTD |=(1‹‹DB1);
else PORTD &=~ (1‹‹DB1);
if (digits1[c]&4) PORTD |=(1‹‹DB2);
else PORTD &=~ (1‹‹DB2);
if (digits1[c]&8) PORTD |=(1‹‹DB3);
else PORTD &=~ (1‹‹DB3);
PORTA=digits1[c];
PORTB |= (1‹‹A0);
PORTB |= (1‹‹WR1);
}
/*
Разделение числа на 1,10...10000; что представляет собой unsigned int
Работает медлено(из-за деления), но в тех целях где оно у меня было
использованно быстродействие было не к чему
*/
void mt_puts(unsigned int c)
{
char t[5];
t[4]=c/10000;
t[3]=c/1000-t[4]*10;
t[2]=c/100-((t[4]*100)+t[3]*10);
t[1]=c/10-(t[4]*1000)-(t[3]*100)-t[2]*10;
t[0]=c-(t[4]*10000)-(t[3]*1000)-(t[2]*100)-t[1]*10;
mt_putc(t[4]);
mt_putc(t[3]);
mt_putc(t[2]);
mt_putc(t[1]);
mt_putc(t[0]);
}
|
Последний раз редактировалось harchenko_pavel; 15.07.2010 в 19:41.
|
|
|
|
Сказали "Спасибо" harchenko_pavel
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:25.
|
|