"Разбиваете" задачи на части, решаете каждую из них последовательно и объединяете. Если одна задача снова сложная, то "разбиваете" ее на большее количество составных частей и решаете их последовательно.
Бы написал две вспомогательные программы: 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 кодировку в главном окне.
Для проверки изменил программку и в главном окне появились ожидаемые цифры. Спойлер
#include "IOSTM8S103F3.h"
char i;
void uart_init()
{
//Настраиваем TX на выход, а RX на вход
PD_DDR_bit.DDR5 = 1; //TX
PD_CR2_bit.C26 = 0; // Запретить внешние прерывания
PD_DDR_bit.DDR6 = 0; //RX
PD_CR1_bit.C16 = 0; //RX - плавающий вход
//Настройка скорости передачи 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? Неужели нужно писать программу, которая будет перекодировать текст? Или я опять собираюсь изобретать велосипед?
Так вопрос и стоит в интерпретации. Человек же не машина. Ему нолики и единички не нужны.
Видимо поэтому и реализовали в программе Терминал автоматическую конвертацию полученных ноликов и единичек в символы. А если используют конкретную кодировку при конвертации, значит есть какие-то стандарты передачи данных... А если есть стандарты передачи данных, то наверное есть и стандартные процедуры реализации этих стандартов. Верно я мыслю?
[uquote="Martian",url="/forum/viewtopic.php?p=4491546#p4491546"]откроем уарт - там будет описание, типа такого:[/uquote]
Я понимаю как идет передача сигнала по проводам и какой она имеет вид осциллограммы. Я немножко
о другом спрашивал. Ну да ладно, это отдельная тема для изучения.
Вернемся к нашим баранам...(Точнее будет сказать к моим) Будем считать, что очки я себе сделал. И в этих очках я вижу тоже, что и без них. А именно:
Написал программу, которая будет передавать на компьютер по uart результат АЦП с 4 входа. Так вот этот результат не соответствует ожидаемому. На вход подаю 3.3 вольта и ожидаю увидеть результат 1023.
У меня складывается мнение, что я неверно настроил АЦП. Но вот что не так, пока мне непонятно. Спойлер
[uquote="Pjatruha@mail.ru",url="/forum/viewtopic.php?p=4491564#p4491564"]На вход подаю 3.3 вольта и ожидаю увидеть результат 1023[/uquote]
Ежели АЦП 10-разрядный, а опорное напряжение равно 3,3 вольта, тогда конечно увидите 1023.
Переписал программу. Добавил 2 переменные и в них записываю результат преобразования. Затем их отправляю в UART. Затем загоняю эти 2 байта в калькулятор и перевожу полученное значение в десятичное. И результат не похож на ожидаемый.
Еще поправил инициализацию АЦП. Мне кажется я неправильно указывал значения SPSEL бита, поэтому записал значение сразу в весь регистр ADC_CR1
Спойлер
while(1)
{
if ((ADC_CSR_bit.EOC==1)&(t==1000))
{
t=0;
x = ((unsigned short)(ADC_DRH << 8 )) | ADC_DRL; //записывае данные из регистров ADC_DRL и ADC_DRH в переменную
PB_ODR_bit.ODR5 = !PB_ODR_bit.ODR5; // Индикатор входа в тело оператора
if (UART1_SR_TXE==1)
{
UART1_DR =res2;
}
if (UART1_SR_TXE==1)
{
UART1_DR =res1;
}
ADC_CR1_bit.ADON=1; // запускаем преобразование
}
}
}
[/uquote]Мрак и ужас...
[uquote="Pjatruha@mail.ru",url="/forum/viewtopic.php?p=4491661#p4491661"]Но в моем случае данные все равно отправлялись в том порядке, в котором я их посылаю.[/uquote]Просто повезло. Завтра что-то добавите/измените где-то в программе (совсем в другом месте) и передача сломается. Или работа АЦП сломается.
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 раз.
[uquote="veso74",url="/forum/viewtopic.php?p=4492175#p4492175"]попробуйте писать код в Arduino IDE[/uquote]
А в чем разница? Почему вы думаете, что там будет проще писать?
В самом начале, я стоял перед выбором среды программирования. Рассматривал Arduino IDE. Установил ее на компьютер, и пытался что-то написать. Честно сказать мне не очень понравилось. В первую очередь, наверное, потому что она оказалась очень тяжелой для моего компьютера(долго запускается, долго компилирует). А сейчас уже побаиваюсь на что-то другое переходить(боюсь запутаться).
[uquote="Jack_A",url="/forum/viewtopic.php?p=4492176#p4492176"]Дык а настройках терминалки выбрано hex. Установить ASCII - и будет сыпать текстом.[/uquote]
Боюсь не будет. Несколько постов выше об этом писал.
[uquote="Martian",url="/forum/viewtopic.php?p=4492208#p4492208"]осталось разобраться, как сторона приёма поймёт, что передача завершена.[/uquote]
А это тоже нужно учитывать?... Да, с передачей данных никогда не работал...
Потому что там писать программный код ... легко. Сделали все макроси, функции и т.д. для использования неспециалистами. Близко к "человеческому мышлению". Просто используйте. (Правда, создается неправильное представление, что все дано ).
Напр. задача: напрежение ADC pin 0 -> в Serial - 1 строка кода. (код не пробовал, могут быть неточности).
Спойлер
[uquote="veso74",url="/forum/viewtopic.php?p=4492227#p4492227"]Установите Arduino IDE v1.8.19.[/uquote]
Да, v1.8.19 работает шустрее v2.x.x.
И таки да, писать там кажется попроще(почитал документацию). Но с STM8 там могут возникнуть проблемы, из-за того что не все библиотеки адаптированы, насколько я понял.
Кстати, с UART у меня и там возникли проблемы. Стандартный пример AnalogReadSerial не скомпилировался. Компилятор выдал ошибку. C:\Windows\TEMP\arduino_modified_sketch_744557\AnalogReadSerial.ino:16: error 25: Structure/Union expected left of '.->'
C:\Windows\TEMP\arduino_modified_sketch_744557\AnalogReadSerial.ino:24: error 25: Structure/Union expected left of '.->'
/*
AnalogReadSerial
Reads an analog input on pin 0, prints the result to the Serial Monitor.
Graphical representation is available using Serial Plotter (Tools > Serial Plotter menu).
Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.
This example code is in the public domain.
https://www.arduino.cc/en/Tutorial/BuiltInExamples/AnalogReadSerial
*/
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
// read the input on analog pin 0:
int sensorValue = analogRead(A3);
// print out the value you read:
Serial.println(sensorValue);
delay(1); // delay in between reads for stability
}
Добавьте аппаратную поддержку Arduino IDE в STM8 из предыдущих сообщений. Перепишите код, скомпилируйте. Запишите полученный hex файл программатором. Получаете вольтметр на А0 (PC4) к UART. С внешним адаптером RX/TX на CH340G к D14/D15. Мне потребовалось ~10 минут.
[uquote="veso74",url="/forum/viewtopic.php?p=4492855#p4492855"]Добавьте аппаратную поддержку Arduino IDE в STM8[/uquote]
Да вроде все сделал, как сказано в инструкции, но почему-то не работает. Причем, пример Blink компилируется заливается в контроллер и работает в нем.
Ну да ладно. Думаю, что не буду распыляться и менять коней на переправе. Если начал писать в IAR, то в нем и продолжу. С предыдущими трудностями справился и с будущими, надеюсь справлюсь. В конце концов, мир не без добрых людей, поэтому надеюсь, что тут мне помогут.