А что не так с типами данных? Это то с чего начинается книга(почти с этого) Б. Кешиган, Д. Ритчи Язык программирования Си. Периодически подглядываю в такие таблички в интернете. Чувствую, что что-то упустил из виду...
"Разбиваете" задачи на части, решаете каждую из них последовательно и объединяете. Если одна задача снова сложная, то "разбиваете" ее на большее количество составных частей и решаете их последовательно.
Бы написал две вспомогательные программы: 1. счетчик от 000 до 999, +1 каждые напр. 0,2 секунды, номер отображается на дисплее, и 2. измерение АЦП на выводе и отправку на UART (внешний адаптер RX/TX->USB). Если работают без ошибок, можно объединить. Таким образом, будете работать без неизвестных.
Со счетчиком думаю разберусь. UART вообще не планировал рассматривать в ближайшее время. Мне кажется это уровень пока не для моих знаний. Возможно я ошибаюсь и это не так сложно как кажется А для чего вы мне это рекомендуете? Пока не понимаю вашей идеи.
Дал метод для debug. Так будете работать без неизвестных. Таким образом, будут инструменты для быстрого обнаружения неточностей.
В Arduino UART по умолчанию включен (одна строка программы). В PIC с используемым компилятором - также строка + аппаратный внешний преобразователь. В STM32 немного больше строки, но там есть внутренний отладчик. Эти неточности в описанном выше коде проявляются в первые минуты тестирования. Если инструментов отладчика нет, проще их создать и с их помощью отслеживать, чем несколько дней смотреть на "сухой программный код".
Ах вот вы о чем.. Об этом я подумал сразу. Но побоялся начинать изучение с протоколов передачи данных. Как я говорил ранее, подумал, что не осилю. Думаете уже пришло время?... С другой стороны - глаза бояться, а руки делают... Попробую... В слепую-то оно очень сложно.
Добавлено after 9 hours 4 minutes 42 seconds: По совету veso74 занялся изучением передачи данных по UART. Написал простенькую программку. И вроде она даже работает. Правда в ASCII кодировке выводит мусор вместо ожидаемых цифр. В Десятичной кодировке цифры выводятся как и ожидалось. В чем может быть загвоздка? В RM вроде написано что передача происходит как раз-таки в ASCII.. Спойлер
Разобрался я в чем было дело. Как говориться в старых сказках - Утро вечера мудренее... Сегодня еще раз пересмотрел RM в поисках ответа. К своему удивлению, я ни слово не нашел там про ASCII. Откуда я взял что там это написано не пойму... В общем терминал автоматически конвертирует полученные данные в ASCII кодировку в главном окне. Для проверки изменил программку и в главном окне появились ожидаемые цифры. Спойлер
//Настройка скорости передачи f_master/baud_rate 16 000 000/115200=138 переводим в hex 0x8A 0x682 UART1_BRR2 = 0x03; UART1_BRR1 = 0x68;
UART1_CR2_TEN = 1;//Передатчик включить UART1_CR2_REN = 1;//Приемник включить /*Все остальные биты можно не прописывать, т.к они заданы по умолчанию UART1_CR1_PIEN = 0;//Четность отключена UART1_CR1_PCEN = 0;//Контроль четности отключен UART1_CR1_M = 0;//8-битный режим UART1_CR1_UART0 = 0;//Включить UART UART1_CR2_TIEN = 0;//Запретить прерывание по опустошению передающ. регистра UART1_CR2_TCIEN = 0;//Запретить прерывание по завершению передачи UART1_CR2_RIEN = 0;//Запретить прерывание по заполнению приемного регистра UART1_CR2_ILIEN = 0;//Запретить прерывание по освобождению линии UART1_CR2_SBK = 0;//Не посылать break-символ UART1_CR3_STOP = 0;//Один стоп-бит */ }
int main( void ) { CLK_CKDIVR=0; // установка делителя частоты процессора равного 1 uart_init(); while(1) {
for (i = 48; i < 53; i++) { if (UART1_SR_TXE==1) { UART1_DR =i; } } } }
Подскажите пожалуйста, а как тогда выводить текст в UART? Неужели нужно писать программу, которая будет перекодировать текст? Или я опять собираюсь изобретать велосипед?
Так вопрос и стоит в интерпретации. Человек же не машина. Ему нолики и единички не нужны. Видимо поэтому и реализовали в программе Терминал автоматическую конвертацию полученных ноликов и единичек в символы. А если используют конкретную кодировку при конвертации, значит есть какие-то стандарты передачи данных... А если есть стандарты передачи данных, то наверное есть и стандартные процедуры реализации этих стандартов. Верно я мыслю?
нолики и единички. I2C, SPI... везде будут нолики и единички (за исключением аналоговой передачи). Во что они превращаются - Ваше личное дело. Хотите, чтобы Ваше устройство общалось, например, с ЧПУ Fanuc - будьте добры, сделать так, чтобы нолики и единички соответствовали кодам ISO или EIA, хотите свои два устройства связать - выберите что угодно или вообще не выбирайте - совершенно пофиг. Так что, всё это условности, и делается в соответствие ТЗ. Стандарты же определяют не только сопоставление ноликов и единичек, но и кучу иных правил.
Я понимаю как идет передача сигнала по проводам и какой она имеет вид осциллограммы. Я немножко о другом спрашивал. Ну да ладно, это отдельная тема для изучения. Вернемся к нашим баранам...(Точнее будет сказать к моим) Будем считать, что очки я себе сделал. И в этих очках я вижу тоже, что и без них. А именно: Написал программу, которая будет передавать на компьютер по uart результат АЦП с 4 входа. Так вот этот результат не соответствует ожидаемому. На вход подаю 3.3 вольта и ожидаю увидеть результат 1023. У меня складывается мнение, что я неверно настроил АЦП. Но вот что не так, пока мне непонятно. Спойлер
Код:
#include "IOSTM8S103F3.h" volatile unsigned short z=0, x=0, y=111,L_1,L_2,L_3; volatile int m=0, t; volatile char i=1,j=0,n=0,k=1;
Переписал программу. Добавил 2 переменные и в них записываю результат преобразования. Затем их отправляю в UART. Затем загоняю эти 2 байта в калькулятор и перевожу полученное значение в десятичное. И результат не похож на ожидаемый. Еще поправил инициализацию АЦП. Мне кажется я неправильно указывал значения SPSEL бита, поэтому записал значение сразу в весь регистр ADC_CR1 Спойлер
Код:
#include "IOSTM8S103F3.h" volatile unsigned short z=0, x=0, y=111,L_1,L_2,L_3; int res1, res2; volatile int m=0, t; volatile char i=1,j=0,n=0,k=1;
if (UART1_SR_TXE==1) //предположим, что не 1 { UART1_DR =res2; // тогда этот не передастся } if (UART1_SR_TXE==1) // а у тут уже 1 { UART1_DR =res1; // и этот передастся
}
итого этот код допускает 4 варианта: не передалось ничего в UART1_DR передалось только значение res1 в UART1_DR передалось только значение res2 в UART1_DR передалось оба значения
то, что видится в терминале, не гарантирует порядок верной отправки. Вы можете утверждать, что увиденная последовательность не соответствовала такой работе: 10 раз ничего не отправилось 1 раз отправился 0xF1 10 раз ничего не отправилось 1 раз отправился 0xF2 ? Может, имеет смысл как-то гарантированно формировать очередь передачи чего-то, например, проверить, не занят ли интерфейс, если занят - подождать освобождения, если не занят, отправить первый байт, снова подождать, когда интерфейс освободится, отправить следующий байт и т.д. У Вас всего два байта. А что будет, если их станет три? тысяча?
if ((UART1_SR_TXE==1)&(m == 0)) { m=1; UART1_DR = res2; } if ((UART1_SR_TXE==1)&(m == 1)) { UART1_DR =res1; m=0;
И оно таки стало передавать то, что я ожидаю Еще раз спасибо за пояснения и подсказки. Подача 3.3 вольта на вход АЦП Подача GND на вход АЦП Значит АЦП настроено и работает верно. Тогда продолжу разбираться дальше. Подскажите, а как опытные программисты проводят проверку того, что данные отправлены в нужной последовательности?
Идея: попробуйте писать код в Arduino IDE с аппаратной поддержкой STM8. Минусы понятны: код не оптимален, но все предусмотрено и уже сделано. Будете писать только по алгоритму задуманного устройства, не вдаваясь в подробности о выбранном МК. А при необходимости: оптимизацию, или написание в другой среде. Но потом. Как только пути выбранных действий ясны.
А так рискуете бесконечно тестировать, почему не работает, например, ADC, UART, SPI, I2c, LCD ... И при 50..1000..10000 попытках чрез неделю, месяц, полгодане ... "сдаться" . (частично пользуюсь переводчиком)
Последний раз редактировалось veso74 Вс окт 22, 2023 16:59:51, всего редактировалось 1 раз.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения