Lyt
Участник-
Постов
36 -
Зарегистрирован
-
Посещение
Репутация
0 ОбычныйИнформация о Lyt
-
Звание
Участник
-
Ковыряться в железках конечно интересно, но только уровень зп, уровень менеджмента и общее ощущение того, что мы пытаемся делать серьезные вещи на коленке, это все демотивирует.
-
Подниму тему, тяжкие думы о перспективах в разработке электроники (схемотехника, печатные платы, программирование firmware) посещают меня с периодичностью в полгода. Пытаться развиваться в этой сфере, думал поступить в магистратуру МИЭМ, про которую кто-то как раз спрашивал в соседней теме, или бросить все это и уходить в java, android etc, пока еще молодой (25 лет, 2 года опыта работы разработчиком РЭА)? Насколько реально достичь уровня в зп 160-180к в Москве как инженер-разработчик? Насколько реально эмигрировать в США/Канаду/Австралию как инженер-разработчик? Кто как оценивает перспективы в разработке железа/низкоуровневом программировании в мире в ближайшие десятилетия? В каком направлении развиваться для эмиграции - модный Iot, пром автоматика, авионика, электропривод, свч?
-
подключить .с файл как библиотеку в IAR
Lyt ответил Lyt тема в Программирование
"как библиотеку" - при компиляции основного проекта будут скомпилированы только используемые функции в этом файле -
подключить .с файл как библиотеку в IAR
Lyt опубликовал тема в Программирование
Два вопроса: 1.Возможно ли подключить .с файл как библиотеку в IAR? 2.При простом подключении .с файла - использующиеся в нем макроопределения можно определить вне его, а в main.c ? -
Заполнение массива на си
Lyt ответил Lyt тема в Программирование
пишу для stm8l решил делать как раз const char *A= {'a', 'b', 'c', 0}; а что делает эта строка? *А-указатель на массив ? char string3_to_LCD[16]={0x20,0xA8,0x45,0x50,0xA5,...} IAR пишет во флеш -
Заполнение массива на си
Lyt ответил Lyt тема в Программирование
Можно поподробнее описать строку unsigned char string_to_LCD[]={ " HE\xA8" "PEP" "\xAE\x42" }; ? а можно стирать массив а потом заново его инициализировать с другими элементами? или это нерационально? -
Заполнение массива на си
Lyt опубликовал тема в Программирование
При инициализации массив можно заполнить следующим образом: unsigned char string_to_LCD[16]={0x20,0x48,0x45,0xA8,0x50,0x45,0x50,0xAE,0x42,0x20,0xA5,0xA4,0x4D,0xFE}; можно ли аналогично заполнить этот же массив другими символами? использую такой массив для хранения кодов символов строки, выводимой на экран hd44780 -
выбор типа указателя
Lyt опубликовал тема в Программирование
Как выбирать размер для указателя на массив? например unsigned char RTC_array[2]; unsigned char *index_RTC_array; index_RTC_array=RTC_array; В указателе содержится адрес 1 элемента массива в памяти, который может выходить за 0xff. Указатель автоматически приводится компилятором к необходимому типу для сохранения полного адреса 1 элемента? Но тогда если 1 элемент находится по адресу 0xff, а следующий по адресу 0x100, то будет ошибка? Или компилятор также учитывает длину массива и размер указателя выбирается с учетом возможности сохранить вдрес последнего элемента? -
Ошибки чтения STM8L
Lyt ответил Lyt тема в MCS51, AVR, PIC, STM8, 8bit
проблему решил! перезагрузка была из-за настройки этих портов: PC_DDR=0xff; PC_CR1=0xff; PF_DDR=0xff; PF_CR1=0xff; во время борьбы с лишними прерываниями я все порты неиспользуемые бездумно поставил на вход и подтянул вверх. перезагрузка была, вероятно из-за того, что С0 и С1 (вроде бы) используются для подключения внешнего кварца и работают в режиме открытого стока (что то такое читал я в даташите). -
Ошибки чтения STM8L
Lyt опубликовал тема в MCS51, AVR, PIC, STM8, 8bit
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) { } */ Из-за чего могут быть ошибки чтения? -
цифровой вольтметр, -5..5 вольт
Lyt ответил Lyt тема в В помощь начинающему
upd:удалением настройки портов на крутые фронты (регистр Px_CR2) удалось добиться отсутствия случайных внешних прерываний. модификацией функции чтения флага занятости удалось убрать ошибки при отладке осталась одна проблема - LCD мерцает, что судя по всему означает постоянную реинициализацию. Получается МК перезагружается постоянно? из-за чего это может быть? -
цифровой вольтметр, -5..5 вольт
Lyt ответил Lyt тема в В помощь начинающему
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-сегм. все отлаживается и работает без ошибок т.е. проблема вряд ли в железе -
цифровой вольтметр, -5..5 вольт
Lyt ответил Lyt тема в В помощь начинающему
в процессе отладки получены еще несколько багов - переполнение стека при инициализации 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 -
цифровой вольтметр, -5..5 вольт
Lyt ответил Lyt тема в В помощь начинающему
опять проблема, на этот раз непонятное поведение контроллера при разрешении прерывания проблема возникла внезапно - при разрешении прерывания asm("RIM") программа уходит в бесконечный пустой цикл. __iar_unhandled_exception: 00870E 9D NOP 00870F 20FD JRA __iar_unhandled_exception Судя по всему, вызываются какие-то пустые прерывания. Проблема возникла реально из ниоткуда - при добавлении в обработчик прерывания опроса второй кнопки на этом же порту. До этого все замечательно работало, но при возврате к исходному коду проблема осталась. upd может также вызываться сразу после разрешения прерывания программа обработки EXTID без нажатия кнопок - после ее обработки происходит выход в пустой цикл.