6 758 сообщений в этой теме

AlexRK    2

А возможно ли в Протеусе к АЦП - как то загрузить аудио файл - Я хочу подключить к AVR ке и потренироваться ? 

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


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

да можно, генератор аудио, файлы wav

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


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

Как например unsigned char = 0b00001010; преобразовать в int и послать в SerialPort. У меня получается посылать только как ASCII символ например UDR0 = ‘1’;
Остальные вариации выводят квадратики. Как в данном случае 10 вывести в сериал порт?

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


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

А с чего вдруг будут отображаться как символы коды, которые этими символами не являются. Преобразуйте 16-разрядный int в набор СИМВОЛОВ той формы представления, которую Вы хотите получить и тогда увидите искомое. Обычно в библиотеках этим занимается printf.

Чтобы увидеть 10, нужно вывести ASCII символ "1" и ASCII символ "0". Разница между ASCII символом цифры и ее количественным значением фиксирована. Смотрите таблицу - все цифры идут подряд.

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

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


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

@serega374 как то так 

void Send_hex(char a) //  Перевод и отправка НЕХ числа в ASCII кодировке
    {
	  char b;
	  b=a>>4; if (b<10) b+='0'; else b+='7'; Send_UART(b);
	  b=a&0x0F; if (b<10) b+='0'; else b+='7'; Send_UART(b);
    } 

 

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


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

Есть ли стандартная функция преобразования типов переменных.
Например в консольном приложении я делаю так

#include using namespace std;int main() {char a =0b00001010;int b = a;coutreturn 0;}


И вывожу «10» но для МК это не работает:

char a =0b00001010;int b = a;


И я уже пол дня бьюсь ищу в интернете как правильно типы переменных менять но что то толку пока нет. Мне это надо что бы отладку делать пытаюсь освоить I2C и нужно что то сыпать в сериал, а он сыплет квадратики, Только если как символ посылать отображает, а мне охота значение переменной смотреть считанной с другого устройства часов, еепрома и тд

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


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

мне охота значение переменной смотреть

где смотреть?

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


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

Если в этой программе нет режима просмотра ascll кодов, воспользуйтесь другой.

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


Ссылка на сообщение
Поделиться на других сайтах
Yurkin2015    320
4 часа назад, serega374 сказал:

Как в данном случае 10 вывести в сериал порт?

@serega374 Число b=10 - это один байт. На мониторе строка "10" - это два байта, первый '1' и второй '0'. Вот и надо посылать в SerialPort эти два байта.

 

Для этого нужно преобразовать число в строку.

Определяем сначала - сколько десятков в числе.

d = b / 10

Получаем d = 1. Преобразовываем d в ASCII код  и посылаем

UDR0 = d + '0'

Затем вычисляем - сколько единиц в b

d = b % 10

Получаем d = 0. Преобразовываем d в ASCII код  и посылаем

UDR0 = d + '0'

 

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

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

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


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

@serega374 , скачайте себе какую-нибудь терминальную программу, с возможностью выбора способа вывода принятой информации - их много всяких. Чтобы ничего не рекламировать: https://yandex.ru/search/?lr=11230&clid=2236986&win=230&text=терминальная программа для com порта

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


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

Получаю температуру с DS3231 целую часть из 0х11 вывожу в UART затем посылаю точку. И она если перед её посылкой _delay_ms(100); не поставить не выводится в UART.
Ещё вопрос получаю дробную часть температуры из 0x12 она хранится в7и 8 байте.

unsigned char TempData=TWDR;
int CurrentTemp=(TempData&0b11000000)
switch (CurrentTemp)
case 0:
Посылка в UART ‘0’ ‘0’
case 1:
Посылка в UART ‘2’ ‘5’
case 2: ‘5’’ 0’ case 3: ‘7’’5’

Я как понял CurrentTemp будет либо 00 либо 01 либо 10 либо 11. Что соответствует сотым частям температуры с кратностью 0.25. Верно ли я switch case составил, у меня что то не то в Uart идёт не могу проблема в нем или во мне)

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


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

Верно ли я switch case составил

конечно нет. CurrentTemp у вас никогда не равен 1,2,3.

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


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

@IMXO но я писал и "case 00:", 01, 10, и 11.  Всё равно не получается. Как правильно то? Не могу понять

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


Ссылка на сообщение
Поделиться на других сайтах
Sergey-Ufa    629
4 часа назад, serega374 сказал:

int CurrentTemp=(TempData&0b11000000)

CurrentTemp после этого может приобретать только значения 0x00, 0x40, 0x80 и 0xC0

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


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

День добрый. Есть устройство на Atmega328p которое контролирует температуру в четырех точках  датчиками DS18B20, так вот в прототипной версии датчики подключены проводами от мышки, и того что попало под руку. Все работает почти идеально, изредка давая сбои по датчикам (на логику работы не влияет). Собрал второй прибор, подключил датчики, но в этом случае взял обычный многожильный(одиночный) провод нарезал три куска и скрутил их вместе дрелью, получив приемлемый для меня дешевый вариант 3-х жильного провода. Так вот в таком варианте (программный код один и тот же) много ошибок чтения показаний датчиков, в плоть до того, что при подключении 4-го датчика идут одни ошибки. Вопрос собственно, кто нибудь может знает какие нибудь особенности, требования к проводам или еще какие хитрости для увеличения стабильности чтения данных с датчиков. Длины проводов где-то около 1,5м на каждый датчик. Блок питания TSP-05 c алиэкспресс питает датчики ,контроллер, дисплей 2004 , по мультиметру выдает стабильно 5В.

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


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

Как запитаны DS? Паразитно или напрямую? Судя по тому что 3 провода - напрямую, но всё же уточню. Делал когда то витой парой, метров 30 точно было, ошибки были, но не много, правда один датчик только на шине был. Когда то находил рекомендации по 1wire тянуть витой парой, данные + земля, пиатние + земля. То есть получается две косы, по одной земле в каждой. Может питания проваливается, попробуйте возле каждой ds по конденсатору на 100 нан хотя бы. Какой номинал подтягивающего резистора? Может там проблема? Ещё, чисто из моего опыта, если адреса ds определять на ходу на шине, то при длинных линиях этот алгоритм у меня стабильно не особо работал, я правда этим сильно не заморачивался, но с первого взгляда, алгоритм определения адрес сам по себе муторный...

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

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


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

Все верно, DS запитаны на прямую. Резистор 4,7кОм, пробовал уменьшать, подымать в пределах 1кОм не помогает. Алгоритм таков: сначала я запоминаю адрес каждого датчика по отдельности в память мк. Затем в цикле  1 раз в сек. захожу  и делаю опрос последовательно каждого датчика на получение температуры, ну далее идет сравнение и дальнейший алгоритм. В конце всего этого посылаю команду на конвертацию всех датчиков с пропуском идентификации SKIP ROM, через секунду цикл повторяется. Разрядность датчиков установлена в 11бит. Есть прерывания по Int0, но там все быстро, зашли увеличили счетчик и вышли. Провода на датчики 0,5мм2, то что было под рукой, по плате натыканы конденсаторы по питанию на 100нан. неужто просадка может на датчике быть? После опроса я не проверяю байт CRC, считываю только данные , если пришли отличные от FFFF значит данные верны, нет -ошибка. В итоге подключая в систему четвертый датчик происходит частое выкидывание ошибки, либо температуры 85 град. 

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


Ссылка на сообщение
Поделиться на других сайтах
snn_krs    46
1 hour ago, Demonrostov said:

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

У меня при опросе датчиков шли прерывания от таймера и были ошибки. Запретил прерывания на время опроса датчиков, ошибки исчезли.

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


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

Пробуй конденсатор хотя бы в конце линии. Ну и витая пара, как писал выше. Вообще почему-то многие недооценивают надобность блокирующих конденсаторов.

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

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


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

Ранее выкладывал выходной каскад для работы с данным типом датчиков

https://forum.cxem.net/index.php?/topic/183682-датчик-ds-18b-20-при-отключении-иногда-продолжает-показывать-старую-температуру/&tab=comments#comment-2685080

основным элементом здесь является MAX6314 - т.к. называемая активная подтяжка (помогает линии быстрее подтянуться к лог.1). В конце линии (у последнего датчика) необходимо ставить диод 1N5817-1N5819 между GND и DATA.
Также надо запрещать прерывания на время передачи и приёма одного бита данных. Ну и CRC обязательно.

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

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


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

запрещать прерывания на время передачи и приёма каждого бита надо ОБЯЗАТЕЛЬНО! так как время тайм-слота строго ограничено.

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

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


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

С запретом прерывания надо мыслить, т.к. на него идет синхронизация с сетевым питанием, ну и далее управление симистором. Думал об этом. Есть мысль опрашивать один датчик после каждого синхроимпульса, т.е. сделали прерывание, после делаем опрос в тайм слоте до следующего прерывания, потом следующий датчик и т.д. . Спасибо всем за инфу. Буду пробовать. Как отлажу поделюсь опытом)) Да, в протеусе (частота 16МГц) время на прерывание 4,18 мкс, ну и ошибок нет)) 

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


Ссылка на сообщение
Поделиться на других сайтах
snn_krs    46
2 hours ago, Demonrostov said:

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

Делал терморегулятор с DS18B20 и выход на симистор через MOC3083, у него встроенная схема определения перехода через 0. На время опроса датчика отключал прерывания. Работает нормально.

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


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

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

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

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

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

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

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

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

Загрузка...

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

    • Автор: CUBE
      Не могу запустить асинхронный режим. 
      Ниже будет представлен код которым пытаюсь отладить. Там в 1 коде идёт работа от внутреннего источника таков (стоит 1МГц).  После 5 миганий таймер должен перейти в асинхронный режим и мигать с частотой в 1 Гц. У меня происходит 5 миганий потом ничего. Фьюзы менять пробовал, ничего не дало, сейчас дефолт. Корпус кварца к земле тянуть пробовал - безрезультатно. 
      Возможно что-то в подключении накосячил, если не видно на фото ниже, спрашиваете, нужно будет - нарисую схему. 
      Компилятор Atmel Studio 7
      Шью через Sind Prog 2.1.1 + USBasp 2.0
      Вот код: 
      .macro outi 
       ldi r16, @1 
       out @0, r16 
      .endm 
      .org $000 
      rjmp reset 
      .org $001 
      reti 
      .org $002 
      reti 
      .org $003 
      reti 
      .org $004 
      rjmp timer2_ovf 
      .org $005 
      reti 
      .org $006 
      reti 
      .org $007 
      reti 
      .org $008 
      reti 
      .org $009 
      reti 
      .org $00A 
      reti 
      .org $00B 
      reti 
      .org $00C 
      reti 
      .org $00D 
      reti 
      .org $00E 
      reti 
      .org $00F 
      reti 
      .org $011 
      reti 
      .org $012 
      reti 
      .ORG INT_VECTORS_SIZE 
       
      reset: 
      .equ portout=portd 
      .equ ddrout=ddrd 
      .def led=r17 
      .def mask=r18 
      .def counter=r19 
       outi spl,low(ramend) 
       outi sph,high(ramend) 
       
       outi ddrout, 0xff 
       
       outi tccr2, 0b00000111 
       outi timsk, 1«toie2 
       
        
       
        
       ldi led,1«5 
       ldi mask,1«5 
       sei 
      cycle: 
      cpi counter, 10 
      breq offtim 
       rjmp cycle 
       
      timer2_ovf: 
      inc counter 
       out portout, led 
       eor led, mask 
      reti 
        
      offtim: 
      outi timsk, 0«toie2 
      rjmp asinxron 
       
      asinxron: 
       outi assr, 0b00001000 
      back: 
       in r16, assr 
       cpi r16, 0b00001000 
       brne back 
       
        outi tccr2, 0b00000101 
        outi tcnt2, 0 
        outi ocr2, 0 
        outi timsk, 1«toie2 
       
       
      m1: 
      rjmp m1


      Верх меги на фото слева. 
    • Автор: qwer qwer
      Требуется разработать блок управления сплит-системой с функцией обучения по ИК каналу через RS-485 интерфейс на базе МК STM32. Есть ТЗ и список команд управления. Разработка в 2 этапа: 1-разработка принципиальной электрической схемы с указанием элементов на основе структурной из ТЗ (можно в карандаше), 2-написание ПО для МК STM32 в соответствии с ТЗ и списком команд. Оплата поэтапно. Кому интересно - уточняйте детали и оценивайте стоимость работы.
      Блок управления по ИК каналу Описание.docx
      Команды MODBUS.xlsx
    • Гость Keil
      Автор: Гость Keil
      Добрый день, ситуация такая - попались мне под руку куча рассыпухи в числе которых достаточное количетво тинек и прочей лабуды - пытась хеловродить, попробовал взять готовый пример работы тиньки и лсдишника здесь также имею ардуинку как  Айсипи и чудесно мигаю светодиодом на мк прошитом ею же  так вот при попытке залить код который по ссылке чуда не произошло.
      курение мануалов лсдишника дало понять лиш одно что старший и младший биты одинаковы с лсдишником со статьи - лсдишник рабочий (игрался контрастом одной строки через V0  и потенциометр ) - как в прочем и мк, было задумано ковырнуть все это в протеусе и атмельстудии, но результатом не увенчалось. Пожалуйста тыкните носом что да где не так.
      fail.zip
    • Автор: В гостях у Михалыча
      Приветики. На днях купил колонку сгоревшую под ремонт. При нажатии на кнопку включения сразу же нагревается микросхема (B6THM1016 1516arz) В интернете вообще нет ничего о ней. Как я понял, это контроллер сенсорных кнопок и питания (даже если включить зарядку, то микруха не греется, пока не нажмешь на кнопку), ибо есть еще две микросхемы, одна из них усилитель, а вторая-блютуз. Может ее получится как-то заменить или выкинуть вообще? 


    • Автор: Сергей Скопинцев
      Нужно разработать циклическую программу сбора информации от 10 измерительных источников. Период повторения цикла - одна секунда
      Источники:
       М - тензопреобразователь давления. Мостовая схема питается постоянным напряжением, выходной сигнал от 0 до 100 милливольт
       Т, ТМ, ТА- три канала измерения изменения напряжения в диапазоне от 400 до 600 милливольт (тоже нужен мост?)
       ЛМ - анализатор максимума напряжения (от 0 до 5 Вольт) по 10 точкам более-менее распределённых в измерительном цикле. Найденный максимум потом должен участвовать в анализе, постепенно уменьшаясь на 20% каждый цикл
       ВЛ - измерить напряжение на Малой емкости (50 пФ) с помощью емкостного делителя по алгоритму:
                         Снять Землю со средней точки емкостного делителя, подать на емкостной делитель положительный Импульс
                         Замерить нужное нам напряжение в средней точке делителя
                         Снять положительный Импульс с делителя, посадить на землю среднюю точку делителя
      - остальные каналы К7...К10  служебные
      Разрядность данных - 16 двоичных.

      Результаты писать на MicroSD текстовым файлом, на первом месте в строке текущее время в секундах, остальные каналы разделены пробелами
      Порядок каналов:
      Т - М -ТМ - Вл - ЛМ -...
      Коэффициенты усиления по каждому информационному каналу должен иметь возможность изменить оператор по формуле y = Ax + B
      Прибор автономный, питается от + 5 Вольт.