Lyt 0 20 октября, 2013 Опубликовано 20 октября, 2013 · Жалоба Спасибо! Засел за изучение метрологии попытаюсь изменить задание в сторону увеличения погрешности и увеличения периода - 0.5% и 1мс Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 20 октября, 2013 Опубликовано 20 октября, 2013 · Жалоба Спасибо! Засел за изучение метрологии попытаюсь изменить задание в сторону увеличения погрешности и увеличения периода - 0.5% и 1мс Читаю и балдею... Вот у французов есть такое лекарство от головной боли - гильотина... Так вот я бы такое лекарство прописал тому, кто дает такие курсовики... И при этом ни черта не объясняет... Не бывает 1 мкс и 1 сек да еще с 0,05% и вот "безо всего"... Это все не так просто и однозначно... итак, надо измерять напряжение... А где? На плате - это одно, а в 20 см, щупами - это другое... Какая схема подключения? 2 провода? 3 провода? Не задумывались о помехах? Ну, скажем 1 раз в секунду можно взять сигма-дельта АЦП... А вот раз в микросекунду? Что там получим? И при каком входном сопротивлении? А получим "радио Маяк"... Да еще 100 Гц.... ОК! Теперь берем щупы руками... "Маяк" стал слышен уже значительно лучше... Делаем щупы экранированные? Значит не получаем изменений сигнала при микросекундных измерениях... Не приходило в голову, посему щупы к тектрониксу продают по 100-200 долл. пассивные? А активные под 1000 долл и дороже... Ну и далее, в том же духе... АЧХ шупа, коррекция АЧХ аналоговая или цифровая. Фильтрация шумов... А еще есть "защита входа" от статики, от повышенного напряжения, от наводки..... Калибровка на ВЧ... Ведь АЦП поразрядного уравновешивания не умеет измерять динамичеки-изменяющийся сигнал. Ему на вход нужно ставить УВХ И входной предварительный каскад... При скачке входного напряжения на входе щупов, на входе АЦП получим экспоненту... И сколько "Тау" нужно ждать, чтобы попасть в "пол-класса"??? Про калибровку по постоянному току тут уже рассказали... Так вот, в "класс", т.е в 0,05% должно войти кроме АЦП еще и предварительный усилитель, и входные цепи и защита и щупы... А главное еще и шумы. И Питание, как не странно тоже... Так что видимо с головной болью не все хорошо у препода... Удачи! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lyt 0 23 октября, 2013 Опубликовано 23 октября, 2013 · Жалоба поговорил с преподавателем - получил относительную свободу действий. т.е. тз додумываю сам как хочется; если планирую использовать какой-либо 8-битник который не потянет условия из задания, то спроектировать устройство на нем с максимальным параметрами, которые может потянуть мой контроллер Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 24 октября, 2013 Опубликовано 24 октября, 2013 · Жалоба Задание: сконструировать вольтметр, предел измерения -5..5 вольт, погрешность не более 0.05%. Имею отношение к проектированию электронной измерительной технике. Скажу так: в рамках курсового - практически нереальная задача. поговорил с преподавателем - получил относительную свободу действий. т.е. тз додумываю сам как хочется; если планирую использовать какой-либо 8-битник который не потянет условия из задания, то спроектировать устройство на нем с максимальным параметрами, которые может потянуть мой контроллер Ну так ещё куда ни шло :rolleyes: А вообще, проектирование измерительной техники - задача очень нетривиальная. Как уже было сказано, недостаточно знаний только параметров радиодеталей, и общего представления как их соединить вместе. Тут нужны знания комплексные из различных областей. Если бы всё было так просто, то мы были бы завалены бюджетными прецизионными измерителями... :rolleyes: :rolleyes: :rolleyes: :bb-offtopic: Но дело это (создавать измерительные приборы) - прекрсное занятие, очень интересное и упоительное! Вот только столькому мне ещё надо научиться... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slavka012 0 24 октября, 2013 Опубликовано 24 октября, 2013 · Жалоба Полно. Только подумайте, где хранить весь объём получаемых данных и как успеть их обработать. А что тут думать, суммировать и все. раз 5 секунду выводить на дисплей Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lyt 0 7 января, 2014 Опубликовано 7 января, 2014 · Жалоба Пытаюсь сделать подобие меню на 44780 (WH1604A), столкнулся с проблемой - при отладке через IAR с использованием stm8l discovery (т.е. через st-link), все хорошо, все 3 строки отображаются полностью, при выходе из режима отладки первая строка "съезжает" влево за границы видимости экрана на 6 символов, после резета кнопкой на discovery-плате такая же ситуация. Что это может быть? Также хотелось спросить - при железном отключении/включении отладочной платы (т.е. отключения-включения usb), экран не отображает вообще ничего, видно только что инициализирован в 2 строки. после нажатия "reset" на плате, lcd переходит в 2-строчный режим, но также ничего не отображает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость TSerg 7 января, 2014 Опубликовано 7 января, 2014 · Жалоба Пытаюсь сделать подобие.. С Праздниками! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 0 8 января, 2014 Опубликовано 8 января, 2014 · Жалоба Пытаюсь сделать подобие меню на 44780 (WH1604A), столкнулся с проблемой - при отладке через IAR с использованием stm8l discovery (т.е. через st-link), все хорошо, все 3 строки отображаются полностью, при выходе из режима отладки первая строка "съезжает" влево за границы видимости экрана на 6 символов, после резета кнопкой на discovery-плате такая же ситуация. Что это может быть? Также хотелось спросить - при железном отключении/включении отладочной платы (т.е. отключения-включения usb), экран не отображает вообще ничего, видно только что инициализирован в 2 строки. после нажатия "reset" на плате, lcd переходит в 2-строчный режим, но также ничего не отображает. инициализацию в студию, а также схему подключения Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lyt 0 8 января, 2014 Опубликовано 8 января, 2014 · Жалоба схема подключения стандартная, 8-битная шина увеличил задержки, добавил проверку флага перед каждой командой, заработало Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lyt 0 8 января, 2014 Опубликовано 8 января, 2014 (изменено) · Жалоба опять проблема, на этот раз непонятное поведение контроллера при разрешении прерывания проблема возникла внезапно - при разрешении прерывания asm("RIM") программа уходит в бесконечный пустой цикл. __iar_unhandled_exception: 00870E 9D NOP 00870F 20FD JRA __iar_unhandled_exception Судя по всему, вызываются какие-то пустые прерывания. Проблема возникла реально из ниоткуда - при добавлении в обработчик прерывания опроса второй кнопки на этом же порту. До этого все замечательно работало, но при возврате к исходному коду проблема осталась. upd может также вызываться сразу после разрешения прерывания программа обработки EXTID без нажатия кнопок - после ее обработки происходит выход в пустой цикл. #include "iostm8l152c6.h" #include "LCD.h" #define T_CPU 0.0625 // 1/частота ядра в мегагерцах = период такт. сигнала в микросек. static unsigned char global_flags_LCD; static unsigned char global_flags_ADC; //Обработчики прерываний #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_CR1=0x0A; //прерывание на 0 и 1 битах портов возникает по спаду EXTI_CONF_bit.PDLIS=1; //PD[3:0] - исп. для EXTID global_flags_LCD=0x00; global_flags_ADC=0x00; LCD_initialization(); set_main_menu_LCD(); asm("RIM"); while(1) { PA_DDR=0x00; PA_DDR=0xff; } } Изменено 8 января, 2014 пользователем Herz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lyt 0 9 января, 2014 Опубликовано 9 января, 2014 (изменено) · Жалоба в процессе отладки получены еще несколько багов - переполнение стека при инициализации 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 Изменено 9 января, 2014 пользователем Lyt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lyt 0 9 января, 2014 Опубликовано 9 января, 2014 (изменено) · Жалоба 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-сегм. все отлаживается и работает без ошибок т.е. проблема вряд ли в железе Изменено 10 января, 2014 пользователем Lyt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lyt 0 10 января, 2014 Опубликовано 10 января, 2014 (изменено) · Жалоба upd:удалением настройки портов на крутые фронты (регистр Px_CR2) удалось добиться отсутствия случайных внешних прерываний. модификацией функции чтения флага занятости удалось убрать ошибки при отладке осталась одна проблема - LCD мерцает, что судя по всему означает постоянную реинициализацию. Получается МК перезагружается постоянно? из-за чего это может быть? Изменено 10 января, 2014 пользователем Lyt Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться