Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.84/209: Рейтинг темы: голосов - 209, средняя оценка - 4.84
ovr_bikymmir
0 / 0 / 0
Регистрация: 08.08.2014
Сообщений: 52
1

HD44780+ATMega16+ASM

05.11.2014, 12:06. Просмотров 37663. Ответов 96
Метки нет (Все метки)

Писал когда то програмку для выводов символов на ЖКИ. Раньше работала. Решил тут недавно добавить функции из этой программы в другую - не выводятся символы. Залил старую программу - тоже не фига не выводится. только горят верхние квадраты в верхней строчке (регулировка контраста не помогает). То ли что то изменил, то ли звезды не так сложились.. Ни в реальном железе (Pinboard2), ни в протеусе работать не хочет. Может подскажет кто-где ошибка?
Сам код:
.include "m16def.yms" ; ATMiko16

//--------------------------------
.DSEG

.def temp=R16

.equ LCD_PORT = PORTA
.equ LCD_DDR = DDRA
.equ LCD_PIN = PINA

.equ D4 = 0
.equ D5 = 1
.equ D6 = 2
.equ D7 = 3

.equ RS = 4
.equ EN = 5

//---------------------------------
//-----------------------------------------------
.CSEG

.ORG $0000
RJMP INIT

//Инициализация МК-------------------------------
INIT:
//Инициализация стека----------
ldi r16,low(ROMend)
out SPL,r16
ldi r16,high(ROMend)
out SPH,r16
//-----------------------------

//Инициализация дисплея
RCALL LCD_INIT
RCALL WAIT_100us

LDI temp, 0b10000000 //Адрес DDROM - 0x00 (первая строка)
RCALL Two

LDI temp, 0xb1
RCALL WrData
RCALL WAIT_100us

LDI temp, M
RCALL WrData
RCALL WAIT_100us
//---------------------------------

LDI temp, 0b11000000 //Адрес DDROM - 0x40 (вторая строка)
RCALL Two

LDI temp, M
RCALL WrData
RCALL WAIT_100us

STOP:
NOP
RJMP STOP

//------------------------------------------------
//Подпрограммы------------------------------------

//---------------------------------
LCD_INIT:
RCALL WAIT_20ms
sbi LCD_DDR, D4 ;Ножки порта на выход
sbi LCD_DDR, D5
sbi LCD_DDR, D6
sbi LCD_DDR, D7

sbi LCD_DDR, RS
sbi LCD_DDR, EN

cbi LCD_PORT, RS ;оистить значение RS, EN
cbi LCD_PORT, EN
RCALL WAIT_100us

LDI temp, 0b00000011
RCALL One ;Начальная инициализация
RCALL WAIT_100us
LDI temp, 0b00000011
RCALL One ;вызывается
RCALL WAIT_100us
LDI temp, 0b00000011
RCALL One ;три раза
RCALL WAIT_100us

LDI temp, 0b00000010 ;4x битный режим
RCALL One
RCALL WAIT_100us

LDI temp, 0x28 ;2 строки 5х7
RCALL Two
RCALL WAIT_100us

LDI temp, 0x06 ;автоинкремент счетчика DDROM
RCALL Two
RCALL WAIT_100us

LDI temp, 0x0c ;Дисплей вкл, курсор выкл
RCALL Two
RCALL WAIT_100us

LDI temp, 0x01 ;очистить LCD
RCALL Two
RCALL WAIT_5ms

LDI temp, 0x06 ;очистить LCD
RCALL Two
RCALL WAIT_5ms

RET

//----------------------------------
WrData:
CLR R17 ;Чистим R17
SBR R17, 0b00010000 ;Установим 5 бит в R17 (RS=1 запись данных)
RJMP TwoData
RET

Two: ;Записать в дисплей
CLR R17
TwoData:
PUSH R16 ;Загрузка значения в стек
SWAP R16 ;поменяли полубайты местами
ANDI temp, 0b00001111 ;маскируем старшую часть байта
OR temp, R17 ;объединяем младшую часть байта и R17
OUT LCD_PORT, temp ;выводим получившееся значение в порт
NOP
NOP
NOP

SBI LCD_PORT, EN ;начало строба
NOP
NOP
NOP
NOP
NOP
CBI LCD_PORT, EN ;конец строба

RCALL WAIT_100us
NOP
POP R16 ;вытащили оригинал данных из стека
ANDI temp, 0b00001111 ;замаскировали старшие полубайты
OR temp, R17 ;объединили два регистра

One:
OUT LCD_PORT, temp ;вывели получившееся значение в порт
NOP
NOP
NOP

SBI LCD_PORT, EN ;начало строба
NOP
NOP
NOP
NOP
NOP
NOP
CBI LCD_PORT, EN ;конец строба
RCALL WAIT_100us ;задержка

RET

//----------------------------------
//Подпрограммы задержки

WAIT_20ms:
; =============================
; delay loop generator
; 160000 cycles:
; -----------------------------
; delaying 159975 cycles:
ldi R17, $E1
WGLOOP01: ldi R18, $EC
WGLOOP11: dec R18
brne WGLOOP11
dec R17
brne WGLOOP01
; -----------------------------
; delaying 24 cycles:
ldi R17, $08
WGLOOP21: dec R17
brne WGLOOP21
; -----------------------------
; delaying 1 cycle:
nop
; =============================

RET

//----------------------------------

WAIT_5ms: ;Расчет делался в программе
; =============================
; delay loop generator
; 40000 cycles:
; -----------------------------
; delaying 39999 cycles:
ldi R17, $43
WGLOOP02: ldi R18, $C6
WGLOOP12: dec R18
brne WGLOOP12
dec R17
brne WGLOOP02
; -----------------------------
; delaying 1 cycle:
nop
; =============================

RET

//----------------------------------
WAIT_100us:
; =============================
; delay loop generator
; 800 cycles:
; -----------------------------
; delaying 798 cycles:
ldi R17, $02
WGLOOP03: ldi R18, $84
WGLOOP13: dec R18
brne WGLOOP13
dec R17
brne WGLOOP03
; -----------------------------
; delaying 2 cycles:
nop
nop
; =============================

RET


[44.35 Кб]
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2014, 12:06
Ответы с готовыми решениями:

Работа с дисплеем HD44780 в Протеус (ATMega16, ASM)
Писал когда то програмку для выводов символов на ЖКИ. Раньше работала. Решил тут недавно добавить...

Дисплей HD44780 и Atmega16
Написал код для вывода текста на дисплей HD44780 через мегу16 и все работало и строки выводил пока...

Работа с LCD дисплеем HD44780 из МК Atmega16 (GCC)
Здравствуйте, пытаюсь подключить LCD дисплей к микроконтроллеру, скачал библиотеку, но уже на...

По нажатию кнопки вывести данные на дисплей HD44780 ATMega16 AVR Studio GCC
Здравствуйте, уважаемые любители-программисты. Нуждаюсь в небольшой помощи по программированию...

Не работает USART ATMega16 (asm)
Пытаюсь тут сделать прием данных по усарту. В дальнейшем планировалось сделать вывод строки...

96
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
17.11.2014, 00:38 81
Был у нас в конторе спец,
Бла..бла...бла... Возьмите свой код , спаяйте макетку , и докажите всем , что Ваш код работает. Заодно , покажите как Вы дергаете E постоянно согласно DS.
статус надо постоянно зачитывать с индикатора, дергая «EN».
Жень, СПАСИБО!!!
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
17.11.2014, 09:47 82
Цитата Сообщение от YTYOUT
Возьмите свой код , спаяйте макетку , и докажите всем , что Ваш код работает. Заодно , покажите как Вы дергаете E постоянно согласно DS.
Я ссылку на видео выкладывал как мой код работает или Вам надо непременно «HM N» вывести? Мой код и в протеусе работает, там можно и все сигналы и времянки посмотреть, и не маловажно для микроконтроллеров – код в полтора раза короче «ВашНашего».
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
17.11.2014, 10:10 83
Цитата Сообщение от tyzord66
...
Вы последний раз весь рабочий проект выкладывали? Или только часть? В вашем примере неправильно настраивается дисплей.
0
okt
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 222
17.11.2014, 11:19 84
Туплю над этой командой
Код
sbrc   temp1,   D7
Может, в качестве ликбеза, кто нибудь пояснит почему ассемблер студии без вопросов транслирует правильно
Код
sbrc   R20,3
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
17.11.2014, 11:20 85
Я удалил все , что Вы закомментировали в своём коде , ни хрена не понял. Потрудитесь расписать Ваш код так чтобы он стал понятен всем
Код
.include "m16def.yms" ; ATMiko16

//--------------------------------
.DSEG

.def temp =R16
.def temp1=R20

.equ   LCD_PORT    = PORTA
.equ   LCD_DDR      = DDRA
.equ    LCD_PIN      = PINA

.equ   D4       = 0
.equ   D5       = 1
.equ    D6       = 2
.equ   D7       = 3

.equ   RS      = 4
.equ   EN      = 5
.equ   RW      = 6

//---------------------------------
//-----------------------------------------------
.CSEG

.ORG $0000
RJMP INIT

//Eieoeaeecaoey IE-------------------------------
INIT:
//Eieoeaeecaoey noaea----------
ldi r16,low(ROMend)
out SPL,r16
ldi r16,high(ROMend)
out SPH,r16
//-----------------------------

//Eieoeaeecaoey oimieay
RCALL    LCD_INIT

;Auaia neiaieia

LDI temp, 0b10000000      //Aa?an DDROM - 0x00 (ia?aay no?iea)
RCALL    Cmd

LDI    temp, H;0xb1
RCALL    WrData

LDI    temp, M
RCALL    WrData

LDI    temp, 0b11000000      //Aa?an DDROM - 0x40 (aoi?ay no?iea)
RCALL    Cmd

LDI    temp, N
RCALL    WrData

STOP:
NOP
RJMP STOP

//------------------------------------------------
//Iiai?ia?aiiu------------------------------------

//---------------------------------
LCD_INIT:
RCALL   WAIT_20ms
LDI      R16, 0xff
OUT      LCD_DDR,R16

CBI      LCD_PORT, RS         ;ienoeou cia?aiea RS, EN
CBI      LCD_PORT, EN
CBI      LCD_PORT, RW
RCALL   LCD_INIT_NoWoyt
LDI    temp, 0x28            ;2 no?iee 5o7
RCALL    Cmd

LDI    temp, 0x06            ;aaoieie?aiaio n?ao?eea DDROM
RCALL    Cmd

LDI    temp, 0x0c            ;Aenieae aee, eo?ni? auee
RCALL    Cmd

LDI    temp, 0x01            ;i?enoeou LCD
RCALL    Cmd
END_INIT_NoWoyt:
RET

;-----------------------------------
LCD_INIT_NoWoyt:
LDI      R25,$03
LDI      temp,0b00000011         ;Iaycaoaeuiay eieoeaeecaoey 8 aeoiiai ?a?eia. Aucuaaaony o?e ?aca
Cycle_Three:

OUT      LCD_PORT,temp      ;ia?eiaai caienu
sbi      LCD_PORT,EN
rcall   END_INIT_NoWoyt
NOP
NOP
NOP
NOP
CBI      LCD_Port,EN      ;caienu aaiiuo a  LCD

rcall   WAIT_5ms

subi   R25,$1
brmi   BusyWoyt
brne   Cycle_Three
cbr      temp,   $1
rjmp   Cycle_Three
//----------------------------------
WrData:
CLR    temp1               ;?enoei ?aoimo? aey onoaiiaee aeoa RS
SBR    temp1, (1<<RS)      ;Onoaiiaei 5 aeo  (iioii aoaao RS=1)
RJMP    Write

Cmd:                     ;Caienaou a oimieae
CLR      temp1

Write:

PUSH    temp                  ;Caa?ocea cia?aiey a noae
SWAP    temp                  ;iiiaiyee iieoaaeou ianoaie
ANDI    temp, 0b00001111         ;ianee?oai noa?oo? ?anou aaeoa
OR       temp, temp1               ;iauaaeiyai ieaaoo? ?anou aaeoa e R17 (RS=1 caienu aaiiuo)

OUT      LCD_PORT,temp      ;ia?eiaai caienu
POP    temp                     ;auoaueee i?eaeiae aaiiuo ec noaea
sbi      LCD_PORT,EN
rcall   END_INIT_NoWoyt
CBI      LCD_PORT,    EN            ;Eiiao no?iaa. Caienu aaiiuo a oimieae
rcall   END_INIT_NoWoyt
ANDI    temp, 0b00001111         ;caianee?iaaee noa?oea iieoaaeou
OR       temp, temp1               ;iauaaeieee aaa ?aoimo?a
OUT      LCD_PORT,temp      ;ia?eiaai caienu
rcall   END_INIT_NoWoyt
sbi      LCD_PORT,EN
rcall   END_INIT_NoWoyt
CBI      LCD_PORT,    EN            ;Eiiao no?iaa. Caienu aaiiuo a oimieae

BusyWoyt:

;Ii?aaaeaiea aioiaiinoe oimieay
;?oaiea aeoa aioiaiinoe
nop
CBI     LCD_PORT,    RS
SBI      LCD_PORT,   RW
ldi      temp,   $f0
out      LCD_DDR,temp
BusyHIGHmybbti:

CBI      LCD_PORT,    EN            ;Eiiao no?iaa. Caienu aaiiuo a oimieae

swap   temp
NOP
NOP
NOP
NOP
SBI      LCD_PORT,   EN
rcall   END_INIT_NoWoyt
sbrc   temp,   $7
rjmp   BusyLoop
in      temp1,   LCD_PIN
rjmp   BusyHIGHmybbti
BusyLoop:
CBI     LCD_PORT,    EN            ;Eiiao no?iaa. Caienu aaiiuo a oimieae
sbrc   temp1,   D7
RJMP   BusyWoyt

CBI     LCD_PORT,    RW
ldi      temp,   $ff
out      LCD_DDR,temp
RET

//----------------------------------
//Iiai?ia?aiiu caaa??ee

WAIT_20ms:
; =============================
;    delay loop generator
;     160000 cycles:
; -----------------------------
; delaying 159975 cycles:
ldi  R17, $E1
WGLOOP01:  ldi  R18, $EC
WGLOOP11:  dec  R18
brne WGLOOP11
dec  R17
brne WGLOOP01
; -----------------------------
; delaying 24 cycles:
ldi  R17, $08
WGLOOP21:  dec  R17
brne WGLOOP21
; -----------------------------
; delaying 1 cycle:
nop
; =============================

RET

//----------------------------------

WAIT_5ms:                        ;?an?ao aaeoimy a i?ia?aiia

ldi  R17, $43
WGLOOP02:  ldi  R18, $C6
WGLOOP12:  dec  R18
brne WGLOOP12
dec  R17
brne WGLOOP02
; -----------------------------
nop
; =============================
RET

//----------------------------------
WAIT_100us:
; =============================
;    delay loop generator
;     800 cycles:
; -----------------------------
Push r17
Push R18
ldi  R17, $02
WGLOOP03:  ldi  R18, $84
WGLOOP13:  dec  R18
brne WGLOOP13
dec  R17
brne WGLOOP03
; -----------------------------
nop
nop
; =============================
POP R18
POP R17
RET
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
17.11.2014, 11:30 86
Цитата Сообщение от okt
Туплю над этой командой
Код:
sbrc temp1, D7 Может, в качестве ликбеза, кто нибудь пояснит почему ассемблер студии без вопросов транслирует правильно
Код
sbrc   R20,3
.equ D7 = 3
0
okt
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 222
17.11.2014, 11:34 87
Блииин! Спасибо, Илья!
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
17.11.2014, 11:35 88
Цитата Сообщение от okt
Туплю над этой командой
Код:
sbrc temp1, D7 Может, в качестве ликбеза, кто нибудь пояснит почему ассемблер студии без вопросов транслирует правильно
Код
sbrc   R20,3
Я хренею... Господа начинающие! Если вы взялись за МК, так хоть потрудитесь купить или скачать необходимую минимальную литературу. Минимум: архитектура, система команд МК AVR. Книга Вольфганг Трамперт "AVR-RISC микроконтроллеры фирмы ATMEL". В ней все для того, чтобы изучить МК и начать писать свои программы. Сайт gaw.ru. На этом сайте неплохая подборка информации по МК AVR.
.def temp = r16 // Обзываем регистр r16 кличкой temp
sbrc - пропуск команды если бит регистра сброшен. Диапазон нумерации битов 0-7 всего восемь битов. Машинный счет начинается с нуля.
.equ D7 = 3
#define D7 3
3 - номер бита.
БЕГОМ КНИЖКИ ЧИТАТЬ, ШКОЛОТА! Если вы вы потрудились все-таки сначала хоть что-то почитать, вы бы сэкономили время себе и остальным, которые вам отвечают.
Губки не сметь надувать! Читайте книжки.
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
17.11.2014, 11:57 89
Жень , не горячись. okt, насколько мне известно, не новичок в ASM и процессорах. Ну бывает , а с кем не бывает.
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
17.11.2014, 17:11 90
Цитата Сообщение от YTYOUT
Бла..бла...бла... Возьмите свой код , спаяйте макетку , и докажите всем , что Ваш код работает.
Какая-то пустая дискуссия выходит. Вы не можете знать, на каком чипе Вам индикатор достанется, на PC2402, ST7066 или еще на каком клоне, каждый из них работает по какому-то своему алгоритму, пытаясь лишь эмитировать протокол оригинала. Чем точней Вы будете придерживаться DS тем выше вероятность совместимости. Я разбирался в Ваших муках творчества, чтоб Ваш код в протеусе заработал, разбирайтесь теперь Вы в моем. Кстати мой код без переделок работает и на винстаровском OLED тот, что на WS0010 и который имеет свои особенности.

Прикрутил перекодировку кириллицы, чтоб «два раза не бегать» ). На фото два разных индикатора «С» и «L», к сожалению в настоящий момент OLEDа в наличии не имею.

2 dymyurk1978
Вы заметили, что инициализация $20/8-$20/8-$20/8-…. Вместо $30/8-$30/8-$30/8-$20/8-… ? Не помню где это вычитал, но этот финт позволяет перейти в 4 бита на одну команду быстрей. Можете проверять прикрепленный пример.





0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
17.11.2014, 17:12 91
Сорри, сам код не влез

[105 Кб]
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
17.11.2014, 17:32 92
Цитата Сообщение от tyzord66
...
Производители ЖКИ на контроллере HD44780 рекомендуют делать инициализацию
Код
0x30
0x30
0x30
Что бы ни случилось, при такой инициализации ЖКИ ГАРАНТИРОВАННО встает в начальный режим 8 бит. В котором уже можно задавать 4 битный режим.
Лично я сталкивался с такой ситуацией. Когда инициализация не проводилась должным образом. Тоже хотел сэкономить на одной команде. При включении устройства все работает. Стоит только сбросить МК, все, дисплей не работает. Потому что при включении ЖКИ был в сбросе по питанию (внутренняя логика), один раз инициализация проходит, после сброса МК, эта "недоинициализация" не канает. Я долго парился, пока мне не подсказали сделать все по даташиту. Инициализация, порядок работы с ЖКИ. Когда я так и сделал у меня исчезли все проблемы. ЖКИ показывал и после сброса МК, даже работать стало лучше. До переделки ЖКИ работал неустойчиво.
Я понимаю, что изобретение собственных лисапедов это прекрасно и чудесно, но вы все-таки посмотрите мой пример. Когда я перешел на си, перенес эту библиотеку на си. И у меня нет никаких проблем с ЖКИ. Притом мои некоторые устройства с ЖКИ работают в промышленных условиях.
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
17.11.2014, 18:08 93
Цитата Сообщение от dymyurk1978
Производители ЖКИ на контроллере HD44780 рекомендуют делать инициализацию
dymyurk1978, я оценил Вашу иронию ). Требую соблюдать DS, а сам… )
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
17.11.2014, 18:09 94
Цитата Сообщение от tyzord66
Цитата Сообщение от dymyurk1978
Производители ЖКИ на контроллере HD44780 рекомендуют делать инициализацию
dymyurk1978, я оценил Вашу иронию ). Требую соблюдать DS, а сам… )
? о_О
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
17.11.2014, 18:16 95
Цитата Сообщение от dymyurk1978
Цитата Сообщение от tyzord66
Цитата Сообщение от dymyurk1978
Производители ЖКИ на контроллере HD44780 рекомендуют делать инициализацию
dymyurk1978, я оценил Вашу иронию ). Требую соблюдать DS, а сам… )
? о_О
Инициализация хоть и работает, но принято делать иначе. К сожалению не могу сослаться на источник, даже не уверен насколько он авторитетный. Насчет сброса проверю, но если индикатор перешел на 4 бита, то перешел, нельзя же быть на половину беременной?
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
17.11.2014, 18:21 96
Ну все ! Письками померились. tyzord66 мой респект

0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
17.11.2014, 18:22 97
Цитата Сообщение от tyzord66
...
Я тоже так считал, на хрена лишняя команда, и так все работает. И ведь работало, пока звезды на небе не сошлись. Я тогда несколько дней убил на разбор причины. Переделал, с тех пор с ЖКИ вообще не мучаюсь.
Будете вы делать как положено, не будете - это ваше дело. Но если вы не сделаете, а потом в пень въедете, тогда сами себя будете материть....
0
17.11.2014, 18:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2014, 18:22

Не работают часы на ATMega16 (asm)
Помогите, пожалуйста, начинающему. В качестве первого проекта решил написать програмку часов (так...

Не получается опросить клавиатуру (ATmega16, ASM)
Написал программу для интереса, которая должна при нажатии кнопки которая подключена к порту С7...

Опрос порта на нажатие кнопки (ASM, ATMega16)
Не могу разобраться в чем дело, в моем проекте порт РС настроен как приемник к каждой ножке будет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
97
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru