Когда не хватает ног. Часть 3. Драйвер индикаторов MAX7221

  Сегодня будет представлен еще один способ сэкономить кучу ножек микроконтроллера в тех случаях когда нужно подключить семисегментные светодиодные индикаторы. Речь пойдет о использовании специализированного драйвера MAX7221 – это драйвера позволяют управлять семисегментными индикаторами (с общим катодом), светодиодными линейками или же с помощью него можно рулить до 64 светодиодами одновременно. Сами драйвера управляются по SPI интерфейсу, с максимальной поддерживаемой частотой работы интерфейса до 10 МГц.

 Распиновка ножек микросхемы:

     1 – DIN. Последовательный ввод данных. Данные загружаются в 16-ти разрядный сдвиговый регистр по переднему фронту тактового сигнала. 2,3,5-8,10,11 – DIG0-DIG7. Выводы для подключения общих катодов индикаторов.

4,9 – GND. Выводы для подключения земли

12 – LOAD (CS)  в MAX7221 данные загружаются в приёмный сдвиговый регистр только когда сигнал CS находится в состоянии низкого уровня (то есть только когда микросхема “выбрана”, если говорить в терминах интерфейса SPI). Запоминаются и поступают к обработке также последние 16 принятых бит, происходит это также по переднему фронту сигнала CS.

13 – CLK. Вход сигнала тактирования, по которому происходит запись данных.

14-17, 20-23 – SEG A-SEG G, DP. Выводы для подключения сегментов семисегментных индикаторов. 

18 – ISET. К этому выводу подключается резистор (вторая нога резистора – к плюсу), позволяющий задавать пиковый ток сегмента и таким образом устанавливать яркость свечения сегментов. Минимальное сопротивление этого резистора должно быть 9,53 кОм, что примерно соответствует току сегмента 40мА.

19 – V+. Сюда подключается “+” питания.

24 – DOUT. Последовательный вывод данных. Эта нога понадобится если нужно будет соединить вместе два или более драйвера.

 Принцип работы с микросхемой MAX7221

 По сути MAX7221 (и его аналог MAX7219) по принципу работы схож с регистром 74HC595, с той лишь разницей что в микросхему загружается 16 бит данных. Первые загружаемые 8 бит необходимы для выбора регистра, в который нужно записать данные. Следующие 8 бит – те данные которые нужно записать в регистр. Говоря проще, сначала сообщаем микросхеме куда записать данные, а затем записываем нужные данные по выбранному адресу. 

 Чем интересен этот драйвер, так это тем, что он имеет два режима  работы.  Первый – работа в режиме обычного буфера с прямым управлением каждого сегмента.  Второй режим, так называемый BCD code B, который позволяет упростить вывод информации на индикатор за счет встроенного декодера символов. Символов кстати совсем немного, всего 16 – это цифры 0-9, знак “-“, пустой символ и 4 быквы – “E”, “H”, “L”, “P” (интересно какое слово можно составить?:)). Например, для того чтобы вывести во второй разряд цифру 2, нам нужно будет отправить адрес второго разряда (8 бит) и затем просто отправить двойку (еще 8 бит). Об этом режиме работы поговорим в следующей статье, сейчас же будет рассмотрен пример как работать с драйвером в режиме без декодирования.

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

 Регистр No Op понадобится при совместном подключении нескольких драйверов. Для того, чтобы обратиться, например, к третьему драйверу в цепочке, не влияя на работу первых двух, – нужно для первых двух обратиться к регистру “No-op”. Поскольку адрес этого регистра равен нулю, то сделать это очень просто: сначала за 16 тактов отправляем данные для третьего регистра, потом устанавливаем линию данных в ноль и отщёлкиваем ещё 2 раза по 16 тактов. В результате первый отправленный пакет будет загружен в третий регистр, а следующие два пакета (загруженные в первый и второй регистры) будут иметь адрес ноль, то есть будут обращаться к регистру “No-op”.

 Digit 0-7 регистры, отвечающие за управление разрядами индикатора. Нумерация разрядов идет слева направо. Это очень удобно, например чтобы сменить одну цифру на индикаторе обращаемся по адресу регистра отвечающего за разряд, тем самым не трогая все остальные разряды.

 

 Регистр Decode Mode отвечает за режимы работы драйвера, о которых говорилось чуть выше: им можно выставить режим декодирования символов BCD code B и режим без декодирования No decode. 

 Через регистр Intensity осуществляется программная(!) настройка яркости свечения индикатора. Удобная штука на разные случаи, от возможности энергосбережения до индикации разных режимов работы девайса. Всего можно выбрать один из 16 уровней яркости.

 Регистром Scan Limit устанавливается число используемых разрядов индикатора. Если планируется использовать не все 8, а меньше, то рекомендуется отключать неиспользуемые. От этого будет зависеть частота обновления индикатора, а также пиковый ток через сегменты. Когда задействованы все 8 разрядов, частота обновления составляет около 800 Гц. При уменьшении количества разрядов частота возрастает, ее можно определить по формуле 8*800/N  (где N – число разрядов). Пиковый ток через сегменты также возрастает при отключении неиспользуемых разрядов.

 Через регистр Shutdown можно включить режим энергосбережения, при котором все индикаторы гаснут, данные и состояние регистров при этом не теряются. Режим энергосбережения включается записью нуля в регистр shutdown. При записи туда единицы драйвер выходит из энергосбережения. Энергопотребление в этом режиме падает до 150 мкА.

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

 После запитывания все регистры драйвера сброшены, поэтому в первую очередь нужно провести настройку. Настройки драйвера (запись нужных значений в регистры Decode Mode, Intensity, Scan Limit, Shutdown и Display Test) необходимо производить каждый раз после подачи питания, эти значения не сохраняются. 

 Работа с драйвером в режиме No-decode  В режиме No decode мы можем управлять каждым сегментом любого разряда напрямую. Соответствие сегментов индикатора битам в регистре Digit представлено на картинке ниже и  для того чтобы зажечь определенный сегмент необходимо записать в соответствующий бит единицу.

 Для примера: нам нужно вывести в первый разряд 8-и разрядного индикатора цифру 1. Сначала отправляем первые 8 бит адреса регистра соответствующего первому разряду (см. таблицу с картой адресов регистров). Нумерация разрядов индикатора идет слева направо (вот таким образом 0.1.2.3.4.5.6.7.), поэтому первый справа разряд (Digit 7), будет иметь адрес &h08, это значение и отправляем. Затем отправляем данные которые должны включить сегменты В и С, по таблице соответствия (см. выше) за эти сегменты отвечают биты D5 и D4. Таким образом следующие 8 бит которые мы должны отправить будут такие: 00110000, или если в шестнадцатеричном представлении – &h48. Подобным образом можем управлять и другими разрядами и сегментами индикатора. Ничего сложного, правда? 😉

 А теперь небольшой рабочий пример. У меня оказался только четырехразрядный индикатор, для демонстрации возможностей вполне сгодится. Соединил по схеме ниже. Неиспользуемые выводы можно оставлять болтаться в воздухе. Микроконтроллер Attiny2313 тактируется от внутреннего генератора на 8 МГц, напряжение питания схемы 5 вольт.

 демо код в Bascom-AVR

$regfile = “attiny2313.dat”

$crystal = 8000000

$hwstack = 32

$swstack = 10

$framesize = 40

Config Portd = Output

Cs Alias Portd.1

Ser_clk Alias Portd.2

Ser_data Alias Portd.3

Dim A As Word

Dim Digit(8)as Byte

Dim Y As Byte

Dim Disp_num As Byte

Dim Disp_data As Byte

Dim Digit_str As String * 4

Dim Temp_str As String * 3

Gosub Max7219_setup

Digit_str = “Good”           ‘строка которую выведем на дисплей

Gosub Prepare                ‘вызываем подпрограмму подготовки и отправки данных

Wait 3

Do                           ‘в главном цикле просто выводим увеличивающее на 1 число

Waitms 200

Incr A                       ‘переменная значение которой выводим на индикатор

Digit_str = Str(a)

Digit_str = Format(digit_str , “0000”)

Gosub Prepare

Loop

End

‘Подготовка данных для передачи

Prepare:

Do

For Y = 1 To 4

   Temp_str = Mid(digit_str , Y , 1)

   Select Case Temp_str

      Case “0” : Temp_str = “126”                           ‘&b01111110

      Case “1” : Temp_str = “48”                            ‘&b00110000

      Case “2” : Temp_str = “109”                           ‘&b01101101

      Case “3” : Temp_str = “121”                           ‘&b01111001

      Case “4” : Temp_str = “51”                            ‘&b00110011

      Case “5” : Temp_str = “91”                            ‘&b01011011

      Case “6” : Temp_str = “95”                            ‘&b01011111

      Case “7” : Temp_str = “112”                           ‘&b01110000

      Case “8” : Temp_str = “127”                           ‘&b01111111

      Case “9” : Temp_str = “123”                           ‘&b01111011

      Case “.” : Temp_str = “128”                           ‘&b10000000

      ‘можно и самостоятельно ввести нужные символы

      Case “A” : Temp_str = “119”                           ‘&b01110111

      Case “C” : Temp_str = “78”                            ‘&b01001110

      Case “E” : Temp_str = “79”                            ‘&b01001111

      Case “G” : Temp_str = “94”                            ‘&b01011110

      Case “o” : Temp_str = “29”                            ‘&b00011101

      Case “d” : Temp_str = “61”                            ‘&b00111101

      Case ” ” : Temp_str = “0”                             ‘&b00000000

      ‘и так далее…

   End Select

   Digit(y) = Val(temp_str)

      Disp_num = Y             ‘знакоместо (разряд) на который выводим текущую цифру

      Disp_data = Digit(y)     ‘данные которые отправляем на выбранный разряд

      Gosub Disp_write

Next Y

Loop Until Y = 5    ‘когда вывели данные на все 4 разряда возвращаемся в главный цикл

Return

‘Передаем данные в max7221

Disp_write:

Ser_data = 0

Ser_clk = 0

Cs = 0

Shiftout Ser_data , Ser_clk , Disp_num , 1   ‘отправляем номер разряда

Shiftout Ser_data , Ser_clk , Disp_data , 1  ‘отправляем данные в этот разряд

Cs = 1

Return

‘инициализации и настройка регистров max7221

Max7219_setup:

Disp_num = &H0C : Disp_data = 0     ‘режим Shutdown (0-включен, 1-выключен)

Gosub Disp_write

Disp_num = &H09 : Disp_data = 0     ‘режим прямого управления сегментами индикатора

Gosub Disp_write

Disp_num = &H0A : Disp_data = 10    ‘уровень свечения сегментов (0-минимум, 15-максимум)

Gosub Disp_write

Disp_num = &H0B : Disp_data = 3     ‘число используемых разрядов (счет от 0)

Gosub Disp_write

Disp_num = &H0F : Disp_data = 0     ‘тестовый режим выключен (0-выключен, 1-включен)

Gosub Disp_write

Disp_num = &H0C : Disp_data = 1        

Gosub Disp_write

Return


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

 

 Далее будет описана работа с драйвером в режиме BCD code B (немного позже:))


Скачать смоделированную схему в ProteusИсходник и скомпилированный файл

Datasheet MAX7219/7221

 И напоследок отдельное спасибо нашему камраду Максиму (известного под ником max) за то, что подкинул мне эти замечательные микрухи. 


Взято с: avrproject.ru


Категория: AVR
Метки:

Написать коментарий

*
= 3 + 7

Добавить изображение

Последние статьи