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

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


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

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

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

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

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

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

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

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

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

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

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

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

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

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

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

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

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

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

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

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

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

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

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