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

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


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

Разделите задачу ПОПЕРЕК. Сначала заставьте обычный пин контроллера переключаться в противоположное состояние при нажатию на кнопку.

Учтите, что реальная кнопка дребезжит, т.е. в момент нажатия МНОГОКРАТНО переходит в противоположное состояние в течении ВРЕМЕНИ ДРЕБЕЗГА. Если опрашивать кнопку с периодом более, чем время дребезга и фиксировать два одинаковых подряд состояния входа с кнопки, то можно создать искомое Вами.

Работайте...

戦う前に相手のベルトの色に注目

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

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

Интересный и главное, вроде бы, простой вариант и никакой переменной объявлять ненадо. Попробую. Спасибо. Если будут у кого еще предложения, буду рад прочитать и другие варианты. Новичкам вроде меня всякое может пригодится. :)

у меня еще вопрос. В микроСи есть функция button, в которой имеется время дребезга, а размерности этого временеи не описано. Какая размерность этого времени: сек, мс или мкс?

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

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

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

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

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

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

Не знаю, но логично предположить миллисекунды. А вообще, рекомендую написать антидребезг САМОМУ, без библиотеки.

Насчет не нужно переменной - это вряд ли. По сути нужна память состояния до следующего опроса.

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

戦う前に相手のベルトの色に注目

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

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

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

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

Все, нашел. В мс. И насчет переменной Вы правы, там не обойтись, если я правильно понимаю.

Вот что у меня получилось из того, что я хотел (я понимаю, что это черновой вариант). Может кто проверит и поправит. Антидребезг я использовал библиотечный, т.к. я тока начинаю разбираться в Си. Я пробую компилировать, но он у меня начинает ругаться с самого начала. Скорей всего это из-зи того, что я неправильно обращаюсь к определенному биту порта. Не скажете как правильно в микроСи 8 обратиться к биту? Или что здесь неправильно?

char oldstate;

void signalon () {

if (PORTB.F6 == 1) {

PORTB.F3 = 1;

switch (PORTA) {

case PORTA.F0 == 0: PORTB.F0 = 1;

delay_ms (200);

PORTB.F0 = 0;

case PORTA.F0 == 0: PORTB.F1 = 1;

break;

default: PORTB.F3 = 1; }

}

}

void signoff () {

if (PORTB.F6 == 0)

PORTB.F4 = 1;

}

main () {

STATUS = 0B00100000;

OPTION_REG = 0b10000111;

TRISA = 0b00011111;

TRISB = 0;

PORTB = 0;

STATUS = 0;

while (1) {

if (Button(&PORTA, 0, 1, 1)) oldstate = 1;

if (oldstate && Button(&PORTB, 0, 1, 0)) {

PORTB.F6 = ~PORTB.F6;

oldstate = 0;

}

signalon ();

signoff ();

}

}

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

Из Мануала на MicroC :

Доступ к отдельным битам

mikroC позволяет получить доступ к отдельным битам 8-битовых переменных, типа char и unsigned short. Просто используйте операцию доступа к элементу структуры (.) с этой переменной, за которой должен следовать один из идентификаторов F0, F1, … , F7, где F7 означает самый старший бит.

Пример:

// Если RB0 установлен, установить RC0:
if (PORTB.F0) PORTC.F0 = 1

;

При этом не требуется никаких дополнительных описаний: данный тип выборочного доступа является внутренней особенностью mikroC и может использоваться в любом месте программы. Идентификаторы F0–F7 указываются большими или маленькими буквами и только в специально отведенном для них месте. Вы можете использовать свои собственные элементы структуры вместо F0–F7.

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

// Очистка бита TMR0F:
INTCON.TMR0F = 0;

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

Я пробую компилировать, но он у меня начинает ругаться с самого начала.
Не плохо бы увидеть ошибки, выдаваемые компилятором. Экстрасенсов на форуме нет !
Ссылка на комментарий
Поделиться на другие сайты

Ошибка твоя вот в чём.

Ты не правильно применяешь оператор switch case. Ты пишешь case PORTA.F0 == 0.... , а в мануале по Си указан следующий синтаксис case value1: операторы. Значение value1 должно быть простой константой либо константным выражением. Твоё условие PORTA.F0 == 0 не отвечает ни первому ни второму.

Поэтому просто замени switch case на обычные условия if...else.

Примерно так:

char oldstate;

void signalon () {
if (PORTB.F6 == 1) {
PORTB.F3 = 1; }

if( PORTA.F0 == 0 ) {PORTB.F0 = 1;
Delay_ms (200);
PORTB.F0 = 0; }
if(PORTA.F0 == 0) PORTB.F1 = 1;

else
   PORTB.F3 = 1;
}


void signoff () {
if (PORTB.F6 == 0)
PORTB.F4 = 1;
}
main () {
STATUS = 0B00100000;
OPTION_REG = 0b10000111;
TRISA = 0b00011111;
TRISB = 0;
PORTB = 0;
STATUS = 0;
while (1) {
if (Button(&PORTA, 0, 1, 1)) oldstate = 1;
if (oldstate && Button(&PORTB, 0, 1, 0)) {
PORTB.F6 = ~PORTB.F6;
oldstate = 0;
}
signalon ();
signoff ();
}
}

И ещё функции delay_ms в микроСи нету есть Delay_ms, регистр имеет значение.

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

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

Спасибо большое! :) Буду дальше изучать. Спасибо за цитату из мануалки. Я думал, что всю ее перечитал и не раз. Видимо пропустил. :unsure:

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

Под мануалом я имел ввиду не русский хелп для микроСи, а книгу по языку, которая у меня всегда под рукой. Называется "Программирование на языке Си" автор Стефан Кочан, очень рекомендую.

Извиняюсь если ввёл в заблуждение :)

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

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

Под мануалом я имел ввиду не русский хелп для микроСи, а книгу по языку, которая у меня всегда под рукой. Называется "Программирование на языке Си" автор Стефан Кочан, очень рекомендую.

Извиняюсь если ввёл в заблуждение :)

А у тебя нет ссылки на эту книгу, где ее можно спокойно качнуть?

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

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

Ну как у тебя дела с твоей программой, получается что нибудь ?

Да, вот ссылка http://zalil.ru/29894591 тоже отличная книга по языку Си, учись на здоровье :)

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

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

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

Ну как у тебя дела с твоей программой, получается что нибудь ?

Да, вот ссылка http://zalil.ru/29894591 тоже отличная книга по языку Си, учись на здоровье :)

Спасибо. Продолжаю дальнейшую разработку своей проги, пока все ок. Спасибо за помощь! :)

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

я тут проверил в протеусе прогу и увидел, что не то, что я хотел получается. А получается вот что: при включении у меня сразу горят два диода RB3 и RB4 и после нажатия кнопки RA1 (здесь уже точно должен гореть один из светодиодов) переключения между ними нет. Не можншь подсказать в чем дело?

char oldstate;

void signalon () {

if (PORTB.F6 == 1) PORTB.F3 = 1;

if( PORTA.F0 == 0 ) {PORTB.F0 = 1;

Delay_ms (200);

PORTB.F0 = 0; }

if(PORTA.F0 == 0) PORTB.F1 = 1;

else

PORTB.F3 = 1;

}

void signoff () {

if (PORTB.F6 == 0)

PORTB.F4 = 1;

}

main () {

STATUS = 0B00100000;

OPTION_REG = 0b10000111;

TRISA = 0b00011111;

TRISB = 0;

PORTB = 0;

STATUS = 0;

while (1) {

if (Button(&PORTA, 1, 10, 1)) oldstate = 1;

if (oldstate && Button(&PORTB, 1, 10, 0)) {

PORTB.F6 = ~PORTB.F6;

oldstate = 0;

}

signalon ();

signoff ();

}

}

и еще вопросик. Когда у меня RA=1 светодиод RB6 моргает, т.е. инверсия происходит постоянно. Разве он не должен изменять свое состояние только после того как RA1=0? Кнопка с NC контактами

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

Прокомментируй код, где, что ты делаешь.

Ну а на вскидку первая ошибка тут

if (Button(&PORTA, 1, 10, 1)) oldstate = 1;

if (oldstate && Button(&PORTB, 1, 10, 0))

видишь, ты кнопку пасёшь на PORTA, а во втором условии пишешь PORTB.

И ещё дам один хороший совет по отладке программ.

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

Ну, а пока от комментируй код :) и делай так всегда, когда хочешь получить помощь.

Удачи.

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

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

Спасибо! Я и остальные свои ошибки нашел. А не подскажете, можно ли использовать while в подпрограммах или он используется тока в основной программе?

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

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

Привет всем.

У меня возник такой вопрос. Пользуюсь MPLab, компилятор MCC18. Контроллер PIC18F2550

Выполняю задержку таким образом в файле user.c.

                       INTCON = 0x20;                //disable global and enable TMR0 interrupt
		INTCON2 = 0x84;               //TMR0 high priority
		RCONbits.IPEN = 1;
		INTCONbits.GIE = 1;
		T0CON = 0x61;
		TMR0L = 0;
		INTCONbits.TMR0IF = 0;
	        T0CONbits.TMR0ON = 1;
		x=0;	
                while(x<12)
		{

		}

обрабатываю прерывание в файле interrupt.c

#pragma interrupt high_isr
void high_isr(void)
{
if(INTCONbits.TMR0IF == 1);
{

INTCONbits.TMR0IF = 0;
x++;
} 
}

Как сделать, чтобы переменная x объявленная в user.c была видна и её можно было изменять в interrupt.c

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

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

1. в файле "interrupt.c" напишите extern int x;

если не прокатит:

2. вынесите объявления переменной из user.c в файл user.h, если нет у Вас user.h, то создайте его

в user.c напишите #include "user.h"

в interrupt.c напишите #include "user.h"

extern int x;

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

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

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

переставьте x++ выше по тексту, вне блока if - чтобы убедиться, что прерывание обрабатывалось.

кстати, после 32 тысяч повторов x будет отрицательным B)

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

переставьте x++ выше по тексту, вне блока if - чтобы убедиться, что прерывание обрабатывалось.

кстати, после 32 тысяч повторов x будет отрицательным B)

x обнулятся перед while

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

в общем, проблема решена. Я выставил бит в регистре T0CON для тактирования от внешнего источника.От внутреннего источника всё работает.

Как настроить работу от внешнего кварца?

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

x обнулятся перед while

Ваш код:

x=0; 
while(x<12)

а я то думал что не так посоветовал :D

Это сообщение поставляется "как есть", без каких либо гарантий. Автор сообщения не несёт какой либо ответственности

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

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

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

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

Как настроить работу от внешнего кварца?

Работу чего? Контроллера или первого таймера?

Если контроллера - это в конфиге (заголовок листинга). Там же указывается включение PLL (учетверение частоты кварца).

Если речь о первом таймере, то там LP генератор конфигурируется в T1CON, но при этом уже использовать LP в качестве системного нельзя.

Обращаю Ваше внимание на правильный выбор конфигурации кварцевого генератора. При частоте от 4 МГц и выше нужно выбирать HS, а ниже 4 МГц - XT. Район 1...4 МГц допускает оба типа.

戦う前に相手のベルトの色に注目

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

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

Не цитируите полностью предыдущее сообщение!!!

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

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

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

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

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

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

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

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

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

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

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

  • Сообщения

    • Вероятно, в разделе "Работа" вам помогут. При условии предоставления чёткого и недвусмысленного технического задания.
    • Привет кто это еще читает. Знакомый купил в Москве по адекватной цене пару  B615D, дал на диагностику перед уверенной эксплуатацией. Одна сразу в защите, большой динамик спален, усилители на высокоомную нагрузку поют, буду позже разбираться. А вот вроде бы вполне работоспособная не сдюжила и 10 минут на хорошей мощности на плотном прогрессиве. Вылетели ключи в БП и драйвера на MMBTA56. Видно что был в ремонте, возможно ключи оказались палёнкой. Есть мысль впаять вместо FQPF13N50  чуток помощней по току 18N50-e. По параметру Qg аналогичные, а по  Сg будут потяжелей, 2350пф против 1800 у 13н50-х. 
    • Ну так теперь фигня вопрос. Проверить, что кнопки невозможно замкнуть одновременно, да определить, на какой ток транзисторы нужны. По характеристикам мотора или по максимально-допустимому току диодов D1-D4. Навскидку, моторчик низковольтный, диоды тоже. Транзисторы тогда на PBSS4350 можно заменить. Они на Али почти задаром продаются.
    • Сами же понимаете, что так не может быть. Или нет "сквозняка", или схема неправильно собрана, элементы не те, битые и пр., и схема защиты не работает. Проверьте сначала работу защёлки защиты при питании от 15 В, отпаяв R19 и подавая туда медленно увеличивающееся напряжение до 1,5 - 2 В (можно с потенциометра ом на 100-500). Добейтесь, чтобы работала. Порог срабатывания измерьте. Пересчитайте в ток через резистор 0,1 Ом. Соответствует ли "правильному"? Проверьте, что у этого резистора сопротивление действительно 0,1 Ом. Запаяйте 0,1 Ом обратно. Напишите, какая лампочка. А то мало ли какая, может она не от "сквозняка", а от броска тока заряда С18 С16 мигает. Транзисторы ключей проверьте. Впаяйте вместо первичной трансформатора резистор ом 150 - 300, чтобы ток с ключей в этот "эквивалент трансформатора" не больше 50-100 мА был. Посмотрите форму напряжения на выходе ключей, в точке соединения С16 и С18, на питании после лампочки. Ищите, где ляп. Умозрительно подсказать можно только по каким-то измеренным данным. Кроме вас никто их не добудет. В общем, как в анекдоте: - Молодой человек, ну делайте же уже хоть что-нибудь!
    • Ну так можно увеличить глубину ООС, тем самым понизив чувствительность и повысив линейность
    • Судя по этой картинке   в трухе передней панели под выступающие болты и шишки паек ЗК динамиков выковыряныфрезерованы выемки, иначе бы динамики так плотно не прилегали бы к ДВП.    А оно тебе надо? "Работает - не мешай"(с)/это уже аксиома, не требующая доказательств/ , пытаясь сделать лучше, чем сделано на заводе. Сanton-ят, т.е. поют, и лучше, чем есть, тебе не сделать. Ну перенесёшь ты динамики наружу, а что тебе это даст? Кроме того, что при попытке их продать(а продавать их когда-нибудь придётся, т.к. эта акустика бюджетного сегмента без потуг на высший класс Hi-Fi) , тебе придётся объяснять потенциальному покупателю причину, по которой какой-то умник заколхозил такую переделку с акустикой, ты ничего хорошего не получишь. Задуманная тобой переделка - это по сути возня ради возни. 
  • Похожий контент

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