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

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 пользователей онлайн

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

  • Сообщения

    • для @Aknod: чем стабильнее и с меньшими пульсациями опорное напряжение, тем стабильнее и чище выходное напряжение блока питания! поэтому желательно НИ чего не подключать лишнего к VT3.
    • Модель магнитолы в студию, там в паспорте скорее всего указан радиус действия, больше вы не сделаете.
    • Да сделайте просто замеры относительно ванны до других металлических предметов. У меня на кухне стоит стоит газовая плита с электророзжигом Hansa 2012 года. Так вот напряжение между мойкой (нержавейка, хотя подводка - пластиковые трубы) и плитой было около 160В. А если перевернуть вилку в розетке то около 10В. Квартира 1983 года, точек заземления нет. А ванна чугунная заземлена была на трубопровод, при чем болт на М6 был приварен, сейчас подводка вся пластиковая. Заземления нет.
    • Что-то не пойму никак: уже 8 страниц обсуждается - что? @Andrewe , в чем проблема сделать точно так, как описано у автора? Этот ИИП запускается и работает в 100% случаев, если не делать своих косяков. А как не сделать - у автора и в форуме все разжевано до мелочей. Программа Старичка все вам посчитала. Вы все точно так же сделали? Кстати, какая магнитная проницаемость у вашего сердечника?
    • Если хочешь получить виртуальный диагноз по фотографии, то должен хотя бы максимально подробно и достоверно изложить обстоятельства. А так ситуация выглядит странно. "Часто" - это как часто? Сколько случаев? За 3-4 года какой налет у каждого квадрокоптера? "Не используется длительный срок" - это какой срок? "Биндится нормально" - это что такое? Без дурацких жаргонов нельзя обойтись? И, наконец, - как узнал? Проверил емкость, измерил внутреннее сопротивление, да? И вообще, нет ни косвенных данных, ни измерений... Без этого будут одни фантастические гадания наподобие деградации микросхем китайского производства Ну или то, или сё... Аккумуляторы проверь нормально. 
×
×
  • Создать...