Например TDA7294

Форум РадиоКот • Просмотр темы - Программирование STM8
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вс фев 15, 2026 01:56:15

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 2585 ]     ... , , , 121, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Чт окт 19, 2023 04:22:27 
Друг Кота
Аватар пользователя

Карма: 26
Рейтинг сообщений: 837
Зарегистрирован: Сб янв 28, 2006 22:47:24
Сообщений: 5923
Рейтинг сообщения: 0
Обобщенно системы исчисления я знаю

Тогда настало время ознакомится с типами и их приведением. Без чего можно ждать всяких сюрпризов, в основном неприятных.

_________________
Астролябия-сама меряет, было бы что мерять!!!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Чт окт 19, 2023 08:12:33 
Грызет канифоль

Зарегистрирован: Пн фев 10, 2014 19:40:03
Сообщений: 259
Рейтинг сообщения: 0
А что не так с типами данных? Это то с чего начинается книга(почти с этого) Б. Кешиган, Д. Ритчи Язык программирования Си. Периодически подглядываю в такие таблички в интернете.
Чувствую, что что-то упустил из виду...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Чт окт 19, 2023 08:31:39 
Мудрый кот

Карма: 25
Рейтинг сообщений: 499
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1867
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
"Разбиваете" задачи на части, решаете каждую из них последовательно и объединяете. Если одна задача снова сложная, то "разбиваете" ее на большее количество составных частей и решаете их последовательно.

Бы написал две вспомогательные программы: 1. счетчик от 000 до 999, +1 каждые напр. 0,2 секунды, номер отображается на дисплее, и 2. измерение АЦП на выводе и отправку на UART (внешний адаптер RX/TX->USB). Если работают без ошибок, можно объединить. Таким образом, будете работать без неизвестных.

STM8 UART example | STM8 STVD Cosmic compiler UART example code


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Чт окт 19, 2023 08:45:24 
Грызет канифоль

Зарегистрирован: Пн фев 10, 2014 19:40:03
Сообщений: 259
Рейтинг сообщения: 0
Со счетчиком думаю разберусь. UART вообще не планировал рассматривать в ближайшее время. Мне кажется это уровень пока не для моих знаний. Возможно я ошибаюсь и это не так сложно как кажется :)
А для чего вы мне это рекомендуете? Пока не понимаю вашей идеи. :dont_know:


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Чт окт 19, 2023 09:32:25 
Мудрый кот

Карма: 25
Рейтинг сообщений: 499
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1867
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
Дал метод для debug. Так будете работать без неизвестных. Таким образом, будут инструменты для быстрого обнаружения неточностей.

В Arduino UART по умолчанию включен (одна строка программы). В PIC с используемым компилятором - также строка + аппаратный внешний преобразователь. В STM32 немного больше строки, но там есть внутренний отладчик. Эти неточности в описанном выше коде проявляются в первые минуты тестирования. Если инструментов отладчика нет, проще их создать и с их помощью отслеживать, чем несколько дней смотреть на "сухой программный код".


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Чт окт 19, 2023 21:13:28 
Грызет канифоль

Зарегистрирован: Пн фев 10, 2014 19:40:03
Сообщений: 259
Рейтинг сообщения: 0
Ах вот вы о чем.. Об этом я подумал сразу. Но побоялся начинать изучение с протоколов передачи данных. Как я говорил ранее, подумал, что не осилю. Думаете уже пришло время?... :)
С другой стороны - глаза бояться, а руки делают... Попробую... В слепую-то оно очень сложно.

Добавлено after 9 hours 4 minutes 42 seconds:
По совету veso74 занялся изучением передачи данных по UART.
Написал простенькую программку. И вроде она даже работает. Правда в ASCII кодировке выводит мусор вместо ожидаемых цифр. В Десятичной кодировке цифры выводятся как и ожидалось. В чем может быть загвоздка? В RM вроде написано что передача происходит как раз-таки в ASCII..
Спойлер
Код:
#include "IOSTM8S103F3.h"
int 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/9600=1667 переводим в hex 0x683
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 = 0; i < 5; i++)
{
  if (UART1_SR_TXE==1) 
  {
    UART1_DR = i;
  }
}
i=0;
 }
}


Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Пт окт 20, 2023 18:02:08 
Грызет канифоль

Зарегистрирован: Пн фев 10, 2014 19:40:03
Сообщений: 259
Рейтинг сообщения: 0
Разобрался я в чем было дело. Как говориться в старых сказках - Утро вечера мудренее...
Сегодня еще раз пересмотрел 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? Неужели нужно писать программу, которая будет перекодировать текст? Или я опять собираюсь изобретать велосипед?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Пт окт 20, 2023 18:19:03 
Друг Кота

Карма: 67
Рейтинг сообщений: 1964
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
везде пересылаются нолики и единички. Как их потом интерпретировать - совершенно пофиг


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Пт окт 20, 2023 19:45:27 
Грызет канифоль

Зарегистрирован: Пн фев 10, 2014 19:40:03
Сообщений: 259
Рейтинг сообщения: 0
Так вопрос и стоит в интерпретации. :) Человек же не машина. Ему нолики и единички не нужны.
Видимо поэтому и реализовали в программе Терминал автоматическую конвертацию полученных ноликов и единичек в символы. А если используют конкретную кодировку при конвертации, значит есть какие-то стандарты передачи данных... А если есть стандарты передачи данных, то наверное есть и стандартные процедуры реализации этих стандартов. Верно я мыслю?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Пт окт 20, 2023 21:00:09 
Друг Кота

Карма: 67
Рейтинг сообщений: 1964
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
откроем уарт - там будет описание, типа такого:

Изображение

нолики и единички. I2C, SPI... везде будут нолики и единички (за исключением аналоговой передачи). Во что они превращаются - Ваше личное дело. Хотите, чтобы Ваше устройство общалось, например, с ЧПУ Fanuc - будьте добры, сделать так, чтобы нолики и единички соответствовали кодам ISO или EIA, хотите свои два устройства связать - выберите что угодно или вообще не выбирайте - совершенно пофиг.
Так что, всё это условности, и делается в соответствие ТЗ.
Стандарты же определяют не только сопоставление ноликов и единичек, но и кучу иных правил.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Пт окт 20, 2023 21:45:15 
Грызет канифоль

Зарегистрирован: Пн фев 10, 2014 19:40:03
Сообщений: 259
Рейтинг сообщения: 0
откроем уарт - там будет описание, типа такого:

Я понимаю как идет передача сигнала по проводам и какой она имеет вид осциллограммы. Я немножко
о другом спрашивал. Ну да ладно, это отдельная тема для изучения. :)
Вернемся к нашим баранам...(Точнее будет сказать к моим) Будем считать, что очки я себе сделал. И в этих очках я вижу тоже, что и без них. А именно:
Написал программу, которая будет передавать на компьютер по uart результат АЦП с 4 входа. Так вот этот результат не соответствует ожидаемому. На вход подаю 3.3 вольта и ожидаю увидеть результат 1023.
У меня складывается мнение, что я неверно настроил АЦП. Но вот что не так, пока мне непонятно. :dont_know:
Спойлер
Код:
#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;

#pragma vector=TIM1_OVR_UIF_vector
 __interrupt void TIM1_interrupt(void)
{
    TIM1_SR1_bit.UIF = 0; //Cброс флага прерывания
 t++;
}

void DELENIE()
{
  L_3 = y / 1000;
  L_2 = (y / 100) % 10;
  L_1 = (y / 10) % 10;
}

void ADC_init()
{
   ADC_CSR_bit.AWD=0; //запрет ожидания сигнала от аналогового сторожевого таймера
   ADC_CSR_bit.EOCIE=0; //прерывание по окончанию преобразования запрешено
   ADC_CSR_bit.AWDIE=0; //прерывание от сторожевого таймера запрещено
   ADC_CSR_bit.CH=0x04; //канал AIN4
   ADC_CR1_bit.SPSEL=0x04; //выбор делителя частоты. Макс. АЦП F=4МГц при VDD=3.3, при VDD=4В F=6МГц
   ADC_CR1_bit.CONT=0; //одиночное преобразование
   ADC_CR2_bit.EXTTRIG=0; //преобразование по внешнему событию запрещено
   ADC_CR2_bit.ALIGN=0; // выравнивание результата преобразования "по правому краю"
   ADC_CR3_bit.DBUF=0; //Буфер данных отключен. Результат преобразования в ADC_DRH и ADC_DRL
   ADC_CR3_bit.OVR=0; //очистка флага перед запуском АЦП
   ADC_CR1_bit.ADON=1; //подключение АЦП к источнику питания
}

void TIM1_init()
{
    //Частота переполнений = 16000000Гц / 32 / 500 = 1000 Гц(1 мс)
  TIM1_PSCRH = 0x00;//записываем 2 старших байта числа 31(32-1) в hex формате в регистр предделителя
  TIM1_PSCRL = 0x1F;//записываем 2 младших байта числа 31(32-1)в hex формате в регистр предделителя
  TIM1_ARRH = 0x01; //записываем 2 старших байта числа 500 в hex формате в регистр автоперезагруски
  TIM1_ARRL = 0xF4; //записываем 2 младших байта числа 500 в hex формате в регистр автоперезагруски

  TIM1_CR1_bit.DIR = 0; // Cчет вверх
  TIM1_CR1_bit.URS = 1; //Прерывание только по переполнению счетчика
  TIM1_EGR_bit.UG = 1;  //Вызываем Update Event для загрузки предделителя

  TIM1_IER_bit.UIE = 1; //Разрешаем прерывание
  TIM1_CR1_bit.CEN = 1; //Запускаем таймер
}

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/9600=1667 переводим в hex 0x682
UART1_BRR2 = 0x03;
UART1_BRR1 = 0x68;

UART1_CR2_TEN = 1;//Передатчик включить
UART1_CR2_REN = 1;//Приемник включить
}

int main( void )
{
  CLK_CKDIVR=0; // установка делителя частоты процессора равного 1
  uart_init();
  ADC_init();
  TIM1_init();
  DELENIE();
  asm("rim");
  PB_DDR_bit.DDR5 = 1; // Настройка 5-го бита порта B на вывод.
   PB_ODR_bit.ODR5 = 1; // Гашение светодиода.
   PB_CR1_bit.C15 = 1; // Переключение порта в режим push-pull.
   PB_CR2_bit.C25 = 0; // Cкорость переключения до 2 МГц
   
   i=1000; //временная задержка
   do {i--;}
   while (i>1);
   ADC_CR1_bit.ADON=1; //повторная запись единицы дает команду на старт преобразования
   
   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 =x;
      }
      ADC_CR1_bit.ADON=1; // запускаем преобразование
    }
 }
}

Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Пт окт 20, 2023 21:56:55 
Друг Кота
Аватар пользователя

Карма: 26
Рейтинг сообщений: 837
Зарегистрирован: Сб янв 28, 2006 22:47:24
Сообщений: 5923
Рейтинг сообщения: 0
На вход подаю 3.3 вольта и ожидаю увидеть результат 1023

Ежели АЦП 10-разрядный, а опорное напряжение равно 3,3 вольта, тогда конечно увидите 1023.

_________________
Астролябия-сама меряет, было бы что мерять!!!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Пт окт 20, 2023 21:57:00 
Друг Кота

Карма: 67
Рейтинг сообщений: 1964
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
UART1_DR =x;

Это как это? два байта пихаются в один?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Пт окт 20, 2023 23:43:12 
Грызет канифоль

Зарегистрирован: Пн фев 10, 2014 19:40:03
Сообщений: 259
Рейтинг сообщения: 0
Переписал программу. Добавил 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;

#pragma vector=TIM1_OVR_UIF_vector
 __interrupt void TIM1_interrupt(void)
{
    TIM1_SR1_bit.UIF = 0; //Cброс флага прерывания
 t++;
}

void DELENIE()
{
  L_3 = y / 1000;
  L_2 = (y / 100) % 10;
  L_1 = (y / 10) % 10;
}

void ADC_init()
{
   ADC_CSR_bit.AWD=0; //запрет ожидания сигнала от аналогового сторожевого таймера
   ADC_CSR_bit.EOCIE=0; //прерывание по окончанию преобразования запрешено
   ADC_CSR_bit.AWDIE=0; //прерывание от сторожевого таймера запрещено
   ADC_CSR_bit.CH=0x04; //канал AIN4
   //ADC_CR1_bit.SPSEL=0x04; //выбор делителя частоты. Макс. АЦП F=4МГц при VDD=3.3, при VDD=4В F=6МГц
   //ADC_CR1_bit.CONT=0; //одиночное преобразование
   ADC_CR2_bit.EXTTRIG=0; //преобразование по внешнему событию запрещено
   ADC_CR2_bit.ALIGN=0; // выравнивание результата преобразования "по правому краю"
   ADC_CR3_bit.DBUF=0; //Буфер данных отключен. Результат преобразования в ADC_DRH и ADC_DRL
   ADC_CR3_bit.OVR=0; //очистка флага перед запуском АЦП
   //ADC_CR1_bit.ADON=1; //подключение АЦП к источнику питания
   ADC_CR1=0x21;
}

void TIM1_init()
{
    //Частота переполнений = 16000000Гц / 32 / 500 = 1000 Гц(1 мс)
  TIM1_PSCRH = 0x00;//записываем 2 старших байта числа 31(32-1) в hex формате в регистр предделителя
  TIM1_PSCRL = 0x1F;//записываем 2 младших байта числа 31(32-1)в hex формате в регистр предделителя
  TIM1_ARRH = 0x01; //записываем 2 старших байта числа 500 в hex формате в регистр автоперезагруски
  TIM1_ARRL = 0xF4; //записываем 2 младших байта числа 500 в hex формате в регистр автоперезагруски

  TIM1_CR1_bit.DIR = 0; // Cчет вверх
  TIM1_CR1_bit.URS = 1; //Прерывание только по переполнению счетчика
  TIM1_EGR_bit.UG = 1;  //Вызываем Update Event для загрузки предделителя

  TIM1_IER_bit.UIE = 1; //Разрешаем прерывание
  TIM1_CR1_bit.CEN = 1; //Запускаем таймер
}

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/9600=1667 переводим в hex 0x682
UART1_BRR2 = 0x03;
UART1_BRR1 = 0x68;

UART1_CR2_TEN = 1;//Передатчик включить
UART1_CR2_REN = 1;//Приемник включить
}

int main( void )
{
  CLK_CKDIVR=0; // установка делителя частоты процессора равного 1
  uart_init();
  ADC_init();
  TIM1_init();
  DELENIE();
  asm("rim");
  PB_DDR_bit.DDR5 = 1; // Настройка 5-го бита порта B на вывод.
   PB_ODR_bit.ODR5 = 1; // Гашение светодиода.
   PB_CR1_bit.C15 = 1; // Переключение порта в режим push-pull.
   PB_CR2_bit.C25 = 0; // Cкорость переключения до 2 МГц
   
   i=1000; //временная задержка
   do {i--;}
   while (i>1);
   ADC_CR1_bit.ADON=1; //повторная запись единицы дает команду на старт преобразования
   
   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; // запускаем преобразование
    }
 }
}

Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Пт окт 20, 2023 23:52:52 
Друг Кота

Карма: 67
Рейтинг сообщений: 1964
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
Код:
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 передалось оба значения


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Сб окт 21, 2023 08:30:51 
Грызет канифоль

Зарегистрирован: Пн фев 10, 2014 19:40:03
Сообщений: 259
Рейтинг сообщения: 0
Да, вы правы.
Наверное нужно написать так
Код:
if (UART1_SR_TXE==1)
      {
        UART1_DR =res2;
      }
      if ((UART1_SR_TXE==1)&(UART1_DR =res2))
      {
        UART1_DR =res1;
      }


Но в моем случае данные все равно отправлялись в том порядке, в котором я их посылаю. Проверял вот так:
Код:
if (UART1_SR_TXE==1)
      {
        UART1_DR =0xF1;
      }
      if (UART1_SR_TXE==1)
      {
        UART1_DR =0xF2;
      }
// в терминале вижу: F1 F2 F1 F2 F1 F2

Т.е и значения ацп видимо шли так же в том порядке, в котором я их отправлял.
Отправку данных по вашим рекомендациям проверю позже.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Сб окт 21, 2023 12:28:49 
Друг Кота

Карма: 67
Рейтинг сообщений: 1964
Зарегистрирован: Сб дек 18, 2021 19:25:32
Сообщений: 12867
Рейтинг сообщения: 0
то, что видится в терминале, не гарантирует порядок верной отправки. Вы можете утверждать, что увиденная последовательность не соответствовала такой работе:
10 раз ничего не отправилось
1 раз отправился 0xF1
10 раз ничего не отправилось
1 раз отправился 0xF2
?
Может, имеет смысл как-то гарантированно формировать очередь передачи чего-то, например, проверить, не занят ли интерфейс, если занят - подождать освобождения, если не занят, отправить первый байт, снова подождать, когда интерфейс освободится, отправить следующий байт и т.д.
У Вас всего два байта. А что будет, если их станет три? тысяча?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Сб окт 21, 2023 12:45:32 
Говорящий с текстолитом

Карма: -7
Рейтинг сообщений: 194
Зарегистрирован: Вт авг 15, 2017 10:51:13
Сообщений: 1690
Рейтинг сообщения: 0
Код:
   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; // запускаем преобразование
    }
 }
}
Мрак и ужас... :facepalm:
Но в моем случае данные все равно отправлялись в том порядке, в котором я их посылаю.
Просто повезло. Завтра что-то добавите/измените где-то в программе (совсем в другом месте) и передача сломается. Или работа АЦП сломается.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Вс окт 22, 2023 16:23:03 
Грызет канифоль

Зарегистрирован: Пн фев 10, 2014 19:40:03
Сообщений: 259
Рейтинг сообщения: 0
Переписал код
Код:
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 на вход АЦП
Изображение
Значит АЦП настроено и работает верно. :) Тогда продолжу разбираться дальше.
Подскажите, а как опытные программисты проводят проверку того, что данные отправлены в нужной последовательности?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Программирование STM8
СообщениеДобавлено: Вс окт 22, 2023 16:52:01 
Мудрый кот

Карма: 25
Рейтинг сообщений: 499
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1867
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
Идея: попробуйте писать код в Arduino IDE с аппаратной поддержкой STM8. Минусы понятны: код не оптимален, но все предусмотрено и уже сделано. Будете писать только по алгоритму задуманного устройства, не вдаваясь в подробности о выбранном МК. А при необходимости: оптимизацию, или написание в другой среде. Но потом. Как только пути выбранных действий ясны.

Programming STM8S Microcontrollers using Arduino IDE
Generic STM8S103 breakout board

к Arduino IDE:
https://github.com/tenbaht/sduino/raw/m ... index.json

Изображение

А так рискуете бесконечно тестировать, почему не работает, например, ADC, UART, SPI, I2c, LCD ... И при 50..1000..10000 попытках чрез неделю, месяц, полгодане ... "сдаться" :). (частично пользуюсь переводчиком)


Последний раз редактировалось veso74 Вс окт 22, 2023 16:59:51, всего редактировалось 1 раз.

Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 2585 ]     ... , , , 121, , , ...  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: akl и гости: 25


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y