Jump to content

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


 Share

Recommended Posts

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

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Выгодные LED-драйверы MOSO для индустриальных приложений

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

Читать статью>>

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

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

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

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

Link to comment
Share on other sites

ER10450 – литий-тионилхлоридная батарейка FANSO EVE Energy формата ААА
Компания FANSO EVE Energy расширила номенклатуру продукции, разработав новый химический источник тока (ХИТ) – батарейку литий-тионилхлоридной электрохимической системы (Li-SOCl2; номинальное напряжение 3,6 В) типоразмера ААА – ER10450. Батарейка имеет бобинную конструкцию (тип Energy) и предназначена для долговременной работы при малых токах.
Батарейка может применяться в приборах учета ресурсов, в различных датчиках, устройствах IoT и в других приборах и устройствах, в которых требуется компактный ХИТ соответствующей емкости.
Подробнее >>

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

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

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

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

Edited by COKPOWEHEU

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

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

Link to comment
Share on other sites

Новое семейство HRP/N3 от MEAN WELL – ИП с 350% перегрузкой для промышленных приложений

В промышленных устройствах и установках с электроприводом на двигателях постоянного тока в момент пуска требуется обеспечить повышенный ток. Для решения этой задачи MEAN WELL предлагает вместо ИП с повышенной избыточной мощностью, более оптимальное решение - источник питания с необходимой перегрузочной способностью семейства HRP/N3. 

Новое семейство, представленное в Компэл, экономичнее и расширяет уже существующее HRP/N в увеличении кратности перегрузки. Подробнее>>

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

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

Edited by serenbkii
Link to comment
Share on other sites

  • 1 month later...

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

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

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

{

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

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

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

}

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

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

Link to comment
Share on other sites

Передача аргумента в прерывание
Интересно, какие Вы хотите аргументы передавать в прерывание, и "кто" их будет передавать ?
Link to comment
Share on other sites

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

Link to comment
Share on other sites

  • 2 weeks later...

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

среда 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

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

что не так?

Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

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

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

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

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

Т.к. что там находится по адресу 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;
}
}

Link to comment
Share on other sites

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

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

Link to comment
Share on other sites

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 раз.

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Ерунду говорите, сударь. Это обычная структура, а RB3 - её битовое поле. Си очень хорошо это всё знает.
Link to comment
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.

×
×
  • Create New...