Lyt
Участник-
Постов
36 -
Зарегистрирован
-
Посещение
Весь контент 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 без нажатия кнопок - после ее обработки происходит выход в пустой цикл. -
цифровой вольтметр, -5..5 вольт
Lyt ответил Lyt тема в В помощь начинающему
схема подключения стандартная, 8-битная шина увеличил задержки, добавил проверку флага перед каждой командой, заработало -
цифровой вольтметр, -5..5 вольт
Lyt ответил Lyt тема в В помощь начинающему
Пытаюсь сделать подобие меню на 44780 (WH1604A), столкнулся с проблемой - при отладке через IAR с использованием stm8l discovery (т.е. через st-link), все хорошо, все 3 строки отображаются полностью, при выходе из режима отладки первая строка "съезжает" влево за границы видимости экрана на 6 символов, после резета кнопкой на discovery-плате такая же ситуация. Что это может быть? Также хотелось спросить - при железном отключении/включении отладочной платы (т.е. отключения-включения usb), экран не отображает вообще ничего, видно только что инициализирован в 2 строки. после нажатия "reset" на плате, lcd переходит в 2-строчный режим, но также ничего не отображает. -
Покритикуйте
Lyt ответил Lyt тема в MCS51, AVR, PIC, STM8, 8bit
с общим катодом и стоит - для зажигания сегмента выдается 1 на анод и 0 на катод спасибо, работает! Подскажите еще пожалуйста насчет питания - будет ли вся схема работать от 3 вольт И каков ток потребление 7-сегментного индикатора? в даташите указан лишь максимальный прямой ток в 30мА - это на сегмент,на цифру или на весь индикатор? и насколько применимы такие индикаторы в устройствах с батарейным питанием? -
цифровой вольтметр, -5..5 вольт
Lyt ответил Lyt тема в В помощь начинающему
поговорил с преподавателем - получил относительную свободу действий. т.е. тз додумываю сам как хочется; если планирую использовать какой-либо 8-битник который не потянет условия из задания, то спроектировать устройство на нем с максимальным параметрами, которые может потянуть мой контроллер -
Покритикуйте
Lyt ответил Lyt тема в MCS51, AVR, PIC, STM8, 8bit
внезапно возник вопрос по схеме - по транзисторам. изначально я рассчитывал поставить n-p-n BC817; по высокому уровню на базе транзистор открывается и ток стекает от катода индикатора через коллектор в эмиттер на землю. Но код не менял с самого начала, когда ток стекал от катода индикатора обратно в контроллер, при симуляции в протеусе перепутал транзисторы и поставил p-n-p BC856 и все работало. Вопросы: как работало в протеусе с p-n-p и будет ли работать как я хотел изначально с n-p-n (при соответствующем изменении программы на #define dig_1_on() PORTB|=(1<<4) //выключение 1 элемента индикатора #define dig_1_off() PORTB&=(~(1<<4)) //включение 1 элемента индикатора #define dig_2_on() PORTB|=(1<<0) //выключение 2 элемента индикатора #define dig_2_off() PORTB&=(~(1<<0)) //включение 2 элемента индикатора ?? -
Покритикуйте
Lyt ответил Lyt тема в MCS51, AVR, PIC, STM8, 8bit
спасибо! оказалось все очень просто Но не меняя тип переменной unsigned char на unsigned int,все получилось без переполнения. Т.е. умножаю значение adc-115 на 43 и делю на 100 - все прекрасно работает. хотя переполнение должно возникнуть при adc-115 >5. Вот здесь момент не ясен но в потеусе с этим простейшим изменением все заработало идеально -
Покритикуйте
Lyt ответил Lyt тема в MCS51, AVR, PIC, STM8, 8bit
спасибо за ответ! tiny2313 не имеет ацп, использую самые простые пока вещи, ну и что есть в наличии питание я предполагал от 3х вольт (будет ли с ним работать? протеус не желает воспринимать 3 вольта как высокий уровень для подтяжки вверх свободного входа регистра. токоограничивающие резисторы предполагаются, в протеусе не стал их вносить в проект. резисторы в базах рассчитывал как (Uh-Ue_b)/Ib=(3-0.7)/10^-2=230 ом Uh - напряжение высокого уровня Ue_b - падение напряжения на переходе эмиттер-база Ib - ток базы в теории, конденсаторы должны увеличить возможную частоту переключения транзисторов? в моем случае там около 10кГц должно получиться, конденсаторы и правда не нужны наверно -
Покритикуйте
Lyt опубликовал тема в MCS51, AVR, PIC, STM8, 8bit
Учусь работать с ацп - решил собрать простейший термометр на аналоговом датчике TC1047 и attiny13, с индикацией на двух семисегметных индикаторах, подключенных через сдвиговой регистр 74HC164. Измеряю от 0 до 60 градусов. результат смотрю в старшем регистре, т.е. 8-битное измерение получается. При использовании внутреннего ИОН 1.1В, шаг получается ~4.3мВ. Результат из преобразованного значения вычисляю как (x-115)*4/10 - (при нуле градусов датчик дает 500мВ) - получаю значение температуры в градусах. В протеусе работает, но выдает ошибку в 1-3 градуса, чем больше температура тем больше ошибка. Как я понимаю ошибка эта возникает за-за того, что умножаю на 4, а не на 4.3. Что скажете в целом по схеме и программе? И будет ли все это работать от источника в 3 вольта? #include <avr/io.h> #include <avr/interrupt.h> #include <avr/delay.h> #define _0 0b11111100 // 0 на индикаторе #define _1 0b01100000 // 1 на индикаторе #define _2 0b11011010 // 2 на индикаторе #define _3 0b11110010 // 3 на индикаторе #define _4 0b01100110 // 4 на индикаторе #define _5 0b10110110 // 5 на индикаторе #define _6 0b10111110 // 6 на индикаторе #define _7 0b11100000 // 7 на индикаторе #define _8 0b11111110 // 8 на индикаторе #define _9 0b11110110 // 9 на индикаторе #define ADC_start() ADCSRA|=(1<<6) #define dig_1_off() PORTB|=(1<<4) //выключение 1 элемента индикатора #define dig_1_on() PORTB&=(~(1<<4)) //включение 1 элемента индикатора #define dig_2_off() PORTB|=(1<<0) //выключение 2 элемента индикатора #define dig_2_on() PORTB&=(~(1<<0)) //включение 2 элемента индикатора #define strob_h() PORTB|=(1<<1) //строб на регистр в 1 #define strob_l() PORTB&=(~(1<<1)) //строб на регистр в 0 static unsigned char temperature_dig_h=0; static unsigned char temperature_dig_l=0; ISR(ADC_vect) { volatile unsigned char temp=0,temp_h=0,temp_l=0; temp=ADCH-115; //из полученного значения вычли значение при 0 градусов if (temp>=17) temp++; if (temp>=24) temp++; if (temp>=31) temp++; if (temp>=38) temp++; if (temp>=50) temp++; if (temp>=60) temp++; temp=(temp*4)/10; //умножаем на шаг преобр. ацп (~4мВ) и делим на шаг преобр. датчика (10мВ/градус) temp_h=temp/10; temp_l=temp-(temp_h*10); switch (temp_h) { case 0: temperature_dig_h=_0; break; case 1: temperature_dig_h=_1; break; case 2: temperature_dig_h=_2; break; case 3: temperature_dig_h=_3; break; case 4: temperature_dig_h=_4; break; case 5: temperature_dig_h=_5; break; case 6: temperature_dig_h=_6; break; break; } switch (temp_l) { case 0: temperature_dig_l=_0; break; case 1: temperature_dig_l=_1; break; case 2: temperature_dig_l=_2; break; case 3: temperature_dig_l=_3; break; case 4: temperature_dig_l=_4; break; case 5: temperature_dig_l=_5; break; case 6: temperature_dig_l=_6; break; case 7: temperature_dig_l=_7; break; case 8: temperature_dig_l=_8; break; case 9: temperature_dig_l=_9; break; break; } } int main(void) { //Начальная инициализация //Инициализация АЦП ADCSRA=0b11101110; //включение ацп, режим однократного преобразования, разрешение прерывания от ацп, ADCSRB=0b00000000; //частота преобразования clk/128=9.6MHz/128=75KHz ADMUX=0b01100011; //опорное напряжение - внутренний ИОН 1.1В, рез-т выравнивается влево, вх. канал - ADC3 //Настройка ввода/вывода DDRB=0b00010111; sei(); _delay_us(100); cli(); while(1) { //вывод данных на 7-сегм. индикаторы. сначала выводится старшая цифра, затем младшая //***** for (unsigned char counter=1; counter!=0; counter=counter<<1 ) { if ((temperature_dig_h & counter)==0) PORTB&=(~(1<<2)); else PORTB|=(1<<2); strob_h(); _delay_us(1); strob_l(); } dig_1_on(); //активирована 1 цифра //sei(); _delay_us(100); //cli(); dig_1_off(); for (unsigned char counter=1; counter!=0; counter=counter<<1 ) { if ((temperature_dig_l & counter)==0) PORTB&=(~(1<<2)); else PORTB|=(1<<2); strob_h(); _delay_us(10); strob_l(); } dig_2_on(); sei(); _delay_us(100); dig_2_off(); cli(); //***** } } -
цифровой вольтметр, -5..5 вольт
Lyt ответил Lyt тема в В помощь начинающему
Спасибо! Засел за изучение метрологии попытаюсь изменить задание в сторону увеличения погрешности и увеличения периода - 0.5% и 1мс -
цифровой вольтметр, -5..5 вольт
Lyt ответил Lyt тема в В помощь начинающему
Разъясните, пожалуйста, поподробнее, в метрологии совсем не силен. В моем случае что подразумевается под сравнением с эталоном?