Перейти к содержанию
    

TIC8148+Atmega16

Привет, к мк Atmega16-16PU я подсоединил жк дисплей TIC8148, питаюсь вывести информацию на него, но ничего не отображается.

DCLC - 1 port C

DIN - 0 port C

LOAD – 7 port D

Питание для жк использую от лпт порта, соединив землю жк с лпт и с землей мк. МК живится от стабилизатора (78L05) который подключен к ком порта.

Участок кода где просто питаюсь зажечь а потом погасить дисплей, порти перед этим настроил как выходи.

for(i=0;i<72;i++)

{

PORTD.7=0;

PORTC.1=0;

PORTC.0=1;

PORTC.1=1;

PORTD.7=1;

};

for(i=0;i<65000;i++)

{

};

for(i=0;i<72;i++)

{

PORTD.7=0;

PORTC.1=0;

PORTC.0=0;

PORTC.1=1;

PORTD.7=1;

};

for(i=0;i<65000;i++)

{};

Но одна интересная вещь когда торкаюсь пальцем к ножке CHK (ее не где не подключал) в некоторые промежутки времени (я так думаю в те промежутки времени когда мк должен зажечь жк) на дисплее зажигаются разные участки а потом эта ножка снова не реагирует некоторое время. В чем может бить проблема помогите мне очень интересно что не так делаю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Давно работал с этим ЖК. Он устроен как большой сдвиговый регистр. Загоняете 8 байт и потом защёлкиваете LOAD.

 

для теста можно так:

#define DCLC PORTC.1

#define DIN PORTC.0

#define LOAD PORTD.7

 

unsigned char i;

 

 

for(i=0;i<64;i++)

{

DIN=1; //зажигаем все сегменты

DCLC=0;

delay_ms(1);

DCLC=1;

delay_ms(1);

}

LOAD=0;

delay_ms(1);

LOAD=1;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделал как посоветовали но у меня на экране только такая картинка (фото). Контакты прозванивал. Что делаю не так не могу понять. Код сделал таким чтобы видеть что зажигаю и гашу дисплей

while (1)

{

 

for(i=0;i<64;i++)

{

DIN=1; //çàæèãàåì âñå ñåãìåíòû

DCLC=0;

delay_ms(1);

DCLC=1;

delay_ms(1);

}

LOAD=0;

delay_ms(1);

LOAD=1;

 

delay_ms(1000);

for(i=0;i<64;i++)

{

DIN=0; //çàæèãàåì âñå ñåãìåíòû

DCLC=0;

delay_ms(1);

DCLC=1;

delay_ms(1);

}

LOAD=0;

delay_ms(1);

LOAD=1;

delay_ms(1000);

};

post-34465-1213819180_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1.Там сдвиговый регистр 80-ти битный: первые 72 бита - сегменты и 8бит не используются, но загружать их тоже надо.

 

2. Защелкивание происходит по фронту. Поменяй местами DCLC=0 <>DCLC=1 и LOAD=0<>LOAD=1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я проверял сперва жк на лпт порте и там работало когда защелкиваю сперва DCLC а потом LOAD.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я проверял сперва жк на лпт порте и там работало когда защелкиваю сперва DCLC а потом LOAD.

 

все верно, только в исходной ситуации DCLC=0 и LOAD=0, а во время работы:

 

защелкивание:

DCLC=1;

delay_ms(1);

DCLC=0;

 

зажигание:

LOAD=1;

delay_ms(1);

LOAD=0;

 

... это я имел ввиду

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не работает дальше , может надо время задержки увеличить.(частота внутреннего генератора мк 1МГц), это странно поскольку на лпт работает ,а на мк не хочет. На лпт я использую перепад с 0-1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не работает дальше , может надо время задержки увеличить.(частота внутреннего генератора мк 1МГц), это странно поскольку на лпт работает ,а на мк не хочет. На лпт я использую перепад с 0-1.

Очень даже может быть, что проблема с задержками. Тайминги для ML1001 не соответствуют реально требуемым задержкам готового изделия, поскольку сопротивление дорожек на стекле достаточно велико, и постоянная времени паразитных RC-цепочек значительна (хотя про влияние CHK очень странно - это _выход_ сдвигового регистра, анализируя этот сигнал, можно удостовериться в правильности загружаемых данных).

 

И о грустном - насколько мне известно, ML1001 с производства снимается (или уже снята), поэтому ориентироваться на эти индикаторы применительно к серийному производству не стоит...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

примерно так и делаю. только лоад даю после посылки всего буфера (72 бита) ... и 80 тоже пробовал как написал ктото... на экране как в фильме хищник знаки :)) короче под конец замучал контроллер - уже не знал что делать - запрограмировал фьюзы на 128 кгц генератор внутренний и он перестал прошиваться :))) поменяю - попробую. (а этот будет ждать высоковольтного программатора...) если есть набор функций готовый - пришли, если не жалко. мой мэйл [email protected]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте.

Вас не затруднит протестировать программу? Делал по аналогии с TIC5231, но там был MSP430. Индикаторы заказаны еще до нового года, но где-то застряли, а двигаться дальше нужно.

TIC8148.rar

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

победил уродца... написал на с десяток функций для удобства вывода - работают.

 

кстати я не могу тебе личное сообщение отправить.. проверь адрес в настройках.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здраствуйте. Только осваиваюсь и учусь программированию. У меня есть индикатор tic8148 + attiny2313 , программку с заполнением всех знакомест и гашением сделать получилось. Теперь хотелось бы научится менять значения например цифр с помощью кнопок в разных знакоместах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день, господа!

Разобравшись с даташитом к дисплею и с процедурой загрузки данных в 8148 решил реализовать отображение отдельных разрядов. Застрял на процедуре, реализующей бланкирование (пока не вешал её в прерывание дабы отработать однократное отображение разряда, а потом уже можно будет и остальное). Отображается цифра согласно знакоместу, сегмент D в восьмом разряде, под ним - символ подчеркивания (это то, что после инициализации), затем там же рядом появлятеся точка. Затем, при переборе массива lcd_buffer, us_buffer - отображаются цифры в первом (слева) разряде и символ подчеркивания отображается по-порядку слева на права. Точка не показывается в принципе. В чем ошибка? Мой код приведен ниже.

#ifndef F_CPU
       #define F_CPU 8000000UL //8MHz
#endif
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
#include "lcd.h"
//#include "interrupts.h"

#define LCD_PORT PORTB
#define LCD_REGISTER DDRB
#define LCD_VDD_PIN 0
#define LCD_VSS_PIN 1
#define LCD_LOAD_PIN 2
#define LCD_DATA_PIN 3
#define LCD_CLK_PIN 4
#define LCD_CHK_PIN 5
#define LCD_POWER(flag) \
       ((flag)? (LCD_PORT |= ((1 << LCD_VDD_PIN) | (0 << LCD_VSS_PIN))): \
               (LCD_PORT &= ~((1 << LCD_VDD_PIN) | (1 << LCD_VSS_PIN))))
#define LCD_CLOCK(flag) \
       ((flag)? (LCD_PORT |= (1 << LCD_CLK_PIN)): \
               (LCD_PORT &= ~(1 << LCD_CLK_PIN)))
#define LCD_DATA(flag) \
	((flag)? (LCD_PORT |= (1 << LCD_DATA_PIN)): \
			(LCD_PORT &= ~(1 << LCD_DATA_PIN)))
#define LCD_LOAD(flag) \
       ((flag)? (LCD_PORT |= (1 << LCD_LOAD_PIN)): \
               (LCD_PORT &= ~(1 << LCD_LOAD_PIN)))
static uint8_t init_complete = 0;
const uint8_t digit_buffer[10] = {
	1+2+8+16+32+64,
	64+32,
	16+32+4+2+1,
	16+32+4+64+1,
	8+4+32+64,
	16+8+4+64+1,
	16+8+2+4+1+64,
	16+32+64,
	127,
	127-2
};
static volatile uint8_t lcd_buffer[] = {
	0, 0, 0, 0, 0, 0, 0, 0
};
static volatile uint8_t dp_buffer[] = {
	0, 0, 0, 0, 0, 0, 0, 0
};
static volatile uint8_t us_buffer[] = {
	0, 0, 0, 0, 0, 0, 0, 0
};
void lcd_strobe(uint8_t select_io) {
switch (select_io) {
case 0:
	LCD_CLOCK(1);
	_delay_us(1);
	LCD_CLOCK(0);
	_delay_us(1);
case 1:
	LCD_LOAD(1);
	_delay_us(1);
	LCD_LOAD(0);
	_delay_us(1);
default:
	break;
}
}
void write_data(void) {
uint8_t dp = 0;
uint8_t underscore = 0;
uint8_t data = 0;
for (uint8_t i = 8; i > 0; i--) {
	dp = dp_buffer[i];
	lcd_strobe(0);
	if (dp)
		LCD_DATA(1);
	else
		LCD_DATA(0);
	for (uint8_t j = 8; j > 0; j--) {
		underscore = us_buffer[j];
		lcd_strobe(0);
		if (underscore)
			LCD_DATA(1);
		else
			LCD_DATA(0);
		data = lcd_buffer[j];
		for (uint8_t z = 8; z > 0; z--) {
			lcd_strobe(0);
			if (data & 0x40)
				LCD_DATA(1);
			else
				LCD_DATA(0);
			data = data << 1;
		}
	}
}
lcd_strobe(1);
}
void clear_buffers(void) {
for (uint8_t i = 0; i < sizeof(dp_buffer); i++) {
	dp_buffer[i] = 0;
}
for (uint8_t i = 0; i < sizeof(us_buffer); i++) {
	us_buffer[i] = 0;
}
for (uint8_t i = 0; i < sizeof(lcd_buffer); i++) {
	lcd_buffer[i] = 0;
}
}
void init_lcd(void) {
if (!init_complete) {
	LCD_REGISTER = 0x1F;
	LCD_POWER(1);
	init_complete = 1;
}
for (uint8_t i = 0; i < 10; i++) {
	clear_buffers();
	lcd_buffer[1] = digit_buffer[i];
	if (i < 9) {
		us_buffer[i] = 1;
		dp_buffer[i] = 1;
	}
	write_data();
	_delay_ms(1000);
}
}

Изменено пользователем GoodNews

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...