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

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


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

Как всегда - клич и Вы сделаете как надо.:)

Только что, CruelAsm сказал:

Словами, простыню кода не надо.

Или простыню, но со своими комментариями.

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

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

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

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

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

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

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

void TimeToStr(char[] str, long value)
{
  long min = value / 60  * 1000;
  char sec = value % 60;
  LongToStr(str, min);
  str[8] = ':';
  str[9] = (sec / 10) + 48;
  str[10] = (sec % 10) + 48;
  str[11]=0;
}
17 минут назад, CruelAsm сказал:

 операцией %

Тогда уж оператором %

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

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

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

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

@korsaj Во первых эта функция сразу выбила какую то непонятную ошибку.

Clip15.jpg.697cb090cafa5f228d5b6287f800c3e8.jpg

И потом совершенно не понятно как её вызывать и куда она выводит данные? Пожалуйста подробнее и как больше информации. 

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

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

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

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

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

Во первых

 

12 минут назад, korsaj сказал:
TimeToStr

 

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

И потом совершенно не понятно как её вызывать и куда она выводит данные

Интересно, а как вы тогда оприходовали предыдущую функцию?

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

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

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

Так я ничего и не понял. Что делать то нужно? Что за ошибка? Как её исправить? Каким образом вызвать эту функцию и передать ей данные для обработки? Куда она выводит данные? Одни вопросы, но пока ни одного ответа. Пожалуйста подробнее и как можно больше информации.

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

Что за ошибка и как её исправить - внимательно, символ за символом, сравнить то, что написал korsaj, с тем, что там у вас.

Подробнее и как можно больше информации в гугле по запросу "функции в языке си". Ну и в вашем коде можно найти примеры успешных вызовов функций с параметрами и без.

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

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

С остальным уже сложностей не будет.

Сколько раз мы это слышали только лишь в этой теме?

"Я не знаю какой там коэффициент, я просто паять умею. "

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

 

2 часа назад, korsaj сказал:
void TimeToStr(char[] str, long value)
{
  long min = value / 60  * 1000;
  char sec = value % 60;
  LongToStr(str, min);
  str[8] = ':';
  str[9] = (sec / 10) + 48;
  str[10] = (sec % 10) + 48;
  str[11]=0;
}

Так этот код с расчётом времени вообще не работает.

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

Я прошу только дать мне последовательность действий для пересчёта полученного времени в минуты и секунды. Чтоб я мог вообще понять как это вообще работает? Как ты до этого описывал перевод чисел. Там я всё понял как действовать нужно. Поняв логику пересчёта я может и сам напишу себе функцию.

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

Ой, не морочте мне голову...
image.png.7ce50ff9a1c484978df3c0cfb66683cd.png

Спойлер
/*
 * tifaso.c
 *
 * Created: 07.05.2024 18:09:29
 * Author : korsaj )))
 */ 

#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;
char ind7=0;
char ind6=0;
char ind5=0;
char ind4=0;
char ind3=0;
char ind2=0;
char ind1=0;
char ind0=0;
char dec=0;
char chl=0;
char def=0;
char dek=0;

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

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

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
#define LCD_STR_SIZE 20

char rx_buf[BUF_SIZE];
char str[LCD_STR_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;
}

char CharToInt(char c)
{
	char chl=0;
	if ('0' <= c && c <= '9')
	{
		chl=c-48;
	}
	else if ('A' <= c && c <= 'F')
	{
		chl=c-55;
	}
	return chl;
}

void LongToStr(char str[], long value)
{
	for (char i = 10; i > 0; i--)
	{
		str[10 - i] = (char)((value % 10) + 48);
		value = value / 10;
	}
	str[11]=0;
}

void TimeToStr(char str[], long value)
{
	long min = value / 60  * 1000;
	char sec = value % 60;
	LongToStr(str, min);
	str[2] = ':';
	str[1] = (sec / 10) + 48;
	str[0] = (sec % 10) + 48;
	str[11]=0;
}

int main(void)
{
	init_pin();
	init_UART();
	//TimeToStr(str, 0xDDDF);
	
	_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_pos(0,10);
			lcd_str("BT201");
		}
		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,10);
			lcd_str("BT201");
		}
		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_pos(0,10);
			lcd_str("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,10);
			lcd_str("BT201");
		}
		
		char i = 0;
		if (rx_buf[i] == 'M'){
			i++;
			if (rx_buf[i] == '1')
			{
				LED_1_ON();
				LED_2_OFF();
				
				long dec = CharToInt(rx_buf[3]);
				dec = dec*16 + CharToInt(rx_buf[4]);
				dec = dec*16 + CharToInt(rx_buf[5]);
				dec = dec*16 + CharToInt(rx_buf[6]);
				dec = dec*16 + CharToInt(rx_buf[7]);
				dec = dec*16 + CharToInt(rx_buf[8]);
				dec = dec*16 + CharToInt(rx_buf[9]);
				dec = dec*16 + CharToInt(rx_buf[10]);
				
				
				TimeToStr(str, dec);
				
				lcd_pos(0,0);
				send_byte(rx_buf[3],1);
				lcd_pos(0,1);
				send_byte(rx_buf[4],1);
				lcd_pos(0,2);
				send_byte(rx_buf[5],1);
				lcd_pos(0,3);
				send_byte(rx_buf[6],1);
				lcd_pos(0,4);
				send_byte(rx_buf[7],1);
				lcd_pos(0,5);
				send_byte(rx_buf[8],1);
				lcd_pos(0,6);
				send_byte(rx_buf[9],1);
				lcd_pos(0,7);
				send_byte(rx_buf[10],1);
				
				for (char n = 0; n < 8; n++){
					lcd_pos(1,n);
					send_byte(str[n],1);
				}
				
				send_UART(ind7);
				send_UART(ind6);
				send_UART(ind5);
				send_UART(ind4);
				send_UART(ind3);
				send_UART(ind2);
				send_UART(ind1);
				send_UART(ind0);
				send_UART(0x0D);
				send_UART(0x0A);
				_delay_ms(250);
			}
			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");
			lcd_pos(0,10);
			lcd_str("BT201");
		}
		
		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");
			lcd_pos(0,10);
			lcd_str("BT201");
		}
	}
}

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

 

 

@tifaso ей Богу, придам анафиме...

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

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

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

Потому то и говорю что оно совершенно не работает.

Интересно, а это как. До того как я исправил ошибки объявления функций он работал, а теперь не работает?

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

Вы код то смотрели?

Походу нет.

В отличии от @CruelAsm

@tifaso у вас есть две функции CharToInt  и TimeToStr, с первой вы разобрались, со второй предстоит. Функция TimeToStr принимает два аргумента: массив str и число содержащее секунды. Выводит время в формате ммммм:сс в тот самый массив str и далее он в цикле выводится на экран второй строкой. Дальше сами решайте где использовать эти функции и что куда выводить.

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

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

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

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