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

Вопросы от начинающих по МК


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

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

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

Концевик это тоже логический сигнал 0-12В, напрямую подключать к контроллеру длинные провода которые могут висеть в воздухе и в процессе ремонта автомобиля на них может быть случайно подано 12В - это верная смерть контроллеру, вопрос лишь времени. А концевики лучше всего завести вообще через оптроны. Проблема в то что их нулевой уровень(масса) может сильно отличаться от нуля за который считает контроллер и даже при замыкании концевика потенциал для контроллера все равно будет выглядеть как лог.1. Особенно такие приколы возникают при работе стартера и включении мощной нагрузки в бортсеть.

Учение - изучение правил. Опыт - изучение исключений.

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

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

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

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

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

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

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

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

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

Здравствуйте. Подскажите пожалуйста. Что то совсем дойти не могу.

пишу код в AVR Studio 4.

#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
DDRD = 0xFF;

while(1)
{
PORTD = 0xFF;
_delay_ms(1000);
PORTD = 0x00;
_delay_ms(1000);
}
return 0;
}

потом пытаюсь в протеусе посмотреть как все работает. но задержка не совпадает с той что стоит в программе.

т.е пауза между включением диода и отключением.

что я делаю не так ? в протеусе частота в настройках микроконтроллера стоит тоже 8МГц

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

Ну так задержка определяется от частоты кварца, допустим 1000мкс( твоя задержка ) при кварце 1МГц даст задержку в 1секунду, при кварце 8МГц уже будет не 1 секунда а другое время

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

подскажите, как реализовать

переменная char id_e хранится в eeprom, извне (например по usart) приходят данные вида char id

как сравнить id и id_e и при совпадении прочитать новую id и перезаписать её в id_e?

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

в личке у вас

в личку то зачем??? в тему выложить проект никак?

1. что делаем это командой

if (w1_read=="on_engine")

функция описана как unsigned char каким образом сравниваем со стринговой константой

2. что делаем этой функцией

		  w1_read(id_device);

аргумент функции описан как unsigned char , id_device как int , какой результат ожидаем?

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

что я делаю не так ? в протеусе частота в настройках микроконтроллера стоит тоже 8МГц
Кроме того, в протеусе по дефолту активно деление частоты на 8, его надо отключить. У тебя программа выполняется на тактовой частоте 1Мгц, когда рассчитана на 8Мгц.
работал с USAR???

А что с ним не так?

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

Учение - изучение правил. Опыт - изучение исключений.

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

Ну так задержка определяется от частоты кварца, допустим 1000мкс( твоя задержка ) при кварце 1МГц даст задержку в 1секунду, при кварце 8МГц уже будет не 1 секунда а другое время

Не знаю извесно вам это или нет, но на задержу влияют 4 фактра, про кварц вы уже упомянули, а вот про фьюзы и константу F_CPU забыли, ну и конечно значение передаваемое функции _delay_ms(х). И даже если у вас кварц на 1Mhz, а задержка в 1000мс, но F_CPU установлен в 8000000UL, то задержка будет в 8 раз длиннее, ну и наоборот. Так что значение F_CPU так же важна как и частота кварца.

Такой нормальный?И программка к нему русская есть?

Назвали они его конечно странно, но свиду похож на USBASP, так что можно смело брать (на ebay в два раза дешевле обойдется).

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

F_CPU - это ж вроде и есть частота кварца?

По идее да, но в реальности может быть что угодно. Эта константа нужна, что бы функции из библиотеки delay.h правильно высчитывали время задерек. Надеюсь вы понимаете что при выполнении _delay_ms(100) мк не буквально ждеть 100мс, а делает что-то определенное количество раз, и от этого количества и зависит длительность задержки. Так вот, если бы вы писали не на Си, а на ассемблере- вам пришлось бы все высчитывать самому, опирась на частоту процессора и сколько тактов занимает та или иная команда.

Как например здесь (можете попробовать подсчитать время задержки при 1Mhz):

ldi r16, 255 ;Загрузка значения в регистр r16
ldi r17, 255 ;Загрузка значения в регистр r17
delay:		 ;Цикл задержки
subi r16, 1 ;Вычитание 1 из регистра r16
sbci r17, 0 ;Вычитание с переносом из регистра r17
brcc delay ;Если не было переноса вернуться к метке delay, а если был идти дальше.

Но так как здесь мы пишем на Си, а компилятор не знает на какой там частоте наш мк пашет,то в результате у него нету нужных данных для подстета количества повторений "ничего-не-делающего-кода" для получения нужной нам задержки. Так вот, константа нужна именно для того что бы дать компилятору пищу для расчетов, и единственное что нам остаеться сделать- это подобрать эту константу как можно ближе к реальной частоте мк.

Как-то так :)

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

Если только питание надо, то usb выдержит. Драйвер vusb в ATtiny13 скорее всего не влезет, надо хотя бы 2кБ флеша, хотя лично не проверял, может и можно извратнуться. MAX232 это преобразователь RS232 в UART, при подключении к USB бесполезен.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Здравствуйте господа профессионалы. Я тут небольшую программку написал в процессе обучения. Хотелось бы услышать критику. Что правильно ,что нет. Как сделать лучше и т.д. Сама программа вроде работает. В протеусе проверил. Если кому нибудь будет не лень глянуть и что то посоветовать , буду рад.

// Atmega 328P
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

void InitUSART(void);
void USART_Transmit( unsigned char data );
void sent_str(unsigned char* str);
unsigned char USART_Receive( void );
int temp = 0;
ISR(USART_RX_vect)
{
temp = UDR0;
}
int main(void)
{

unsigned char *st ;
unsigned char text[] = "Hello! It is MEGA 328 !!!";

InitUSART();

DDRB = 0xFF;
DDRC = 0xFF;
DDRD = 0xFC;



st= text;
sent_str(st);
USART_Transmit(13);
unsigned char i=0; // для счетчиков циклов
unsigned char count = 0; // для доп. счетчиков
while(1)
{

switch (temp)
		 {
		 case '1': // моргание красными
 if (i==1)
 {
	 PORTB = 0x00;
	 i=0;
	 _delay_ms(100);
 }
 else
 {
	 PORTB = 0xFF;
	 i=1;
	 _delay_ms(100);
 }
 break;


 case '2': // красный бегает по кругу
	 PORTB = 0x00;
	 unsigned char var=0;
	 unsigned char add=1 ;
	 for(i=0;i<=8;i++)	
	 {
	 if((var+add)>255)
		 {
			 var = 0;add=1;
		 }
		 var = var+add;
		 PORTB = var;
	 add=var;
		 _delay_ms(100);
	 }

 break;

 case '3': // строб синий красный
		 PORTB = 0x00;
 PORTC = 0x00;
 PORTD = 0x00;
 for(i=0;i<5;i++)
 {
	 PORTB = 0xFF;
	 _delay_ms(50);
	 PORTB = 0x00;
	 _delay_ms(50);
 }
 for (i=0;i<5;i++)
 {
	 PORTC = 0xFF;
	 PORTD = (1<<PORTD2)|(1<<PORTD3);

	 _delay_ms(50);
	 PORTC = 0x00;
	 PORTD ^=(1<<PORTD2)|(1<<PORTD3);
	 _delay_ms(50);
 }
 break;

 case '4': // бегущие огни 2
	 count = 3;
	 for(i=0;i<8;i++)
	 {
	 PORTB = count;
	 _delay_ms(100);
	 if (count == 192)
		 count = 129;
	 else
		 count *=2;
	 }


 default:
 PORTB = 0x00;
}

}
}
void InitUSART()
{
asm("sei"); // глобальное прерывание
#define Baud 250000UL // скорость
#define baudrate (F_CPU/(Baud*16UL)-1) // делитель
UCSR0B = (1<<TXEN0)|(1<<RXEN0)|(1<<RXCIE0); // разррешение приёма передачи и прерываний по завершению приёма
UCSR0C = (1<<UCSZ00)|(1<<UCSZ01); // 8 бит посылка
UCSR0A = 0x00;
UBRR0H = (baudrate>>8);
UBRR0L = (baudrate);
}
void USART_Transmit( unsigned char data )
{
while ( !( UCSR0A & (1<<UDRE0)) );
UDR0 = data;
}
void sent_str(unsigned char* str)
{
while((*str) != '\0')
{
USART_Transmit(*str);
str++;
}
}
unsigned char USART_Receive( void )
{

while ( !(UCSR0A & (1<<RXC0)) );

return UDR0;
}

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

В прерывании необходимости нет... Проверяешь в начале цикла принят ли байт, и там же его читаешь если да.

В данном случае ты сделал классическую ошибку - переменная temp может быть изменена в процессе проверки, судя по всему это изменение с очень высокой степенью вероятности попадет не вовремя, т.к. эта переменная постоянно в работе. Тем не менее, проблем в этой программе ты не увидишь - происходит она редко и приводит к незначительной погрешности в работе программы. Но тем не менее, если не увидеть проблему в таком простом коде, то в более сложном ты можешь получить огромные проблемы, причем проблема будет настолько коварная что происходить будет на первый взгляд очень случайно и в разных местах программы, будто неисправно железо. Тут нужна либо критическая секция, либо атомарная операция с переменной temp. В прерывании она атомарная, а вот в основном коде - нет, чтобы все было правильно необходимо перед CASE скопировать один раз эту переменную в другую, и только потом делать проверки.

Учение - изучение правил. Опыт - изучение исключений.

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

В прерывании необходимости нет... Проверяешь в начале цикла принят ли байт, и там же его читаешь если да.

В данном случае ты сделал классическую ошибку - переменная temp может быть изменена в процессе проверки, судя по всему это изменение с очень высокой степенью вероятности попадет не вовремя, т.к. эта переменная постоянно в работе. Тем не менее, проблем в этой программе ты не увидишь - происходит она редко и приводит к незначительной погрешности в работе программы. Но тем не менее, если не увидеть проблему в таком простом коде, то в более сложном ты можешь получить огромные проблемы, причем проблема будет настолько коварная что происходить будет на первый взгляд очень случайно и в разных местах программы, будто неисправно железо. Тут нужна либо критическая секция, либо атомарная операция с переменной temp. В прерывании она атомарная, а вот в основном коде - нет, чтобы все было правильно необходимо перед CASE скопировать один раз эту переменную в другую, и только потом делать проверки.

Я так понял что повреждение переменной может произойти когда идет проверка в цикле этой переменной и в прерывании ей присваивается значение ?

Ушел читать про атомарные операции и критические секции.

Огромное спасибо!

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

Вопрос такой мне нужно установить фус биты так вот

http://startcd.narod.ru/clock/pony.gif

Это в пони прог

А я программировать буду через AVRdude в AVRdude мне фусы выставлять инверсно этим что в пони прог?

И как в начале залить прошивку во флеш, потом в EEPROM а потом фусы запрограмировать или разницы нету что зачем?

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

Syltetooy что такое GUI-оболочка, и что за консольная версия? Вообщем никто не подскажет?

А разобрался там есть выббрать можно как в понипрог( то есть инвертирование фус битов)

Интерессует только что за чем зашивать или без разницы?

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

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

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