• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!
a_sergeevich

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

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

@IMXO@Yurkin2015 , спасибо за разъяснения. Вообще, я хочу сделать беспроводной термометр на 2 измеряемые точки с аналоговыми датчиками (один - отечественный К1019ем1). Для передачи данных хотел сначала использовать библиотеку Манчестерского кода, а потом набрел на интересную статью http://www.romanblack.com/RF/cheapRFmodules.htm (на англ.) Там, в конце, есть код и для приемника, но насчет TMR0 мне было не понятно (настройка, чтение)

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

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


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

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

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

  • x
    мм
Заказать Получить купон на $5.00
IMXO    1 100
11 минуту назад, Aleksandr1111 сказал:

Там, в конце, есть код и для приемника

этот код не для 628го

 

23 минуты назад, Aleksandr1111 сказал:

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

это как?  два термометра со своими передатчиками или общий передатчик на один приемник?

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


Ссылка на сообщение
Поделиться на других сайтах
26 минут назад, IMXO сказал:

этот код не для 628го

Это понятно :) ,пытаюсь адаптировать для 628. 

26 минут назад, IMXO сказал:

два термометра со своими передатчиками или общий передатчик на один приемник?

Наверно, общий передатчик (а датчики в двух теплицах), причем передатчик и приемник, возможно, самодельные.Там еще упоминается, что все это тестировалось на Pic18 с кварцами 20 МГц, а если у меня 8 МГц, то, боюсь, что при таких длительностях передаваемых нулей и единиц (порядка 80 мксек) приёмный МК не сможет корректно обработать поступающие импульсы.

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

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


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 100
36 минут назад, Aleksandr1111 сказал:

,пытаюсь адаптировать для 628. 

те аналоговые датчики вы уже адаптировали?

:) не с того вы начинаете...

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


Ссылка на сообщение
Поделиться на других сайтах
17 минут назад, IMXO сказал:

те аналоговые датчики вы уже адаптировали?

Нет, но, мне кажется, это не так сложно, примеры кодов есть, в передатчике планирую использовать Pic12f675 с его ацп.

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


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

те настроить таймер вызывает сложности, но считать показания датчика в попугаях АЦП перевести в цифру, потом в строку, потом создать кодовую посылку, добавить CRC(контрольную сумму) , преобразовать все это в манчестер - конечно "это не так сложно" :)

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


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

Там будет не Манчестер. Да, работы над этим много. А зачем в строку? Результат в байты, посыл 

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


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 100
Только что, Aleksandr1111 сказал:

А зачем в строку? Результат в байты, посыл 

когда соберешь в живую узнаешь :)

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


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

@IMXO , а вообще, можно останавливать/запускать в нужный момент счетчик с помощью бита T0CS, как написал Yurkin2015 ? И еще: запись

while (PORTA.F0) continue;

значит ли, что только когда PORTA.F0 станет = 1, выполнение кода пойдет дальше по тексту, иначе программа будет ждать выполнения условия?

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

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


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

для 12 16 пиков нет, TMR0 считает постоянно

исключение новые серии PICxxF1xxx

и запускает/останавливает бит TMR0ON, бит T0CS  или внутренний генератор или внешний 

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


Ссылка на сообщение
Поделиться на других сайтах
Yurkin2015    279
15 минут назад, Aleksandr1111 сказал:

с помощью бита T0CS

Поясняю. При установке бита в 1 таймер отключается от внутреннего генератора, поэтому и останавливается.

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


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

и при смене уровней на RA4 продолжает считать...

29 минут назад, Aleksandr1111 сказал:

значит ли, что только когда PORTA.F0 станет = 1, выполнение кода пойдет дальше по тексту,

с точностью до наоборот,

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


Ссылка на сообщение
Поделиться на других сайтах
32 минуты назад, IMXO сказал:

точностью до наоборот,

Т.е. continue - имеется ввиду "продолжать находится в этом цикле, если условие истинно", и только, когда условие даст ложный рез., произойдет выход из цикла, и выполнение прогр. пойдет дальше, так?

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


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

нет не так. continue - продолжить , для WHILE   перейти на проверку условия

изучайте:

раздел операторы перехода

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


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

80-1=79 .....

стандартный прием написания кода

80 - нужная  задержка

-1 - коррекция ошибки МК

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


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

@IMXO , скажите, пожалуйста, у меня в проекте Протеуса 2 МК PIC16F628A, 1-ый передает данные по протоколу, согласно прикрепленному рис., 2-ой соединен через резистор 510 Ом и принимает их (статью с кодами для приемника и передатчика Вы видели несколькими постами выше), только у меня все длительности импульсов увеличены в 2 раза. Так вот передатчик-то работает и в Протеусе, и в железе, (по осциллографу), а на индикаторе приемника передаваемое число не меняется (в Протеусе).Вопрос: может ли этот протеус при  длительностях от 40 мксек и более адекватно имитировать работу такого устройства?

RFmodule_proto1.gif

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

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


Ссылка на сообщение
Поделиться на других сайтах
IMXO    1 100
17 минут назад, Aleksandr1111 сказал:

Вопрос: может ли этот протеус при  длительностях от 40 мксек и более адекватно имитировать работу такого устройства?

да может

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


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

@IMXO , наконец, протокол заработал. Увеличил все длительности импульсов в 4 раза от исходных (поскольку у меня кварцы 8 МГц), на выходе приемного МК стоит 7-сегм. индикатор, и он сначала показывал декодированные числа в 2 раза большие, чем передавались, оказалось, в коде функции приемника есть небольшая ошибка, исправил, теперь все правильно работает (на макет. плате, МК соединены проводом).

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

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


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

В библиотеке ADC в mikroC почему-то указано,что эта библиотека работает с RC-тактовым генератором, но ведь её используют и с кварцами? Почему там так указано?

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


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

Изучаю СИ по книге Ритчи и Кернигана. Задание из книги: "Проверьте, что выражение getchar() != EOF действительно равно 1 или 0."

Получилась следующая программа:

#include <stdio.h>

main()
{
  int c;
  
  	while(c=(getchar() !=EOF))
	{
		printf("%d\n", c);
	}
}

При нажатии клавиш выводит нажатые символы, вместо единиц. Подскажите, где я ошибся.

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


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

в Си нет переменных типа булеан,  выражение считается истинным, если оно не равно ноль.

  	while(c=(getchar()!=EOF) ? 1 : 0 )
	{
		printf("%d\n", c);
	}

 

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


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

Видимо авторы книги использовали другую версию библиотеки "stdio.h". Или другой стандарт языка СИ. Следующая программа из книги так-же не правильно работает. Просто выводит на экран символы, вводимые с клавиатуры. Попробую другой компилятор.

Подсчет символов.PNG

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


Ссылка на сообщение
Поделиться на других сайтах
ARV    267
20 часов назад, IMXO сказал:

в Си нет переменных типа булеан,  выражение считается истинным, если оно не равно ноль.

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

Почему не работает - не знаю, я протестировал вот здесь https://ideone.com/AeGca9 - работает, все нормально

43 минуты назад, Kopetan_Nemo сказал:

Просто выводит на экран символы, вводимые с клавиатуры.

Возможно, проблема в том, что stdin у @Kopetan_Nemo по каким-то причинам не связан с консолью, и поэтому вводимые с консоли символы никуда не попадают. Попробуйте запустить программу в командной строке test.exe < data.txt, где data.txt - текстовый файл, в котором надо подсчитать символы.

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


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

Просто test.exe запускается, с приставкой <data.txt, пишет "Не удается найти указанный файл". Оба файла в одной папке. Также пробовал прописывать путь для текстового файла - не находит. В архиве СИ файл и EXE-шник.

test.zip

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


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

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

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

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

  Разрешено не более 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
  • Сообщения

    • Либо выкинуть нах феты и поставить нормальный параллельный повторитель
    • Понял Вас, спасибо.Учту на будущее. Если возможно этот вывод отключить от массы, получилась бы простая схема без транзисторов и резисторв...
    • глупости, сгорает он только от превышения мощности рассеивания транзистора, не более. замена тр-ра на более мощный +  соответствующий радиатор решат проблему 
    • Здравствуйте. Возможно коротит где то, или же диоды плохо качества. У меня было такое, диоды сами по себе не сильно надежные, повреждаются и начинаются сбои в работе.  Ставил разные и половина ужасного качества.. Сейчас с этого сайта стоят https://electro-kot.ru/svetovoy-tyuning/podsvetka-salona/ Вроде нормальные, работают пока без сбоев
    •           Странный способ "уговорить" Т1 и Т2 изменить своё напряжение отсечки! Проще подобрать их по одинаковому Uотс. Но "выбирать нет из чего". Тогда: 1.либо вернуть историю "взад" и сделать предыдущую схему (её фрагмент здесь второй по счёту); 2.либо искусственно увеличить Uотс одного из Т1Т2 (т.е. уравнять Uотс обоих тр-ров); 3.либо сделать R6 постоянным 111...333...888Ом, а потенциометр на 24Ом включить между эмиттерами, удалив R7R8. Как-то так. С уважением В.    
    • Вы видимо полагаете, что ток через конденсатор существенно изменится при удвоении ESR? Это ваше право. Однако, я указал конкретный тип конденсаторов, допускающих протекание потребного тока, и "забил" в симуль именно их ESR. Опять же, никто не запрещает вам пристегнуть к своему питальнику рюкзак с конденсаторами, буде у вас есть много места и куча невостребованных электролитов.