Программирование STM8

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32

Сообщение alex38779 »

Странно..У меня что лог. анализатор ни чего не показывает на PC4, что светодиод подключенный к этому выводу.
Все перепроверил кучу раз.

Компилятор sdcc:

Код: Выделить всё

SDCC : mcs51/z80/z180/r2k/r3ka/gbz80/tlcs90/ds390/pic16/pic14/TININative/ds400/hc08/s08/stm8 3.4.0 #8981 (Jan 10 2015) (Linux)
published under GNU General Public License (GPL)
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

вот на всякий - в реальной поделке работает, правда 1 канал TIM1. Недостаток - надо option bit alternate function [AFR0] включать:

Код: Выделить всё

void TIM1_init(void) // Настройка таймера 1
{
//PWM output signal frequency = TIM1 counter clock/(TIM1_ARR + 1)
//Channel x duty cycle = [TIM1_CCRxx/(TIM1_ARR + 1)] * 100  
    TIM1->PSCRH = 0x00;
    TIM1->PSCRL = 0x00;
    TIM1->ARRH = 0x0F;
    TIM1->ARRL = 0x9F;

    TIM1->CCMR1 |= (uint8_t)0x60; //110: PWM mode 1 - In up-counting, channel 1 is active as long as TIM1_CNT < TIM1_CCR1, 
    TIM1->CCER1 |= TIM1_CCER1_CC1E; //CH1 compare Enable
    TIM1->CCR1H = 0x07; 
    TIM1->CCR1L = 0xD0;
    TIM1->CR1 |= TIM1_CR1_CEN;  
    TIM1->BKR |= TIM1_BKR_MOE; // OC and OCN outputs are enabled if their respective enable bits are set (CC/E in Tim1_CCERi)    
}
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="alex38779",url="/forum/viewtopic.php?p=3435262#p3435262"]Странно..У меня что лог. анализатор ни чего не показывает на PC4, что светодиод подключенный к этому выводу.
Все перепроверил кучу раз.[/uquote]
Компилировал ИАР-ом, смотрел осциллографом. Частота и коэффициент заполнения соответствуют значениям регистров. Кварца у меня нет, тактировалось от внутреннего генератора. Полный текст под спойлером:
Спойлер

Код: Выделить всё

#include "stm8s.h"

void TIM1_Init(void)
{
   GPIOC->DDR |= GPIO_PIN_4;
   GPIOC->CR1 |= GPIO_PIN_4;
   GPIOC->CR2 |= GPIO_PIN_4;

   CLK->PCKENR1 |= CLK_PCKENR1_TIM1; //16MHz
   TIM1->CR1 &= ~TIM1_CR1_CEN; //OFF
   TIM1->CR1 |= TIM1_CR1_ARPE;

   TIM1->PSCRH = 0x00;
   TIM1->PSCRL = 0x08; // 16MHz/8 = 2MHz

   TIM1->ARRH = 0x4e; //2MHz/20000 = 100Hz частота шима
        TIM1->ARRL = 0x20;
   //D = 100% = 20000
   //D = 50% = 10000   

   TIM1->CCMR4 |= 0x68; //PWM MODE, Output compare 4 preload enable
   TIM1->CCER2 &= ~TIM1_CCER2_CC4P; //PC4
   TIM1->CCER2 |= TIM1_CCER2_CC4E;
   TIM1->BKR |= TIM1_BKR_MOE;

   TIM1->CCR4H = 0x00; //D=0%
   TIM1->CCR4L = 0x00;

   TIM1->IER &= ~TIM1_IER_UIE;    
   TIM1->CR1 |= TIM1_CR1_CEN; //ON;

   TIM1->CCR4H = 0x3a; //15000, D = 75%
   TIM1->CCR4L = 0x98;   
}

int main( void )
{
  CLK->CKDIVR = 0;

  TIM1_Init();
  while (1);
}
Держит паяльник хвостом
Аватара пользователя
Сообщения: 960
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда

Сообщение GARMIN »

Попробуй в конце так:
TIM1->CR1 |= TIM1_CR1_CEN; // разрешить таймер
TIM1->EGR |= TIM1_EGR_UG; // обновить установки
И проверь в отладчике результаты записи в регистры таймера
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

У SDCC такой отладчик, что поневоле засомневаешься, пользоваться им или нет.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32

Сообщение alex38779 »

А под линукс то и выбора нет, только sdcc для stm8. Из отладчиков есть gui для gdb, зовется ddd https://www.gnu.org/software/ddd/

На отладчике программа залипает на следующей строке - CLK->PCKENR1 |= CLK_PCKENR1_TIM1; //16MHz
Убираю ее и все идет дальше. Но толку нет.

Вижу такой вариант - у меня кривой stm8s.h, я его взял с сайта st.

Вообщем я чет намучился и установил в виртуалку 7 винду + iar, в нем скомпилировал этот код. Прошил - все работает.

Спасибо за помощь всем!
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

[uquote="alex38779",url="/forum/viewtopic.php?p=3435704#p3435704"]установил в виртуалку 7 винду + iar[/uquote]

Лучше STVD.
А еще лучше SES и stm32, если так уж охота красноглазить...
Друг Кота
Сообщения: 3092
Зарегистрирован: Пн апр 06, 2015 11:01:53
Откуда: москва, уфа

Сообщение arkhnchul »

[uquote="alex38779",url="/forum/viewtopic.php?p=3435704#p3435704"]А под линукс то и выбора нет[/uquote]
cosmic - сам компилятор - я под вайном запускал, работает, собирает. Остальные скорее всего тоже заведутся.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32

Сообщение alex38779 »

[uquote="arkhnchul",url="/forum/viewtopic.php?p=3435717#p3435717"]cosmic - сам компилятор - я под вайном запускал, работает, собирает. Остальные скорее всего тоже заведутся.[/uquote]

Я имел ввиду нативные компиляторы. Без вайнов и т.д.
Контактная информация:
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Хотя интереснее бы разобраться, почему собранный SDCC не работает. Проблема какая-то ненормальная.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Доброго времени суток. МК STM8S.
Ковыряюсь с внешними прерываниями. У такого конттроллера они очень упрощены. И нет флага внешнего прерывания. Ну он конечно же есть, но для софта недоступный.
Для теста специально брекпоинтился в обработчике и генерил внешнее событие.
Попытался сбросить этот внутренний флаг запретом/разрешением внеш. прерывания на пине. Это ничего не дало. Ну наверное логично, так как прерывание для всего порта идет.
Забубенил вот такой макрос

Код: Выделить всё

Clear_Fl_Ext_D    EXTI_CR1_PDIS=0;EXTI_CR1_PDIS=0x3;
, т.е просто переключил режимы возникновения событий. Ну вроде как сбросился этот флаг. Опять же в RM написано, что их можно переключать только находясь в приоритете Level3. Специально попробовал находясь в Level2, действительно перестал работать такой сброс. Т.е. если что еще прерывания надо запрещать для такой операции.

В общем ничего лучшего я не придумал, если нужен будет такой сброс.

Добавлено after 1 hour 46 minutes 51 second:
Вот что обнаружил, сразу то и не догадаешься такое прочитать. Видимо баг включенный в RM. Я про регистр D_CR1.
11.9.4 Port x control register 1 (Px_CR1)
Address offset: 0x03
Reset value: 0x00 except for PD_CR1 which reset value is 0x02.
Добавлено after 1 minute 59 seconds:
Хотя на этой ноге SWIM висит. Видимо не баг.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Открыл глаза
Аватара пользователя
Сообщения: 54
Зарегистрирован: Пт апр 25, 2008 03:44:41
Откуда: Воронеж

Сообщение Klepko »

Всем привет! Столкнулся с проблемой при разыменовывании указателя. Пользую cosmic. Передаю в функцию адрес на массива void spisendbuf(&massiv, byte) в функции spisendbuf(*massiv,byte) пытаюсь копировать значение в переменную bufer = *massiv но вместо значения получаю в буфере значение старшего адреса указателя *massiv. Как правильно копировать переменную на которую указывает указатель
Всех убить! Всё отобрать!
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Klepko, имя массива и есть адрес его первого элемента.

Код: Выделить всё

void copy_array(uint8_t * buf)
 {  uint8_t test,i;
	
	 for(i=0;i<8;i++)
	 {
		 test= *buf++;
		 
	 }
 }	 


uint8_t my_array[20]={1,45,68,34,78,23,98,56,3,0,165};
	
	
	copy_array(my_array);


Или с индексами :

Код: Выделить всё

void copy_array(uint8_t * buf)
 {  uint8_t test,i;
	
	 
	 for(i=0;i<8;i++)
	 {
		 test= buf[i];
		 
	 }
 }	 



И еще вариант передачи :

Код: Выделить всё

copy_array(&my_array[0]);
Открыл глаза
Аватара пользователя
Сообщения: 54
Зарегистрирован: Пт апр 25, 2008 03:44:41
Откуда: Воронеж

Сообщение Klepko »

dosikus спасибо.

Как правильно сделать, например есть функция передачи по spi команды и адреса

Код: Выделить всё

spiwritereg(0x01, 0x02);

void spiwritereg (uint8_t adress,uint8_t data)
{адреса
spisendbuf(&adress,1);
spisendbuf(&data,1);
}

void spisendbuf(uint8_t *massiv,uint8_t byte)
{
uint8_t i;
uint8_t test;
    for(i=0;i<byte;i++)
    {   
test=*massiv[i];/* здесь в отладчике вижу что в указателе *massiv[0] лежит адрес переменной adress например, а по адресу adress лежит нужное значение 0x01
а в переменную test копируется старший байт адреса указателя *massiv(смотрю в отладчике STVD), как сделать так, чтобы в переменную test копировалась переменная adress? */
test=massiv[i];// так компилятор ругается
  }
 }

Всех убить! Всё отобрать!
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Ругань компиля покажите.
Только что скомпилил оба варианта -никакой ругани.

Добавлено after 5 minutes 11 seconds:

Код: Выделить всё

void copy_array(uint8_t * buf)
 {  uint8_t test,i;
	 
	 
	 for(i=0;i<8;i++)
	 {
		 test= *buf++;
		 
	 }
 }	 
			
void copy_array2(uint8_t * buf)
 {  uint8_t test,i;
	 
	 
	 for(i=0;i<8;i++)
	 {
		 test= buf[i];
		 
	 }
}

Код: Выделить всё

uint8_t my_array[20]={1,45,68,34,78,23,98,56,3,0,165};
copy_array(my_array);
		copy_array2(my_array);
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Klepko писал(а):test=*massiv;
Интересно, а как такая конструкция должна работать?

Добавлено after 13 minutes 29 seconds:

Код: Выделить всё

volatile uint8_t Test [3]=        {1,2,3};
volatile uint8_t Test_var;
//volatile uint8_t *Test_var;

...
...

Test_var=     *Test[0];

IAR послал меня с таким кодом.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 373
Зарегистрирован: Ср мар 09, 2016 08:07:41

Сообщение JackSmith »

[uquote="Klepko",url="/forum/viewtopic.php?p=3449488#p3449488"]Как правильно сделать[/uquote]
если вам нужно получить указатель на массив, но объявите test как указатель: uint8_t * test;
после чего присваивайте: test=massive;
доступ к элементам массива через: *(test+i), где i- номер элемента массива.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

JackSmith, подучите немножко матчасть.
если вам нужно получить указатель на массив, но объявите test как указатель: uint8_t * test;
после чего присваивайте: test=massive;
Это уже происходит при передаче аргумента в функцию.

доступ к элементам массива через: *(test+i), где i- номер элемента массива.
Чем сие не угодило?
test= *buf+i;
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Указатели в Си можно использовать разными способами. Не нравится разыменование? Обращайтесь к данным по указателю, как к массиву:

Код: Выделить всё

void clear_array(uint8_t my_arr[]) {
  //
  for (int i = 0; i < 10; i++) {
    my_arr[i] = 0;
  }
}

// причем, можно и по-другому

void clear_array(uint8_t *my_arr) {
  //
  for (int i = 0; i < 10; i++) {
    my_arr[i] = 0;
  }
}

Открыл глаза
Аватара пользователя
Сообщения: 54
Зарегистрирован: Пт апр 25, 2008 03:44:41
Откуда: Воронеж

Сообщение Klepko »

JackSmith писал(а):Чем сие не угодило?
test= *buf+i
вот моя программа

Код: Выделить всё

NRF24_WriteReg(CONFIG, 0x0a);

void NRF24_WriteReg(uint8_t addr, uint8_t dt)
{
  addr |= W_REGISTER;//включим бит записи в адрес
  CS_ON;
  HAL_SPI_Transmit(&addr,1);//отправим адрес в шину
  HAL_SPI_Transmit(&dt,1);//отправим данные в шину
  CS_OFF;
}
void HAL_SPI_Transmit(uint8_t * pData1, uint8_t Size)
{
uint8_t i;
uint8_t test;

test = pData1[i];//test=0x03
test = *pData1;//test=0x03
for(i = 0; i < Size; i++)
{
while (SPI_GetFlagStatus(SPI_FLAG_TXE)== RESET);
SPI_SendData(* pData1);
//buf = pData1[0];
pData1++;
while (SPI_GetFlagStatus(SPI_FLAG_BSY)== SET);
while (SPI_GetFlagStatus(SPI_FLAG_RXNE) == RESET);
//buf=SPI_ReceiveData();
}
}

Вопрос, почему test = pData1 равно 0х03, хотя указатель pData1 указывает на значение 0x20?
Как разыменовывать указатель чтобы в нем было 0x20? Во вложении скрин космика с ошибкой.
Компилировалось все без ошибок
error.jpg
(219.81 КБ) 602 скачивания
Всех убить! Всё отобрать!
Ответить

Вернуться в «Разные вопросы по МК»