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

цифровой вольтметр, -5..5 вольт

Спасибо!

Засел за изучение метрологии

попытаюсь изменить задание в сторону увеличения погрешности и увеличения периода - 0.5% и 1мс

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо!

Засел за изучение метрологии

попытаюсь изменить задание в сторону увеличения погрешности и увеличения периода - 0.5% и 1мс

Читаю и балдею...

Вот у французов есть такое лекарство от головной боли - гильотина...

Так вот я бы такое лекарство прописал тому, кто дает такие курсовики... И при этом ни черта не объясняет... Не бывает 1 мкс и 1 сек да еще с 0,05% и вот "безо всего"... Это все не так просто и однозначно...

 

итак, надо измерять напряжение... А где? На плате - это одно, а в 20 см, щупами - это другое... Какая схема подключения? 2 провода? 3 провода? Не задумывались о помехах? Ну, скажем 1 раз в секунду можно взять сигма-дельта АЦП... А вот раз в микросекунду? Что там получим? И при каком входном сопротивлении? А получим "радио Маяк"... Да еще 100 Гц....

ОК! Теперь берем щупы руками... "Маяк" стал слышен уже значительно лучше... Делаем щупы экранированные? Значит не получаем изменений сигнала при микросекундных измерениях... Не приходило в голову, посему щупы к тектрониксу продают по 100-200 долл. пассивные? А активные под 1000 долл и дороже...

Ну и далее, в том же духе... АЧХ шупа, коррекция АЧХ аналоговая или цифровая. Фильтрация шумов...

А еще есть "защита входа" от статики, от повышенного напряжения, от наводки.....

Калибровка на ВЧ... Ведь АЦП поразрядного уравновешивания не умеет измерять динамичеки-изменяющийся сигнал. Ему на вход нужно ставить УВХ

И входной предварительный каскад... При скачке входного напряжения на входе щупов, на входе АЦП получим экспоненту... И сколько "Тау" нужно ждать, чтобы попасть в "пол-класса"???

Про калибровку по постоянному току тут уже рассказали... Так вот, в "класс", т.е в 0,05% должно войти кроме АЦП еще и предварительный усилитель, и входные цепи и защита и щупы... А главное еще и шумы. И Питание, как не странно тоже...

 

Так что видимо с головной болью не все хорошо у препода...

Удачи!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

поговорил с преподавателем - получил относительную свободу действий. т.е. тз додумываю сам как хочется; если планирую использовать какой-либо 8-битник который не потянет условия из задания, то спроектировать устройство на нем с максимальным параметрами, которые может потянуть мой контроллер

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Задание: сконструировать вольтметр, предел измерения -5..5 вольт, погрешность не более 0.05%.

Имею отношение к проектированию электронной измерительной технике.

Скажу так: в рамках курсового - практически нереальная задача.

 

поговорил с преподавателем - получил относительную свободу действий. т.е. тз додумываю сам как хочется; если планирую использовать какой-либо 8-битник который не потянет условия из задания, то спроектировать устройство на нем с максимальным параметрами, которые может потянуть мой контроллер

Ну так ещё куда ни шло :rolleyes:

А вообще, проектирование измерительной техники - задача очень нетривиальная. Как уже было сказано, недостаточно знаний только параметров радиодеталей, и общего представления как их соединить вместе. Тут нужны знания комплексные из различных областей. Если бы всё было так просто, то мы были бы завалены бюджетными прецизионными измерителями... :rolleyes: :rolleyes: :rolleyes:

:bb-offtopic: Но дело это (создавать измерительные приборы) - прекрсное занятие, очень интересное и упоительное! Вот только столькому мне ещё надо научиться...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Полно. Только подумайте, где хранить весь объём получаемых данных и как успеть их обработать.

А что тут думать, суммировать и все. раз 5 секунду выводить на дисплей

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пытаюсь сделать подобие меню на 44780 (WH1604A), столкнулся с проблемой - при отладке через IAR с использованием stm8l discovery (т.е. через st-link), все хорошо, все 3 строки отображаются полностью, при выходе из режима отладки первая строка "съезжает" влево за границы видимости экрана на 6 символов, после резета кнопкой на discovery-плате такая же ситуация. Что это может быть?

Также хотелось спросить - при железном отключении/включении отладочной платы (т.е. отключения-включения usb), экран не отображает вообще ничего, видно только что инициализирован в 2 строки. после нажатия "reset" на плате, lcd переходит в 2-строчный режим, но также ничего не отображает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пытаюсь сделать подобие меню на 44780 (WH1604A), столкнулся с проблемой - при отладке через IAR с использованием stm8l discovery (т.е. через st-link), все хорошо, все 3 строки отображаются полностью, при выходе из режима отладки первая строка "съезжает" влево за границы видимости экрана на 6 символов, после резета кнопкой на discovery-плате такая же ситуация. Что это может быть?

Также хотелось спросить - при железном отключении/включении отладочной платы (т.е. отключения-включения usb), экран не отображает вообще ничего, видно только что инициализирован в 2 строки. после нажатия "reset" на плате, lcd переходит в 2-строчный режим, но также ничего не отображает.

инициализацию в студию, а также схему подключения

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

схема подключения стандартная, 8-битная шина

увеличил задержки, добавил проверку флага перед каждой командой, заработало

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

опять проблема, на этот раз непонятное поведение контроллера при разрешении прерывания

проблема возникла внезапно - при разрешении прерывания 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;
 }
}

Изменено пользователем Herz

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в процессе отладки получены еще несколько багов - переполнение стека при инициализации 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

Изменено пользователем 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-сегм. все отлаживается и работает без ошибок

т.е. проблема вряд ли в железе

 

Изменено пользователем Lyt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

upd:удалением настройки портов на крутые фронты (регистр Px_CR2) удалось добиться отсутствия случайных внешних прерываний.

модификацией функции чтения флага занятости удалось убрать ошибки при отладке

осталась одна проблема - LCD мерцает, что судя по всему означает постоянную реинициализацию. Получается МК перезагружается постоянно? из-за чего это может быть?

 

Изменено пользователем Lyt

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...