Не выводит символы на в протеусе HD44780

Обсуждаем контроллеры компании Atmel.
Ответить
Ехан
Родился
Сообщения: 6
Зарегистрирован: Вс ноя 23, 2014 11:23:03

Не выводит символы на в протеусе HD44780

Сообщение Ехан »

Ребят помогите, не понимаю в чем проблема, символы не выводит, инициализацию прошел, курсор гоняю по строкам, а символ вывести не могу.

Прошу прощения, если тема задублирована, искал по форуму - не нашел, может плохо искал, спорить не буду.

Код: Выделить всё

main:
rjmp init_stack
Init_Stack:
	ldi temp, 0x01
	sts stmc,temp
	ldi temp,high(RAMEnd)
	out SPH,temp
	ldi temp,low(RAMEnd)
	out SPL,temp

	rcall init_ports
	rcall init_timer
	sei
	rcall LCD_INIT

wait20ms:
	push temp
	lds temp,TCNT2
	ldi temp1,0x0C
	add temp,temp1
	push temp1

Wait20ms_REDO:
	lds temp1,TCNT2
	cp temp1,temp
	BREQ Wait20ms_RET
	rjmp Wait20ms_REDO

Wait20ms_RET:
	pop temp1
	pop temp
	; rcall Init_INT
ret

LCD_INIT:
	push temp
	push temp1

	ldi temp,0x00
	out portB,temp

	; Инциализация 3 операции 0b00110000
	; Первая операция
	ldi temp,0b00110000
	out portD,temp

	ldi temp1,0x04
	out portB,temp1

	rcall wait20ms
	
	ldi temp1,0x00
	out portB,temp1

	; Вторая операция
	ldi temp,0b00110000
	out portD,temp

	ldi temp1,0x04
	out portB,temp1
	rcall wait20ms
	ldi temp1,0x00
	out portB,temp1

	; Третья операция
	ldi temp,0b00110000
	out portD,temp

	ldi temp1,0x04
	out portB,temp1

	;rcall wait20ms
	
	ldi temp1,0x00
	out portB,temp1

	rcall wait1s

	; Ширина шины 8 бит
	ldi temp,0b00111000
	out portD,temp

	ldi temp1,0x04
	out portB,temp1
	rcall wait20ms
	ldi temp1,0x00
	out portB,temp1

	; Смещение курсора, а не экрана
	ldi temp,0b00000110
	out portd,temp 

	ldi temp,0x04
	out portB,temp

	rcall wait20ms

	ldi temp,0x00
	out portB,temp


	; Вывод отображения
	ldi temp,0b00001111
	out portD,temp

	ldi temp1,0x04
	out portB,temp1
	
	rcall wait20ms
	
	ldi temp1,0x00
	out portB,temp1

	; Очистить и курсор в первую позицию
	ldi temp,0x01
	out portD,temp

	ldi temp,0x04
	out portB,temp

	rcall wait20ms

	ldi temp,0x00
	out portb,temp
	ldi r22,0x79
	ldi r21,0x30
	; Направление сдвига курсора
	ldi temp,0b00010100
	out portd,temp 

	ldi temp,0x04
	out portb,temp

	rcall wait20ms

	ldi temp,0x00
	out portB,temp
REDO_WHILE:
	; Установка курсора 1 сторка 1й символ
	ldi temp,0x04
	out portB,temp

	inc r22
	out portD,r22

	rcall wait20ms

	ldi temp,0x00
	out portb,temp

	; Вывод символа 0x44 - D
	ldi temp1,0x05
	out portB,temp1
	
	out portD,r21

	rcall wait20ms
	
	ldi temp1,0x00
	out portB,temp1
	inc r21

	;rcall wait20ms

	cpi r21,0x3F
	BRNE REDO_WHILE
END_WHILE:

	pop temp1
	pop temp
RET
Реклама
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Не выводит символы на в протеусе HD44780

Сообщение COKPOWEHEU »

ldi temp,0b00110000
out portD,temp

ldi temp1,0x04
out portB,temp1

rcall wait20ms

ldi temp1,0x00
out portB,temp1

; Вторая операция
ldi temp,0b00110000
out portD,temp
А где обнуление PORTD или сброс хотя бы битов PD4 и PD5? Кстати, на каких выводах висят RS, E, R/W? Для вывода символа и вывода команды вывод RS должен быть разным.
main:
rjmp init_stack
Init_Stack:
ldi temp, 0x01
sts stmc,temp
ldi temp,high(RAMEnd)
out SPH,temp
ldi temp,low(RAMEnd)
out SPL,temp

rcall init_ports
rcall init_timer
sei
rcall LCD_INIT

wait20ms:
...
Wait20ms_REDO:
...
BREQ Wait20ms_RET
rjmp Wait20ms_REDO

Wait20ms_RET:
...
ret
Делать ret из основной программы? И куда надеетесь попасть?
Wait20ms_REDO:
lds temp1,TCNT2
cp temp1,temp
BREQ Wait20ms_RET
rjmp Wait20ms_REDO

Wait20ms_RET:
Во славу борьбы со спагетти-кодом открою тайну оператора BRNE (он такой же, как BREQ, но наоборот). И, если задержка все равно реализуется в цикле, может отказаться от таймера?
wait20ms:
push temp
lds temp,TCNT2
ldi temp1,0x0C
add temp,temp1
push temp1
Ну и какой смысл теперь сохранять temp1? Его надо было сохнанять до изменений, а не после.
rcall init_timer
sei
rcall LCD_INIT
Может стоит сначала разобраться с дисплеем, а уже потом подключать прерывания? Кстати, ни одна переменная не объявлена, да и часть процедур.
; Вывод символа 0x44 - D
ldi temp1,0x05
out portB,temp1
Так 0x44 или 0x05?
Вообще, я бы посоветовал вынести передачу отдельного байта (вместа с дерганьем R/W и E, но не RS), включая задержку, в процедуру или макрос. А потом на его основе два макроса - передачу байта команды и передачу байта данных (отличающихся установленным RS). Дергать отдельные биты (E, RS, R/W) можно не только прямой записью числа, но и командами sbi / сbi, в данном случае это удобнее. И еще, стоит написать макросы для имен таких выводов, что-то вроде

Код: Выделить всё

.equ LCD_E = 4
.equ LCD_RS=2
.equ LCD_RW=5
(в Си можно поизвращаться, и назначить сразу с буквой порта, в ассемблере нельзя)
И использовать
.macro LCD_CMD
cbi PORTD,LCD_RS
rcall LCD_SEND //принимает код команды через temp, например
.endm
Последний раз редактировалось COKPOWEHEU Чт ноя 27, 2014 19:13:27, всего редактировалось 1 раз.
Реклама
Аватара пользователя
НАПАЛМ
Это не хвост, это антенна
Сообщения: 1314
Зарегистрирован: Пт ноя 27, 2009 19:47:13
Откуда: Казань

Re: Не выводит символы на в протеусе HD44780

Сообщение НАПАЛМ »

COKPOWEHEU писал(а):Делать ret из основной программы? И куда надеетесь попасть?
Куда стек пошлет :)))
Ехан
Родился
Сообщения: 6
Зарегистрирован: Вс ноя 23, 2014 11:23:03

Re: Не выводит символы на в протеусе HD44780

Сообщение Ехан »

А где обнуление PORTD или сброс хотя бы битов PD4 и PD5?
В даташите что у меня есть, написано что их нужно только установить, а про сбрасывать ничего не сказано ;)
Делать ret из основной программы? И куда надеетесь попасть?
Wait20ms_REDO:
lds temp1,TCNT2
cp temp1,temp
BREQ Wait20ms_RET
rjmp Wait20ms_REDO

Wait20ms_RET:
Это часть кода, хочу попасть, я не стал выкладывать часть кода с работой TWI. Надеюсь попасть сюда, часть которая идет собственно.

Код: Выделить всё

	rcall init_ports
	rcall init_timer
	sei
	rcall LCD_INIT
	rcall I2C_INIT

	rcall GET_DATE
loop:
	sei
	IN r21,PIND
	rjmp loop
out portD,temp
А где обнуление PORTD или сброс хотя бы битов PD4 и PD5? Кстати, на каких выводах висят RS, E, R/W? Для вывода символа и вывода команды вывод RS должен быть разным.[/quote]

Висят на: PB0 - RS ; PB1 - R\W; E - PB2
wait20ms:
push temp
lds temp,TCNT2
ldi temp1,0x0C
add temp,temp1
push temp1
Ну и какой смысл теперь сохранять temp1? Его надо было сохнанять до изменений, а не после.
Последний раз редактировалось Ехан Чт ноя 27, 2014 10:30:52, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Ехан
Родился
Сообщения: 6
Зарегистрирован: Вс ноя 23, 2014 11:23:03

Re: Не выводит символы на в протеусе HD44780

Сообщение Ехан »

Да согласен, бессмысленная операция. Впихнул код не туда, подниму строку обратно.
wait20ms:
push temp
lds temp,TCNT2
ldi temp1,0x0C
add temp,temp1
push temp1
Ну и какой смысл теперь сохранять temp1? Его надо было сохнанять до изменений, а не после.
rcall init_timer
sei
rcall LCD_INIT
Может стоит сначала разобраться с дисплеем, а уже потом подключать прерывания? Кстати, ни одна переменная не объявлена, да и часть процедур.
Прерывания нормально в симуляции работают, каждую секунды светодиоды тикают. Повторюсь, код выложил кусками для экономии вашего времени, своих нервов и вопросов ;-). Сейчас я хочу вывести символ на экран, а затем уже приводить код в божеский вид.

Заголовок программы:

Код: Выделить всё

.org 0x0000 ; Reset
	rjmp main
.org 0x001 ; Ext_INT0
	rjmp Ext_INT0
.org 0x002
;	rjmp Ext_INT0
.org 0x003

.org 0x004
;	rjmp Timer2_OVF ; Overflow Timer2/Counter2
.org 0x005
.org 0x006
.org 0x007
	
.org 0x008
.org 0x009 ; Timer INT
	rjmp Timer2_OVF ; Overflow Timer2/Counter2
.org 0x010
	rjmp Timer2_OVF
.org 0x018
	rjmp I2C_INT ; I2C Interput

.def temp=r16
.def temp1=r17
.def c=r20

.dseg
stmc:	.dw 0x00
count: .db 0x00
date: .db 0x00,0x00,0x00,0x00,0x00,0x00 
.cseg
(в Си можно поизвращаться, и назначить сразу с буквой порта, в ассемблере нельзя)
Мне интересно на асме запустить прием данных с DS1307 и вывести на экран полученные данные, И повторить этоже на железке.
Реклама
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Не выводит символы на в протеусе HD44780

Сообщение COKPOWEHEU »

; Вывод символа 0x44 - D
ldi temp1,0x05
out portB,temp1

out portD,r21

rcall wait20ms

ldi temp1,0x00
out portB,temp1
inc r21
Тогда можно попробовать при сбросе E сохранить остальные линии: если прием идет по спадающему фронту, может неверно считаться.

Код: Выделить всё

ldi temp,(1<<2 | 1<<0)
out PORTB,temp
out PORTD,r21
rcall wait20ms
cbi PORTB,2
rcall wait20ms
cbi PORTB,0
Реклама
Ехан
Родился
Сообщения: 6
Зарегистрирован: Вс ноя 23, 2014 11:23:03

Re: Не выводит символы на в протеусе HD44780

Сообщение Ехан »

Тогда можно попробовать при сбросе E сохранить остальные линии: если прием идет по спадающему фронту, может неверно считаться.

Код: Выделить всё

ldi temp,(1<<2 | 1<<0)
out PORTB,temp
out PORTD,r21
rcall wait20ms
cbi PORTB,2
rcall wait20ms
cbi PORTB,0
[/quote]

Отлично, спасибо, заработало. Буду внимательней к передним и задним фронтам.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Не выводит символы на в протеусе HD44780

Сообщение COKPOWEHEU »

И, все-таки, приведите код в читабельный вид с помощью процедур, макросов и именованных констант.
Ответить

Вернуться в «AVR»