Форум по микроконтроллерам: Сканер шины LCD экрана. - Форум по микроконтроллерам

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Сканер шины LCD экрана. Код для Arduino

#1 Пользователь офлайн   Mizar-s 

  • Прибывший
  • Группа: Пользователи
  • Сообщений: 2
  • Регистрация: 26 Ноябрь 18

Отправлено 26 Ноябрь 2018 - 16:36

Привет.
Есть устройство с LCD экраном . Используется полу байтовая передача.
Внешней связи с устройством нет, но понадобилось видеть содержимое экрана на расстоянии.
На Arduino UNO собрал сканер, нарисовал код (пока топорно и на коленках).

char Buff[33]; // две строки по 8 символов + 1 вконце строки
char Disp2[80]; // буфер для вывода в последовательный порт. не обязателен. используется при наладке
char DataBuff[8]; // две строки по 8 символов + 1 вконце строки
int TempBuff;
int TempBuff_f;
int i;
int LcdPinRS = 2;
//int LcdPinE = 3;
int LcdPinD0 = 4;
int LcdPinD1 = 5;
int LcdPinD2 = 6;
int LcdPinD3 = 7;
int LcdPinD4 = 8;
int LcdPinD5 = 9;
int LcdPinD6 = 10;
int LcdPinD7 = 11;

int lcdRS; // флаг вывода управления
char ByteL, ByteH; // байт из порта

byte fByte, fByteCommsnd; // флаг первого полубайта и флаг первого полубайта команды

// вывод в последовательный порт слова из массива
void Serial_Print() // вывод массива в порт
{
  Serial.println(Disp2);
}

void setup() {
  Serial.begin(9600);
  // pinMode (9, OUTPUT); //
  //  pinMode(A0, INPUT); //
  //  pinMode(2, INPUT_PULLUP); //
  pinMode(LcdPinRS, INPUT); //
  // pinMode(LcdPinE, INPUT); //
  pinMode(LcdPinD0, INPUT); //
  pinMode(LcdPinD1, INPUT); //
  pinMode(LcdPinD2, INPUT); //
  pinMode(LcdPinD3, INPUT); //
  pinMode(LcdPinD4, INPUT); //
  pinMode(LcdPinD5, INPUT); //
  pinMode(LcdPinD6, INPUT); //
  pinMode(LcdPinD7, INPUT); //

  attachInterrupt(1, LcdCLC, RISING ); // используется прерыванеи на цировом порту 3 (0- порт 2) вызов при изменении с  LOW на HIGH
  //  sprintf (Disp2, "Start");
}

void loop() {
  //  мониторим данные в буфере для вывода на кран и порт
  //  if (Disp2[0] != ' ') { // //в буфере есть новые значения в 1м символе
  //  Serial_Print();// выодим на дисплей
  //  Disp2[0] = ' '; // стираем первый символ, буфер пуст
  //  }
  //  delay(100);// что-б слишком часто в дисплей не писало..
}

void LcdCLC()
{
  lcdRS = digitalRead (LcdPinRS);

  if (lcdRS == 0) { // команда
    fByte = 0; // сбрасываем флаг полубайта
    //   sprintf (Disp2, "fByte = 0;"); Serial_Print();// выдоим на дисплей

    if (fByteCommsnd == 0) { // принимаем первый полубайткоманды
      fByteCommsnd = 1;
      TempBuff = digitalRead (LcdPinD4) * 16 + TempBuff;
      TempBuff = digitalRead (LcdPinD5) * 32 + TempBuff;
      TempBuff = digitalRead (LcdPinD6) * 64 + TempBuff;
      TempBuff = digitalRead (LcdPinD7) * 128 + TempBuff;
    }
    else { // принимаем второй полубайткоманды
      fByteCommsnd = 0;
      TempBuff = digitalRead (LcdPinD4) * 1 + TempBuff;
      TempBuff = digitalRead (LcdPinD5) * 2 + TempBuff;
      TempBuff = digitalRead (LcdPinD6) * 4 + TempBuff;
      TempBuff = digitalRead (LcdPinD7) * 8 + TempBuff;
      sprintf (Disp2, "Comand Buff= %3d Hex=%2X", TempBuff, TempBuff);
      Serial_Print();// выодим на дисплей
      TempBuff = 0;
    }
  }
  else { // данные
    if (fByte == 0) { // принимаем первый полубайт
      fByte = 1;
      TempBuff = digitalRead (LcdPinD4) * 16 + TempBuff;
      TempBuff = digitalRead (LcdPinD5) * 32 + TempBuff;
      TempBuff = digitalRead (LcdPinD6) * 64 + TempBuff;
      TempBuff = digitalRead (LcdPinD7) * 128 + TempBuff;
    }
    else { // принимаемый второй полубайт
      fByte = 0;
      TempBuff = digitalRead (LcdPinD4) * 1 + TempBuff;
      TempBuff = digitalRead (LcdPinD5) * 2 + TempBuff;
      TempBuff = digitalRead (LcdPinD6) * 4 + TempBuff;
      TempBuff = digitalRead (LcdPinD7) * 8 + TempBuff;
      sprintf (Disp2, "Data Buff= %3d Hex=%2X", TempBuff, TempBuff);
      Serial_Print();// выводим на дисплей
      TempBuff = 0;
    }
  }
}



Код работает, за исключением инициализации дисплея, вылавливает буфер команд и символов.
Но работает медленно.....
Собрал тестовый счетчик на другой UNO. При заполнении экрана символами 2 в сек, сканер успевает захватить, но при увеличении скорости, не говоря уже об обычном режиме, сканер заикается.

Помогите оптимизировать код.

Как в ардуино получить параллельную передачу данных? Без вычислений.
и вообще, способна ли ардуина на такое?
Может дешифраторами ей помочь?
0

#2 Пользователь офлайн   MAZ 

  • Консерватор - до мозга костей и суставов
  • Группа: Администраторы
  • Сообщений: 1 425
  • Регистрация: 15 Февраль 11
  • ГородРоссия

Отправлено 26 Ноябрь 2018 - 22:23

Здесь ардуино не сильно интересует. Можете долго ждать ответа.
Если бы Бог не был консерватором, вместо десяти заповедей мы имели бы десять предложений
0

#3 Пользователь офлайн   Mizar-s 

  • Прибывший
  • Группа: Пользователи
  • Сообщений: 2
  • Регистрация: 26 Ноябрь 18

Отправлено 26 Ноябрь 2018 - 23:13

Хорошо, на чем лучше собрать?

Может сменить среду разработки для Атмеги? AVR Studio помоему.
или на пик контрллерах?
И пожалуй главное, какую минимальную частоту нужно зарядить? 10,20,40 МГц ?
У меня в арсенале есть pic16f877 pic16f628-A

Таких устройств (сканеров) будет несколько, вместе по шине 485 будут работать с мастером или компом.

0

#4 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 900
  • Регистрация: 15 Февраль 11

Отправлено 29 Ноябрь 2018 - 00:57

Проблема в digitalRead, которая далеко не за 1 такт читает ПИН контроллера, и в бешеных умножениях.
Делайте чтение портов напрямую (без библиотечных функций), а умножения замените на сдвиги, либо сделайте на условиях.

Цитата

У меня в арсенале есть pic16f877 pic16f628-A
Если всё сделать по-уму, то 628-ого хватит для такой задачи. Только придётся попотеть с буферизацией данных и отправку их на UART через прерывания. Новичку сделать это быстро не получится.
Не говорите что мне делать, и я не скажу куда Вам идти !
0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей