Jump to content
a_sergeevich

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

Recommended Posts

2 минуты назад, ruhi сказал:

И, соответственно, трассировку для конкретных ног только нужно будет менять.

Ага, для ног питания и общего. Точнее, для всех цепей питания и общего.

Share this post


Link to post
Share on other sites
37 минут назад, ARV сказал:

Ага, для ног питания и общего. Точнее, для всех цепей питания и общего.

Да, да если цифровая и аналоговая части разделены не правильно при разводке, то смысла нет искать отдельные ноги.

Share this post


Link to post
Share on other sites

Уважаемые, чтоб не получить очередной бан, создал отдельную тему по Ц и А части. Она чуть выше.... Спасибо, если дадите там советы. 

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

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

Подробнее

Если есть переменная unsigned int B;

и её надо привести к unsigned short, можно ли написать просто (unsigned short) B; в mikroC?

Share this post


Link to post
Share on other sites
                     

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

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

Подробнее...

Помогите, пожалуйста: не работает получение ответа от датчика DS18B20.

Пишу так:

 void ds_init() 
 {  //функция инициализации датчика ds18, т.е. сброса и получения сигнала присутствия
 
  pin_dir = 0; //вывод на выход

  pin_ds = 0;
  Delay_us(550);
  pin_dir = 1; //настройка на вход
  
  while (PORTA.B0 == 0) continue;
  while (PORTA.B0 == 1) continue; // датчик ждёт 15-60 мкс
  while (PORTA.B0 == 0) continue; // ждём, пока датчик держит линию на земле (60-240 мкс)

  
  
 }

Если вместо этих 3-х while просто вставляю ожидание 550 мкс, пока там датчик отвечает, то всё работает. (pin_ds это PORTA.B0,   pin_dir это TRISA.B0)

Share this post


Link to post
Share on other sites

А если датчика нет, у вас всё подвиснет в ваших while. Как минимум нужен таймаут.
В своё время отказался от анализа импульса присутствия. Контроль ведётся только по CRC (дополнительно вёлся контроль на замыкание линии на ноль, при выходе выходного каскада из строя).
Если импульса присутствия нет, вы что будете делать? Отправите ещё один импульс сброса, через какой промежуток времени? А если несколько датчиков на линии, как вы определите какой ответил, а какой нет?
Мне кажется лучше произвести полноценный опрос датчика. Не ответил, ставим признак ошибки, 8 ошибок (например), датчик в обрыве.

Share this post


Link to post
Share on other sites

Импульс присутствия имеет смысл при работе в режиме ожидания, например при работе с DS1990A.
После подаче питания на DS1990A, "таблеткой" будет сформирован импульс присутствия, что запустит процедуру чтения данных из DS1990A.

Share this post


Link to post
Share on other sites
1 час назад, technik-1017 сказал:

таймаут

Вы имеете ввиду таймером подсчитывать длительность нуля, который формируется датчиком? Мне всё-таки хотелось бы понять, почему у меня в Протеусе не работает с while? Вроде ведь всё должно получаться: настроили вывод на вход, и сравниваем, ноль или единица. Пока там 1(датчик ждет 15-60 мкс), программа будет выполняться во 2-ом цикле while. Затем там появляется 0, и управление переходит к 3-ему оператору while.

Edited by Aleksandr1111

Share this post


Link to post
Share on other sites
12 минуты назад, Aleksandr1111 сказал:

почему у меня в Протеусе не работает с while?.....

Пока там 1(датчик ждет 15-60 мкс), программа будет выполняться во 2-ом цикле while. Затем там появляется 0, и управление переходит к 3-ему оператору while.

потомушта первый 0 принадлежит МК и вы его сформировали , потомушта датчик может сформировать ответ 0 сразу и 1 вы не увидете/пропустите , потомушта второй 0 датчик не передает.

Share this post


Link to post
Share on other sites
16 минут назад, Aleksandr1111 сказал:

почему у меня в Протеусе не работает

Подключите в протеусе осциллограф и посмотрите что происходит на линии

Share this post


Link to post
Share on other sites

Доброго времени суток.

Использую XC8 v1.3

Есть задача общаться программно по 1wire в PIC. Для этого выделено 3 вывода (RB0, RB1, RB2). На каждом весит свой датчик. Для работы с каждым выводом будут использоваться одинаковые функции (например:

void wire_vivod_byte(char data, char kanal)

). Как можно в теле функции обратиться к RB0, RB1 или RB2 в зависимости от переменной kanal. Через if (kanal==0)..., или swith (kanal)..., я реализовать могу, а вот хочется что бы переменная kanal выступала в роли смещения.

Share this post


Link to post
Share on other sites

можно номер канала передать в массив, как индекс, а на выходе получить маску канала
что то вроде этого

const unsigned char mask[] = {0x01,0x02,0x04};

и использование
PORTB = 0xFF & mask[kanal];

Share this post


Link to post
Share on other sites
Posted (edited)

То есть устанавливать не бит а записывать порт. Тогда:

//при записи единицы
PORTB|=mask[kanal];
//при записи нуля
PORTB&=~mask[kanal];

При таком подходе маска не нужна, необходимо канал задавать правильно (1,2,4).

//при записи единицы
PORTB|=kanal;
//при записи нуля
PORTB&=~kanal;

Вроде бы просто, а не догнал. 

Спасибо.

Edited by Bugrim

Share this post


Link to post
Share on other sites

Опять затупил. Помогите разобраться. Объявлены массивы:

unsigned char  dekady[4][10],dekadyBCD[4][10];

Начальный адрес первого 0х110, второго 0х190.

Есть функция 

void inc_chass(unsigned char *chas_dec,unsigned char *chas_bcd){
    if (++(*chas_dec)==24)
        *chas_dec=0;
    *chas_bcd=bin_to_bcd(*chas_dec);
    *(chas_bcd+1)=*chas_bcd&0x0f;
    *chas_bcd=(*chas_bcd>>4)&0x0f;
}

Ее прототип:

void inc_chass(char *chas_dec,char *chas_bcd);

Вызов функции:

inc_chass(dekady,dekadyBCD[1][0]);         //увеличить час

Но в функцию передаются не те данные, которые хочу, т.е. не адрес начала массива "dekady" (0х110) и не адрес "dekadyBCD[1][0]" (0х19А), а вот что:5cc59d3060340_.jpg.63109e408054050928ff1f8170928d55.jpg

Где не прав, подскажите. Может это длина адреса виновата, которая в char не помещается?

Share this post


Link to post
Share on other sites

Дак Вы в функцию принимаете указатель на char, а передаёте туда значение.
Компилятор не материл Вас ? :wacko:

PS: Для справки. Адрес начала массива - есть само имя массива. Без всяких там индексов и т.д...

Share this post


Link to post
Share on other sites

Да так и есть - предупреждение "illegal conversion between pointer types". Однако переписав вызов функции:

inc_chass(&(dekady[1][0]),&(dekadyBCD[1][0]));         //увеличить час

приводит не совсем к нужному результату:  chas_dec=0x0F1A, должен быть 0х11А, chas_bcd=0х19А, что есть правильно.

48 минут назад, Alex сказал:

Адрес начала массива - есть само имя массива. Без всяких там индексов и т.д...

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

Share this post


Link to post
Share on other sites
47 минут назад, Bugrim сказал:

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

Тогда взятие адреса "&" обязано сработать.

48 минут назад, Bugrim сказал:

chas_dec=0x0F1A, должен быть 0х11А, chas_bcd=0х19А, что есть правильно

Ничего не понятно. Можете перевести ? :wacko:

Share this post


Link to post
Share on other sites

Объявлены массивы:

unsigned char  dekady[4][10],dekadyBCD[4][10];

Начальный адрес первого 0х110, второго 0х190.

Функция

void inc_chass(char *chas_dec,char *chas_bcd);

Тогда вызов функции

inc_chass(&dekady[1][0],&dekadyBCD[1][0]);

должен передать указателю chas_dec значение 0х11А, а указателю   chas_bcd значение 0х19А. Однако при прогоне в протеусе указателю chas_dec присваивается значение 0x0F1A, почему мне не понятно. Указателю chas_bcd присваивается правильное значение 0х19А.

Share this post


Link to post
Share on other sites

Не раз накалываюсь. Присваивается не правильное значение, однако программа отрабатывает правильно. Вероятней всего для данного камня это не имеет значения. Использую PIC16F886, компилятор XC8, v1.33.

Share this post


Link to post
Share on other sites
В 28.04.2019 в 18:10, Bugrim сказал:

Однако при прогоне в протеусе указателю chas_dec присваивается значение 0x0F1A, почему мне не понятно.

потомушта для пыков,   адреса регистров ОЗУ 0х1A, 0x9A, 0x11A, 0x19A это одно и тоже значение , адрес берется маской 0x7F, старшие разряды берутся битами переключения банков, так что шо там в значении адреса 0хF1A or 0x11A абсолютно монопенисуально.

Share this post


Link to post
Share on other sites
Posted (edited)

Всем привет. начинаю изучать Си. 

При опросе PINа в AVR, на то, нажата ли кнопка if((PIND&(1<<PD0)) == 0) все выполняется, то есть при имитации нажатия (отлаживал в avr Studio7) проходит в тело функции (истина)

А при if((PIND&(1<<PD0)) == 1) и не нажатой кнопке (условие лог 1) в тело функции не входит(в истину). Как работает последний if?

В железе не проверял. Пытаюсь разобраться с ифом. Заранее благодарю.

Edited by mosfetx

Share this post


Link to post
Share on other sites

Иф работает, как должен. У вас ведь там не PD0, а PD1 или что-то иное?

Ну и вообще-то надо показывать конкретный кусок кода с проблемой. Потому как не входить в ИФ может и по причине бесполезности входа...

Share this post


Link to post
Share on other sites
Posted (edited)
5 hours ago, ARV said:

Ну и вообще-то надо показывать конкретный кусок кода с проблемой. Потому как не входить в ИФ может и по причине бесполезности входа...

#include <avr/io.h>
char x = 0;
char temp = 0;
int main(void)
{
    DDRD = 0;
    PORTD = 0xFF;
     while (1) 
    {
        for (char i = 0; i<8; i++)
        {
            if ((PIND&(1<<x))==1)
            {
                temp++;
            }
            else
            {
                x++;    
            }
        }
        x = 0;
     }
}

Хотел опрашивать все 8 пинов. на наличии лог1. так не работает. Если написать PD0 работает (был не внимателен) 

Edited by mosfetx

Share this post


Link to post
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
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...

  • Similar Content

    • By Артемон
      Всем привет. Просьба посодействовать в исправлении кода для термометра. Так как сам я в этом новичек, то код собирал из трех чужих проектов. Реализация такова, подключение термопары через микруху 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] редактора сообщений, кнопка <>
    • By igoryan
      нужно ли обрабатывать RESET просто компилятор не видит RESET_vect?
    • By P32L
      Натолкните на мысль пожалуйста.Смысл в следующем.Нужно изменять задержку(Delay) из EEPROM. Контроллер PIC , язык СИ.
      Как реализовать чтение числа из ипрома ? Если не затруднит, то кусочек кода был бы очень кстати.
    • By Zver2011
      Здравствуйте! Недавно начал изучать МК AVR. Читаю книги Белова. Пользуюсь программами CVAVR и Proteus. По урокам, собирал все в железе. По готовым примерам кода конечно же мне легко учиться и все в принципе понятно из описания, хоть и в программировании не силен, но как только начинаешь создавать что то свое - начинаются проблемки.
      В общем я создаю что то вроде музыкального светильника, который должен включаться от звука (голоса). Датчик звука пытаюсь реализовать на компараторе, плавное включение света - ШИМ, а генерация мелодии (пищалки) благодаря таймеру Т1 и его прерыванию. Куски кода брал из разных чужих самоделок, вот только объединить не удается.
      В железе работает как будто цветомузыка какая-то. Мелодия не играет, Я думаю это из-за неправильной конфигурации компаратора, а также схемы. Вот это основной вопрос у меня. Ну и собственно основной цикл программы, там я думаю тоже накосячил.
      Помогите мне разобраться до конца, понять ошибки в коде, мне самому интересно вот только С - язык тяжеловатый на мой взгляд и без помощи знающих не обойтись))

      КОД.txt
    • By 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
  • Сообщения

    • Виноват... Не предполагал, что по прочтении моего сообщения народ ломанётся   уродовать нормальный  штангель, или станет таскаться по магазинам с большой, пустой, сумкой и хорошим микрометром в предвкушении тяжёлой покупки.
    • Походу так и  есть - зависит от железа на борту гаджета и от его ПО. Прежний редми 4х ни под 7-ым андроном, ни с обновлённым до 8.1, никак не реагировал на смену нагрузки. И "гонор" C7 бабаджиньи при переключении внутреннего динамика на 32-омные наушники никак не реагирует. А к примеру, при подключении 32-омных наушников к Samsung А40 с and.9 "линейка" индикатора уровня громкости сразу меняет цвет с синего на красный, при этом амплитуда сигнала, замеренная непосредственно на миниджеке снижается примерно на 30%, и если попытаться "накрутить" громкость, то она почти не меняется. Сегодня попинаю дониного огрызка - интересно, как я-фонь реагирует. 
    • Другими словами -Он сгорать будет долго и мучительно,и благополучно сгорит последним во всей конструкции Поставь тогда предохранитель последовательно с ним...
    • Это надо было бы  сразу в сообщении со штангенциркулем написать (а то  ужу было приготовил ржавые гвозди - прибить Вас к позорному столбу, и рогатку для расстрела...). Да Ваш инструмент, и вы определяете степень его годности для тех или иных работ (да хоть нос чесать, а что,  одним движением  колупаете обе свои носовые дырки..., типа таки есть определённая инновация.... Дарю идею).... Однако, чувствую что стебаете честной народ!. Со сшангелем походу чутка таки перегнули палку, у большинства, отношение к штангелю - профессионально пиететное, а Вы его в "разводные ключи". Типа: "-  Бутылку?, Вдребезги??!..."  Не удержался. С уважением, Сергей
    • " Звоню коллеге по работе, которая находится дома, чтобы обсудить рабочие вопросы. Слышно ее плохо, потому что все перекрывают детские крики и визг — у нее две дочери. Наконец, она говорит: — Подожди минутку, я решу проблему с шумом. Через некоторое время продолжаем разговор без шумовых помех. Я ей говорю: — Какие послушные у тебя дочки. — Эээ... не совсем так. Я в шкафу. "
    • Железяка под датчиком лежит или датчик неправильно подключен. Обращаться к продавцу за консультациями, мы то тут при чём.
  • Покупай!

×
×
  • Create New...