Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Микроконтроллеры других производителей

Микроконтроллеры других производителей Все, что касается микроконтроллеров и НЕ подошло в раздел Microchip.

Ответ
 
Опции темы Опции просмотра
Старый 12.04.2017, 09:23   #51
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 34
Сообщений: 1,411
Вес репутации: 2524/84
Рак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond repute
По умолчанию Re: stm8s iar simulator

Цитата:
Сообщение от gromovi Посмотреть сообщение
не правильно описал проблему. в прерывании Th и Tl имеют значение какое то там, а после выхода в главный цикл становятся равны нулю.
В прерывании установи флаг какой-нибудь, а в главном цикле ожидай этот флаг, как только он установился, сбрасывай флаг и выполняй вычисления и снова жди флаг.
P.S. Давно не видел тебя на форуме, помню еще по теме реобаса. Где пропадал?
Рак вне форума   Ответить с цитированием
Старый 12.04.2017, 12:40   #52
gromovi
Banned
 
Регистрация: 17.02.2009
Сообщений: 1,368
Вес репутации: 381/0
gromovi is just really nicegromovi is just really nicegromovi is just really nicegromovi is just really nice
По умолчанию Re: stm8s iar simulator

Цитата:
Сообщение от Рак Посмотреть сообщение
В прерывании установи флаг какой-нибудь, а в главном цикле ожидай этот флаг, как только он установился, сбрасывай флаг и выполняй вычисления и снова жди флаг.
P.S. Давно не видел тебя на форуме, помню еще по теме реобаса. Где пропадал?
То есть фишка в том, что в прерывании значение переменной не видимо для основного цикла?
p.s. на казусе какое то время. пока калом не облили. а так командировки, командировки. интернетом пользоваться во время работы нельзя.
gromovi вне форума   Ответить с цитированием
Старый 12.04.2017, 13:11   #53
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 34
Сообщений: 1,411
Вес репутации: 2524/84
Рак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond repute
По умолчанию Re: stm8s iar simulator

Цитата:
Сообщение от gromovi Посмотреть сообщение
То есть фишка в том, что в прерывании значение переменной не видимо для основного цикла?
p.s. на казусе какое то время. пока калом не облили. а так командировки, командировки. интернетом пользоваться во время работы нельзя.
Глобальная переменная видима, но в основном цикле идет вычисление:
Код:
zz=TEMPERATURA.full;
TEMPERATURA.full=(zz*625)/1000;
По сути это формула y = x * 0.625, но в твоем случае получается х = х * 0.625. Через сколько итераций х стенет равен нулю? По-этому тебе нужен флаг, что бы выичслить значение только тогда, когда значение изменится, и ждать нового значения.
Рак вне форума   Ответить с цитированием
Старый 12.04.2017, 17:08   #54
gromovi
Banned
 
Регистрация: 17.02.2009
Сообщений: 1,368
Вес репутации: 381/0
gromovi is just really nicegromovi is just really nicegromovi is just really nicegromovi is just really nice
По умолчанию Re: stm8s iar simulator

Цитата:
Сообщение от Рак Посмотреть сообщение
Глобальная переменная видима... ....когда значение изменится, и ждать нового значения.
Оптимизация у меня выключена. Я ставлю остановку дебага в прерывании перед выходом. Вижу полученное значение переменных(ой), ставлю остановку дебага на строке
Код:
zz=TEMPERATURA.full;
, пускаю дальше, любо по шагам - это не важно, как только я вышел из прерывания переменные обнулились, то есть
Код:
zz=TEMPERATURA.full;
не выполнялась. а они уже 0x00. Оптимизация выключена.
попробовал другим путем.
Код:
volatile signed char TH ;//
volatile signed char TL
без union, так TH нормальное значение имеет после выхода из прерывания, а TL обнуляется.
Вариант обхода известен. Даже прерывание не нужно, но это не айс. Хочу разобраться.
gromovi вне форума   Ответить с цитированием
Старый 12.04.2017, 17:35   #55
gromovi
Banned
 
Регистрация: 17.02.2009
Сообщений: 1,368
Вес репутации: 381/0
gromovi is just really nicegromovi is just really nicegromovi is just really nicegromovi is just really nice
По умолчанию Re: stm8s iar simulator

Код:
union typeMyData_T{
  signed short full;
   struct    {
      signed char TH ;//
      signed char TL;//
   };
}TEMPERATURA;

volatile char so_good = 0;
мэйн
Код:
...
  while(1)              // Бесконечный цикл  
  {
    while(so_good==0){}
    zz=TEMPERATURA.full;
    TEMPERATURA.full=(zz*625)/1000;
    so_good = 0;
  }
}
прерывание
Код:
so_good = 1;
да с флагом все путем. Но вот затык в
Код:
while(so_good==0){}
мне так нельзя. буду думать.
gromovi вне форума   Ответить с цитированием
Старый 12.04.2017, 20:48   #56
Zikon
Junior Member
 
Регистрация: 04.07.2012
Сообщений: 23
Вес репутации: 139/30
Zikon will become famous soon enoughZikon will become famous soon enough
По умолчанию Re: stm8s iar simulator

а почему не вот так?

Код:
...
  while(1)              // Бесконечный цикл  
  {
    if (so_good!=0)
    {
      zz=TEMPERATURA.full;
      TEMPERATURA.full=(zz*625)/1000;
      so_good = 0;
    }
  }
}

Последний раз редактировалось Zikon; 12.04.2017 в 20:58.
Zikon вне форума   Ответить с цитированием
Старый 12.04.2017, 22:43   #57
gromovi
Banned
 
Регистрация: 17.02.2009
Сообщений: 1,368
Вес репутации: 381/0
gromovi is just really nicegromovi is just really nicegromovi is just really nicegromovi is just really nice
По умолчанию Re: stm8s iar simulator

Код:
#include "iostm8s103f3.h"

__interrupt void TIM1_OVR_UIF_handler(void);

signed long zz;

unsigned short byte_uart = 0;

char rom_ds18b20[9];

union typeMyData_T{
  signed short full;
   struct    {
      signed char TH ;//
      signed char TL;//
   };
}TEMPERATURA;

volatile char so_good = 0;

//******************************************************************************
// Инициализация UART1 STM8S003
//******************************************************************************
void uart_init(unsigned long baud_rate, unsigned long f_master)
{
  //Значение регистра BRR
  unsigned long brr;
  //Настраиваем TX на выход
  PD_DDR_bit.DDR5 = 0;  //TX 
  //TX - открытый сток
  PD_CR1_bit.C15 = 0;
  //быстрый
  PD_CR2_bit.C25 = 0; 
  //Настройка скорости передачи
  brr = f_master/baud_rate;   
  UART1_BRR2 = brr & 0x000F;
  UART1_BRR2 |= brr >> 12;
  UART1_BRR1 = (brr >> 4) & 0x00FF;
  //Четность отключена
  UART1_CR1_PIEN = 0;
  //Контроль четности отключен
  UART1_CR1_PCEN = 0;
  //8-битный режим
  UART1_CR1_M = 0;
  //Включить UART
  UART1_CR1_UART0 = 0;
   
  //Запретить прерывание по опустошению передающ. регистра
  UART1_CR2_TIEN = 0;
  //Запретить прерывание по завершению передачи
  UART1_CR2_TCIEN = 0;
  //Запретить прерывание по заполнению приемного регистра
  UART1_CR2_RIEN = 0;
  //Запретить прерывание по освобождению линии
  UART1_CR2_ILIEN = 0;
  //Передатчик включить
  UART1_CR2_TEN = 1;
  //Приемник включить
  UART1_CR2_REN = 1;
  //Не посылать break-символ
  UART1_CR2_SBK = 0;
   
  //Один стоп-бит
  UART1_CR3_STOP = 0;
  //полудуплексный режим
  UART1_CR3_LINEN = 0;
  UART1_CR3_CKEN = 0;
  
  UART1_CR5_IREN =0;
  UART1_CR5_SCEN = 0;
  UART1_CR5_HDSEL = 1;//вкл. полудуплекс
}
  // Отправка байта
void uart_tx_byte(unsigned char data)
{
  while(!UART1_SR_TXE);
  UART1_DR = data;
}
// Прием байта
unsigned char uart_rx_byte()
{
  unsigned char data;   
  while(!UART1_SR_RXNE);
  
  data = UART1_DR;
  return data;
}
//сброс лини и прием импульса присутствия
void ow_reset()
{
  uart_init(9600,16000000);
  //передача ресета
  uart_tx_byte(0xF0);
  //прием пресента
  byte_uart=uart_rx_byte(); 
  uart_init(115200,16000000);
}
//чтение слота
unsigned char ow_read_bit()
{ 
  uart_tx_byte(0xff);
  if( uart_rx_byte() == 0xfc ) return 0;
  else return 1;
}
//передача слота
void ow_write_bit(unsigned char temp)
{ 
  if( temp == 1 )
  {
    uart_tx_byte(0xff);
  }
  if( temp == 0 )
  {
    uart_tx_byte(0x00);
  }
  uart_rx_byte();
}
/* передача произвольного байта младшим битом вперед */
void ow_write_byte(unsigned char write)
{
unsigned char i=0;
  for(i=0;i<=7;i++)
  {
    if ( (write & (1<<i)) == 0 ) 
      ow_write_bit(0); 
    else 
      ow_write_bit(1); 
  }
}
/* прием произвольного байта младшим битом вперед */
unsigned char ow_read_byte(void)
{
  unsigned char i;
  unsigned char read_byte;
  for(i=0;i<=7;i++)
  {
    if( ow_read_bit() == 1)
      read_byte |= (1<<i); 
    else
      read_byte &= (~(1<<i));
  }
return read_byte;
}
int main( void )
{
  CLK_SWCR_bit.SWEN=0;               // запрешаем переключение источника тактовой частоты
  CLK_CKDIVR = 0;  
 
  TIM1_PSCRH = (1599) >> 8;
  TIM1_PSCRL = (1599)& 0xFF;
  TIM1_ARRH = (10000) >> 8; //Частота переполнений = 16М / 1600 / 10000 = 1 Секунда
  TIM1_ARRL = (10000)& 0xFF;

  TIM1_CR1_bit.URS = 1; //Прерывание только по переполнению счетчика
  TIM1_EGR_bit.UG = 1;  //Вызываем Update Event

  TIM1_IER_bit.UIE = 1; //Разрешаем прерывание
  TIM1_CR1_bit.CEN = 1; //Запускаем таймер
  
  asm("rim"); //Разрешаем прерывания
  while(1)              // Бесконечный цикл  
  {
    while(so_good==0){}
    if(TEMPERATURA.full>=0)
    {
      TEMPERATURA.full = (TEMPERATURA.full*10)/16;
    }
    else
    {
      TEMPERATURA.full = ((TEMPERATURA.full-4096))/16;//НЕ ВЕРНО!!!!!!!!
    }
    so_good = 0;
  }
}
#pragma vector = TIM1_OVR_UIF_vector
__interrupt void TIM1_OVR_UIF_handler(void)
{
  // Проверка, что же вызвало прерывание
  if (TIM1_SR1_UIF==1)
  {
    TIM1_SR1_bit.UIF = 0;
    ow_reset();
    ow_write_byte(0xcc);
    ow_write_byte(0xbe);
    TEMPERATURA.TL = ow_read_byte();
    TEMPERATURA.TH = ow_read_byte();
    ow_reset();
    ow_write_byte(0xcc);
    ow_write_byte(0x44);
    so_good = 1;
  }  
}
ПаТаМуШтО далеко не конечный вариант

Последний раз редактировалось gromovi; 12.04.2017 в 22:49.
gromovi вне форума   Ответить с цитированием
Старый 13.04.2017, 12:45   #58
HHIMERA
Senior Member
 
Регистрация: 10.06.2008
Возраст: 58
Сообщений: 2,883
Вес репутации: 3992/111
HHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond reputeHHIMERA has a reputation beyond repute
По умолчанию Re: stm8s iar simulator

Цитата:
Сообщение от gromovi Посмотреть сообщение
в прерывании Th и Tl имеют значение какое то там, а после выхода в главный цикл становятся равны нулю.
Так может... это...
http://www.pic24.ru/doku.php/osa/art...e_for_chainiks
__________________
"Я не даю готовых решений, я заставляю думать!"(С)
HHIMERA вне форума   Ответить с цитированием
Старый 13.04.2017, 22:37   #59
gromovi
Banned
 
Регистрация: 17.02.2009
Сообщений: 1,368
Вес репутации: 381/0
gromovi is just really nicegromovi is just really nicegromovi is just really nicegromovi is just really nice
По умолчанию Re: stm8s iar simulator

Цитата:
Сообщение от HHIMERA Посмотреть сообщение
HHIMERA оптимизация выключена. Я сейчас немного в сторону отошел, имею приятный секус с VDO приоры, точнее с её EEPROM, там защита от чтения. Как закончу продолжу разбираться в чем ошибка. Обойти - обошел, спасибо РАК-у, а то меня несколько заклинило. Но и насчет статьи Виктора, если не ошибаюсь, поразмыслю.
gromovi вне форума   Ответить с цитированием
Старый 17.04.2017, 22:00   #60
gromovi
Banned
 
Регистрация: 17.02.2009
Сообщений: 1,368
Вес репутации: 381/0
gromovi is just really nicegromovi is just really nicegromovi is just really nicegromovi is just really nice
По умолчанию Re: stm8s iar simulator

Цитата:
Сообщение от HHIMERA Посмотреть сообщение
из статьи "Автор этого кода рассказал, что при отладке сломал кнопку, пытаясь нажать ее сильнее, чтобы она хоть как-то сработала . Его ошибка заключалась в том, что он не использовал volatile при объявлении переменной Button. Сделай он это - и компилятор знал бы, что при каждом обращении к переменной Button нужно выполнять инструкции для фактического обращения к ячейке памяти, а не использовать для ускорения промежуточный результат." это, подозреваю, обо мне. Было такое дело. Вроде даже тут где то.
С своей ошибкой разобрался. Рак правильно указал причины "глюка", volatile и оптимизация не причем. Имело место недопонимание архитектуры stm8. Но volatile для глобальных переменных, значение которых меняется в прерывании, необходим.
gromovi вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
falsh read/write PIC18F258 & IAR Compiler addi Продукция MICROCHIP 3 23.03.2010 16:57
IAR DSPIC и PIC24 YuryD Продукция MICROCHIP 0 07.12.2009 13:28
нужен консультант по PIC simulator IDE aznik Вопросы начинающих 0 01.08.2008 22:25
просьба про IAR PIC 2.21 и PIC16F884 Constant Продукция MICROCHIP 0 12.02.2008 15:53
IAR и LPC213x Amoeba Микроконтроллеры других производителей 3 24.05.2007 22:55


Часовой пояс GMT +3, время: 01:44.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot