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

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

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

  • Сообщения

    • Под "начинай - поможем" здесь имеется в виду: вы демонстрируете результаты своих потуг на самостоятельное решение задачи, а желающие помочь указывают на ошибки и направляют в нужную сторону. А не делают вашу работу за вас, это в другой раздел форума.
    • Вам удалось победить это? Я так и не смог научиться компилировать. Давно купил SH1106 и SSD1306,  всё получилось с авторскими hex. Работает отлично.  Но вот сейчас купил SH1106  которые, почему-то, работают с hex для 1306(с 1106 не работают), но  справа полоса засвечивается, очевидно что под названием 1106 китайцы продают что-то иное. На Гитхабе писали что 1309. Вот и вопрос к коллегам: если есть возможность, можете скомпилировать hex  под Атм328 на разные типы индикаторов(1305 и 1309), кроме тех, которые уже есть(1106 и 1306)?  Готов раскошелиться на бутылку рома. 
    • Вечерами по неделе на каждый шар ушло(вернее не шар, а яйцо, т.к. папье маше слоями обклеивался обычный воздушный шарик) , потом после просушки ещё покрытие стеклотканью с эпоксидкой, грунтовкой, покраска рояльным лаком, и окончательная сборка акустики. В общем примерно за месяц с небольшим с той каторжной работой управился. В итоге, доказав себе,типа - я смог это сделать; наслушавшись и нахвастовавшись перед друзьями висящими на растяжках в углах зала яйцами, по случаю продал их одному небедному любителю подобных эксклюзивных изделий за 300 баксов(если помнишь, в конце 90-ых бакс резко попёр по цене в верх, и я не смог устоять перед искушением подержать псыцу счастья за хвост... и не удержал ).  
    • Доброго всем здравствуйте. Подскажите пожалуйста куда можно подать питание 5в. на эту блютуз модуль, чтобы работал только от сети, помимо заряда на аккумулятор. Фото выкладываю. Оторвался микроуизби. 
    • Да он скорее всего поторопился.  Долго изготавливал? Как то пытался тоже,но не срослось
    • Здраствуйте,собрал липина из первого поста,все отлично заработал без танцев с бубном,первое включение через латр смотря за сколом на коллекторе нижнего ключа,далее на балласте и на сварку варил замечательно,но включил его через несколько дней ключи тихо умерли,заменил запускаю через латр подымаю потихоньку напряжение все отлично,в первый раз подумал что частота уплыла и ключики из-за этого стрельнули но нет частота как была 38-39 кГц так и осталась полка так же есть только думаю она завышена на половину амплитуды регулировал ее путем подбора сопротивления на дед тайм,так вот через латр все отлично запускается подымаю до 310 на ключе,но дежурка подключена отдельно так вот когда отключаеш ключи в этот момент как я понял стреляют,даже в сборе когда дежурка запитана от основного питания как по схеме при включении сразу в сеть начало стрелять,думал может когда устанавливал крышку трансформатор повредил,нет же индуктивность проверил 3900 мкГн первичка,ток намагничивания насколько помню 0.7…0.8 ампер Снабера по ключам в норме проверял C метром,1 мкФ пленка по питанию около ключей в норме Осцилка приведу позже, сейчас на работе Возможно ли быть такое что после выключения от сети сигнал с затвора пропадает ,и он повисает в воздухе,хотя в принципе по схеме он подтянут резистором к эммитеру,да и работало же как-то да и у всех работает
×
×
  • Создать...