который здесь http://radiokot.ru/forum/viewtopic.php? ... 8#p1854078 уже обсуждался. Прошло не мало времени, была проблема с дисплеем, первый раз выслали не тот (на 15 пин). Но теперь он собран, его
нужно запрограммировать. Я начал с дисплея — UG-2832HSWEG02.
Контроллер дисплея — SSD1306. Проблема в том, что я не знаю
точный адресс ведомого (управляется по I2C), в даташите на
дисплей он не указан. В даташите на контроллер дисплея сказано,
что адресс ведомого: 011110xRW, где x - 0, если на ножке SA0 (D/C#)
низкий уровень и 1, если высокий. Но у этого дисплея нет ножки D/C#.
Соответственно может быть 2 адреса: 01111010b (0x7A) или 01111000b (0x78).
Был написан код инициализации и частичного заполнения дисплея пикселями.
Было проверено оба адреса. В итоге – ничего не работает)
Дисплей либо ничего не выводит, либо иногда рандомно загораются пиксели
(мусор в памяти дислея). По началу ножка RES# дисплея висела в воздухе,
но потом её подключил к свободной ноге контроллера, думал из за этого
может не работать, в итоге опять ничего. Прошу вашей помощи, где я допустил ошибку?)
Прилагаю исходник и схему всего этого чуда. Скачать исходник http://yadi.sk/d/pwbeA84HLGrXZ
Схема
Спойлер


Спойлер
.include "m8Adef.inc".macro outi
ldi r16, @1
out @0, r16
.endm
.dseg
.eseg
.cseg
.org 0x00
rjmp Reset
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
.org 0x13
Reset:
; initialization of RAM
outi SPL, Low(RAMEND)
outi SPH, High(RAMEND)
; ===
; flushing of RAM
ldi ZL, Low(SRAM_START)
ldi ZH, High(SRAM_START)
clr r16
Flush:
st Z+, r16
cpi ZH, High(RAMEND)
brne Flush
cpi ZL, Low(RAMEND)
brne Flush
; ===============
; ports configuration
outi DDRB, 0
outi PORTB, 0xFF
outi DDRC, 0
outi PORTC, 0xFF
outi DDRD, 0
outi PORTD, 0xFF
; ===================
rcall OLED_Init
;========= test =========
rcall IIC_Start ; send start condition
ldi r16, 0x78 ; set slave address
rcall IIC_SendByte
ldi r16, 0x40 ; control byte for send data
rcall IIC_SendByte
; partial filling of the display
ldi r16, 0xFF
ldi r17, 0xFF
NextByte:
rcall IIC_SendByte
dec r17
brne NextByte
rcall IIC_Stop ; send stop condition
;========= test =========
MainLoop:
rjmp MainLoop
Delay:
ldi r18, 0xFF
D2:
ldi r19, 0xFF
D1:
dec r19
brne D1
dec r18
brne D2
ret
OLED_Init:
; reset of display
outi DDRC, 0x4 ; set PC2 to out
rcall Delay
rcall Delay
outi PORTC, 0 ; set 0 to PC2
rcall Delay
rcall Delay
outi PORTC, 0x4 ; set 1 to PC2
rcall Delay
rcall Delay
; ================
rcall IIC_Init ; initialize of TWI
rcall IIC_Start ; send start condition
ldi r16, 0x78 ; set slave address
rcall IIC_SendByte
ldi r16, 0x00 ; control byte for send command
rcall IIC_SendByte
ldi r16, 0xAE ; turning off display
rcall IIC_SendByte
ldi r16, 0xD5 ; set clock divide ratio/oscillator frequency
rcall IIC_SendByte
ldi r16, 0x80
rcall IIC_SendByte
ldi r16, 0xA8 ; set multiplex ratio
rcall IIC_SendByte
ldi r16, 0x3F
rcall IIC_SendByte
ldi r16, 0xD3 ; set display offset
rcall IIC_SendByte
ldi r16, 0x00
rcall IIC_SendByte
ldi r16, 0x40 ; set display start line
rcall IIC_SendByte
ldi r16, 0x8D ; set charge pump
rcall IIC_SendByte
ldi r16, 0x14 ; turn on internal DC/DC converter
rcall IIC_SendByte
rcall Delay
rcall Delay
rcall Delay
rcall Delay
ldi r16, 0xA1 ; set segment re-map
rcall IIC_SendByte
ldi r16, 0xC8 ; set COM output scan direction
rcall IIC_SendByte
ldi r16, 0xDA ; set COM pins hardware configuration
rcall IIC_SendByte
ldi r16, 0x02
rcall IIC_SendByte
ldi r16, 0x81 ; set contrast control
rcall IIC_SendByte
ldi r16, 0x8F
rcall IIC_SendByte
ldi r16, 0xD9 ; set pre-charge period
rcall IIC_SendByte
ldi r16, 0xF1 ; internal DC/DC converter
rcall IIC_SendByte
ldi r16, 0xDB ; set VCOMH deselect level
rcall IIC_SendByte
ldi r16, 0x40
rcall IIC_SendByte
ldi r16, 0xA4 ; set entire display on/off
rcall IIC_SendByte
ldi r16, 0xA6 ; set normal/inverse display
rcall IIC_SendByte
ldi r16, 0x20 ; set addressing mode
rcall IIC_SendByte
ldi r16, 0x0
rcall IIC_SendByte
ldi r16, 0xAF ; turn on display
rcall IIC_SendByte
rcall IIC_Stop ; send stop condition
ret
IIC_Init:
outi TWBR, 12 ; set bitrate of TWI
outi TWSR, 0 ; for 4MHz chip freq
ret
IIC_Start:
outi TWCR, 1 << TWINT | 1 << TWSTA | 1 << TWEN | 0 << TWIE
IIC_S:
in r16, TWCR
andi r16, 1 << TWINT
breq IIC_S
ret
IIC_SendByte:
out TWDR, r16
outi TWCR, 1 << TWINT | 1 << TWEN | 0 << TWIE
IIC_B:
in r16, TWCR
andi r16, 1 << TWINT
breq IIC_B
ret
IIC_RecvByte:
outi TWCR, 1 << TWINT | 1 << TWEN | 1 << TWEA | 0 << TWIE
IIC_R:
in r16, TWCR
andi r16, 1 << TWINT
breq IIC_R
ret
IIC_RecvLastByte:
outi TWCR, 1 << TWINT | 1 << TWEN | 0 << TWEA | 0 << TWIE
IIC_RL:
in r16, TWCR
andi r16, 1 << TWINT
breq IIC_RL
ret
IIC_Stop:
outi TWCR, 1 << TWINT | 1 << TWSTO | 1 << TWEN | 0 << TWIE
IIC_ST:
in r16, TWCR
andi r16, 1 << TWSTO
breq IIC_ST
ret


