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

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


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

думал, вы скажете что это компьютер.

Нет, в роли компьютера будет ваш контроллер. Иначе, для чего он вообще нужен?

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

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

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

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

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

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

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

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

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

Карты бывают разные. Я же не сказал, что она должна быть IBM совместимая :)

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

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

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

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

Добрый вечер, товарищи! Совсем недавно начал изучать микроконтроллеры. И решил начать с фирмы Texas Instruments. Хочу собрать схему, показанную на рисунке 1. Т.е с помощью кнопки переключать светодиоды. Написал код программы:

#include "msp430f1121.h"

int main(void)

{

WDTCTL = WDTPW + WDTHOLD;

P1DIR |= BIT1 + BIT3;

P1OUT = 0x00;

P1OUT |= BIT2;

while(1)

{

if((P1IN & BIT2)==0)

{

P1OUT |= BIT1;

P1OUT &= ~BIT3;

}

else

{

P1OUT |= BIT3;

P1OUT &= ~BIT1;

}

}

}

IAR ругаться на нее не стал. Сначала решил промоделировать схему в протеусе, использую выходной файл .hex . Но вот протеус стал ругаться и выдавать вот такую ошибку:

Error reading HEX file D\....\(location): Colon expected at start of line..

Real Time Simulation failed to start.

Ума не приложу в чем ошибка! Но самое главное протеус работает нормально, прошивка, скачанная из интернета для других МК работает.

Прошу, помогите мне! Заранее благодарю всех!smile.png

post-191122-0-74823900-1431892090_thumb.jpg

post-191122-0-47098400-1431892091_thumb.jpg

post-191122-0-28710400-1431892092_thumb.jpg

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

У HEX-а есть два принципиально разных формата, видать IAR генерирует несовместимый формат файла. Надо бы покопаться в компиляторе и переключить на другой.

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

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

Методом тыка. Открой его в блокноте и посмотри, открой те что в протеусе работают и тоже посмотри.

А на счет программы - практика покажет.

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

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

А мне нравится кнопка с батарейкой :crazy:

Когда я впервые открыл протеус, я промодeлировал именно такую схему.

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

Вроде создает. Сейчас попробовал скомпилировать файл с этим расширением, протеус выдал еще больше ошибок. А как блокнотом открыть файл .hex?

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

Это не файл прошивки, это точно. Это какой-то левый двоичный файл. Скорей всего, что-то не так сделано и компилятор сохраняет в .HEX что-то совсем другое. Судя по всему, это готовый объектный файл.

Настоящий .HEX-файл должен быть текстовым и вполне удачно открываться блокнотом.

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

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

#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include "lcd.h"
void uart_init( void )
{
//настройка скорости обмена
UBRRH = 0;
UBRRL = 12;// 4800 скорость
//8 бит данных, 1 стоп бит, без контроля четности
UCSRC = ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 );
//разрешить прием и передачу данных
UCSRB = ( 1 << TXEN ) | ( 1 <<RXEN );
}
void uart_putc( char g )
{
//ждем окончания передачи предыдущего байта
while( ( UCSRA & ( 1 << UDRE ) ) == 0 );
UDR = g;
}

void uart_puts( char *str )
{
unsigned char g;
while( ( g = *str++ ) != 0 ) {
uart_putc( g );
}
}
int main( void )
{
uart_init();
while( 1 )
{
uart_puts( "Hello \r\n" );// r,n- переход на новую строку
_delay_ms(1000);
 }
return 0;
}

хочу передать с мк атмега32 через uart длинный код для проверки частоты , помогите разобраться где что не так ? при пошаговой проверке ноут завесает в студии

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

а в реальности всё работает. измерил чистоту примерно подогнал . теперь надо на lcd принятое слово вывести . т.е. как из всех букв собрать в слово и передать на экран ?

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

Добрый вечер. Такой вопрос. Кто знает зачем ставят резистор между линиями Rx Tx UARTа. Резистор 240к. Увидел такое в готовм устройстве, до этого не видел ниразу.

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

терминатор видимо

для линий связи значительной длинны полезная штука от помех. Если линия 2-5 метров, можно не заморачиваться

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

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

Встречал такое, когда два прибора связаны по одной линии. Т.е. Rx подсоединяется напрямую, а Tx для ограничения тока, уже через резистор. Для чего так сделано х.з. Обычно резистор ставится от "звона" между линиями RS482/RS422, но там - десятки Ом.

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

не ну к.з. батарейки при помощи кнопки это вещь !!! но у меня другой вопрос нужно организовать буфер на 20 символов в программе на приёме uart и только после этого выводила принятое сообщение из 20 символов на экран lcd . или покажите готовый кусок кода и где он должен стоять

ниже привожу код который:

передаёт сообщение по уарт на п.к., если пришёл символ с п.к. отображает на lcd экране и обратно всё снова(работает цеклично)

. код уже проверял работает с м.к.atmega32

#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include "lcd.h"
#define F_CPU 1000000// не на что не влияет
void lcd()
{
init_port(); // инициализируем порт A для lcd
lcd_init(); // инициализируем ЖКИ десплей
lcd_clear();
}
// работа с usart
void uart_init( void )
{
//настройка скорости обмена
UBRRH = 0;
UBRRL = 12;// 4800 скорость
//8 бит данных, 1 стоп бит, без контроля четности
UCSRC = ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 );
//разрешить прием и передачу данных
UCSRB = ( 1 << TXEN ) | ( 1 <<RXEN );
}
unsigned char uart_getc( void )
{
//ждем приема байта
while(( UCSRA & ( 1 << RXC )) == 1);
//считываем принятый байт
return UDR;
//1 вот сдесь нужно собрать слово скорее всего через буфер
}
void uart_putc( unsigned char g )
{
//ждем окончания передачи предыдущего байта
while( ( UCSRA & ( 1 << UDRE ) ) == 0 );
UDR = g;
}

void uart_puts( char *str )
{
unsigned char g;
while( ( g = *str++ ) != 0 ) {
 uart_putc( g );
}
}

int main( void )
{
uart_init();
unsigned char  g;
uart_puts( "Hello uart\r\n" );// r,n- переход на новую строку
lcd();
while( 1 )
{
  lcd_clear();
 lcd_putstring("zapusc");
  _delay_ms(2000);
  uart_puts("Hello drug" );// r,n- переход на новую строку
 lcd_clear();
 lcd_putstring("GOTOV"); //выводим строку на lcd-Done AT Home

 g = uart_getc();

   _delay_ms(10);
   lcd_putchar( g );
 _delay_ms(1000);
 }
   return 0;
}

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

и ещё такой вопрос если разница между этими кодами а то попадаются примеры в которых по разному написано

while(( UCSRA & ( 1 << RXC )) == 1);//ждем приема байта
return UDR;

и этим

while(!( UCSRA & ( 1 << RXC )));//ждем приема байта
return UDR;

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

Есть. Первая запись в общем случае неправильная. Правильно ее исправить на

while((UCSRA & (1<<RXC)) != 0);

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

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

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

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

 for (int m=0;m<=9;m++ )
  {
   g = uart_getc();
   lcd_gotoxy(m,1);
   lcd_putchar( g );
  }

который отдалённо имеет что то схожее и теперь появляются строчки на экране

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

Написать буфер не так сложно. Для интерфейсов в общем случае больше подходит список (FIFO), но в частном может быть удобнее массив с произвольным доступом. Для простейшего случая можно обойтись массивом, а после заполнения забирать оттуда всю информацию одновременно. Для этого можно завести массив и переменную, хранящую сколько байт принято. По приему очередного байта (по прерыванию, например) записываем в конец массива принятый байт и увеличиваем счетчик. В основной программе проверяем, не равен ли счетчик размеру массива и если равен - забираем все данные из массива и сбрасываем счетчик в ноль.

Полный код писать не буду, хотя это было бы проще, чем текстовое описание.

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

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

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

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

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

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

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

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

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

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

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

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

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

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