Перейти к содержанию
    

Lyt

Участник
  • Постов

    36
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о Lyt

  • Звание
    Участник
    Участник
  1. Ковыряться в железках конечно интересно, но только уровень зп, уровень менеджмента и общее ощущение того, что мы пытаемся делать серьезные вещи на коленке, это все демотивирует.
  2. Подниму тему, тяжкие думы о перспективах в разработке электроники (схемотехника, печатные платы, программирование firmware) посещают меня с периодичностью в полгода. Пытаться развиваться в этой сфере, думал поступить в магистратуру МИЭМ, про которую кто-то как раз спрашивал в соседней теме, или бросить все это и уходить в java, android etc, пока еще молодой (25 лет, 2 года опыта работы разработчиком РЭА)? Насколько реально достичь уровня в зп 160-180к в Москве как инженер-разработчик? Насколько реально эмигрировать в США/Канаду/Австралию как инженер-разработчик? Кто как оценивает перспективы в разработке железа/низкоуровневом программировании в мире в ближайшие десятилетия? В каком направлении развиваться для эмиграции - модный Iot, пром автоматика, авионика, электропривод, свч?
  3. "как библиотеку" - при компиляции основного проекта будут скомпилированы только используемые функции в этом файле
  4. Два вопроса: 1.Возможно ли подключить .с файл как библиотеку в IAR? 2.При простом подключении .с файла - использующиеся в нем макроопределения можно определить вне его, а в main.c ?
  5. пишу для stm8l решил делать как раз const char *A= {'a', 'b', 'c', 0}; а что делает эта строка? *А-указатель на массив ? char string3_to_LCD[16]={0x20,0xA8,0x45,0x50,0xA5,...} IAR пишет во флеш
  6. Можно поподробнее описать строку unsigned char string_to_LCD[]={ " HE\xA8" "PEP" "\xAE\x42" }; ? а можно стирать массив а потом заново его инициализировать с другими элементами? или это нерационально?
  7. При инициализации массив можно заполнить следующим образом: unsigned char string_to_LCD[16]={0x20,0x48,0x45,0xA8,0x50,0x45,0x50,0xAE,0x42,0x20,0xA5,0xA4,0x4D,0xFE}; можно ли аналогично заполнить этот же массив другими символами? использую такой массив для хранения кодов символов строки, выводимой на экран hd44780
  8. Как выбирать размер для указателя на массив? например unsigned char RTC_array[2]; unsigned char *index_RTC_array; index_RTC_array=RTC_array; В указателе содержится адрес 1 элемента массива в памяти, который может выходить за 0xff. Указатель автоматически приводится компилятором к необходимому типу для сохранения полного адреса 1 элемента? Но тогда если 1 элемент находится по адресу 0xff, а следующий по адресу 0x100, то будет ошибка? Или компилятор также учитывает длину массива и размер указателя выбирается с учетом возможности сохранить вдрес последнего элемента?
  9. проблему решил! перезагрузка была из-за настройки этих портов: PC_DDR=0xff; PC_CR1=0xff; PF_DDR=0xff; PF_CR1=0xff; во время борьбы с лишними прерываниями я все порты неиспользуемые бездумно поставил на вход и подтянул вверх. перезагрузка была, вероятно из-за того, что С0 и С1 (вроде бы) используются для подключения внешнего кварца и работают в режиме открытого стока (что то такое читал я в даташите).
  10. STM8L152C6, работа с LCD. отладка с использованеим stm8l discovery в IAR'e. Периодически происходят ошибки чтения памяти. Они не всегда появляются при отладке, но всегда при обычной работе контроллера, что вызывает его перезапуск. текущая версия кода: #include "iostm8l151c6.h" #include "LCD.h" #define RTC_vector 0x06 #define T_CPU 0.0625 // 1/частота ядра в мегагерцах = период такт. сигнала в микросек. //Глобальные переменные /* Описание глобальных переменных ***global_flags_LCD*** биты [0:1] - флаги навигации по меню (кнопка BUT1) //00 - 1 строка 01 - 2 строка 10 - 3 строка биты [2:3] - флаги глубины нахождения в меню 00 - основное меню 01 - подменю 1 порядка 10 - подменю 2 порядка 11 - не в меню, на экране - процесс измерения ***global_flags_ADC** биты [0:1] - флаги текущего режима работы АЦП 00 - АЦП выкл 01 - непрерывный режим преобразование 01 - периодич. N - число преобразований */ static unsigned char global_flags_LCD; //static unsigned char global_flags_ADC; //Прототипы функций void delay_mcs(unsigned int); void LCD_initialization(void); void set_main_menu_LCD(void); void send_command_to_LCD(unsigned char); void send_data_to_LCD(unsigned char); void set_CGRAM_adress(unsigned char); void set_DDRAM_adress(unsigned char); void wait_busy_flag(void); //Обработчики прерываний #pragma vector=EXTID_vector __interrupt void buttons_interrupt(void) { if (PD_IDR_bit.IDR0==0) // прерывание на PD0 - навигация по меню { if ((global_flags_LCD&0x03)==0x00) { global_flags_LCD=(global_flags_LCD&0xFC)|0x01; set_DDRAM_adress(0xC0); goto exit0; } if ((global_flags_LCD&0x03)==0x01) { global_flags_LCD=(global_flags_LCD&0xFC)|0x02; set_DDRAM_adress(0x90); goto exit0; } if ((global_flags_LCD&0x03)==0x02) { global_flags_LCD=(global_flags_LCD&0xFC)|0x00; set_DDRAM_adress(0x80); goto exit0; } } exit0: while (PD_IDR_bit.IDR0==0) {} //ожидание отпускания кнопки //прерывание на PD1 if (PD_IDR_bit.IDR1==0) { if ((global_flags_LCD&0x0C)==0x00) { if ((global_flags_LCD&0x03)==0x00) //если выбран режим непрерывного измерения (1 строка в меню) { send_command_to_LCD(clear_display); send_data_to_LCD(0x21); //TEST //global_flags_ADC=0x01; //запуск непрерывного преобразования с отображением рез-ов на экране goto exit1; } if ((global_flags_LCD&0x03)==0x01) //если выбран режим периодич измерений { send_data_to_LCD(0x23); //TEST } } } exit1: while (PD_IDR_bit.IDR1==0) {} //ожидание отпускания кнопки EXTI_SR2_bit.PDF=1; //сброс флага прерывания delay_mcs(200); } int main( void ) { //настройка тактирования. //тактирование от 16Мгц внутреннего ист. HSI CLK_CKDIVR=0x00; //настройка порта для кнопок PD_DDR=0xFC; //порт D[0:1] на вход, D[2:7] - на выход PD_CR1=0xFF; //D[0:1] - с подтяжкой; D[2:7] - push-pull PD_CR2=0x03; //D[0:1] - разр. прерывания; EXTI_CR3=0x00; //прерывание на PD[0:3] по спаду и низкому уровню //0 и 1 битах портов возникает по спаду EXTI_CONF_bit.PDLIS=1; //PD[3:0] - исп. для EXTID //настройка неисп. портов PA_DDR=0xff; PA_CR1=0xff; PA_ODR=0xff; delay_mcs(800000); PA_ODR=0x00; PC_DDR=0xff; PC_CR1=0xff; PF_DDR=0xff; PF_CR1=0xff; global_flags_LCD=0x00; //global_flags_ADC=0x00; LCD_initialization(); set_main_menu_LCD(); asm("RIM"); while(1) { } } void delay_mcs(unsigned int mcs) { unsigned long temp=0; temp=(mcs*10000)/(T_CPU*10000); for (unsigned int i=0;i<temp;i++) {} } void LCD_initialization(void) { PE_DDR=0x07; //PE[0:2] - выход. PE0 - E, PE1 - R/W, PE2 - RS PE_CR1=0x07; //PE[0:2] - push-pull PE_ODR_bit.ODR1=0; //R/W - запись на LCD PE_ODR_bit.ODR2=0; //RS - команда PB_DDR=0xff; //порт B - выход на LCD PB_CR1=0xff; //push-pull delay_mcs(50000); PE_ODR_bit.ODR0=1; // E - 1 PB_ODR=bus_8__st_2__sym_l; delay_mcs(400); PE_ODR_bit.ODR0=0; // E - 0 delay_mcs(800); PE_ODR_bit.ODR0=1; // E - 1 PB_ODR=bus_8__st_2__sym_l; delay_mcs(400); PE_ODR_bit.ODR0=0; // E - 0 delay_mcs(1000); PE_ODR_bit.ODR0=1; // E - 1 PB_ODR=bus_8__st_2__sym_l; delay_mcs(400); PE_ODR_bit.ODR0=0; // E - 0 wait_busy_flag(); //если busy flag=0, продолжить инициализацию send_command_to_LCD(clear_display); wait_busy_flag(); //если busy flag=0, продолжить инициализацию send_command_to_LCD(disp_on__s_cursor); wait_busy_flag(); //если busy flag=0, продолжить инициализацию send_command_to_LCD(inc_adr__no_shift); } void set_main_menu_LCD(void) { set_DDRAM_adress(0x80); //1 строка send_data_to_LCD(0x20); //_ send_data_to_LCD(0x48); send_data_to_LCD(0x45); send_data_to_LCD(0xA8); send_data_to_LCD(0x50); send_data_to_LCD(0x45); send_data_to_LCD(0x50); send_data_to_LCD(0xAE); send_data_to_LCD(0x42); send_data_to_LCD(0x20); //_ send_data_to_LCD(0xA5); send_data_to_LCD(0xA4); send_data_to_LCD(0x4D); set_DDRAM_adress(0xC0); //2 строка send_data_to_LCD(0x20); //_ send_data_to_LCD(0xA8); send_data_to_LCD(0x45); send_data_to_LCD(0x50); send_data_to_LCD(0xA5); send_data_to_LCD(0x4F); send_data_to_LCD(0xE0); send_data_to_LCD(0x20); //_ send_data_to_LCD(0xA5); send_data_to_LCD(0xA4); send_data_to_LCD(0x4D); set_DDRAM_adress(0x90); //3 строка send_data_to_LCD(0x20); //_ send_data_to_LCD(0x42); send_data_to_LCD(0xAE); send_data_to_LCD(0x42); send_data_to_LCD(0x4F); send_data_to_LCD(0xE0); send_data_to_LCD(0x20); //_ send_data_to_LCD(0xA8); send_data_to_LCD(0x4F); send_data_to_LCD(0x20); //_ send_data_to_LCD(0x55); send_data_to_LCD(0x41); send_data_to_LCD(0x52); send_data_to_LCD(0x54); set_DDRAM_adress(0x80); //1 строка } void send_command_to_LCD(unsigned char command) { wait_busy_flag(); //если busy flag=0, продолжить PE_ODR_bit.ODR1=0; //R/W - запись на LCD PE_ODR_bit.ODR2=0; //RS - команда PE_ODR_bit.ODR0=1; // E - 1 PB_DDR=0xff; //порт B - выход на LCD PB_CR1=0xff; //push-pull PB_ODR=command; delay_mcs(40); PE_ODR_bit.ODR0=0; // E - 0 PB_DDR=0x00; //порт B - вход от LCD } void send_data_to_LCD(unsigned char data) { wait_busy_flag(); //если busy flag=0, продолжить PE_ODR_bit.ODR1=0; //R/W - запись на LCD PE_ODR_bit.ODR2=1; //RS - данные PE_ODR_bit.ODR0=1; // E - 1 PB_DDR=0xff; //порт B - выход на LCD PB_CR1=0xff; //push-pull PB_ODR=data; delay_mcs(40); PE_ODR_bit.ODR0=0; // E - 0 PB_DDR=0x00; //порт B - вход от LCD } /*переключает адресацию на CGRAM, входной параметр adress - задает адрес */ void set_CGRAM_adress(unsigned char adress) { wait_busy_flag(); //если busy flag=0, продолжить PE_ODR_bit.ODR1=0; //R/W - запись на LCD PE_ODR_bit.ODR2=0; //RS - команда PE_ODR_bit.ODR0=1; // E - 1 PB_DDR=0xff; //порт B - выход на LCD PB_CR1=0xff; //push-pull PB_ODR=adress; delay_mcs(40); PE_ODR_bit.ODR0=0; // E - 0 PB_DDR=0x00; //порт B - вход от LCD } /*переключает адресацию на DDRAM, входной параметр adress - задает адрес */ void set_DDRAM_adress(unsigned char adress) { wait_busy_flag(); //если busy flag=0, продолжить PE_ODR_bit.ODR1=0; //R/W - запись на LCD PE_ODR_bit.ODR2=0; //RS - команда PE_ODR_bit.ODR0=1; // E - 1 PB_DDR=0xff; //порт B - выход на LCD PB_CR1=0xff; //push-pull PB_ODR=adress; delay_mcs(40); PE_ODR_bit.ODR0=0; // E - 0 PB_DDR=0x00; //порт B - вход от LCD } void wait_busy_flag(void) { unsigned char busy_flag; PE_ODR_bit.ODR1=1; //R/W - чтение с LCD PE_ODR_bit.ODR2=0; //RS - команда PB_DDR=0x00; //порт B - вход с LCD PB_CR1=0xff; //с подтяжкой PB_CR2=0x00; //без прерывания cycle: PE_ODR_bit.ODR0=1; // E - 1 delay_mcs(10); PE_ODR_bit.ODR0=0; // E - 0 busy_flag=PB_IDR&0x80; busy_flag=busy_flag>>7; if (busy_flag!=0x00) goto cycle; } /* void delay_mcs(unsigned int mcs) { } */ Из-за чего могут быть ошибки чтения?
  11. upd:удалением настройки портов на крутые фронты (регистр Px_CR2) удалось добиться отсутствия случайных внешних прерываний. модификацией функции чтения флага занятости удалось убрать ошибки при отладке осталась одна проблема - LCD мерцает, что судя по всему означает постоянную реинициализацию. Получается МК перезагружается постоянно? из-за чего это может быть?
  12. upd: периодически срывает стек даже при запрещенных прерываниях. в случае когда отладка проходит нормально, при выходе из режима отладки на LCD мерцает текст я начинаю подозревать что что-то случилось с контроллером на отладочной плате или с самим отладчиком если кому-то не лень - проверьте, пожалуйста, код #include "iostm8l152c6.h" #include "LCD.h" #define RTC_vector 0x06 #define T_CPU 0.0625 // 1/частота ядра в мегагерцах = период такт. сигнала в микросек. //Глобальные переменные /* Описание глобальных переменных ***global_flags_LCD*** биты [0:1] - флаги навигации по меню (кнопка BUT1) 00 - 1 строка 01 - 2 строка 10 - 3 строка биты [2:3] - флаги глубины нахождения в меню 00 - основное меню 01 - подменю 1 порядка 10 - подменю 2 порядка 11 - не в меню, на экране - процесс измерения ***global_flags_ADC** биты [0:1] - флаги текущего режима работы АЦП 00 - АЦП выкл 01 - непрерывный режим преобразование 01 - периодич. N - число преобразований */ static unsigned char global_flags_LCD; //static unsigned char global_flags_ADC; //Прототипы функций void delay_mcs(unsigned int); void LCD_initialization(void); void set_main_menu_LCD(void); void send_command_to_LCD(unsigned char); void send_data_to_LCD(unsigned char); void set_CGRAM_adress(unsigned char); void set_DDRAM_adress(unsigned char); unsigned char check_busy_flag(void); //Обработчики прерываний #pragma vector=EXTID_vector __interrupt void buttons_interrupt(void) { if (PD_IDR_bit.IDR0==0) // прерывание на PD0 - навигация по меню { if ((global_flags_LCD&0x03)==0x00) { global_flags_LCD=(global_flags_LCD&0xFC)|0x01; set_DDRAM_adress(0xC0); goto exit0; } if ((global_flags_LCD&0x03)==0x01) { global_flags_LCD=(global_flags_LCD&0xFC)|0x02; set_DDRAM_adress(0x90); goto exit0; } if ((global_flags_LCD&0x03)==0x02) { global_flags_LCD=(global_flags_LCD&0xFC)|0x00; set_DDRAM_adress(0x80); goto exit0; } } exit0: while (PD_IDR_bit.IDR0==0) {} //ожидание отпускания кнопки //прерывание на PD1 if (PD_IDR_bit.IDR1==0) { if ((global_flags_LCD&0x0C)==0x00) { if ((global_flags_LCD&0x03)==0x00) //если выбран режим непрерывного измерения (1 строка в меню) { send_command_to_LCD(clear_display); send_data_to_LCD(0x21); //TEST //global_flags_ADC=0x01; //запуск непрерывного преобразования с отображением рез-ов на экране goto exit1; } if ((global_flags_LCD&0x03)==0x01) //если выбран режим периодич измерений { send_data_to_LCD(0x23); //TEST } } } exit1: while (PD_IDR_bit.IDR1==0) {} //ожидание отпускания кнопки EXTI_SR2_bit.PDF=1; //сброс флага прерывания delay_mcs(200); } int main( void ) { //настройка тактирования. //тактирование от 16Мгц внутреннего ист. HSI CLK_CKDIVR=0x00; //настройка порта для кнопок PD_DDR=0xF0; //порт D[0:3] на вход, D[4:7] - на выход PD_CR1=0xFF; //D[0:3] - с подтяжкой; D[4:7] - push-pull PD_CR2=0xFF; //D[0:3] - разр. прерывания; D[4:7] - крутые фронты EXTI_CR3=0x08; //прерывание на PD[0:3] по спаду //0 и 1 битах портов возникает по спаду EXTI_CONF_bit.PDLIS=1; //PD[3:0] - исп. для EXTID //настройка неисп. портов PA_DDR=0xff; PC_DDR=0xff; PF_DDR=0xff; global_flags_LCD=0x00; //global_flags_ADC=0x00; LCD_initialization(); set_main_menu_LCD(); asm("RIM"); while(1) { // PA_DDR=0x00; // PA_DDR=0xff; } } void delay_mcs(unsigned int mcs) { unsigned long temp=0; temp=(mcs*10000)/(T_CPU*10000); for (unsigned int i=0;i<temp;) {i++;} } void LCD_initialization(void) { PE_DDR|=0x07; //PE[0:2] - выход. PE0 - E, PE1 - R/W, PE2 - RS PE_CR1|=0x07; //PE[0:2] - push-pull PE_CR2|=0x07; //PE[0:2] - крутые фронты delay_mcs(15000); send_command_to_LCD(bus_8__st_2__sym_l); delay_mcs(4000); send_command_to_LCD(bus_8__st_2__sym_l); delay_mcs(100); send_command_to_LCD(bus_8__st_2__sym_l); while (check_busy_flag()!=0x00) {} //если busy flag=0, продолжить инициализацию send_command_to_LCD(clear_display); send_command_to_LCD(disp_on__s_cursor); send_command_to_LCD(inc_adr__no_shift); } void set_main_menu_LCD(void) { set_DDRAM_adress(0x80); //1 строка send_data_to_LCD(0x20); //_ send_data_to_LCD(0x48); send_data_to_LCD(0x45); send_data_to_LCD(0xA8); send_data_to_LCD(0x50); send_data_to_LCD(0x45); send_data_to_LCD(0x50); send_data_to_LCD(0xAE); send_data_to_LCD(0x42); send_data_to_LCD(0x20); //_ send_data_to_LCD(0xA5); send_data_to_LCD(0xA4); send_data_to_LCD(0x4D); set_DDRAM_adress(0xC0); //2 строка send_data_to_LCD(0x20); //_ send_data_to_LCD(0xA8); send_data_to_LCD(0x45); send_data_to_LCD(0x50); send_data_to_LCD(0xA5); send_data_to_LCD(0x4F); send_data_to_LCD(0xE0); send_data_to_LCD(0x20); //_ send_data_to_LCD(0xA5); send_data_to_LCD(0xA4); send_data_to_LCD(0x4D); set_DDRAM_adress(0x90); //3 строка send_data_to_LCD(0x20); //_ send_data_to_LCD(0x42); send_data_to_LCD(0xAE); send_data_to_LCD(0x42); send_data_to_LCD(0x4F); send_data_to_LCD(0xE0); send_data_to_LCD(0x20); //_ send_data_to_LCD(0xA8); send_data_to_LCD(0x4F); send_data_to_LCD(0x20); //_ send_data_to_LCD(0x55); send_data_to_LCD(0x41); send_data_to_LCD(0x52); send_data_to_LCD(0x54); set_DDRAM_adress(0x80); //1 строка } void send_command_to_LCD(unsigned char command) { while (check_busy_flag()!=0x00) {} //если busy flag=0, продолжить PE_ODR_bit.ODR1=0; //R/W - запись на LCD PE_ODR_bit.ODR2=0; //RS - команда PE_ODR_bit.ODR0=1; // E - 1 PB_DDR=0xff; //порт B - выход на LCD PB_CR1=0xff; //push-pull PB_CR2=0xff; //крутые фронты PB_ODR=command; PE_ODR_bit.ODR0=0; // E - 0 //PB_DDR=0x00; //порт B - вход от LCD } void send_data_to_LCD(unsigned char data) { while (check_busy_flag()!=0x00) {} //если busy flag=0, продолжить PE_ODR_bit.ODR1=0; //R/W - запись на LCD PE_ODR_bit.ODR2=1; //RS - данные PE_ODR_bit.ODR0=1; // E - 1 PB_DDR=0xff; //порт B - выход на LCD PB_CR1=0xff; //push-pull PB_CR2=0xff; //крутые фронты PB_ODR=data; PE_ODR_bit.ODR0=0; // E - 0 //PB_DDR=0x00; //порт B - вход от LCD } /*переключает адресацию на CGRAM, входной параметр adress - задает адрес */ void set_CGRAM_adress(unsigned char adress) { while (check_busy_flag()!=0x00) {} //если busy flag=0, продолжить PE_ODR_bit.ODR1=0; //R/W - запись на LCD PE_ODR_bit.ODR2=0; //RS - команда PE_ODR_bit.ODR0=1; // E - 1 PB_DDR=0xff; //порт B - выход на LCD PB_CR1=0xff; //push-pull PB_CR2=0xff; //крутые фронты PB_ODR=(0x40|adress); PE_ODR_bit.ODR0=0; // E - 0 //PB_DDR=0x00; //порт B - вход от LCD } /*переключает адресацию на DDRAM, входной параметр adress - задает адрес */ void set_DDRAM_adress(unsigned char adress) { while (check_busy_flag()!=0x00) {} //если busy flag=0, продолжить PE_ODR_bit.ODR1=0; //R/W - запись на LCD PE_ODR_bit.ODR2=0; //RS - команда PE_ODR_bit.ODR0=1; // E - 1 PB_DDR=0xff; //порт B - выход на LCD PB_CR1=0xff; //push-pull PB_CR2=0xff; //крутые фронты PB_ODR=(0x80|adress); PE_ODR_bit.ODR0=0; // E - 0 //PB_DDR=0x00; //порт B - вход от LCD } unsigned char check_busy_flag(void) { unsigned char busy_flag; PE_ODR_bit.ODR1=1; //R/W - чтение с LCD PE_ODR_bit.ODR2=0; //RS - команда PE_ODR_bit.ODR0=1; // E - 1 PB_DDR=0x00; //порт B - вход с LCD PB_CR1=0xff; //с подтяжкой PB_CR2=0x00; //без прерывания busy_flag=PB_IDR&0x80; busy_flag>>=7; PE_ODR_bit.ODR0=0; // E - 0 delay_mcs(3); return busy_flag; } upd: включил другой проект с часами и индикацией на 7-сегм. все отлаживается и работает без ошибок т.е. проблема вряд ли в железе
  13. в процессе отладки получены еще несколько багов - переполнение стека при инициализации LCD, получение кучи непонятных внешних прерываний - почти все флаги в EXTI_SR1 уст. в 1 сообщение об ошибках при отладке: Thu Jan 09 13:54:51 2014: C-SPY Processor Descriptor V1.30.1.50036 for STM8 Thu Jan 09 13:54:51 2014: C-SPY Debugger Driver, ST-LINK V1.30.2.50045 for STM8 Thu Jan 09 13:54:52 2014: Connected to STM8 SWIM Debugging system, STM8-SWIM 1.6.2, GDI Version 1.2.6 Thu Jan 09 13:54:53 2014: Loaded debugee: C:\Users\Lyt\Documents\STM8_projects\Debug\Exe\test.out Thu Jan 09 13:54:53 2014: Target reset Thu Jan 09 13:55:01 2014: Breakpoint hit: Code @ main.c:111.3 Thu Jan 09 13:55:04 2014: Breakpoint hit: Code @ main.c:133.3 Thu Jan 09 13:55:05 2014: Failed to get execution status: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:05 2014: Failed to get execution status: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:05 2014: Failed to step target: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:06 2014: Failed to read memory at 0x700: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:06 2014: The stack 'Stack' is filled to 99% (255 bytes used out of 256). The warning threshold is set to 90.% Thu Jan 09 13:55:06 2014: Failed to read memory at 0x7FA: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:06 2014: Failed to read memory at 0x7FB: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:06 2014: Failed to read memory at 0x50A5: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:06 2014: Failed to read memory at 0x50A5: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:06 2014: Failed to read memory at 0x50A5: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:06 2014: Failed to read memory at 0x50A5: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:06 2014: Failed to read memory at 0x50A5: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:06 2014: Failed to read memory at 0x50A5: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:06 2014: Failed to read memory at 0x50A5: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:07 2014: Failed to read memory at 0x50A5: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:07 2014: Failed to read memory at 0x50A5: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:07 2014: Failed to read memory at 0x50A0: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:07 2014: Failed to read memory at 0x50A0: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:07 2014: Failed to read memory at 0x50A0: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:07 2014: Failed to read memory at 0x50A0: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:07 2014: Failed to read memory at 0x50A0: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:07 2014: Failed to read memory at 0x50A1: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:07 2014: Failed to read memory at 0x50A2: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:07 2014: Failed to read memory at 0x50A3: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:07 2014: Failed to read memory at 0x50A3: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:08 2014: Failed to read memory at 0x50A3: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:08 2014: Failed to read memory at 0x50A3: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:08 2014: Failed to read memory at 0x50A3: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:08 2014: Failed to read memory at 0x50A3: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:08 2014: Failed to read memory at 0x50A3: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:08 2014: Failed to read memory at 0x50A3: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:08 2014: Failed to read memory at 0x50A3: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:08 2014: Failed to read memory at 0x50A4: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:08 2014: Failed to read memory at 0x50A4: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:08 2014: Failed to read memory at 0x50A4: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:08 2014: Failed to read memory at 0x50A4: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:09 2014: Failed to read memory at 0x50A4: SWIM error [30004]: Comm timeout Thu Jan 09 13:55:09 2014: Failed to read memory at 0xC: SWIM error [30004]: Comm timeout
  14. опять проблема, на этот раз непонятное поведение контроллера при разрешении прерывания проблема возникла внезапно - при разрешении прерывания asm("RIM") программа уходит в бесконечный пустой цикл. __iar_unhandled_exception: 00870E 9D NOP 00870F 20FD JRA __iar_unhandled_exception Судя по всему, вызываются какие-то пустые прерывания. Проблема возникла реально из ниоткуда - при добавлении в обработчик прерывания опроса второй кнопки на этом же порту. До этого все замечательно работало, но при возврате к исходному коду проблема осталась. upd может также вызываться сразу после разрешения прерывания программа обработки EXTID без нажатия кнопок - после ее обработки происходит выход в пустой цикл.
×
×
  • Создать...