Регистр сдвига и дисплей

none4
Offline
Зарегистрирован: 30.05.2013

Добрый день,

просьба в помощи. Поневоле судьба заставляет программировать под контроллер atmega16.Разработчик  разработал свою железяку на которую программил на асемблере, сам ушёл,а никто в контроллерах не разбирается.  Я с контроллерами дело не имел, ассемблер для меня как китайский. Единственное, что я могу попытаться сделать, это посчитать его устройство ардуиной и прогаммить для него в ардуинной иде.Нашёл к счастью в интернете как подружить ардуино иде и atmega16.Схема устройство есть и прошивалка есть.

Я в протеусе нарисовал часть его схемы, залил его прошивку-всё ок.На дисплее вывелась информация.

Я захотел вывести на дисплей hello world написанное в ардуино ide, но ничего не произошло.

#include <ShiftRegLCD.h>

const byte dataPin  = 8;    // SR Data 
const byte clockPin = 22;    // SR Clock 
const byte enablw = 23;      //enable

ShiftRegLCD srlcd(dataPin, clockPin, enablw);

void setup()
{

  srlcd.print("HELLO, WORLD!");
}

void loop()
{

}

Оказалось что для ардуино стандартная схема подключения слегка отличается

1)  стандартная схема.

2) Спаянная схема.(отличие выделено розовым)

Если подключить по первой схеме, то hello world выводится.Но мне надо именно, чтобы выводилось при схеме на рис.2.

В библиотеке ShiftRegLCD.cpp я не нашёл явного указания пинов.Полагаю нужно шаманить со сдвигами, но для меня это тёмный лес.

void ShiftRegLCD::send(uint8_t value, uint8_t mode) {
  uint8_t val1, val2;
  if ( _two_wire ) shiftOut ( _srdata_pin, _srclock_pin, MSBFIRST, 0x00 ); // clear shiftregister
  digitalWrite( _enable_pin, LOW );
  mode = mode ? SR_RS_BIT : 0; // RS bit; LOW: command.  HIGH: character.
  val1 = mode | SR_EN_BIT | ((value >> 1) & 0x78); // upper nibble
  val2 = mode | SR_EN_BIT | ((value << 3) & 0x78); // lower nibble
  shiftOut ( _srdata_pin, _srclock_pin, MSBFIRST, val1 );
  digitalWrite( _enable_pin, HIGH );
  delayMicroseconds(1);                 // enable pulse must be >450ns
  digitalWrite( _enable_pin, LOW );
  if ( _two_wire ) shiftOut ( _srdata_pin, _srclock_pin, MSBFIRST, 0x00 ); // clear shiftregister
  shiftOut ( _srdata_pin, _srclock_pin, MSBFIRST, val2 );
  digitalWrite( _enable_pin, HIGH );
  delayMicroseconds(1);                 // enable pulse must be >450ns
  digitalWrite( _enable_pin, LOW );
  delayMicroseconds(40);               // commands need > 37us to settle
}

// For sending data when initializing the display to 4-bit
void ShiftRegLCD::init4bits(uint8_t value) {
  uint8_t val1;
  if ( _two_wire ) shiftOut ( _srdata_pin, _srclock_pin, MSBFIRST, 0x00 ); // clear shiftregister
  digitalWrite( _enable_pin, LOW );
  val1 = SR_EN_BIT | ((value >> 1  ) & 0x78);
  shiftOut ( _srdata_pin, _srclock_pin, MSBFIRST, val1 );
  digitalWrite( _enable_pin, HIGH );
  delayMicroseconds(1);                 // enable pulse must be >450ns
  digitalWrite( _enable_pin, LOW );
  delayMicroseconds(40);               // commands need > 37us to settle
}

 Полагаю, что  надо подравить что-то в val1,2 , хотя могу и ошибаться.

 val1 = mode | SR_EN_BIT | ((value >> 1) & 0x78); // upper nibble
  val2 = mode | SR_EN_BIT | ((value << 3) & 0x78); // lower nibble
 
 
Просьба помочь.Или указать куда копать.Не хотелось бы перепаивать провода дисплея.
 
 
tsostik
Offline
Зарегистрирован: 28.02.2013

Судя по всему SR_RS_BIT надо переопределить из 0x04 в 0x01, а

 val1 = mode | SR_EN_BIT | ((value >> 1) & 0x78); // upper nibble
 val2 = mode | SR_EN_BIT | ((value << 3) & 0x78); // lower nibble
 
переписать в виде
 
 val1 = mode | SR_EN_BIT | ((value ) & 0xF0); // upper nibble
 val2 = mode | SR_EN_BIT | ((value << 4) & 0x78); // lower nibble
 

Меня смущает только SR_EN_BIT, потому что, судя по схеме с выхода регистра EN не берется вообще.

Как он определен в коде библиотеки?

none4
Offline
Зарегистрирован: 30.05.2013

спасибо, переназначил, но не помогло ((.

 
#define SR_EN_BIT 0x80
 
 
 

ссылка на библиотеку http://www.filedropper.com/shiftr

#define SR_RS_BIT 0x01


void ShiftRegLCD::send(uint8_t value, uint8_t mode) {
  uint8_t val1, val2;
  if ( _two_wire ) shiftOut ( _srdata_pin, _srclock_pin, MSBFIRST, 0x00 ); // clear shiftregister
  digitalWrite( _enable_pin, LOW );
  mode = mode ? SR_RS_BIT : 0; // RS bit; LOW: command.  HIGH: character.
  val1 = mode | SR_EN_BIT | (value & 0xF0); // upper nibble
  val2 = mode | SR_EN_BIT | ((value << 4) & 0x78); // lower nibble
  shiftOut ( _srdata_pin, _srclock_pin, MSBFIRST, val1 );
  digitalWrite( _enable_pin, HIGH );
  delayMicroseconds(1);                 // enable pulse must be >450ns
  digitalWrite( _enable_pin, LOW );
  if ( _two_wire ) shiftOut ( _srdata_pin, _srclock_pin, MSBFIRST, 0x00 ); // clear shiftregister
  shiftOut ( _srdata_pin, _srclock_pin, MSBFIRST, val2 );
  digitalWrite( _enable_pin, HIGH );
  delayMicroseconds(1);                 // enable pulse must be >450ns
  digitalWrite( _enable_pin, LOW );
  delayMicroseconds(40);               // commands need > 37us to settle
}

// For sending data when initializing the display to 4-bit
void ShiftRegLCD::init4bits(uint8_t value) {
  uint8_t val1;
  if ( _two_wire ) shiftOut ( _srdata_pin, _srclock_pin, MSBFIRST, 0x00 ); // clear shiftregister
  digitalWrite( _enable_pin, LOW );
  val1 = SR_EN_BIT | (value & 0xF0);
  shiftOut ( _srdata_pin, _srclock_pin, MSBFIRST, val1 );
  digitalWrite( _enable_pin, HIGH );
  delayMicroseconds(1);                 // enable pulse must be >450ns
  digitalWrite( _enable_pin, LOW );
  delayMicroseconds(40);               // commands need > 37us to settle
}

 

none4
Offline
Зарегистрирован: 30.05.2013

Я удалил SR_EN_BIT и в val2 78 на f0 заменил...

 val1 = mode |  ((value) & 0xf0); // upper nibble
  val2 = mode |  ((value << 4) & 0xf0); // lower nibble
 
И заработало!!!!
 
спасибо!
none4
Offline
Зарегистрирован: 30.05.2013

на эмуляторе работает, а на реальном железе,надпись появляется на мгновение, а затем сплошные чёрные квадраты.

придётся повозится(

tsostik
Offline
Зарегистрирован: 28.02.2013

А в init4bits SR_EN_BIT тоже изничтожили?

Вообще, по симптомам похоже, что где-то какая-то лишняя команда проскакивает.

none4
Offline
Зарегистрирован: 30.05.2013

да, и там  тоже.

В этом девайсе на ноги data и clock также повешены ещё 2 микрухи для включения релюшек и для  включения пищалки(buzzer).

После прошивки пищалка начинает пищать и щёлкает реле,походу команда для дисплея включает также пищалку и реле.

Проверил, квадраты на дисплее появляются даже, если прошить пустой прошивкой, но пищалка и реле не срабатывают.С чем это связано пока не понял.

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

 

tsostik
Offline
Зарегистрирован: 28.02.2013

С пустой прошивкой черные прямоугольнике на экране это нормальное явлени - это признак того, что дисплей подключен к питанию, но не инициализирован.

Кстати, в реальной схеме причина может оказаться именно в этом - возможно после первой инициализации и печати hello, world передергивается питание дисплея.

Если задачи и правда элементарна, то сделать ее с нуля, действительно, чаще будет проще, чем разбираться в чудом коде и схемотехнике.

С другой стороны, асемблер avr не так страшен, как кажется на первый взгляд, если не бояться, то в нем разобраться достаточно реально, имея в запасе хотя бы минимальные знания о программировании, ведь в любом случае имея дело с микроконтроллерами приходится думать на уровне "послать этот бит сюда, а этот здесь обнулить/установить".