Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры 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. Просмотров 37609. Ответов 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
ovr_bikymmir
0 / 0 / 0
Регистрация: 08.08.2014
Сообщений: 52
14.11.2014, 12:59 61
Одна из проблем все таки - чтение флага занятости
Сделал так:
Код
   SBR      temp, 1<<EN               ;ia?aei no?iaa ia?eiaaony no?ieie ie?a
NOP
OUT     LCD_PORT, temp            ;auaaee iieo?eaoaany cia?aiea a ii?o
RCALL   BusyWoyt
RET

BusyWoyt:
CBI      LCD_PORT,    EN            ;Eiiao no?iaa. Caienu aaiiuo a oimieae
---->   RCALL WAIT_100us
ret
Выводится на втором знакоместе M, на второй сточке N, первый символ не выводится. Лог выглядит так:


Видимо одна из проблем все таки - неправильный алгоритм чтения флага занятости или что то, связанное с ним.
0
omokost
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,753
14.11.2014, 13:20 62
Желтый треугольник - "Контроллер занят во время получения команды".
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
14.11.2014, 20:58 63
Тоже самое. На самом деле то, что выводится N ни о чем не говорит. Он потом стал выводить L.
Вы хоть понимаете , что если дисплей хоть что-то показывает , то это означает , что инит дисплея прошёл удачно,,И он прекрасно опознал флаги занятости. Вы хоть каой инструмент имеете?
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
15.11.2014, 00:24 64
Цитата Сообщение от avr_bikymmir
Видимо одна из проблем все таки - неправильный алгоритм чтения флага занятости или что то, связанное с ним.
Чтоб не повторять сказанного дважды, просто поправил Ваш проект. Получился полный пипец, но, если Вам так понятней, то извольте.



[153.49 Кб]
0
ovr_bikymmir
0 / 0 / 0
Регистрация: 08.08.2014
Сообщений: 52
15.11.2014, 03:29 65
[QUOTE="YTYOUT"]
Цитата Сообщение от Цитата:[/QUOTE]
Тоже самое. На самом деле то, что выводится N ни о чем не говорит. Он потом стал выводить L.
Вы хоть понимаете , что если дисплей хоть что-то показывает , то это означает , что инит дисплея прошёл удачно,,И он прекрасно опознал флаги занятости. Вы хоть каой инструмент имеете?
В том тои дело, что в основном все таки ничего не показывает. Иногда L проскакивала. Программа явно не здорова. Имею пинбоард, паяльник и мультиметр.

[QUOTE="tyzord66
но, если Вам так понятней, то извольте.
Стало еще более не понятно. Вообще теперь не понимаю алгоритм. Чувствую, придется без проверки флага использовать. Целую портянку на форуме создал, а в итоге вернулся к тому с чего начал. Чувствую, пока не осилю я это. Если сильно не разочаруюсь в себе и не брошу вообще это занятие - может быть как нибудь потом и перепишу уже с проверкой. Всем спасибо большое.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
15.11.2014, 03:46 66
Цитата Сообщение от avr_bikymmir
Стало еще более не понятно. Вообще теперь не понимаю алгоритм. Чувствую, придется без проверки флага использовать.
Почитайте внимательно это.
Купите, скачайте книгу Вольфганг Трамперт "AVR-RISC микроконтроллеры фирмы ATMEL". К книге идет диск с примерами программ. Там тоже расписано, разжевано по ЖКИ. Плюс примеры программ.
Также я вам дал РАБОЧИЙ проект. Нет только чтения флага занятости. Свое мнение об этом флаге я уже высказывал.

Цитата Сообщение от avr_bikymmir
Чувствую, пока не осилю я это. Если сильно не разочаруюсь в себе и не брошу вообще это занятие - может быть как нибудь потом и перепишу уже с проверкой. Всем спасибо большое.
Первое правило спецназа - никогда не сдаваться.

Я вам свой жизненный пример расскажу. С 1994 года до 2006 года я работал автоэлектриком. Надоело. Кем работать? Образование 9 классов. По знакомству устроили меня на предприятие электронщиком. Руководству честно сказал, что образование 9 классов. Опыта работы с промышленным оборудованием практически никакого. Увлекаюсь электроникой с детства. Меня приняли на работу. Проработал год. Предприятие стало менять старый парк оборудования. А я испугался, что не потяну. И мы мирно разошлись. Я не бросил промышленное оборудование. Через месяц устроился на другое предприятие. Потом я понял, что совершенно зря испугался, ничего особо сложного. И то предприятие до сих пор было самым лучшим местом постоянной работы. Так получилось, что опять через год мне пришлось уволиться (по личным причинам). И когда я устраивался на работу. Рассказал про свое первое предприятие. И меня не взяли на ту работу. Потому что я тогда "испугался трудностей". Такой сделали вывод. Так что думайте...
0
ovr_bikymmir
0 / 0 / 0
Регистрация: 08.08.2014
Сообщений: 52
15.11.2014, 07:11 67
Цитата Сообщение от dymyurk1978
Также я вам дал РАБОЧИЙ проект. Нет только чтения флага занятости. Свое мнение об этом флаге я уже высказывал.
Спасибо за поддержку. С gaw статью изучал, даже распечатаная есть. За книжку спасибо, где то была в электронном виде, посмотрю. Без проверки флага вроде и моя первая программа работала. Надо будет еще раз перепроверить ее и, если действительно рабочая, то пока буду ее использовать. А там видно будет. Хотелось просто полностью разобраться с жки, в том числе и с проверкой флага.
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
15.11.2014, 10:09 68
Цитата Сообщение от avr_bikymmir
Стало еще более не понятно. Вообще теперь не понимаю алгоритм. Чувствую, придется без проверки флага использовать. Целую портянку на форуме создал, а в итоге вернулся к тому с чего начал. Чувствую, пока не осилю я это. Если сильно не разочаруюсь в себе и не брошу вообще это занятие - может быть как нибудь потом и перепишу уже с проверкой. Всем спасибо большое.
Не стоит сходу сдаваться. При чтении статуса у Вас только две основные ошибки. При ожидании готовности надо постоянно зачитывать статус с индикатора, а не ждать когда «D7» сам перебросится. Читается статус также как и запись команд/данных (каждый ниббл отдельно). Ниббл с флагом “BF" читается первым.
«EN» является стробом, поэтому при записи в индикатор необходимо сперва выставить данные, а потом дергать строб, а не подавать их одновременно.
0
ovr_bikymmir
0 / 0 / 0
Регистрация: 08.08.2014
Сообщений: 52
16.11.2014, 12:23 69
Цитата Сообщение от tyzord66
При чтении статуса у Вас только две основные ошибки. При ожидании готовности надо постоянно зачитывать статус с индикатора, а не ждать когда «D7» сам перебросится. Читается статус также как и запись команд/данных (каждый ниббл отдельно). Ниббл с флагом “BF" читается первым.
«EN» является стробом, поэтому при записи в индикатор необходимо сперва выставить данные, а потом дергать строб, а не подавать их одновременно.
В принципе в Ваших исправлениях моего кода разобрался. Не понятен только вот этот кусок кода. Что им проверяется?
Код
sbrc   temp,   $7
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
16.11.2014, 12:42 70
Я не особо следил за темой. Но то, что у вас проблемы с чтением флага занятости, я понял. Номер бита флага занятости 7.
Соответственно, разбираем строчку:
sbrc temp, $7
sbrc - пропуск команды, если бит регистра сброшен. синтаксис команды SBRC Rr,b где Rr - регистр, b номер бита от 0 до 7.
temp - регистр
$ - шестнадцатеричное значение
7 номер бита.
Значит строка означает: пропуск команды, если 7 бит регистра сброшен. Применительно к вашим затруднениям, пропуск команды, если флаг занятости сброшен.

P.S. Когда я решил изучать МК AVR, я подготовился к этому. Поехал купил книжки. И ВНИМАТЕЛЬНО читал. Архитектура. Система команд, примеры программ. Потом начал пробовать писать свои первые программы.
Так что, чтобы сэкономить свое и наше время:
Скачиваете, покупаете книжку Вольфганг Трамперт "AVR-RISC микроконтроллеры фирмы ATMEL". Джон Мортон - Микроконтроллеры AVR. Вводный курс. И внимательно читаете.
Вот сайт. Побродите по этому сайту. Много чего полезного там есть...
0
ovr_bikymmir
0 / 0 / 0
Регистрация: 08.08.2014
Сообщений: 52
16.11.2014, 13:53 71
Цитата Сообщение от dymyurk1978
Я не особо следил за темой. Но то, что у вас проблемы с чтением флага занятости, я понял. Номер бита флага занятости 7.
Соответственно, разбираем строчку:
...
Полностью подпрограмма выгдядит так:
Код
BusyWoyt:
;Определение готовности дисплея
;Чтение бита готовности
nop
CBI     LCD_PORT,    RS
SBI      LCD_PORT,   RW
ldi      temp,   $f0
out      LCD_DDR,temp
BusyHIGHmybbti:
CBI      LCD_PORT,    EN            ;Конец строба. Запись данных в дисплей
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            ;Конец строба. Запись данных в дисплей
sbrc   temp1,   D7

RJMP   BusyWoyt

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

RET
Я так понимаю, что то, что Вы описали выполняют вот эти строчка:
Код
sbrc   temp1,   D7
Цитата Сообщение от dymyurk1978
P.S. Когда я решил изучать МК AVR, я подготовился к этому. Поехал купил книжки. И ВНИМАТЕЛЬНО читал. Архитектура. Система команд, примеры программ. Потом начал пробовать писать свои первые программы.
Книжки я читаю. Только, так как я еще и работаю, причем работа вообще не связана с этой темой (ремонт, монтаж РЭС), а времени отнимает много, то времени остается мало и получается читать и пробовать что то как то наскоком. Да и с книжками подобного плана у нас проблема. Хотел в интернете найти, чтоб купить, Вольфганг Трамперт "AVR-RISC микроконтроллеры фирмы ATMEL" и не нашел. Везде пишут нет в наличии. Так что приходится по большей части "гуглением" изучать
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
16.11.2014, 15:23 72
Вашнаш код абсолютно рабочий. Фото я приложил .
Руки опускать не надо.
Вопрос к DI:
PINDOARD умеет работать в режиме отладчика?
И ко Всем. На фото Вы видите дисплей VHF1620B / Есть у кого нить даташит на него ? Поиск в паутине результат не дал.

0
ovr_bikymmir
0 / 0 / 0
Регистрация: 08.08.2014
Сообщений: 52
16.11.2014, 16:21 73
Цитата Сообщение от YTYOUT
Вашнаш код абсолютно рабочий. Фото я приложил .
То есть Вы без правки кода, который я выкладывал последним (якобы мой который), прошили его в МК, собрали макет в точности по моей схеме и все заработало без пинков и подправок?
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
16.11.2014, 16:40 74
Ну без пинков конечно не обошлось ,т.к. я ни хрена не знаю о том дисплее который использовал , кроме картинки с какого-то сайта , где кто-то постарался хоть по пинам расписать где у него что. Код я приложил , надеюсь узнаете . Да спаял по Вашей схеме , в def можете посмотреть распиновку.

[154.37 Кб]
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
16.11.2014, 16:44 75
Цитата Сообщение от avr_bikymmir
В принципе в Ваших исправлениях моего кода разобрался. Не понятен только вот этот кусок кода. Что им проверяется?
Код:
sbrc temp, $7

Используем остатки в temp от настройки порта на чтение, в цикле своп, а эта строчка проверяет оба ниббла зачитаны или нет.
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
16.11.2014, 16:50 76
Цитата Сообщение от YTYOUT
Ну без пинков конечно не обошлось ,т.к. я не хрена не знаю о том дисплее который использовал , кроме картинки с какого-то сайта , где кто-то постарался хоть по пинам расписать где у него что. Код я приложил , надеюсь узнаете . Да спаял по Вашей схеме , в def можете посмотреть распиновку.
Не понятно как вот это у Вас работает, статус надо постоянно зачитывать с индикатора, дергая «EN».
Код
BusyLoop:
SBIC   PIND,D7
RJMP   BusyLoop
И вот тут, данные в порт уходят одновременно со стробом, жуть
Код
   SBR      temp,1<<EN            ;Начало строба начинается строкой ниже
OUT     LCD_PORT, temp            ;выводим получившееся значение в порт
0
YTYOUT
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
16.11.2014, 17:18 77
Где написано, что дергать надо постоянно?
Правильность данных дисплеем проверяется не по фронтам , а по уровню 1 на входе Е. Вот такие они.
Не понятно как вот это у Вас работает
См. фото.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
16.11.2014, 17:43 78
Цитата Сообщение от YTYOUT
...
С обратной стороны фото выложи, дам тебе распиновку.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
16.11.2014, 20:15 79
14 пинов. Значит подсветки нет. Распиновка должна быть такой: Datasheet
0
tyzord66
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
16.11.2014, 21:36 80
[QUOTE="YTYOUT"]Где написано, что дергать надо постоянно?
Правильность данных дисплеем проверяется не по фронтам , а по уровню 1 на входе Е. Вот такие они.
[QUOTE="Цитата:[/QUOTE]
Не понятно как вот это у Вас работает
См. фото.
Был у нас в конторе спец, тоже любил даташиты как ему удобно трактовать, и поспорить было никак – девайс работал, ставили по началу винстар, а когда закупили болимин – облом. Вы бы его слышали, виноваты были все - китайцы, почта, все кто роняли посылку по пути, только код его был безупречен.
0
16.11.2014, 21:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2014, 21:36

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

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

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


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

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

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