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

Язык СИ для микроконтроллеров


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

Компилятор Atmel Studio 6.1. Пробовал все предложеные варианты. Никак не получается побитово с портами общаться. Запись типа portc == 0b00000001 лишает возможности использовать целых 7! пинов порта. В соседней ветке предложили использовать if(~PINC&(1<<0)) и if((PINC^(1<<0))&(1<<0)) вроде получалось, после долгих попыток подставлять разные числа и варианты, сейчас опять ничего не получается.

код с предыдущего сообщения проверил, компилится, но в протеусе не работает. Может компилятор сменить?

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

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

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

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

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

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

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

Ни в коем случае. Дело в том, что я ещё не видел на форуме упоминаний атмел студии, вот и подумал, что её среда разработки и компил не могут нормально подхватить код, который у всех работает нормально. Обучение только началось и знаний почти ноль, даже базовые знания Си++ ещё толком не освоены и потихоньку доходят до понимания. А вера протеусу из- за того, что возможности работать на реальном железе пока нет, жду прихода комплектующих и инструмента.

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

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

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

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

Конструкции, типа

if(var&(1<<n)){...} // Проерка бита n в переменной var на еденицу
if(!(var&(1<<n))){...} // Проерка бита n в переменной var на ноль

должны работать в любом компиляторе.

Вместо var вставляем порт, вместо n - номер тестируемого бита.

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

код с предыдущего сообщения проверил, компилится, но в протеусе не работает. Может компилятор сменить?

Это может быть,никак не запомню какой из операторов, "&" или "&&" когда использовать, обычно проверяю отдельно. Возможно стоит поменять оператор. Сразу же предупредил что правильность работы программы гарантировать не могу, код был как пример обращения к биту в байте по номеру.

Второе, как и куда подключена кнопка? Должна замыкать PC0 и землю. При этом на PORTB будет "цветомузыка".

И, кстати, было бы неплохо указать тактовую частоту, либо компилятору либо #define F_CPU 1000000 //1МГц внутреннее тактирование в коде.

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

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

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

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

Конструкции, типа

if(var&(1<<n)){...} // Проерка бита n в переменной var на еденицу
if(!(var&(1<<n))){...} // Проерка бита n в переменной var на ноль

должны работать в любом компиляторе.

Спасибо. Работает.

Второе, как и куда подключена кнопка? Должна замыкать PC0 и землю. При этом на POERB будет "цветомузыка".

И, кстати, было бы неплохо указать тактовую частоту, либо компилятору либо #define F_CPU 1000000 //1МГц внутреннее тактирование в коде.

подключено верно, приложил схему. Частота у меня указана, без частоты паузы не выставляются.

post-169402-0-38708300-1371399249_thumb.jpg

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

  • 1 месяц спустя...

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

Реализуется с помощью цикла for

if (var & ( 1<< n )) кнопка нажата

{

for ( i=0; i <= 10; i++ ); выдержка

if (var & ( 1<< n )) снова проверяем нажата ли кнопка

{ выполняем все необходимые действия }

}

Короче как-то так.

Будьте проще и люди к вам потянутся.

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

  • 2 недели спустя...

сюр какой-то....

среда MPLAB IDE 8.92

подключил С18 v3.43

создал проект для pic18f2550

из папки примеров взял код типа дрыгаем ногами по таймеру0


#include <p18cxxx.h>
#include <timers.h>

#define NUMBER_OF_LEDS 8

void timer_isr (void);

static unsigned char s_count = 0;


#pragma code low_vector=0x18
void low_interrupt (void)
{

 _asm GOTO timer_isr _endasm
}


#pragma code

#pragma interruptlow timer_isr

void
timer_isr (void)
{
 static unsigned char led_display = 0;

 INTCONbits.TMR0IF = 0;

 s_count = s_count % (NUMBER_OF_LEDS + 1);

 led_display = (1 << s_count++) - 1;

 PORTB = led_display;
}

void
main (void)
{

 TRISB = 0;
 PORTB = 0;

 /*
  * Enable the TMR0 interrupt, setting up the timer as an internal
  * 16-bit clock.
  */
 OpenTimer0 (TIMER_INT_ON & T0_SOURCE_INT & T0_16BIT);

 INTCONbits.GIE = 1;

 while (1)
   {
   }
}

откомпилировал, ошибок нет,

подключаю протез - не работает,

подключаю сим млаба,смотрю файл регистров - вижу следующие:

T0CON=0b10011111 (таймер вкл, 16бит вкл, такт от OSC без прескалера)

TMR0L - приращение есть....

TMR0H -приращения нет....confused.gif

собственно в прерывание не попадаем....

что не так?

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

может попробовать volatile unsigned char s_count = 0; В Пиках не смыслю, но может поможет. volatile - указание компилятору, что, даже в целях оптимизации, значение переменной должно всегда сбрасываться в память после изменения (они-то идут в регистрах а не ОЗУ).

Что дает static в приложении к глобальной переменной - не знаю, просветите кому не лень.

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

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

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

Что дает static в приложении к глобальной переменной - не знаю, просветите кому не лень.
Ограничивает область видимости данным файлом.

Назначение модификатора volatile - отключить оптимизацию.

http://www.edaboard.com/thread197899.html - вот похожая тема, почитайте, большинство встречаемых проблем давно уже разобраны на просторах интернета.

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

http://www.edaboard....read197899.html - вот похожая тема, почитайте

Спб. почитал... там нет решения... с таймером я разобрался - нужно было смотреть регистр TMR0_internal...

то же дошел до прямой инициализации таймера и прерывания, ничего не поменялось... проблема осталась и она в другом: по переполнению таймера программа в симе вместо перехода на вектора прерывания переходит на вектор сброса... :crazy::wall: :wall: :wall:

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

Назначение модификатора volatile - отключить оптимизацию.

Только для данной переменной. Вообще, volatile используется именно тогда, когда переменная должна изменяться или использоваться в прерывании.

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

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

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

IMXO, по умолчанию (если не включать приоритеты) у всех модулей высокий приоритет. Соответственно, обработчик должен лежать по 0x08, а не 0x18.

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

это понятно... тогда по переполнению таймера прога должна уходить на 0х08 и благополучно доходить до 0х18 или нет?

а оная в симе уходит на 0х00

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

или нет?
Конечно или нет. Т.к. что там находится по адресу 0x08, до адреса 0x18, неизвестно.

В любом случае, сделай обработчик высоких приоритетов, или включи приоритеты и дай таймеру низкий приоритет.

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

Т.к. что там находится по адресу 0x08, до адреса 0x18, неизвестно.

В любом случае, сделай обработчик высоких приоритетов, или включи приоритеты и дай таймеру низкий приоритет.

по адресам 0х04 и 0х14 компилятор ставит return 0

но все равно не понятно почему в случае отсутствия ОВП переход идет на 0х00 , а не на 0х08 или 0х18...

так и сделал...добавил обработчик высокого приоритета , назначил приоритет для таймера все пошло...

#include <p18cxxx.h>
//#include <timers.h>
//#pragma config OSC = HS, OSCS = OFF
#pragma config PWRT = OFF
#pragma config BOR = OFF
#pragma config WDT = OFF
//#pragma config CCP2MUX = OFF
#pragma config LVP = OFF
#define NUMBER_OF_LEDS 8
void timer_isr (void);
void button (void);
static unsigned char s_count = 0;

#pragma code high_vector_section=0x8
void
high_vector (void)
{
_asm GOTO button _endasm
}

#pragma code low_vector=0x18
void low_interrupt (void)
{
_asm GOTO timer_isr _endasm
}

#pragma code
#pragma interruptlow timer_isr
void
timer_isr (void)
{
static unsigned char led_display = 0;
/*
* Clears the TMR0 interrupt flag to stop the program from processing the
* same interrupt multiple times.
*/
INTCONbits.TMR0IF = 0;
TMR0H=0xff;
TMR0L=0x50;
LATB = LATB^0b00000110;
}
#pragma interrupt button
void
button (void)
{
_asm nop nop _endasm
}

void
main (void)
{
/*
* Initialize the special function registers TRISB and PORTB.
*/
ADCON1=0xff;
TRISB = 0;
PORTB = 0;
/*
* Enable the TMR0 interrupt, setting up the timer as an internal
* 16-bit clock.
* Enable global interrupts.
*/
TMR0H=0xff;
TMR0L=0x50;
T0CON = 0b10011111;
INTCONbits.TMR0IF = 0;
RCONbits.IPEN=1;
INTCON2bits.TMR0IP = 0;
INTCONbits.T0IE = 1;
INTCONbits.GIEL = 1;
INTCONbits.GIE = 1;

while (1)
{
_asm nop nop _endasm
INTCONbits.GIEL = 0;
LATB = LATB^0b00000001;
INTCONbits.GIEL = 1;
}
}

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

Вот что получилось. Самое то что надо было.

http://forum.cxem.ne...ttach_id=233720

что бы получить такую последовательность можно просто прибавлять счетчик и проверять бит0 и бит3

асм для авиров не знаю вот код на Си

while(1)
{
counter++;
if(counter.bit0)
 {
  if(counter.bit3)
  {
   PORTB.RB3=1;
  }
 else
  {
  PORTB.RB4=1;
  }
}
else
{
 PORTB.RB3=0;
 PORTB.RB4=1;
}

delay();
}

post-124881-0-69044900-1376720219_thumb.jpg

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

PORTB.RB3=1; Такого Си не знает. Даже, в стиле cvavr (PORTB.3=1) тоже не знает. Именно Си знает что-то вроде PORTB |= (1<<3); Аналогично с counter.bit3, без извращений такое не сделать а с извращениями больно громоздко выглядит. Лучше уж if(counter & 0b00001001) для первого сравнения. Извращения это создание своей структуры

typedef union{
unsigned char value;
struct{
 char bit0:1;
 char bit1:1;
...
 char bit7:1;
}bits;
}struct_name;

к которой и обращаться надо как struct_name.value=0xAA; struct_name.bits.bit0=1; Может можно и покороче, но вряд ли проще чем с битовыми масками.

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

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

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

PORTB.RB3=1; Такого Си не знает.

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

для пиков на асме это выглядело бы так:

cicle:	
 incf counter,f
 btfss counter,0
	 goto label_1
	 btfsc counter,3		
		 bsf PORTB,3
	 btfss counter,3		
		 bsf PORTB,4
	 goto label_2
label_1	 bcf PORTB,3
  bcf PORTB,4
label_2	 call Delay
cicle_end goto cicle

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

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

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

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

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

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

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

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

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

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

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

  • Сообщения

    • Ну так а в чем проблема сравнить те символы которые определяют команду/ответ. Приведите пример команды и ответа, а я вам покажу как сравнивать.
    • Для домашних измерений можно ограничиться определением уровня свечения лампочки  "на глаз" - всё равно это будет точнее амперметров на снимке вверху .  Метод фотоамперметра применяется в метрологических лабораториях  для сложных и ВЧ сигналов . 
    • @korsajЧего то я не совсем понимаю как данную функцию вызывать проверять с конкретными данными. Тем более что у меня в большей части данные которые я буду получать я не знаю полученную информацию там только известны первые символы и последние символы, а в середине хранятся данные которые каждый раз разные. Вот в том то и вся суть приёма данных. Чтобы можно было получить данные и вывести на индикаторы. Так что вариант сравнения строк тут наверное мало поможет. Тут как я понимаю нужно сравнивать конкретные символы и всю информацию между этими символами отдавать уже в обработку программе для вывода на индикацию. Потому как известно что сколько символов занимают данные то есть длинна принятой посылки всегда одинакова для определённого типа информации. Сейчас разбираюсь с UART в меге на передачу я уже всё сделал и оно работает, но на приём пока есть некоторые сложности.
    • И в чем проблема? управлять модулем атмегой16 смог?
    • Наверное существуют, но как реализовать данный алгоритм для самодельной конструкции ? Но постоянный и пульсирующий то же не одно и то же. В том то и проблема . КАК его мерить ?
    • Переменный и пульсирующий постоянный ток- не одно и то же.
    • Я не плавную регулировку тока. Я про увеличить ток заряда с 6 до 10 ампер, и всё. Подобрать ёмкости C14/C15 - по каким параметрам? Поменять ключи на более низкоомные - я хотел поставить например BUV48A или 2SC3320. Пойдут на замену 2SC2335 которые сейчас стоят? А вот этот самый "резистор обмоток связи R19" уже достал! На всех зарядках он набран из 8, бывает из 10 SMD резисторов под которыми выгорает текстолит. Падла греется до 150 градусов. В этом экземпляре, стыдно даже писать его название, Striver PW-150 всё по другому. Зарядка собрана этажеркой, да так криво и нелепо, что выглядит в 100 раз хуже многих самоделок. Так вот этот "резистор обмоток связи R19" тут стоит обычный на 1 или 2 Вт - кетайский, его хрен поймёшь. Я поставил керамический - цементный на 5 Вт - нагрев 75 градусов при 5 амперах. Что ж туда ставить то? 10-20 ваттные проволочные? А вот с делителем R4/R5/R6 я не согласен! Тут за пороги вкл-выкл циклов заряд - пауза отвечает другая часть микросхемы. В этом я уже убедился, регулировку порогов делаю подстроечным резистором на 2 ноге 393. В этих зарядках и схемах часто перепутаны компараторы. Ваше утверждение про 5, а точнее 6 ногу относиться к другим схемам и зарядкам.  Резистором R7 определяется разница между напряжением окончания и начала зарядки. А вот это ценная информация - никак не мог понять как сократить минимальный и максимальный порог заряда.
  • Похожий контент

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