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

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


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

Это же форум?

Форум, но раздел - не курилка.

Начинаете - код не рабочий, пустой, работать не будет. А на вопрос "Почему ?" отвечаете, что нифига не понимаете.

То код даёте, как пример, совершенно нечитабельный.

И с наивной гордостью говорите, что Вам советовали тоже читать литературу, и что это уже всё позади. Считаете, что и на данные момент к Вам это не относится ? Что за самоуверенность такая ? :)

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

Реклама: ООО ТД Промэлектроника, ИНН: 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 (PINC == 0b01111100)
{
PORTB = 0b00000001;
}
else
{
PORTB = 0b00000000;
}

Даже так работает :crazy:

if (PINC==124)PORTB=1;else PORTB=0;

И так

// (выражение) ? ( если выражение истина ) : ( если выражение ложно )
(PINC==124?(PORTB=1):(PORTB=0));

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

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

офигеть так просто !

"Магические числа" рулят . При переделке подобных исходников, появляется только одно желание -давить таких пЕЙсателей в детстве на горшке

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

:unknw:А стопитсот скобок, это правильно? Да, так не стоит писать программу, ибо через какое то время, сам забудешь что написал. Я просто показал что можно писать как хочешь и что хочешь. А уж дальше, сам пусть решает.

Это сто процентов не правильно, и нельзя так писать. Но кто из вас попытался объяснить что написали вы?

. При переделке подобных исходников

Пробуйте уже свои писать :)

Ну и как вы считаете, они справедливы ?

Конечно справедливы... А еще... Учит других тот, кто и сам не знает. Это как раз я :yes:

офигеть так просто

Нет не просто. Это, в железе, работать не будет... Или будет чудить. Потому что не реализовано спасение от дребезга контактов и микросхема будет реагировать не только на 2 и 3 кнопки а еще и 4 и 5.

А вообще. Смотрите видео...http://forum.cxem.net/index.php?showtopic=136229 Три-пять раз на сутки...

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

Пробуйте уже свои писать :)

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

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

О каком проекте речь? Я лично, не вижу своей вины в чем либо содеянном на этом сайте. Я такой же писака как тысячи писак писакающих по всему рунету. И поди ка, розберись кто правильно говнокодит а кто нет. :rolleyes: Да и не надо так расстраиваться из за какого то кода, не стоит оно того...

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

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

if (pinc==0b1110111)

{ _delay_ms(1000);

portb=0x00;}

делей происходит при выполнении цикла и после нарушения цикла тоже такой же делей (1000)

мне нужно чтобы выкл через время а вкл моментально

я понял ребята что if так не правильно записывать на данный момент я просто записал для примера

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

щас опишу проблему по другому.допустим portb лапка 0 стоит светодиод. мне нужно чтобы светодиод тухнул через кнопку на pc0 но с делеем т. е. пропал сигнал (отключили кнопку ) через 40 сек отключился светодиод на portb лапка 0.

если писать так {_delay_ms (4500)

portb=0b00000000;}

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

кнопка офф

делей 45сек

светодиод офф

кнопка он

делей 45сек(тут мне надо чтобы он мгновенно включил его)

светодиод он

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

(отключили кнопку ) через 40 сек отключился светодиод
Т.е. светодиод 40 сек. включен.

А как тогда понимать это :

при включении кнопки мне надо чтобы светодиод сразу загорелся и не ждал делея (40 секунд)
?

Зачем его сразу же включать, если он уже включен в течении этих 40 секунд ?

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

если кнопка офф

то делей 45сек

офф светодиод

потом когда либо если я подам другой кнопкой питание на светодиод или этой же кнопкой pc0 неважно там когда это будет через 5 минут ли через 25 минут все равно при подаче на светодиод пидания произойдет делей 45 сек только потом он включится а мне над чтобы при подаче питания он включился сразу

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

Вы бы хоть знаки препинания ставили. Ничего не понятно, всё в кучу. Абракадабра какая-то, а не текст.

если кнопка офф
Что значит "кнопка офф" ? Не нажата ? Или что ?

Ну не нажата она, дальше что ? Зачем делать делей, если она не нажата ?

ЗЫ: Всё, отхожу от темы. Ничего не понимаю. Вы попытайтесь сначала нормально сформулировать задачу. Можно на бумажке, ручкой.

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

#define F_CPU 80000000

#include <util/delay.h>

#include <avr/io.h>

int preset(){

DDRB=0xFF;

PORTB=0x00;

DDRC=0x00;

PORTC=0xFF;

}

int main(void)

{preset();

while(1)

{if (PINC&(0<<PC0))

{_delay_ms(4500);

PORTB=0b00000000;

}

else

{

PORTB=0b00000001;

_delay_ms(10);

}

}

}

при вык pc0 светодиод тухнет с делеем 45сек но при включении pc0 он загорается тоже через 45 сек как сделать так чтобы он загорелся сразу без делея а тух с делеем?

изначально кнопка всегда включена

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

if (PINC&(0<<PC0))

Это условие у Вас никогда не выполнится.

Ну и, ещё раз, повторюсь :

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

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

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

ясно буду знать большое спасибо всем кто участвовал и помогал!

#define F_CPU 80000000

#include <util/delay.h>

#include <avr/io.h>

int preset(){

DDRB=0xFF;

PORTB=0x00;

DDRC=0x00;

PORTC=0xFF;

}

int main(void)

{preset();

while(1)

{if (PINC&(1<<PC0))

{

PORTB=0b00000001;

_delay_ms(10);

}

else

{

_delay_ms(4500);

PORTB=0b00000000;

}

}

}

так правильней

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

щас опишу проблему по другому.допустим portb лапка 0 стоит светодиод. мне нужно чтобы светодиод тухнул через кнопку на pc0 но с делеем т. е. пропал сигнал (отключили кнопку ) через 40 сек отключился светодиод на portb лапка 0.

это называется таймер отключения с перезапуском....

все что вы понаписали не работает и не будет работать по определению , потому-что

1. не одна кнопка не срабатывает мгновенно , есть дребезг контактов длящийся 5-20мс

2. любая помеха на кн будет приниматься как команда

для решения задачи задействуйте таймер, настройте прерывание через 1мс и в прерывании устанавливайте флаг

создайте функцию которая по флагу будет проверять состояние входа

создайте счетчик состояния входа на 10-20отчетов , бит предыдущего состояния входа и бит состояния кнопки

void test_power(void)
{
  if (flag.mc1_test)
 {
   if(GPIO5!=tempGPIO.GP5)
    {
	 temp_shet=0;
	 tempGPIO.GP5=GPIO5;
    }
   else
    {
	 if(temp_shet==20)
	  {
	   flag.power_ON=tempGPIO.GP5;
	  }
	 else
	  {
	   temp_shet++;
	  }	
    }
   flag.mc1_test=0;
 }
}

создайте функцию генерации отсчетов в 1сек типа

void blink_Led(void)
{
	 if (flag.mc1)
	  {
	   shet_cicle++;
	   if (shet_cicle==200)
		 {
		   GPIO0=0;			 
		 }			 
	   if (shet_cicle==1000)
		 {
		   GPIO0=1;
		   shet_cicle=0;
		   flag.sec1=1;			  
		 }
	   flag.mc1=0; 
	  }
	 if (flag.sec1)
	 {
	  shet_time++;

	  flag.sec1=0;
	 }
}

тогда задавая состояние выхода по заданному алгоритму при изменении ссостояния входа вы сможите выйти из функции и проивести нужные действия с выходом....

void fenction_one(void)
{

   shet_cicle=0;
   shet_time=0;	   
while(shet_time<shet_time_imp)
   {
 test_power();
    if (!flag.power_ON) {GPIO=0x00; return  ;} //экстренный выход
  blink_Led();
   }
  GPIO1=1;
  NOP();
  GPIO2=1;
  shet_cicle=0;
  shet_time=0; 
while(shet_time<shet_time_pause)
   {
 test_power();
	 if (!flag.power_ON) {GPIO=0x00; return  ;} // экстренный выход
 blink_Led();
   }
   GPIO=0x00;
//   GIE=0;  
}

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

Просьба о помощи.

Пишу в аврстудио 6.

void LedBoardSimbPrint (unsigned char simbol) // байты из знакогенератора переслать в видеобуфер

{

1. char *Simbol = ((simbol - 0x20) * 5) + SimbMass; //указатель на первый байт символа в массиве фонта

for (char i=0; i<5; i++) //печать символа в видеобуфер

2. *vbuffer[]++ = pgm_read_byte (*Simbol++);

3. *vbuffer[]++ = 0; //разделитель между символами

}

const char SimbMass [] PROGMEM = { и т.д. проинициализировано в файле font.h

unsigned char vbuffer [32] проинициализировано в основном файле

unsigned char Simbol; проинициализировано в основном файле

Error 2 invalid conversion from 'const char*' to 'char*' [-fpermissive] 1.

Error 3 expected primary-expression before ']' token 2.

Error 4 expected primary-expression before ']' token 3

Подскажите правильный синтаксис. Ну никак не получается.

Знакогенератор 5х8.

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

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

Там где массивы нужно сначала = потом++

А в первой ошибке у вас число больше 255 случайно не получается после сложения???

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

Не знаеш как? Спроси у Google'а !!!

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

Подскажите правильный синтаксис. Ну никак не получается.
Правильный - это какой ? И что КОНКРЕТНО у Вас не получается ?

Опять недовопросы начинаются, заставляющие идти варить кофе.

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

Виктору

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

Алексу.

Да вроде все по полочкам разложил.

Кусок проги. Где инициализировал переменные. И ошибки выдаваемые компилятором на

конкретные строки.

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

//ФУНКЦИЯ ВЫВОДА СИМВОЛА В СТРОКУ

//АРГУМЕНТ 1 - код символа

//АРГУМЕНТ 2 - знакоместо (0 - левый невидимый символ, 1-8 - видимые символы, 9 - правый невидимый символ)

//невидимые символы справа и слева, предназначены для организации плавной прокрутки строки

void LedBoardSimbPrint (unsigned char simbol, unsigned char position)

{

if (position > (LedBoardSize+1))

return;

char* pPosition = position * LedBoardSimbWidth + LedBoardBuffer; //указатель на первый байт символа в бегущей строке

if (simbol < 0x20)

simbol = 0x20;

if (simbol >= 0xc0)

simbol -= 0x40;

char *pSimbol = (simbol - 0x20) * FontSimbWidth + SimbMass; //указатель на первый байт символа в массиве фонта

for (char i=0; i<FontSimbWidth; i++) //печать символа

*pPosition++ = pgm_read_byte (pSimbol++);

for (char i=0; i<(LedBoardSimbWidth-FontSimbWidth); i++) //разделитель между символами

*pPosition++ = 0;

}

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

Опишу еще словами.

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

Есть видеобуфер vbuffer[]. Беру из строчного массива букву в simbol.

Вычисляю начало в знакогенераторе и вывожу 5 байт из знакогенератора

в видеобуфер. Зотем вывожу нолевой байт. Все.

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

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

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

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

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

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

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

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

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

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

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

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