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

BT201 схема подключения и управление из под ATMEGA8


Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Hongfa для различных применений в Компэл. Большой выбор в наличии!

Компания HONGFA - это не только крупнейший в мире производитель электромеханических реле, но также производитель конденсаторов, вакуумных прерывателей, трансформаторов и низковольтного коммутационного оборудования. На складе КОМПЭЛ регулярно поддерживаются около 100 самых популярных позиций электромеханических реле. Реле Hongfa могут заместить многие изделия производства недоступных брендов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

@donec Спасибо, но нет. Слишком всё как то всё сложно и запутано написано там в этом коде. 

Я сейчас тем временем продолжаю разбираться с дисплеем. Выяснил причину артефактов на дисплее, а она кроется в коде, но это ещё нужно понять как исправить. Собственно в чём суть дела вывод по одному символу работает корректно и всё отображается правильно, но как только я пытаюсь вывести строку то на дисплее сразу появляются всяческие артефакты. Так что тут получается нужно каким то образом править код вывода строки.

Вот весь код написанный под ATMEGA16.

#define F_CPU 7372800UL
#define BAUND 9600L
#define UBRRL_value (F_CPU/(BAUND*16))-1

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

#define MAIN_H_
#define LCD_H_

#define LCD_DDR DDRA
#define LCD_PORT PORTA
#define LCD_PIN PINA

#define DATA 0b11110000
#define RS PA2
#define E PA3

#define E1 LCD_PORT|=(1<<E)
#define E0 LCD_PORT&=~(1<<E)

#define RS1 LCD_PORT|=(1<<RS)
#define RS0 LCD_PORT&=~(1<<RS)

void lcd_ini(void);
void lcd_str(char* str);
void lcd_pos(uint8_t line, uint8_t pos);
void lcd_num(uint8_t num, uint8_t line, uint8_t pos);
uint8_t n=0;


void write(uint8_t n)
{
	n<<=4;
	E1; //линию Е в 1
	LCD_PORT&=~DATA; //удалить предыдущую отправку
	LCD_PORT|=n; //выставить значение на пины управления дата битами
	asm("nop"); //пропуск такта
	E0; //линию Е в 0
}

void send_byte(uint8_t byte, uint8_t tip)
{
	if (tip) //если тип данные на линии RS 1
	{
		RS1;
	}
	else //иначе тип команда и на линии RS 0
	{
		RS0;
	}
	
	write(byte>>4); //передача старшего полубайта
	write(byte); //передача младшего полубайта
}

void lcd_ini(void)
{
	LCD_DDR|=DATA | (1<<RS) | (1<<E);
	_delay_ms(20);
	RS0;
	write(3);
	_delay_ms(5);
	write(3);
	_delay_us(150);
	write(3);
	_delay_us(50);
	write(2);
	_delay_us(50);
	
	send_byte(40,0);
	_delay_us(50);
	
	send_byte(12,0);
	_delay_us(50);
	
	send_byte(1,0);
	_delay_ms(2);
	
	send_byte(6,0);
	_delay_us(50);
}

void lcd_str(char* str)
{
	uint8_t n=0;
	while(str[n])
	{
		send_byte(str[n],1);
		n++;
	}
}

void lcd_pos(uint8_t line, uint8_t pos)
{
	uint8_t adress=(line*0x40+pos)|0x80;
	send_byte(adress,0);
	_delay_us(50);
}

void init_pin(void);

#define C_PC0 (~PINC&(1<<PC0))
#define C_PC1 (~PINC&(1<<PC1))
#define LED_1_ON() PORTD|=(1<<PD2)
#define LED_1_OFF() PORTD&=~(1<<PD2)
#define LED_2_ON() PORTD|=(1<<PD3)
#define LED_2_OFF() PORTD&=~(1<<PD3)

#define FLAG_END_RX (1<<3)
#define FLAG_ERR_RX (1<<4)
#define BUF_SIZE 20

char rx_buf[BUF_SIZE];
char buf_index = 0;
char rxb;

volatile start=1, flags;

ISR(USART_RXC_vect)
{
	char rxb = UDR;
	if(!(flags & FLAG_END_RX))
	{
		rx_buf[buf_index]=rxb;
		if(rx_buf[buf_index] == 0x0D)
		{
			flags |= FLAG_END_RX;
			return;
		}
		buf_index++;
		if(buf_index >= BUF_SIZE)
		{
			buf_index = 0;
			flags |= FLAG_ERR_RX;
		}
	}
}

void init_UART()
{
	UBRRL = UBRRL_value;
	UBRRH = UBRRL_value>>8;
	UCSRB|=(1<<TXEN);
	UCSRB|=(1<<RXEN);
	UCSRC|=((1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1));
	UCSRB|=(1<<RXCIE);
	sei();
	flags = 0;
}

void send_UART(char value)
{
	while(!(UCSRA&(1<<UDRE)));
	UDR=value;
}

int main(void)
{
	init_pin();
	init_UART();
	
	_delay_ms(500);
	send_UART('O');
	send_UART('K');
	send_UART('!');
	send_UART(0x0D);
	send_UART(0x0A);
	_delay_ms(10);
	flags = 0;
	
	DDRB = 0b10000000;
	PORTB = 0b11111111;
	lcd_ini();
	
	while(1)
	{
		if (~PINB & (1<<1))
		{
			send_UART('P');
			send_UART('B');
			send_UART('1');
			send_UART(0x0D);
			send_UART(0x0A);
			_delay_ms(250);
			lcd_pos(0,0);
			send_byte('A',1);
			lcd_pos(1,0);
			lcd_str("PORT B1");
			//lcd_str("                ");
			//lcd_pos(1,0);
			//lcd_str("                ");
			//lcd_pos(1,0);
			//lcd_str("GAMES AND SOFT");
			//send_byte(0b01000001,1); //A
			//send_byte(0x41,1);       //A
			//send_byte('A',1);        //A
			
		}
		if (~PINB & (1<<2))
		{
			send_UART('P');
			send_UART('B');
			send_UART('2');
			send_UART(0x0D);
			send_UART(0x0A);
			_delay_ms(250);
			lcd_pos(0,0);
			send_byte('B',1);
			lcd_pos(1,0);
			lcd_str("PORT B2");
			//lcd_pos(0,0);
			//lcd_str("                ");
			//lcd_pos(1,0);
			//lcd_str("                ");
			//lcd_str("TIFASO");
		}
		if (~PINB & (1<<3))
		{
			send_UART('P');
			send_UART('B');
			send_UART('3');
			send_UART(0x0D);
			send_UART(0x0A);
			_delay_ms(250);
			lcd_pos(0,0);
			send_byte('C',1);
			lcd_pos(1,0);
			lcd_str("PORT B3");
			//lcd_str("                ");
			//lcd_pos(1,0);
			//lcd_str("                ");
			//lcd_pos(1,0);
			//lcd_str("HELLO");
			//lcd_pos(1,0);
			//lcd_str("PLAYER BT201");
			
		}
		if (~PINB & (1<<4))
		{
			send_UART('P');
			send_UART('B');
			send_UART('4');
			send_UART(0x0D);
			send_UART(0x0A);
			_delay_ms(250);
			lcd_pos(0,0);
			send_byte('D',1);
			lcd_pos(1,0);
			lcd_str("PORT B4");
			//lcd_pos(0,0);
			//lcd_str("                ");
			//lcd_pos(1,0);
			//lcd_str("                ");
			
			//lcd_str("FILE MUSIC MP3");
			//lcd_pos(1,0);
			//lcd_str("USB PLAYER VOLL");
			
		}
		
		char i = 0;
		if (rx_buf[i] == 'M'){
			i++;
			if (rx_buf[i] == '1')
			{	
				LED_1_ON();
				LED_2_OFF();
			}
			else if (rx_buf[i] == '2')
			{
				
				LED_1_OFF();
				LED_2_ON();
			}
			else if (rx_buf[i] == 'T')
			{
				
				LED_1_ON();
				LED_2_ON();
			}
			else if (rx_buf[i] == 'K')
			{
				
				LED_1_OFF();
				LED_2_OFF();
			}
		}

		if (C_PC0)
		{
			send_UART('P');
			send_UART('C');
			send_UART('0');
			send_UART(0x0D);
			send_UART(0x0A);
			_delay_ms(250);
			lcd_pos(0,0);
			send_byte('E',1);
			lcd_pos(1,0);
			lcd_str("PORT C0");
		}
		
		if (C_PC1)
		{
			send_UART('P');
			send_UART('C');
			send_UART('1');
			send_UART(0x0D);
			send_UART(0x0A);
			_delay_ms(250);
			lcd_pos(0,0);
			send_byte('F',1);
			lcd_pos(1,0);
			lcd_str("PORT C1");
		}
	}
}

void init_pin(void)
{
	DDRC = 0b00000000;
	PORTC = 0b11111111;
	DDRD |= ((1<<2)|(1<<3));
	PORTD &=~ ((1<<2)|(1<<3));
}

Собственно за вывод символа отвечает send_byte она работает правильно, а за вывод строки отвечает lcd_str вот в ней как раз таки и вся проблема с артефактами. А что конкретно не так я пока ещё никак не пойму. Может кто более опытным глазом увидит и подскажет что нужно исправить.

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

Тренды и лучшие решения для разработки зарядных станций в России

К 2029 году в России прогнозируется увеличение числа зарядных станций до 40 000. При этом отечественный рынок электротранспорта имеет климатические, потребительские и географические особенности. Для успешной разработки и построения инфраструктуры станций заряда в России идеальным вариантом является использование решений и электронных компонентов китайских производителей – лидеров индустрии электротранспорта и возобновляемой энергетики, которые уже представлены в КОМПЭЛ. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Я бы вот эту функцию переписал следующим образом:

void write(uint8_t n)
{
	n<<=4;
	LCD_PORT&=n; //выставить значение на пины управления дата битами
	E1; //линию Е в 1
	asm("nop"); //пропуск такта
    ... // столько раз, чтобы высокий уровень "E" был >= 1 мкс
	asm("nop"); //пропуск такта
	E0; //линию Е в 0
	LCD_PORT|=DATA; //между обращениями Dx = "1"
}

 

С уважением, Владимир

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

Секреты депассивации литиевых батареек FANSO EVE Energy

Самыми лучшими параметрами по энергоемкости, сроку хранения, температурному диапазону и номинальному напряжению обладают батарейки литий-тионилхлоридной электрохимической системы. Но при длительном хранении происходит процесс пассивации. Разберем в чем плюсы и минусы, как можно ее избежать или уменьшить последствия и как проводить депассивацию батареек на примере продукции и рекомендаций компании FANSO EVE Energy. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Я как-то задавал вопрос какие фьюзы, но ТС не читатель, ТС писатель, вопросы не зря задаются.

void write(uint8_t n)
{
	n<<=4;
	LCD_PORT&=~DATA; //удалить предыдущую отправку
	LCD_PORT|=n; //выставить значение на пины управления дата битами
	E1; //линию Е в 1
	_delay_us(2); //пропуск такта
	E0; //линию Е в 0
	_delay_us(50);
}

  

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

1 час назад, tifaso сказал:

Выяснил причину артефактов на дисплее, а она кроется в коде,

А может все-таки дело не в бобине? А в "сидящем в кабине" tifaso категорически отвергающем все советы?

555.jpg.9ae33d64411f92ef19db9ecbecf1ce59.jpg

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

46 минут назад, donec сказал:

Я как-то задавал вопрос какие фьюзы

А при чём тут фьюзы вообще. При разных микроконтроллерах приходится настраивать фьюзы по разному в зависимости от ситуации. Здесь же я использую микроконтроллер ATMEGA16 и тут фьюзы настроены следующим образом. Во первых настройки для кварца и во вторых отключение JTAGEN. Более ничего не менялось.

Скрин прилагаю.

Clip14.jpg.5b12c0cee2142750d2674843e17da396.jpg

Изменено пользователем tifaso
Ссылка на комментарий
Поделиться на другие сайты

9 минут назад, tifaso сказал:

при чём тут фьюзы вообще

При том, что фьюзы определяют длительность одного такта. Не задумывался об этом?

С уважением, Владимир

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

3 минуты назад, tifaso сказал:

И что дальше.

Ниче. Тут как обычно - не обращайте внимание на то что пишут, шуруйте свое...

 

Изменено пользователем korsaj
Ссылка на комментарий
Поделиться на другие сайты

Можете сделать быструю проверку что все у вас верно с фьюзами. По моргайте светодиодом с интервалом 1 секунда, если совпадет с реальным временем, то все в порядке (частота указанная в начале файла, совпадает с частотой работы мк).  Но у вас на верность настроек фьюзов указывает работа ЮАРТа. 

Изменено пользователем korsaj
Ссылка на комментарий
Поделиться на другие сайты

46 минут назад, tifaso сказал:

Но как решать проблему то.

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

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

30 минут назад, donec сказал:

тебе предложили решение твоей проблемы, а ты игнорируешь

Я просто пока не пойму что это изменит и как это отобразится на работе программы. Хотел просто пока услышать пояснения чем изменяется данный код и что это даст?

Завтра уже на свежую голову попробую этот код записать и протестить.

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

4 часа назад, korsaj сказал:

По моргайте светодиодом с интервалом 1 секунда,

Это напомнило анекдот про гаишников, новичку напарник говорит, выгляни, посмотри мигалка работает ? Работает-не работает, работает- не работает...

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

26 минут назад, tifaso сказал:

Завтра уже на свежую голову попробую

Вот информация для утренних размышлений из моих заметок об LCD:

 

При переводе в 4-х битный режим пауза 5 мс

Задержка 1,64 мс для команд “возврат” и “домой”

Задержка 40 мкс для всех других операций

Исходное состояние сигналов (должно поддерживаться в промежутках между обменами):

  • RS = произвольное
  • E = Lo
  • R/W = Lo
  • DB0 .. DB7 = Hi

 

Операция записи для 4-х разрядной шины:

1.Установить RS

2.Вывести значение старшей тетрады на DB4...DB7

3.Установить E = 1 (на >=1мкс)

4.Установить E = 0

5.Вывести значение младшей тетрады на DB4...DB7

6.Установить E = 1 (на >=1мкс)

7.Установить E = 0

8.Установить линии DB4...DB7 = HI

Минимальное время между шагами 250 нс

 

RS = 0 - адресуется регистр команд (IR)

RS = 1 - адресуется регистр данных (DR)

 

!!! При ложном импульсе “E” (по какой-либо причине) может сбиться синхронизация младшей и старшей тетрады. По любому фронту сигналов RS и RW синхронизация восстанавливается для приема старшей тетрады.

С уважением, Владимир

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

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

Изменено пользователем dolmatovva
Ссылка на комментарий
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Сообщения

    • @_abk_ Да сделал всё точно так же с размерами своего сердечника, только проницаемость вбил 2000, ибо не знаю как посчитать ш-образный сердечник
    • Это вопрос или утверждение? Что-то новенькое.
    • Не вижу. А Вы видите, потому что совершенно не разбираетесь в вопросе. Задачи сердечника и металлической оболочки разные. Сердечник локализует магнитный поток, большая проводимость сердечника - вредный показатель. В экранирующей железной оболочке тоже концентрируется магнитный поток, но это может быть малая доля от потока сердечника. не раз читал, что при высокой частоте (но нигде не была указана граница этой высокой частоты), экранирование происходит в основном не за счет шунтирования магнитных линий, а за счет наведенных токов, поле которых компенсирует индуцирующее. В этом случае магнитные свойства оболочки практически не имеют значения, или имеют в меньшей степени, а вот проводимость, и геометрия проводящего пути выходят на первое место. Это, естественно, для ближнего поля. Для волны там уже свои аспекты в которых сильно не разбирался, такие как многочисленное переотражение на границе перепада волновых сопротивлений и прочие моменты.
    • Да я их вчера еще в чип и дип купил ) Если там не закупаться для оптового производства, то терпимо, доставок с авито ждать не охота ) 90 руб, 270 за три микры, приемлемо...
    • @Kotto ,они на авитоподобных недорогие если что. Желательно брать постарше годов выпуска,в перестройку лепили недобро. И еще при пайке не перегревать. Удачи!
    • Я правильно понял, что сигнал с платы входа идет на U1 УПЗ-15? То есть если я хочу сравнить то что на входе и то что после селектора, мне надо проверять выход на разъеме X XP (слева сверху)?
×
×
  • Создать...