Модераторы: PILOT, ManiaK, Mazzi
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическая индикация 9 разрядного индикатора 
:(
    Опции темы
GeForce
  Дата 6.10.2009, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 6.10.2009

Репутация: нет
Всего: нет



Добрый день всем. Попался мне вот этот 9 разрядный семисегментный индикатор с последовательной шиной, выполненный на двух микросхемах 74HC595D. Индикатор стоял в телефоне с АОН русь 27.
Решил я разобраться в его работе. Хотелось бы научиться для начала выводить на него какието символы.На сколько я знаю 2-а сдвиговых регистра подключены по последовательной шине. Один региср определяет символ другой его местоположение.Программирую на Micro C Pro. 
Выставили на Ser бит (0 или 1), на Sclk - 1-0. И так каждый бит,
после того как вывели все 16 бит - подали 1-0 на Rclk.-Пока вот такая идея.
Только как это организовать программно, не знаю. В программировании новичок, за ранее спасибо.
Код

// назначение выводов
sbit SER_pin    at GPIO.B0;
sbit SERCLK_pin at GPIO.B1;
sbit RCLK_pin   at GPIO.B2;
void sendWordToLED(unsigned short sim)
{

// здесь собственно код драйвера
}
void main() {
TRISIO = 0;
GPIO = 0;
for(;;)
{
sendWordToLED(0xff);
}
}


Это сообщение отредактировал(а) GeForce - 6.10.2009, 16:54

Присоединённый файл ( Кол-во скачиваний: 16 )
Присоединённый файл  DSC05443.JPG 580,09 Kb
PM MAIL   Вверх
ManiaK
Дата 7.10.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Homo Sapience
***


Профиль
Группа: Комодератор
Сообщений: 1145
Регистрация: 3.8.2004
Где: ИУ5-93

Репутация: 2
Всего: 29



Недостаточно описал стенд, на котором творишь это всё.

К чему подключаешь плату, изображённую на приложенной фотографии? Куда заливаешь код, приведённый в сообщении? Судя по коду  - PIC-контроллер какой-то. Какой конкретно?

74HC595D не встречал раньше, как будет время (ближайшие три дня) посмотрю, может чего скажу полезного.
PM MAIL WWW   Вверх
xvr
Дата 7.10.2009, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Как то так:
Код

void sendWordToLED(unsigned short sim)
{
 int i;
 SERCLK_pin = 0;
 RCLK_pin = 0;
 for(i=0;i<16;++i,sim>>=1)
  {
    SER_pin = sim&1;
    NOP();
    SERCLK_pin = 1;
    NOP();
    SERCLK_pin = 0;
  }
 RCLK_pin = 1;
 NOP();
 RCLK_pin = 0;
}
Но просто выводить ff через sendWordToLED в цикле недостаточно - нужно реализовывать динамическую индикацию, т.е. перебор цифр с формированием соотвествующих битов в 16ти битной шкале, выводимой на индикаторы

PM MAIL   Вверх
mr_smit
Дата 7.10.2009, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 27.2.2008
Где: Самара

Репутация: 1
Всего: 4



http://startcd.narod.ru/hc595/led595.html

Добавлено через 2 минуты и 27 секунд
http://startcd.narod.ru/clock_serial/index.html
PM MAIL   Вверх
GeForce
  Дата 10.12.2009, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 6.10.2009

Репутация: нет
Всего: нет



Всем огромное спасибо. Проект закончен. Кому интересно могут взглянуть на код. Среда MicroC For Pic:
Код

sbit SER_pin    at GPIO.B5;
sbit SERCLK_pin at GPIO.B4;
sbit RCLK_pin   at GPIO.B2;

// ----- Объявление глобальных переменных --------------------------------------
const unsigned short TEMP_RESOLUTION = 12;
const char *StrRom = "CPU    *C" ;
char StrOut[10], StrBuf[10];
unsigned short i, flag_Temp;
unsigned temp;
unsigned int count;

// ---- Прототипы функций ------------------------------------------------------
void out_symbol(unsigned short, unsigned short);
void data_shift(unsigned short);
void Str9ToSeven(void);
void StrRomToRAM(char*, const char*);

//---------Преобразование температуры ------------------------------------------
void Format_Temperature(unsigned int temp2write)
 {
   const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
   unsigned short temp_whole;
   // преобразование отрицательной температуры
   if (temp2write & 0x8000)
    {
     StrBuf[3] = '-';
     temp2write = ~temp2write + 1;
    }
    // извлечение целой части
    temp_whole = temp2write >> RES_SHIFT ;
    // преобразование целой части температуры в символы

    StrBuf[4] = temp_whole/100  + 48;
              if (StrBuf[4] == 0x30)
                 { StrBuf[4] = 0x20;}
              else
              {StrBuf[4] = temp_whole/100  + 48;}
    StrBuf[5] = (temp_whole/10)%10 + 48;            // извлечение десятков
              if (StrBuf[4] == 0x20 && StrBuf[5] == 0x30)
                {StrBuf[5] = 0x20;}
                else
                {StrBuf[5] =(temp_whole/10)%10 + 48;}
    StrBuf[6] = temp_whole%10     + 48;           // извлечение единиц
        if(StrBuf[4] == 0x31 && StrBuf[5]>= 0x30 && StrBuf[6]>=0x30)
        { StrBuf[4] = 0x48;          //0x48 соответсвует символу H из ASCII таблицы
          StrBuf[5] = 0x31;
          StrBuf[6] = 0x20;         //0x20 соответсвует пустому месту.
          }
        else
        if (StrBuf[6] == 0x30 && StrBuf[5] == 0x20)
            {StrBuf[4] = 0x4C;
             StrBuf[5] = 0x30 ;
             StrBuf[6] = 0x20;
             i=5;

            }

 }//~

// --- Подпрограмма обработки прерывания ---------------------------------------
void interrupt()
{
 static unsigned short ii = 0;

 if(T0IF_bit)
  {
   out_symbol(ii, StrOut[ii]);
   ii++;
   if(ii == 9) ii = 0;
   count++;
   if(count > 500)           //??
    {
     count = 0;
     flag_Temp = 1;
    }
   T0IF_bit = 0;
  }
}
// -------- Подпрограмма копирования из ROM в RAM ------------------------------
void StrRomToRAM(char* dect, const char*source)
{
 while(*dect++ = *source++);
}
//------Подпрограмма выталкивания байта старшим битом вперед--------------------
//------в последовательный регистр----------------------------------------------
void data_shift(unsigned short data_7)
{
  unsigned short i;

    for (i=0;i<8;i++)
      {
       if (data_7 & 0x80)
         SER_pin = 1;
       else
         SER_pin = 0;
       SERCLK_pin = 1;
       SERCLK_pin = 0;
       data_7 <<= 1;            //??
      }
}

//--Подпрограмма вывода символа (symbol) в заданное знакоместо (mesto - 0..8)--
void out_symbol(unsigned short mesto, unsigned short symbol)
{
  unsigned short ii;

    ii = 0;
    RCLK_pin = 1;       // перевести выводы в третье состояние
      data_shift(symbol); // загрузка символа в первый регистр

    if(mesto == 7) ii = 1; // 7-е знакоместо
    if(mesto == 8) ii = 2; // 8-е знакоместо

    mesto = ~(1<<mesto); // формирование кода для зажигания нужного знакоместа
    data_shift(mesto);   // сдвигаем: в первом регистре - символ, во втором - бит знакоместа
    if(ii == 0)          // если знакоместо имеет номер 0..6
     {
      RCLK_pin = 0;
      RCLK_pin = 1;
      RCLK_pin = 0;
     }

    if(ii > 0)            // если знакоместо имеет номер 7 или 8
      {
        RCLK_pin = 0;
        RCLK_pin = 1;
        RCLK_pin = 0;
        SERCLK_pin = 1;
        SERCLK_pin = 0;
       }

    if(ii == 2) data_shift(0); // если знакоместо имеет номер 8

    SER_pin = 0;
    RCLK_pin = 0;
    SERCLK_pin = 0;
}

//------ Процедура преобразования кодов ASCII в 7-сегментный код ---------------
void Str9ToSeven()
{
 unsigned short i;
 for(i = 0;i<9;i++)
  {
   switch(StrBuf[i])
    {
     case '0': StrBuf[i] = 0xEB; break;
     case '1': StrBuf[i] = 0x48; break;
     case '2': StrBuf[i] = 0x73; break;
     case '3': StrBuf[i] = 0x7A; break;
     case '4': StrBuf[i] = 0xD8; break;
     case '5': StrBuf[i] = 0xBA; break;
     case '6': StrBuf[i] = 0xBB; break;
     case '7': StrBuf[i] = 0x68; break;
     case '8': StrBuf[i] = 0xFB; break;
     case '9': StrBuf[i] = 0xFA; break;
     case 'C': StrBuf[i] = 0xA3; break;
     case 'P': StrBuf[i] = 0xF1; break;
     case 'U': StrBuf[i] = 0xCB; break;
     case 'A': StrBuf[i] = 0xF9; break;
     case 'F': StrBuf[i] = 0xB1; break;
     case 'H': StrBuf[i] = 0xD9; break;
     case 'L': StrBuf[i] = 0x83; break;
     case '*': StrBuf[i] = 0xF0; break;
     case ' ': StrBuf[i] = 0x00; break;
     case '-': StrBuf[i] = 0x10; break;
     default : StrBuf[i] = 0x00;
    }
  }
}
// ------ MAIN -----------------------------------------------------------------
void main()
{
 CMCON = 7;              //все выводы цифровые.
 TRISIO = 0;
 GPIO = 0;

 OPTION_REG = 0x82;     // TMR0 прерывания каждые 2,048 мс
 T0IE_bit = 1;           //??
 GIE_bit = 1;            //??

 for(;;)
  {
   if(flag_Temp)
    {
      GIE_bit = 0;                      //??
      RCLK_pin = 1;                     //??
      Ow_Reset(&GPIO,0);            // сигнал сброса
      Ow_Write(&GPIO,0,0xCC);       // команда SKIP_ROM
      Ow_Write(&GPIO,0,0x44);       // команда CONVERT_T
      Delay_us(120);
      Ow_Reset(&GPIO,0);
      Ow_Write(&GPIO,0,0xCC);       // команда SKIP_ROM
      Ow_Write(&GPIO,0,0xBE);       // команда READ_SCRATCHPAD
      temp =  Ow_Read(&GPIO,0);
      *((unsigned short*)&temp+1) = Ow_Read(&GPIO,0);
      RCLK_pin = 0;
      GIE_bit = 1;
      //--- форматирование и вывод температуры
      StrRomToRAM(StrBuf,StrRom);
      Format_Temperature(temp);
      Str9ToSeven();
         for(i=0;i<9;i++)
         StrOut[i] = StrBuf[i];
      flag_Temp = 0;

    }
  }

}

Теперь это цифровой термометр проект в протеусе во вложении.
Я дмаю что тему можно закрывать.

Добавлено через 1 минуту
Проект

Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  led_aon.rar 74,72 Kb
PM MAIL   Вверх
GeForce
Дата 10.12.2009, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 6.10.2009

Репутация: нет
Всего: нет



Ах да и еще ,кнтроллер PIC12f629.

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  led_aon.rar 74,72 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Микроконтроллеры (MCU) и микропроцессоры (MPU)"
PILOT ManiaK
UniBomb Mazzi

На данный раздел помимо Правил форума распространяются текже следующие правила:


  • Прежде чем создать тему воспользуйтесь поиском или посмотрите в faq. Возможно на форуме уже есть ответ на ваш или близкий к вашему вопрос.
  • В заголовке темы в квадратных скобках обозначьте используемое семейство микроконтроллера: [avr],[pic],[arm].
  • При создании темы с вопросом указывайте участок кода с ошибкой, версию компилятора, схемы подключения, fuse биты и прочие данные, которые помогут найти правильный ответ. Для форматирования текста программ используйте кнопку код.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Для флуда, просьб выполнить задание, поиска партнёров или исполнителей существуют свои разделы.
  • Если вы заметили несовместимое с правилами сообщение, то можете уведомить об этом модератора раздела нажав кнопку Репорт у соответствующего сообщения.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, PILOT, ManiaK, UniBomb, Mazzi.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Микроконтроллеры (MCU) и микропроцессоры (MPU) | Следующая тема »


 




[ Время генерации скрипта: 0.1971 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.