Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Можно ли подключить к Atmega16 LCD индикатор c входами CE,CLOCK,DATA?


Можно ли подключить к Atmega16 LCD индикатор c входами CE,CLOCK,DATA?

Сообщений 1 страница 20 из 20

1

Имеется панель от автомагнитолы.В ней драйвер сегментов и сам индикатор.Каким образом можно подключить к Atmega16?
Есть ли в Барсике библиотека под это?

Отредактировано Zybex (2011-06-08 23:19:00)

0

2

Для начала надо узнать что за драйвер, а там видно будет.

0

3

max написал(а):

Для начала надо узнать что за драйвер, а там видно будет.

LC75823E

0

4

в Яндрексе нашел что-то типа описания программиста
там всё есть. Не читал!

0

5

Mrshilov
А точно не односторонний вариант  SPI ?

0

6

Mrshilov

Оказалось, шина называется CCB

0

7

Mrshilov

Спасибо.Но все же можно I2C  припахать?  А то я не совсем понимаю, как там CLOCK  делать...

0

8

Mrshilov
Пробовал через I2C .Но я не понимаю, как там организовать нужное количество бит.Точнее 8+160. I2C  шлет дополнительно свои биты.
Пробовал и   через I2Csend  и через I2Cwbyte... второе в протеусе шлет пакеты, в железе - ничего.
А просто через произвольные порты если делать, то там синхронизацию посылаемых битов с  Clock  непонятно как делать.

0

9

Mrshilov
Ладно, пока не будем i2c  мучать. Я не понял, как там после каждого посланного байта убрать служебный бит А.
Вот , что я нашел на польском сайте.Здесь реализовано управление  для LC7582 (это которая не CCB, адресации нет).
Что тут можно подправить, чтобы программа слала 8+160 бит из базы (даты)?

Чел, как я понял, делал вывод значений миллиамперов и вольт.

Код:
'//////////////////////////////////////////////////////////////////// 
'////////////   STEROWANIE WYSWIETLACZEM NA LC7582   //////////////// 
'//////////////////////////////////////////////////////////////////// 



$regfile = "attiny2313.dat"                                 ' 
$crystal = 8000000 
$lib "bcd.lbx" 
$external Bin2bcd16 
Declare Function Bin2bcd16(binval As Word) As Word 

Config Pind.2 = Output : Pind.2 = 0 
Config Pind.3 = Output : Pind.3 = 0 
Config Pind.4 = Output : Pind.4 = 0 

Dat Alias Portd.2                                           'linia danych 
Clk Alias Portd.3                                           'linia zegarowa 
Ce Alias Portd.4                                            'zezwolenie transmisji 


Dim Mah As Word , Napiecie As Word , Pom As Word 
Dim Petla As Byte , Dane(16) As Byte 
Napiecie = 16 : Mah = 1234                                  'opcjonalnie 

Do 
Gosub Przelicz : Gosub Wyswietlanie 
Waitms 100 
Loop : End 

Przelicz: 
Pom = Mah : Pom = Bin2bcd16(pom) 
Dane(2) = Pom And &B0000000000001111                        'wyodrebnij jedności mAh 
Shift Pom , Right , 4 : Dane(4) = Pom And &B0000000000001111       'dziesiatki mAh 
Shift Pom , Right , 4 : Dane(6) = Pom And &B0000000000001111       'setki mAh 
Shift Pom , Right , 4 : Dane(9) = Pom And &B0000000000001111       ''tysiace mAh 

Pom = Napiecie : Pom = Bin2bcd16(pom) 
Dane(3) = Pom And &B0000000000001111                        'dziesiętne V 
Shift Pom , Right , 4 : Dane(5) = Pom And &B0000000000001111       'jednosci V 
Shift Pom , Right , 4 : Dane(7) = Pom And &B0000000000001111       'dziesiątki V 

Dane(2) = Lookup(dane(2) , Tabela)                          'wczytaj z tabeli jednosci mah 
Dane(4) = Lookup(dane(4) , Tabela)                          'dziesiatki mah 
Dane(6) = Lookup(dane(6) , Tabela)                          'setki mah 
Dane(9) = Lookup(dane(9) , Tabela)                          'tysiace mah 
Dane(8) = Dane(9)                                           'tak ma byc 
Dane(3) = Lookup(dane(3) , Tabela)                          'dziesietne V 
Dane(5) = Lookup(dane(5) , Tabela)                          'Jednosci V 
Dane(7) = Lookup(dane(7) , Tabela)                          'dziesiatki V 
If Dane(7) = 123 Then Dane(7) = 0                           'jesli dziesiatki V = 0 to wygas cyfre dziesiatek 

Dane(16) = 2                                                'w dane(16).1 wymagane 1 
Dane(8).3 = 1                                               'wymagane 1 
Dane(8) = Dane(8) And 223                                   'to samo co Dane(8).5 = 0 -wymagane 
Dane(3).7 = 1                                               'kropka V 
Dane(1).6 = 1                                               'znak V 
Dane(1).7 = 1                                               'znak mAh 
Return 

Wyswietlanie: 
Set Ce                                                      'rozpoczecie transmisji 
For Petla = 6 To 121                                        'wyslij 112 bitow 
Dat = Dane(1).petla                                         'ustaw znak 
Set Clk : Reset Clk                                         'ustaw taktowanie i wyzeruj taktowanie -wpisz znak 
If Petla = 61 Then Reset Ce : Set Ce                        'jesli wyslalo polowe to wyzeruj i ustaw ce 
Next 
Reset Ce                                                    'koniec transmisji 
Return 

Tabela: 
Data 123 , 10 , 55 , 47 , 78 , 109 , 125 , 75 , 127 , 111

Отредактировано Александр Д. (2011-06-20 21:30:59)

0

10

Код:
$regfile "m16def.dat"

$crystal = 8000000
$lib "i2c_twi.lib"

Config Twi = 20000
Config Porta = Output
Config Portb = Output
Config Portd = Output
Config Portc = Output
Config Pind.0 = Output                                      'INTH
Config Pind.1 = Output                                      'CE
Config Scl = Portc.0
Config Sda = Portc.1

I2cinit

Do

Set Portd.0                                                 'INTH

I2cstart
I2cwbyte &H41
Set Portd.1                                                 'CE
I2cwbyte &B11111111
I2cwbyte &B11111111
I2cwbyte &B11111111
I2cwbyte &B11111111
I2cwbyte &B11111111
I2cwbyte &B11111111
I2cwbyte &B11111111
I2cwbyte &B11111111
I2cwbyte &B11111111
I2cwbyte &B11111111
I2cwbyte &B11111111
I2cwbyte &B11111111
I2cwbyte &B11111111
I2cwbyte &B11111111
I2cwbyte &B11111111
I2cwbyte &B11111111
I2cwbyte &B11111111
I2cwbyte &B11111111
I2cwbyte &B11111111
I2cwbyte &B11110000

Reset Portd.1                                               'CE
i2cstop
Waitms 1000

Reset Portd.0                                               'INTH

Loop
End

увеличить

Отредактировано Zybex (2011-06-20 21:51:30)

0

11

Mrshilov
Я кабель LPT  не нашел.Конечно бы проверить сначала ее, хотя работало .Протеус - это чтобы схему нарисовать. А в подпрограмме "высвечивание" там в DATA нужно набивать байты через запятую?
То есть &H41,...&B00000000  итд 20 штук? Я там не понял как, например,байт &Bxxxxxxxx  разбивается на биты, чтобы включать и выключать порт.

Команда  shiftout  подходит для реализации?

PS AY0438 в протеусе удалось запустить с помощью этой команды.
PPS  75823 тоже.Правда адрес &H82.В другом форуме тоже об этом писали.
Теперь другой вопрос: как менять только одну цифру букву значок итд? Переписывать все 160 бит???

Отредактировано Zybex (2011-06-21 02:54:53)

0

12

Mrshilov

Значит вот на чем я остановился.Кстати, фишку с прописыванием  массива  A(n) я не знал.Сейчас покажу, что пришлось сделать мне.Хорошо, что было описание сегментов (PDF  на магнитолу).Да, это табло от магнитолы.Там есть 8 разрядов 14 сегментов для вывода текста и цифр, есть счетчик треков 00 и всякие таблички и уровни.
Я ,конечно, не ахти какой оптимизатор кода и хитрых ходов пока не знаю.Вот, что у меня получилось.Данная программа выводит счет на 00-99 и так по кругу  (указатель треков СД).Пришлось писать тейбл под старший и младший сегмент.Переменная Segment1,Segment2  это на самом деле разряды.Просто не правильно назвал.

Dat(20).1 = 0                                               'BU
Dat(20).2 = 0                                               'SC
Dat(20).3 = 0                                               'DR

Вы не могли бы объяснить вот эти строчки вашего кода.Это замена в байте &Bxxxxx(xxx).Изменение с конца?

============

Код:
$regfile "m16def.dat"
$crystal = 8000000
'$lib "lcd4.lib"
Config Porta = Output
Config Portb = Output
Config Portd = Output
Config Portc = Output
Config Pind.0 = Output
Config Pind.1 = Output
Config Pind.2 = Output
Config Pind.3 = Output
Declare Sub Case1
Declare Sub Disp
'Portd.2 Alias Di
'Portd.3 Alias Clk
'Portd.4 Alias Ce
'Portd.5 Alias Inth
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Integer
Dim Segment1 As Byte
Dim Segment2 As Byte
Dim F As Integer
Dim Ga As Integer
Dim Gb As Integer
Dim Gc As Integer
Dim Loud As Bit

Ga = 0



Do
Gosub Disp
Ga = Ga + 1
If Ga = 100 Then Ga = 0

Waitms 1000
Loop
End



Sub Disp
D = Ga \ 10
Gosub Case1
Gb = D * 10
F = Ga - Gb
Gosub Case1

Locate 1 , 1
Lcd D
Locate 2 , 1
Lcd F


A = &H82
Shiftout Portd.2 , Portd.3 , A , 0
Set Portd.4
Shiftout Portd.2 , Portd.3 , Segment1 , 0                   ' цифры х0
Shiftout Portd.2 , Portd.3 , Segment2 , 0                   ' цифры 0х


For B = 2 To 19

C = Lookup(b , seg)
Shiftout Portd.2 , Portd.3 , C , 0
Waitms 10
Next 
Reset Portd.4
End Sub
Return



Sub Case1


Select Case D

Case 0 : Segment1 = &B01110111
Case 1 : Segment1 = &B00000011
Case 2 : Segment1 = &B00111110
Case 3 : Segment1 = &B00011111
Case 4 : Segment1 = &B01001011
Case 5 : Segment1 = &B01011101
Case 6 : Segment1 = &B01111101
Case 7 : Segment1 = &B00010011
Case 8 : Segment1 = &B01111111
Case 9 : Segment1 = &B01011111
End Select

Select Case F


Case 0 : Segment2 = &B01111110
Case 1 : Segment2 = &B00001100
Case 2 : Segment2 = &B11111000
Case 3 : Segment2 = &B11101100
Case 4 : Segment2 = &B10001110
Case 5 : Segment2 = &B11100110
Case 6 : Segment2 = &B11110110
Case 7 : Segment2 = &B01001100
Case 8 : Segment2 = &B11111110
Case 9 : Segment2 = &B11101110
End Select
End Sub
Return








Seg:
Data &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000 , &B00000000

Отредактировано Zybex (2011-06-22 23:34:30)

0

13

Mrshilov
Да, он работает.А что непосредственно значит  1,2,3 ? Допустим, что 20-й байт &B11111111, то что произойдет после
Dat(20).1 = 0       
Dat(20).2 = 0       
Dat(20).3 = 0

&B11111000
?

Отредактировано Zybex (2011-06-21 21:34:51)

0

14

Mrshilov
Понял.Спасибо. А то что-то запутался в этом.
То есть можно на лету бит подменять...
Подумалось тут о полноценной программе-драйвере под эту панель.Ну чтоб буквы, цифры :) Но вряд ли.Это ж сколько  нужно в тейбл набивать.Весь алфавит чего стоит.

А не подскажете еще кое-чего: как через команду  shiftout  послать 1 бит, а не 8?
Дело в том, что нужно организовать несколько пропусков в 1 бит.
Или как назначить переменную в 160 бит?

Отредактировано Zybex (2011-06-22 20:14:27)

0

15

Скажите, получилось какое-то готовое устройство или нет.
Просто у меня есть подобная панелька от авторадио на LC7282 (SONY) но мне очень хочется её приделать к самодельному радио-сканеру 45-850 МГц.
_http://p-45.narod.ru/Mini-45.html
В качестве индикатора частоты, в проекте используется ЖКИ TIC-8213/55 (ML1001) которые трудно найти, продавцы радио-рынка мотают головой, а у одного даже глаз задергался (видно достали).
В качестве управления ипользуется PIC12F629 и соеденен с ЖКИ тремя контактами:

LOAD - Загрузка данных с регистра сдвига в регистр данных
DIN   - Входной вывод данных на дисплей
DCLK - Входной вывод для тактирования данных на дисплей

исходный код есть
_http://p-45.narod.ru/Mini/M45v02.asm

Можно ли адаптировать код под LC7582 и что для этого потребуется ?

P.S.

контакт INH не обьязательно использовать
при лог. 0 информация не выводится на дисплей
при лог. 1 выводится.
Т.е.  можно соеденить вывод INH с Vdd напрямую или через резистор в 10кОм.

Отредактировано 20AMax (2013-02-03 14:29:00)

0

16

В качестве индикатора можно использовать любые регистры сдвига с семисегментниками в статическом включении. Больше всего похоже на 595й регистр по назначению лап. Может, разве что придется изменить таблицу цифр

0

17

Ага понятно примерно так:
_http://ra9wof.qrz.ru/files/Shemes/PIC/ht1611.files/image013.gif

но все-же стало интересно, и собрал девайс для LC7582, Post # 14
STEROWANIE WYSWIETLACZEM NA LC7582 (по моему з/у батареек)
показывает, но не то что надо.

Как бы выглядела программа которая высвечивает 1 сегмент на дисплее
(потом 2 затем 3, 4...и так далее) ну для того чтобы зарисовать таблицу сегментов.

тех.док.
_http://www.datasheetcatalog.org/datasheet/sanyo/ds_pdf_e/LC75821E.pdf

0

18

Это ты нашел с LCD с непонятным протоколом ))) TICи такого типа работают по принципу статической индикации, заменить можно по ссылкам ниже .

На светодиодных индикаторах :
Статика :  http://avrproject.ru/publ/kak_podkljuch … a/2-1-0-57

Динамика :  http://avrproject.ru/index/podkljucheni … mer_2/0-17

Отредактировано Skull (2013-02-10 17:01:46)

0

19

:crazyfun:

с TIC разобрался уже хотел помучать магнитолу в надежде что-нибудь когда нибудь сделать.
вопрос снимается
Hello World на магнитоле

Отредактировано 20AMax (2013-02-10 17:19:21)

0

20

Управлять мордой по протоколу sanyo CCB не сложно, а вот как реализовать чтение?
Я хочу избавиться от морды, читать и управлять магнитолой на 32U4 через андройд приложение.
https://yadi.sk/i/qFbQrfa_qDfzK (это еще недописанная версия).
На аппаратном уровне через SPI получается только читать данные выводимые на дисплей с инверсией вывода CS, так как адрес прочесть я не могу, отправить данные тоже.
На TEENSY3.1 я написал программную реализацию протокола, но иногда бывают ошибки, и работает только на 72MHZ, ниже мусор.
Использую 2 прерывания по выводу CL , при FALLING читаю данные, при RISING отправляю.
По мануалу на микросхему BU97520,
при адресе 0x42 приходит пакет из 12 байт, всего 4 пакета на дисплей (48 байт), нумерация пакетов в последних битах 12 байта (00, 01, 10, 11).
При адресе 0x43 отправка данных клавиатуры 32 бита. Но из-за того что какой то сдвиг после последнего принятого пакета данных, вместо 0x43 читает 0x86.
Пишу в Arduino IDE. Помогите советом. В сети нашел только как управлять по протоколу CCB (быть мастером), мне же надо слейвом.
Вот код прерываний:
void spidisp() {
  if ((GPIOC_PDIR & 0x10) != 0x10) {                        // cs 10 = 0
    bitWrite(A, posA, (GPIOC_PDIR & 0x80));                 // читаем адрес
    posA++; posKey = 0;
  }
  else {                                                    // cs 10 = 1
    posA = 0;
    if (A == 0x42) {
      bitWrite(MyBuff[posBy], posBi, (GPIOC_PDIR & 0x80));  // читаем данные дисплея
      posBi--;
      if (posBi < 0) {
        posBi = 31;
        posBy++;
      }
    }
  }
}

void spikey() {
  if ((GPIOC_PDIR & 0x10) == 0x10) {                         //cs 10 = 1
    if (A == 0x86 || A == 0x43) {
      posKey++;
      if (posKey == 21 || posKey == K) GPIOC_PSOR = _BV(6);  //data out 11 = 1
      else GPIOC_PCOR = _BV(6);                              //data out 11 = 0
      posBi = 31;
      posBy = 0;
    }
  }
  else if (A == 0x86) {                                      //cs 10 = 0
    CRC();
    DATA();
  }
}

Отредактировано kisel39 (2016-03-16 08:09:14)

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Можно ли подключить к Atmega16 LCD индикатор c входами CE,CLOCK,DATA?