a_sergeevich

Язык Си Для Микроконтроллеров

1 470 сообщений в этой теме

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00

Так проект защиты тихо валко, но двигается, просто соверщенно нет времени, могу, что-то проверять только по выходным. Вот, что получилось пока, модуль защиты от постоянки работает, сделал его на АЦП, модуль включения вентиляторов работает( включение +55, выключение +45). Сейчас думаю как прикрутить защиту от КЗ, уже есть кое-какие мысли задействовать для этого также АЦП, надо проверить будет, плохо, что в 16f877 нету модуля компараторов, было бы проще,ну да ладно. В программе пока не использовал ни прерываний ни собаку, пока чисто рабочий скелет. В архиве исходник, hex, проект протеуса.

zashita.rar

В проекте: L4, L5 - имитация реле.

L3, L6 - сигнал авария по постоянке.

L1, L2 - имитация вентиляторов.

Задержка включения 5 секунд. Порог отключения по постоянке +- 0.2 в.

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
GDK    2

А как на си с многозадачностью дела? Реализовать реально? Проще чем на АСМе? На Basice наверное совсем не вариант? Если брать МК с аппаратным стэком на Си можно писать проги к нему? Пока читал только про АСМ, вроде разобрался б/м (PIC16F84). И ещё прога написанная на си легко перенесётся на другую модель МК? На АСМе это вроде не просто. Он для разных моделей разный вроде. Особенно интересует многозадачность, а то много времени уходит "впустую" или считать МЦ не хоцца.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    484

Смотря что считать многозадачностью. Что конкретно хотите сделать ? Пример приведите.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
GDK    2

Одновременная работа программного UART и программного SPI, и напр. программы опроса клавиатуры (не используя прерывания).

Это только пример.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
my504    154
А как на си с многозадачностью дела? Реализовать реально? Проще чем на АСМе? На Basice наверное совсем не вариант? Если брать МК с аппаратным стэком на Си можно писать проги к нему? Пока читал только про АСМ, вроде разобрался б/м (PIC16F84). И ещё прога написанная на си легко перенесётся на другую модель МК? На АСМе это вроде не просто. Он для разных моделей разный вроде. Особенно интересует многозадачность, а то много времени уходит "впустую" или считать МЦ не хоцца.

Для реализации многозадачности (вытесняющей или кооперативной) в Си применяют многочисленные ОСРВ. Выбирай - не хочу...

Можно написать диспетчер задач и сервисы самому...

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

Переносимость текстов в АСМе вполне высокая в пределах платформы, если писать грамотно.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
GDK    2

ОСРВ ресурсов немало хавают наверное. Применять стоит для мощных МК. Или я неправ? Для работы ОСРВ нужен обязательно программный стэк?

А диспетчер задач написать универсальный можно? Число задач - ну навскидку 16....32. Может уже написаны такие готовые? И получится ли многозадачность для МК с аппаратным стэком? На чём такой писать удобнее АСМ или Си. Это к тому что стоит ли вобще связываться с ознакомлением с Си для МК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
CHARADEY    0

Скачал HI-TECH с первой страници. Устанавил а там малый выбор камней. В гугле йскал но находил только с аналогичным выбором аналогичные. Поделитесо ссылочкой

post-60152-1262642116.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Cavalryman    0

Подскажите пожалуйста, что может обозначать следующий код:

BYTE xdata regValues[] = {1,2,3};
halSpiWriteBurstReg(0x00, regValues, sizeof(regValues));
halSpiReadReg(0x00);
halSpiReadReg(0x01);
halSpiReadReg(0x02);

Через интерфейс СПИ что-то посылается на периферийное устройство. Даже зная это, ничего не погнимаю из этого кода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    484

Да что угодно...

Это вызов каких то процедур, которые только автору известны.

Поделиться сообщением


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

CHARADEY

Обрати внимание, что это ты просматриваешь только МК младшего семейства, нажми F3 и появятся МК среднего семейства, а F4 переключит выбор на старшее семейство.

Поделиться сообщением


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

Народ, ну может у кого есть мысли по поводу защиты от КЗ ? У меня уже кончились, осталась одна, но она требует внешней микросхемы компаратора, а я этого не хочу, охота. чтобы был только контроллер и использовать его по максимуму, если нет ни у кого дельных мыслей, (а скачало проект 28 человек) то может тогда прикрутить к МК индикацию уровня сигнала на светодиодах ?

Что-то как-то вяло народ реагирует на всё, то по форуму куча вопросов, а теперь ветка есть и я тут сам с собой разговариваю :) Может моя конструкция нах никому не нужна и людям проще это на ИС собирать в виде отдельных узлов ? Ну давайте может кто ещё какой узел предложит, а ?

Поделиться сообщением


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

Да вот думаю над этим, чтобы из АЦП соорудить подобие компаратора, но пока это в голове, в коде и железе не реализовывал, надо продумать как это лучше сделать. А то, что в 877-м есть АЦП я знаю у меня защита от постоянки с использованием двух каналов сделана уже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
GDK    2

Нет проги для просмотра схемы. Чтобы не было кз можно использовать стабилизатор с встроенной защитой или с ограничением тока. Но это для питания от постояники.

Поделиться сообщением


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

Короче после всех раздумий по поводу защиты от КЗ я решил, что проще будет её прямо в усилке реализовывать, вместо этого узла решил привинтить TDA8425, будет пред со всеми регуляторами только без ДУ, у меня его нету и ИК приёмника тоже, ну и за одно потренеруюсь в работе с I2C, микру сегодня уже заказал дней через 10 придёт, сейчас даташит качать буду и курить, курить ( даташит ) до посинения :) Фигово, что её в протеусе нема, буду ждать в железе, как долго, блин. :)

Может у кого уже есть опыт по общению с данным зверем ? Я тут подумал, I2C мне лучше задействовать железную, а не софтовую т.к это побережёт ресурсы МК, верно или нет ?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Lexi    1

Беспроно, надо юзать аппаратный I2C.

Времена 16F84 давно прошли.

Тем более что это не сложно и очень удобно.

Поделиться сообщением


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

Да у меня уже почти весь код готов, осталось как раз добавить только функции для работы с I2C, но пока если честно руки не доходят, в принципе и функции в голове уже все собраны, если может кого заинтересует могу выложить, то что уже сделал, там чуть-чуть осталось. Но, что-то мне кажется добровольцев не будет, т.к в инете уже готовых схем со схожим функционалом и даже круче просто море и на пиках и на аврках. Ещё самое плохое, что магазин мне прислал заказ без нужной мне TDA8425, а ждал я почти месяц, редиски они такие вот оказались.

Короче вот, то что сделал zashita.rar

если всё же доделаю соответственно выложу обновление.

Жаль, конечно темка задумывалась для всех кто хочет научиться программировать МК на Си, но что-то как-то народ вяло раскачивается, хотя то тут, то там создаются темки с вопросами. Ладно пошёл спать, завтра на работу :)

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Sivent    0

есть небольшой вопросик гуру форума

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

микроконтроллер 12f675

сейчас его запрограммировал его на переодическое считывание порта

логика такая

при работе постоянно опрашивается порт командой

if (GPIO & (1<<2)) rezim();

Delay_ms(200);

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    484

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

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

char tmp;

if(!GPIO2 && tmp) rezim();     // Срабатывание при отжатии
//if(GPIO2 && !tmp) rezim();   // Срабатывание при нажатии

tmp = GPIO2;

А что-бы было 100% срабатывание, нужно запихнуть этот код в прерывание по таймеру. Что-бы этот кусок выполнялся с определённой переодичностью.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Sivent    0

спасибо

попробовал с прерыванием

получилось вот что

void interrupt() {

j++;

GPIO=j;

if (j == 4) j=0;

INTCON = 0x90;

}

это процедура установки режима работы

инициализировал прерывание

INTCON = 0x90;

работает по переднему фронту

все правильно написал?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    484

А что это такое ? :unsure: Это у Вас получился какой-то вывод переменной в порт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Sivent    0

А что это такое ? :unsure: Это у Вас получился какой-то вывод переменной в порт.

void interrupt() {

какие-то действия

INTCON = 0x90;

}

инициализировал прерывание

INTCON = 0x90;

Поделиться сообщением


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

Можно ещё вот так сделать на отжатие, только ещё антидребезг надо добавить.

//блок инициализации переменных
char flag = 0;
char tmp = GPIO2;
//основной цикл программы
if (GPIO2 != tmp ) { flag++; tmp = GPIO2; } //обработка нажатия отжатия.
if (flag >= 2 ) { funcia (); flag = 0; }

Работает следующим образом:

1.Записываем в tmp начальное состояние GPIO2, например 1.

2.Если нажали то состояние GPIO2 с 1 изменится на 0 сработает условие flag увеличится на 1, а в tmp снова запишем

состояние GPIO2.

3.Если отжали то состояние GPIO2 c 0 изменится на 1 сработает условие flag увеличится на 1, а в tmp снова запишем

состояние GPIO2.

4.Теперь flag равен 2 и сработает следующее условие где мы выполняем какую-то funcia() и обнуляем flag.

Если кнопку просто зажать и удерживать то сработки не будет.

Короче как-то так, а если что-то и не так :) то поправите. :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
sibiryak    0

всем доброго времени суток! Читаю этот топик что-то понимаю, что-то не очень. Я тока недавно занялся программированием на Си. Поставил себе 8-й микроСи. Пытаюсь что-нить свое состряпать. У меня вопрос. Как можно (хотя бы алгоритм) реализовать прогу? Ща расскажу краткое содержание. Есть две ветки проги. Мне нужно, чтобы при нажатии кнопки сначала выполнялась одна ветка, при следующем нажатии кнопки - вторая, при повторном нажатии, снова выполняется первая ветка. Я тут прикинул алгоритм,может кто поправит, буду непротив. Алгоритм: сначала мне надо объявить некую переменную, которая изменяла бы значение (инкрементировалась) по нажатию кнопки. Нажал один раз, например, переменная i=1 и прога пошла работать от условия, что i=1. Нажал второй раз, i=2 и прога пошла работать по второй ветке. Нажал еще раз и прога пошла работать по первому условию. Если что-то желаете уточнить (я думаю, что не очень все доходчиво написал) задавайте вопросы. Спасибо!

Поделиться сообщением


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

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

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

  Разрешено не более 75 смайлов.

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

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

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

Загрузка...

  • Похожие публикации

    • Автор: Артемон
      Всем привет. Просьба посодействовать в исправлении кода для термометра. Так как сам я в этом новичек, то код собирал из трех чужих проектов. Реализация такова, подключение термопары через микруху Max6675 к Atmega и вывод данных на LCD экран. В архиве прилагаю проект Atme Studio 7 и принт скрин из Протеуса. Ошибка заключается в неправильных показаниях температуры

      Test1.rar
      Вот код, чтоб не скачивать проект.

      #define F_CPU 1000000UL #include <util/delay.h> #include <avr/io.h> #include "max6675.h" #include "LCD.h" uint16_t gettemp(void); //Funktionsdeklarationen void initavr(void); //gettemp () returns absolute Temperature in Temp * 4 °C - in 1/4°-steps // uint16_t gettemp(void){ //Temperatur holen. uint8_t bit = 0, bitnr = 12; //Variablen uint8_t foo1 = 0; uint16_t Rohdata = 0; CS_Port &= ~(1 << CS); //Chip select anlegen for(foo1 = 0 ; foo1 < 16 ; foo1++){ //16 Bits einlesen bit = 15 - foo1; //Die Aktuelle Bitnr berechnen. SCK_Port |= (1 << SCK); //SCK hi if((bit <= 14) && (bit >= 3)){ //Einfach mal die 12 relevanten von den 16 Bits ausfiltern if((SO_Pin & (1 << SO))){ //WENN SO 1 ist, dann... bitnr--; //zдhlen wir runter... Rohdata |= (1 << bitnr); // und schieben eine 1 an bit x }else{ //WENN dem NICHT so ist, dann... bitnr--; //zдhlen wir runter... Rohdata &= ~(1 << bitnr); //und schieben eine 0 an bit x } }else{ //weis au nimmer, was das soll. bitnr = 12; } SCK_Port &= ~(1 << SCK); //SCK LO } CS_Port |= (1 << CS); //CS HI //Alles auf Standardkonfig. return Rohdata; //Das ist doch mal was ;D } // getTC() returns 0 if Thermocouple is not connected, 255 if thermocuple is connected // (to enable this feature T- must be connected to GND) uint8_t getTC(void){ //Temperatur holen. //Variablen uint8_t TC = 0; uint8_t foo1 = 0; CS_Port &= ~(1 << CS); //Chip select anlegen for(foo1 = 0 ; foo1 < 16 ; foo1++){ //16 Bits einlesen //Die Aktuelle Bitnr berechnen. SCK_Port |= (1 << SCK); //SCK hi if(foo1 == 2){ //das 3. bit ist fьr uns relevant. if((SO_Pin & (1 << SO))){ //WENN SO 1 ist, dann... TC = 0; }else{ //WENN dem NICHT so ist, dann... TC = 255; } } SCK_Port &= ~(1 << SCK); //SCK LO } CS_Port |= (1 << CS); //CS HI //Alles auf Standardkonfig. return TC; //Das ist doch mal was ;D } //Initiates the MAX6675 and IO-pins void init_6675(void){ //AVR initialisieren SO_DDR &= ~(1 << SO); CS_DDR |= (1 << CS); SCK_DDR |= (1 << SCK); //IOs setzen SO_Port |= (1<<SO); //Pullups an. (Wichtig fьr MAX6675, der kann nicht anders, hab ich festgestellt... CS_Port |= (1 << CS); //CS HI //Alles auf Standardkonfig. SCK_Port &= ~(1 << SCK); //SCK LO } int main(void) { init_port();// инициализируем порт ЖКИ lcd_init();// инициализируем ЖКИ init_6675(); while (1) { char buffer[8]; int temp; temp = gettemp(); temp /=4; lcd_gotoxy(0,0);//перемещаем курсор в верхний левый угол sprintf(buffer, "t=%i\xdf\C ", temp); // так как тут не плавающая запятая то числа с запятой записываются так %i.%i, код градуса записывается так \xdf lcd_putstring(buffer); } }
      вставляете код пользуйтесь тегами [CОDE][/CОDE] редактора сообщений, кнопка <>
    • Автор: igoryan
      нужно ли обрабатывать RESET просто компилятор не видит RESET_vect?
    • Автор: P32L
      Натолкните на мысль пожалуйста.Смысл в следующем.Нужно изменять задержку(Delay) из EEPROM. Контроллер PIC , язык СИ.
      Как реализовать чтение числа из ипрома ? Если не затруднит, то кусочек кода был бы очень кстати.
    • Автор: Zver2011
      Здравствуйте! Недавно начал изучать МК AVR. Читаю книги Белова. Пользуюсь программами CVAVR и Proteus. По урокам, собирал все в железе. По готовым примерам кода конечно же мне легко учиться и все в принципе понятно из описания, хоть и в программировании не силен, но как только начинаешь создавать что то свое - начинаются проблемки.
      В общем я создаю что то вроде музыкального светильника, который должен включаться от звука (голоса). Датчик звука пытаюсь реализовать на компараторе, плавное включение света - ШИМ, а генерация мелодии (пищалки) благодаря таймеру Т1 и его прерыванию. Куски кода брал из разных чужих самоделок, вот только объединить не удается.
      В железе работает как будто цветомузыка какая-то. Мелодия не играет, Я думаю это из-за неправильной конфигурации компаратора, а также схемы. Вот это основной вопрос у меня. Ну и собственно основной цикл программы, там я думаю тоже накосячил.
      Помогите мне разобраться до конца, понять ошибки в коде, мне самому интересно вот только С - язык тяжеловатый на мой взгляд и без помощи знающих не обойтись))

      КОД.txt
    • Автор: sensey88
      Продам счетчики бета-гамма излучения новые заводская упаковка
      Си1Г (79г) 62 шт. 5000р
      Си21БГ (79г) 49 шт. 350р
      Си22БГ (79г) 70 шт. 700р
      Си3БГ (84г) 20 шт. 300р
      Си3БГ (78г) 46 шт. 250р
      Си3БГ (77г) 10 шт. 250р
      Си3БГ (79г) 18 шт. 250р
      Си3БГ (75г) 10 шт. 200р
      Си37Г (80г) 40 шт. 400р
      Си37Г (76г) 24 шт. 350р
      Си37Г (79г) 16 шт. 350р
      Си33Г (78г) 28 шт. 450р
      Си33Г (77г) 15 шт. 450р
      СБТ13 (78г) 2 шт. 3000р
      СБТ13 (76г) 3 шт. 2700р
      СБТ13 (69г) 3 шт 2500р.
      Си8Б (79г) 1 шт. 2500р
      Си8Б (78г) 1 шт. 2500р
      СБТ10 (79г) 3 шт. 4500р
      8 (910) 7051241 Евгений
      bishop-x@yandex.ru
  • Сообщения

    • С размещением показаний на дисплее немного разобрался (скрин1) Идею  я понял, спасибо, буду иметь ввиду. С этим я уже сталкивался, когда делал "показометр" для переделанного в лабораторный БП  АТХ.  Только делал в CVAVR на дисплее 1602. Нормально получилось. (скрин2) 100% согласен! Но до изучения таймеров ни как пока не дойду (со мной внуков трое:4, 6 и 8 лет - особо не разгуляешься). Еще раз спасибо тебе за полезные советы!  
    • Ну и ещё. При нынешнем Rg 0.65 чуйка упала всего на 0.34дб, для Rg0.2 это падение будет 0.107дб. Я дал цифры а решать вам.
    • Ты тормози по времени то ай-ай. Сказывай лучше камрад Леха на какие колонки слушали? На твои старые?
    • Добавлю WR30-48D5V5-F    WR30-48S12-F DC/DC: 48V-12V-30W   BXA75-48S05 DC/DC: 48V-5V-75W   BXA15-48S12-F DC/DC: 48V-12V-15W   PH150S48-24/STI Преобразователь постоянного тока в постоянный 150W 24V 6.3A   NFC10-24S05SI DC/DC: 24V-5V-10W   BXA3-24S12-FSI
    • Не надо искать скрытого смысла в моих фразах. Сердечник напрямую влияет на индуктивность и косвенно на Rg. На Rg напрямую влияет диаметр проволоки и косвеено длинна. Для номинального импеданса Z=8 допустимо Rg= 0.2ом. Zmax измерять без надобности. У вас довольно хороший кабель, такой желательно иметь и внутри ас.
    • На пробу, как всегда, демонтаж. Площадь=(Д.реб*Ш.реб* кол-во ребер*2)+(Д.опора*Ш.опора).  Радиатор 150х110 высота 14, основание 3 мм. Вес 265 г. 37 ребер, толщина ребра 1 мм, межреберье - 3 мм. Площадь около 1050 см. 6 отверстий с резьбой М4, цена 150. 5 штук.   Радиатор 170х30 высота 25, основание 4 мм. Вес 140 г. 6 ребер, толщина ребра 1,5 мм, межреберье - 4 мм. Площадь около 470 см.  3 отверстия с резьбой М3 на крайнем ребре, цена 80 руб/шт. 3 штуки. Радиатор 128х30 высота 25, основание 4 мм. Вес 115 г. 7 ребер, толщина ребра 1,5 мм, межреберье - 3+ мм. Площадь около 410 см.  3 отверстия с резьбой М3 на крайнем ребре, цена 60 руб/шт. 3 штуки. Радиатор 101х61 высота 7,5, основание 1+ мм. Вес 55 г. 27 ребер, толщина ребра 1+ мм, межреберье - 3- мм. Площадь около 260 см. 4 отверстия с резьбой М4, цена 40 руб. 5 штук. Радиатор 145х120 высота 25, основание 3+ мм. Вес 400 г. 18 ребер, толщина ребра 1,5+ мм, межреберье - 5 мм. Площадь около 1300 см. 7 отверстия с резьбой М4, цена 200 руб. 5 штук. Радиатор 225х140 высота 31, основание 7+ мм. Вес 1100 г. примерно 15 ребер, толщина ребра 2,5 мм, межреберье - 6 и 8 мм. Площадь около 1850 см. 8 отверстий с резьбой М6, цена 400 руб. 5 штук. Подошва с прорезями, см фото Может кому будет интересно еще один Радиатор 410х295 высота 52, основание 17 или 23 мм. Вес около 10 кг. 20+18 ребер, толщина ребра 3 мм, межреберье - 5 мм. Площадь около 8500 см. много отверстий с резьбой М4, цена 2000 руб. 3 штуки. Та часть, которую можно выделить - ровная подошва - 150х295 высота 52, основание 17 мм. Вес около 4-5 кг. 20  ребер, толщина ребра 3 мм, межреберье - 5 мм. Площадь около 4500 см.  
    • Кажется это ВОТ ТАКАЯ приблуда. И, схему на неё искать придётся очень долго...  Ага-да, для автоаккумуляторов она не годится.