реклама на сайте
подробности

 
 
> Причины зависания и их поиск
forever failure
сообщение Dec 3 2007, 10:39
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



В общем такая проблема: есть устройство, которое периодически отказвает в работе - зависает. Более подробно:
mcu - Atmega128 управляет двумя устройствами по шине SPI, плюс одно на шине TWI, плюс на усарт повешен преобразователь в интерфейса rs485, через который и идёт связь с внешним миром. По внешним светодиодикам зависон выглядит так, как будто после перезагрузки по какой-то причине (по вотчдогу или пропаданию питания) контроллер начинает по новой инициализироваться и на каком-то этапе входит в вечный цикл, который обычно должен выполнятся очень быстро. После снятия напряжения питания и его восстановления зависон исчезает (на некоторое время).
Привожу часть кода инициализации, с возможно проблемными местами (пояснения ниже):
Код
/******************************************************************************/
/* avr-gcc v 4.1.2 */
#include <avr/io.h>

#define BIT(b)    (1 << b)

void spi_transmit (unsigned char c)
   {
   asm ("wdr");
   SPDR = c;
   while (!(SPSR & BIT(SPIF)));
   }  
  
void spi_str_transmit (const unsigned char * str, unsigned char size, unsigned char no)
   {
   static const unsigned char cs_bit [] = {BIT(PB4), BIT(PB6)};
   PORTB &= ~cs_bit [no];
    
   for (;size--;)
      spi_transmit (*str++);
    
   PORTB |= cs_bit [no];    
   }  
/******************************************************************************/
void twi_transmit (unsigned char data, unsigned char flags, const unsigned char stat)
   {
   asm ("wdr");
   TWDR = data;
   TWCR = flags;    
   while (!(TWCR & BIT (TWINT)));
   }

void send_twi_addr (const char a)
   {
   twi_transmit (a, BIT(TWINT) | BIT(TWEN), 0x18);
   }  

void send_twi_byte (const char b)
   {
   twi_transmit (b, BIT(TWINT) | BIT(TWEN), 0x28);
   }      
  
unsigned char read_twi_byte (void)
   {
   twi_transmit (0xFF, BIT(TWEA) | BIT(TWINT) | BIT(TWEN), 0x50);
   return TWDR;
   }    
  
void twi_start (void)
   {
   twi_transmit (0xFF, BIT(TWSTA) | BIT(TWINT) | BIT(TWEN), TWI_START);
   }    
  
void twi_stop (void)
   {  
   TWCR = BIT (TWSTO) | BIT (TWINT) | BIT (TWEN);
   TWCR = BIT (TWSTO) | BIT (TWINT);
   }

/******************************************************************************/

void init (void)
   {
   DDRF |= BIT(PF4) | BIT(PF5) | BIT(PF6) | BIT(PF7);   /* all leds */
   PORTF |= BIT(PF4) | BIT(PF5) | BIT(PF6) | BIT(PF7);  /* on */
  
   asm ("wdr");

   WDTCR = BIT(WDCE) | BIT(WDE);
   WDTCR = BIT(WDP2) | BIT(WDP1) | BIT(WDP0);           /* watchdog timeout ~ 2 sec  */
   WDTCR = BIT(WDE);  

   DDRE = BIT (0x03);                                   /* w/r rs485 driver ctrl. output enable */

   DDRA |= BIT(PA3);                                    /* debug led */
   PORTA |= BIT(PA3);                                   /* off */
   PORTD |= BIT(PD3);                                   /* internal pullup resistor */

   PORTB = BIT(PB7) | BIT(PB6)  | BIT(PB5) | BIT(PB0) | BIT(PB4);  
   DDRB = BIT(PB7) | BIT(PB6) | BIT(PB5) | BIT(PB4) | BIT(PB2) | BIT(PB1) | BIT(PB0);  
  
   while (!(PIND & BIT(PD3)));                          /* wait pwr signal */
    
   SPCR = BIT(SPE) | BIT(MSTR) | (SPR0);                /* init SPI (250 kHz) */

/* Two wire interface initialization */
   TWSR = 0; /* <- setting prescaler */
   TWBR = 0;  /* F_CPU / 16;  Bit rate = 250 kHz */

   EIMSK = BIT(INT7) | BIT(INT6) | BIT(INT3);           /* Extrnal intr. 7, 6, 3  */
   EICRB = BIT(ISC71) | BIT(ISC61);                     /* Falling edge sens.  */
  
   EICRA = BIT(ISC31);                                  /* Falling edge sens. */

   PORTE = ~BIT(0x03);                                  /* w/r rs485 driver read enable */

   UCSR0B = BIT(RXCIE0) | BIT(TXCIE0) | BIT(RXEN0) | BIT(TXEN0); /* enable intr/ on recv/send  byte  usart0 */
   UCSR0C = BIT(UCSZ01) | BIT(UCSZ00) | BIT(UPM01) | BIT(UPM00); /* async, even parity, 2 stop bit 8 bit usart0 */
   init_r (0);       /* spi_str_transmit */
   init_r (1);       /* spi_str_transmit */
  
   reset_tm ();      /* r/w twi  */
   init_s ();        /* r/w twi  */
   init_m ();        /* eeprom_read ->  UBRR0H, UBRR0L; */
   clear_list ();    /* r/w twi  */
   asm ("sei");
   PORTF &= ~(BIT(PF4) | BIT(PF5) | BIT(PF6) | BIT(PF7)); /* leds off */
   }
  
void loop (void)
   {
   for (;;)
      { /* ... */ }
   }
  
int main (void)
   {
   init ();
   loop ();
   return 0;
   }

Самое подозрительное в отношение зависания место - ожидание установки единицы на PD3:
while (!(PIND & BIT(PD3))); /* wait pwr signal */.
В реальном устройстве этот пин соединён через резистор 1к с шиной питания и вроде всегда должна там быть единица.
Другие места, где возможно организуется вечный цикл - в функциях twi_transmit и spi_transmit.

В связи с этим возникли такие вопросы :
1. Может ли линия порта ввода-вывода (и вообще порты ввода - вывода) входит в такое состояние, что уровни с неё не читаются корректно (то есть единица не воспринимается как единица)?
2. Могут ли так зависать внутринние устройства TWI - SPI, что чтение их статусных регистров всегда возвращает одно и тоже ?
3. Самое трудное - воспроизвести эту проблему не в условиях эксплуатации, а на месте, где её можно решить. Одно из устройств сейчас гоняю всяко - на мороз его выставляю, помехи возле него создаю, влажность повышенную - всё нипочём, - всегда бы так работало. Какие ещё дестабилизирующие средства можно применить ?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
forever failure
сообщение Dec 3 2007, 12:06
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 256
Регистрация: 6-03-05
Из: Екатеринбург
Пользователь №: 3 112



на TWI висит rtc+fram FM3130 может ли она так шину завесть, что её надо сбрасывать отключением питания ? По поводу WDT тоже не совсем понятно, похоже сброс всё таки есть, но он не помогает, так как есть что-то, что не сбрасывается сигналом, генерируемым вочдогом.
Ещё один момент был - когда замерял все напряжения на зависшем устройстве - при касании щупа вольтметра этой ноги PD3 успройство ожило и пошло работать дальше, почему и возникло предположение про порты ввода-вывода.
Go to the top of the page
 
+Quote Post
oran-be
сообщение Dec 3 2007, 13:52
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621



Цитата(forever failure @ Dec 3 2007, 16:06) *
на TWI висит rtc+fram FM3130 может ли она так шину завесть, что её надо сбрасывать отключением питания ? По поводу WDT тоже не совсем понятно, похоже сброс всё таки есть, но он не помогает, так как есть что-то, что не сбрасывается сигналом, генерируемым вочдогом.
Ещё один момент был - когда замерял все напряжения на зависшем устройстве - при касании щупа вольтметра этой ноги PD3 успройство ожило и пошло работать дальше, почему и возникло предположение про порты ввода-вывода.

При условии, что слэйв на шине вследствии некоторых факторов не выставляет АСК, создаются предпосылки для надежного завмсания TWI модуля. Для надежной работы модуля лучше всего использовать асинхронную библиотеку из Атмеловской аппликухи, дополнив ее контролем ошибок. Зависон определяется по 0(наиболее типичная ситуация) в статус регистре. Зависон модуля снимается его полным отключением отключением(запретом) и последующей переинициализации модуля.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- forever failure   Причины зависания и их поиск   Dec 3 2007, 10:39
- - defunct   Цитата(forever failure @ Dec 3 2007, 13:3...   Dec 3 2007, 11:17
- - sensor_ua   На TWI может висеть атмелевская 24-я, требующая 9 ...   Dec 3 2007, 11:53
- - bodja74   Включите BOD + управлять питанием или сбросом оста...   Dec 3 2007, 12:10
- - forever failure   BOD включен, уровень = 2.7в. В нормальном режиме ...   Dec 3 2007, 12:23
- - bodja74   Начинается ... :D 15 Ом - это много ,при токе в 10...   Dec 3 2007, 12:38
- - forever failure   15 Ом - это требование по искробезопасности цепи, ...   Dec 3 2007, 12:43
- - GDI   ЦитатаСамое подозрительное в отношение зависания м...   Dec 3 2007, 12:55
- - bodja74   Никогда не видели как взлетает сетевой электролит ...   Dec 3 2007, 13:01
- - forever failure   Переживать мне и нужно, иначе всё это будут прелес...   Dec 3 2007, 13:32
|- - SasaVitebsk   Цитата(forever failure @ Dec 3 2007, 17:3...   Dec 3 2007, 20:56
- - GDI   ЦитатаПо поводу подозрительной строки - в данной с...   Dec 3 2007, 13:49
- - forever failure   Про емкость между пином и землёй - несколько раз в...   Dec 3 2007, 16:11
- - sensor_ua   Попробуй перед reset_tm (); /* r/w twi */ вы...   Dec 3 2007, 16:38
|- - Т.Достоевский   Цитата(sensor_ua @ Dec 3 2007, 19:38) Поп...   Dec 3 2007, 17:22
- - sensor_ua   ЦитатаПодавать команду стоп нельзя!!! ...   Dec 3 2007, 20:58
|- - Т.Достоевский   Цитата(sensor_ua @ Dec 3 2007, 23:58) ......   Dec 3 2007, 22:48
- - sensor_ua   ЦитатаНе совсем понял вопроса, проясните. В специф...   Dec 4 2007, 04:23
|- - Т.Достоевский   Цитата(sensor_ua @ Dec 4 2007, 07:23) Неп...   Dec 4 2007, 20:13
|- - zltigo   Цитата(Т.Достоевский @ Dec 4 2007, 22:13)...   Dec 4 2007, 23:04
|- - Т.Достоевский   Цитата(zltigo @ Dec 5 2007, 02:04) У Фил...   Dec 4 2007, 23:31
- - forever failure   Ещё такая деталь: стартап тайм, определённое фьюза...   Dec 4 2007, 06:43
|- - oran-be   Цитата(forever failure @ Dec 4 2007, 10:4...   Dec 4 2007, 11:32
- - vesago   А индуктивной нагрузочкой случаем не управляет ваш...   Dec 4 2007, 07:25
- - forever failure   нет, ничем он не управляет, но электромагнитная об...   Dec 4 2007, 07:31
- - vesago   Ну тогда, когда отделите мух от котлет - убедитесь...   Dec 4 2007, 07:40
- - D H   IMHO зависон в twi. Отключите twi устройство и пол...   Dec 4 2007, 07:42
- - forever failure   Что бы что-то попробовать, нужно, чтоб ситуация хо...   Dec 4 2007, 12:25
- - sensor_ua   Нужно аж симитировать сброс проца во время работы ...   Dec 4 2007, 12:42
|- - forever failure   Цитата(sensor_ua @ Dec 4 2007, 17:42) Нуж...   Dec 4 2007, 13:09
- - D H   Не подсоединияй устройство по TWI, вот и получишь ...   Dec 4 2007, 15:26
- - forever failure   Тов. Достоевский, у меня там FM3130 прицеплено, а ...   Dec 5 2007, 07:01
- - forever failure   Чисто случайно нашёл сейчас свою тему, на какую сл...   Mar 2 2009, 06:05


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 05:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01492 секунд с 7
ELECTRONIX ©2004-2016