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

 
 
> Причины зависания и их поиск
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

Сообщений в этой теме
- 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
- - forever failure   на TWI висит rtc+fram FM3130 может ли она так шину...   Dec 3 2007, 12:06
|- - oran-be   Цитата(forever failure @ Dec 3 2007, 16:0...   Dec 3 2007, 13:52
- - 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 Текстовая версия Сейчас: 18th June 2025 - 17:13
Рейтинг@Mail.ru


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