Вс апр 29, 2018 06:28:56
void setup() {
Serial.begin(9600); // запуск последовательного интерфейса
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
for (byte a=0; a<256; a++)
{
Serial.println("в данный момент активен сегмент, соответствующий биту");
Serial.print("0x"); Serial.print(a,HEX); Serial.println("");
delay(500);
}
}
for (int a=0; a<256; a++)
#define data 10 // соответствие номеру вывода D10
#define wr 11 // соответствие номеру вывода D11
#define cs 12 // соответствие номеру вывода D12
#define biass B00101000 // LCD 1/2 bias option, 4 common option
#define clc_on 1 // пуск системного генератора
#define lcd_on 3 // turn ON LCD bias generanor
byte ln_dat = data; // переменная со значением номера вывода линии данных
byte ln_wr = wr; // переменная со значением номера вывода линии строба записи
byte ln_cs = cs; // переменная со значением номера вывода линии строба выборки кристалла
byte bufout[ ] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // массив буфера данных для пакетной загрузки
// начальный статус линий интерфейса (он же и заглушка завершения пакета)
void stop_pack ();
// строб сопровождения данных
void data_clock();
// запись заголовка с составляющими командными словами для активации режима дисплея
void wr_uksda(byte a,byte b,byte c);
// запись байта команды
void trs_com(byte);
// запись пакета bufout (в комплекте с командным заголовком)
void wr_ksda();
// блок вращения бита в массиве
void rotor_16();
pinMode(ln_dat, OUTPUT);
pinMode(ln_wr, OUTPUT);
pinMode(ln_cs , OUTPUT);
/*
здесь размещаем реализацию наших функции - подпрограммок
используемых в вышерасположенных void setup() , void loop() а также
наши самодельные функции поменьше, используемые при реализации более крупных
собственно всего того, что заявлено выше в разделе
описанием (определением) применяемых в программе самодельных функций
*/
// начальный статус линий интерфейса (он же и заглушка завершения пакета)
//подразумевается, что линия ln_wr уже установлена в 1 или при начальной
// инициализации или по завершении строб-импульса
void stop_pack ()
{
digitalWrite(ln_dat, HIGH);
delayMicroseconds(6);
digitalWrite(ln_cs, HIGH);
}
// строб сопровождения данных
void data_clock()
{
digitalWrite(ln_wr, LOW);
delayMicroseconds(3);
digitalWrite(ln_wr, HIGH);
delayMicroseconds(3);
}
// запись байта команды (может быть выполнена как shiftOut)
void trs_com(byte com_word)
{
digitalWrite(ln_dat, bitRead(com_word,7));
data_clock();
digitalWrite(ln_dat, bitRead(com_word,6));
data_clock();
digitalWrite(ln_dat, bitRead(com_word,5));
data_clock();
digitalWrite(ln_dat, bitRead(com_word,4));
data_clock();
digitalWrite(ln_dat, bitRead(com_word,3));
data_clock();
digitalWrite(ln_dat, bitRead(com_word,2));
data_clock();
digitalWrite(ln_dat, bitRead(com_word,1));
data_clock();
digitalWrite(ln_dat, bitRead(com_word,0));
data_clock();
data_clock(); // стробирует девятый бит командного слова (его состояние безразлично)
}
#define clc_on 1
// запись заголовка с составляющими командными словами для активации режима дисплея
void wr_uksda()
{
digitalWrite(ln_cs, LOW);
delayMicroseconds(6);
data_clock(); // линия ln_dat предварительно была в состоянии 1 !!!
digitalWrite(ln_dat, LOW);
data_clock();
data_clock(); // преамбула "запись команд" 100
trs_com(biass); // LCD 1/2 bias option, 3 common option
trs_com(clc_on); // пуск системного генератора
trs_com(lcd_on); // включить LCD bias generator
stop_pack();
}
void wr_uksda(byte,byte,byte);
void wr_uksda(byte a,byte b,byte c)
{
digitalWrite(ln_cs, LOW);
delayMicroseconds(6);
data_clock();
digitalWrite(ln_dat, LOW);
data_clock();
data_clock(); // преамбула "запись команд" 100
trs_com(a); // LCD 1/2 bias option, 3 common option
trs_com(b); // пуск системного генератора
trs_com(c); // включить LCD bias generator
stop_pack();
}
/* пересылка данных в ОЗУ дисплея из ОЗУ bufout
* без разрушения содержимого bufout
*/
void wr_ksda()
{
digitalWrite(ln_cs, LOW);
delayMicroseconds(6);
data_clock();
digitalWrite(ln_dat, LOW);
data_clock();
digitalWrite(ln_dat, HIGH);
data_clock(); // преамбула "запись ОЗУ" 101
digitalWrite(ln_dat, LOW);
for (byte cnt=0; cnt<=5; cnt++)
{
data_clock(); // начальный адрес (6бит) = 0
} // отсылаем начальный адрес пакета
//заголовок-преамбула завершен, далее собственно пошли данные
for (byte cnt=0; cnt<=15; cnt++)
{
// неразрушающая обработка байта с пересылкой
digitalWrite(ln_dat, bitRead(bufout[cnt],0)); // бит 0 текущего байта
data_clock();
digitalWrite(ln_dat, bitRead(bufout[cnt],1)); // бит 1 текущего байта
data_clock();
digitalWrite(ln_dat, bitRead(bufout[cnt],2)); // бит 2 текущего байта
data_clock();
digitalWrite(ln_dat, bitRead(bufout[cnt],3)); // бит 3 текущего байта
data_clock();
digitalWrite(ln_dat, bitRead(bufout[cnt],4)); // бит 4 текущего байта
data_clock();
digitalWrite(ln_dat, bitRead(bufout[cnt],5)); // бит 5 текущего байта
data_clock();
digitalWrite(ln_dat, bitRead(bufout[cnt],6)); // бит 6 текущего байта
data_clock();
digitalWrite(ln_dat, bitRead(bufout[cnt],7)); // бит 7 текущего байта
data_clock();
}
stop_pack();
}
// блок вращения бита в массиве
void rotor_16()
{
byte b = 0; static byte a = 0; // описываем и проводим начальную инициализацию передаточных флагов
// как static переменной a - флаг предыдущего переноса из бита 7,
// и обычной переменной b — флаг (рвх) текущего переноса из бита 7
byte c; // буфер обработчика
for (int x=0; x<=15; x++)
{
c = bufout[x]; // читаем элемент массива в буфгр обработки
b = bitRead(c,7); // b может принять значения 0 иди 1
c = c << 1; // сдвиг данных
c = c | a; // запись содержимого а (0000000N) в бит 0 с
bufout[x] = c; // вернуть новое значение в элемент массива
a = b; // скрпируем текущий флаг переноса из b в а
}; // и повторим это для всех 16 байт массива
}
digitalWrite(ln_cs, HIGH); // исходное состояние = 1
digitalWrite(ln_wr, HIGH); // исходное состояние = 1
digitalWrite(ln_dat, HIGH); // исходное состояние = 1
wr_uksda(biass, clc_on, lcd_on);
wr_ksda(); // начальная инициализация дисплея "все погашены"
Serial.println("Test of the determination of the segment to bit OZU"); // Тест посегментной привязки бит ОЗУ
Serial.println("For indicator on base of the controller HT1621"); // Для индикатора на основе контроллера НТ1621
delay(1000);
bufout[15] = 0x80; // начальная активация для предустановки значения static byte a = 0
rotor_16(); // дубль - аналог перемещения бита из последней ячейки буферного ОЗУ
// для устранения ошибок положения бита в цикле
for (int a = 0; a <=127; a++)
{
rotor_16(); // перемещаем бит в следующую позицию
Serial.println("at present active segment, corresponding to bit");
// "в данный момент активен сегмент, соответствующий биту"
Serial.print("0x"); Serial.print(a, HEX); Serial.println("");
wr_ksda(); // проводим вывод пакета в дисплей и сообщения в окно терминала
delay(3500); // и после задержки в … секунды снова повторяем
}
delay(3500); // и после задержки в … секунды снова повторяем
bufout[15] = 0x80; // начальная активация для предустановки значения static byte a = 0
rotor_16(); // дубль - аналог перемещения бита из последней ячейки буферного ОЗУ
Пн апр 30, 2018 11:19:11
Ср май 02, 2018 05:43:34
Ср май 02, 2018 13:37:29
С такими ограничениями, отладка может быть не такой простой как хотелось бы.Программные точки останова формируются с помощью входящей в систему команд AVR команды Break. Интегрированная среда разработки обеспечивает сохранение оригинальной команды, заменяемой Break в памяти настольного компьютера, с последующим её восстановлением и продолжением исполнения программы. Таким образом использование программных точек останова тратит ограниченный ресурс данных микроконтроллеров — максимально возможное количество циклов записи стирания программной памяти. Нужно следить, чтобы отладчик не израсходовал его полностью.
Поскольку для отладки используется вход внешнего сброса RESET, становится невозможным проверять схемы внешнего сброса.
В момент останова процессора, чтобы не нарушить работу системы, надо соблюдать осторожность при обращении через отладчик к регистрам ввода-вывода.
Документацию на МК нужно читать.BOB51 писал(а):А ни в одной из "популярных" книж о том ... ни полслова ни намяка...
Ср май 02, 2018 16:07:56
Ср май 02, 2018 18:02:11
Что-то я не заметил в ArduinoIDE возможности отладки. Или речь про отправку данных в USART? Это вовсе не внутрисхемная отладка, в том смысле в каком она обычно подразумевается. К микроконтроллеру подключается аппаратный отладчик и программа выполняется под его управлением.BOB51 писал(а):Речь идет об использовании средств, заложенных в обязательном минимуме АРДУИНО IDE (программный ICD)
Ср май 02, 2018 18:21:41
Ср май 02, 2018 22:26:57
При если нужно добавить или убрать их или переместить в другое место программы, потребуется вносить изменения в код и перекомпилировать программу. С аппаратным отладчиком, ничего этого не нужно. Просто кликаете по строке с кодом и аппаратный отладчик сообщит отладочному модулю внутри МК что при выполнении инструкции с определенным адресом нужно остановить программу, т. е. точки останова аппаратные и их можно ставить и/или убирать во время отладки без остановки программы и ее перекомпиляции.BOB51 писал(а):Можно расставить программные ловушки
Чт май 03, 2018 09:02:23
Пн май 07, 2018 13:43:35
Ср май 09, 2018 15:53:43
Вс май 13, 2018 05:56:24
Чт май 17, 2018 09:15:50
Вс май 20, 2018 08:17:16
Ср май 30, 2018 20:35:37
byte data_write (byte trs_dat, byte trs_flg)
{ byte tmp=0; unsigned long tmp_er;
pinMode(dat_pin, OUTPUT);digitalWrite(dat_pin, LOW);
delayMicroseconds(6);digitalWrite(clk_pin, LOW);delayMicroseconds(6); // старт
for (byte cnt=0; cnt<8; cnt++)
{
digitalWrite(dat_pin,bitRead(trs_dat, cnt));
delayMicroseconds(6);
digitalWrite(clk_pin, HIGH);
delayMicroseconds(6); // строб бита
digitalWrite(clk_pin, LOW);
}
/*
* длительность интервала от перевода шины dat_pin в режим
* ввода после заднего фронта CLK в документации не оговорена !!!
*/
digitalWrite(dat_pin, LOW);pinMode(dat_pin, INPUT);
delayMicroseconds(2);
//----------???????????----------
tmp_er=millis();
while (digitalRead(dat_pin)) // ждем начала импульса АСК
{
if ((millis() - tmp_er) >= 100)
{
tmp=1; // запись статуса "ошибка АСК" в возвращаемый флаг (tmp=1)
break; // автосброс при ошибке ожидания /АСК ответа модуля более 10 миллисекунд
}
}
//----------???????????----------
digitalWrite(clk_pin, HIGH);delayMicroseconds(5);
digitalWrite(clk_pin, LOW);delayMicroseconds(4); // строб АСК
if (trs_flg) // при trs_flg=1 отрабатывается статус СТОП
{digitalWrite(clk_pin, HIGH);delayMicroseconds(5);
pinMode(dat_pin, OUTPUT);digitalWrite(dat_pin, HIGH);delayMicroseconds(5);}
return tmp; // при trs_flg=0 выход с dat_pin=INPUT
}
byte data_write (byte trs_dat, byte trs_flg)
{ byte tmp=0; unsigned long tmp_er;
pinMode(dat_pin, OUTPUT);digitalWrite(dat_pin, LOW);
delayMicroseconds(6);digitalWrite(clk_pin, LOW);delayMicroseconds(6); // старт
for (byte cnt=0; cnt<8; cnt++)
{
digitalWrite(dat_pin,bitRead(trs_dat, cnt));
delayMicroseconds(6);
digitalWrite(clk_pin, HIGH);
delayMicroseconds(6); // строб бита
digitalWrite(clk_pin, LOW);
}
/*
* длительность интервала от перевода шины dat_pin в режим
* ввода после заднего фронта CLK в документации не оговорена !!!
*/
digitalWrite(dat_pin, LOW); // pinMode(dat_pin, INPUT);
delayMicroseconds(2);
//----------???????????----------
/* tmp_er=millis();
while (digitalRead(dat_pin)) // ждем начала импульса АСК
{
if ((millis() - tmp_er) >= 100)
{
tmp=1; // запись статуса "ошибка АСК" в возвращаемый флаг (tmp=1)
break; // автосброс при ошибке ожидания /АСК ответа модуля более 10 миллисекунд
}
}*/
//----------???????????----------
digitalWrite(clk_pin, HIGH);delayMicroseconds(5);
digitalWrite(clk_pin, LOW);delayMicroseconds(4); // строб АСК
if (trs_flg) // при trs_flg=1 отрабатывается статус СТОП
{digitalWrite(clk_pin, HIGH);delayMicroseconds(5);
pinMode(dat_pin, OUTPUT);digitalWrite(dat_pin, HIGH);delayMicroseconds(5);}
return tmp; // при trs_flg=0 выход с dat_pin=INPUT
}
Ср июн 06, 2018 10:15:39
Ср июн 06, 2018 10:29:09
Ср июн 06, 2018 10:33:40
Вс июн 10, 2018 08:39:36
Чт июн 21, 2018 10:06:23