|
Avr90s8515, программа не работает |
|
|
|
Apr 20 2010, 19:19
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(Prevan @ Apr 20 2010, 20:05)  ........., дисплей вообще молчит). Вы упустили самую главную часть , инициализация LCD. Что это такое и как её сделать Вы найдёте в DS на применёный в Вашем дисплее контролере. Т.к. Вы его не указали , помочь пока нечем То , что Вы назвали ;****** Инициализация ЖКИ ********************************************** таковой не является
Сообщение отредактировал ILYAUL - Apr 20 2010, 19:21
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
May 5 2010, 16:52
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 7-04-10
Пользователь №: 56 469

|
Здравствуйте! Подкорректировал код с учётом задержек (руководствовался ДШ и примерами схожих программ). Программа компилируется и при запуске видно, как перебегают сигналы порта А, подключенного к ЖКИ, но дисплей по-прежнему ничего не отображает. По логике вещей, дело в последовательности установления битов RW, RS и Е, но просмотренный мною на несколько раз код явных ошибок не таит. Буду рад прочесть идеи, советы по направлению программы в рабочее русло... CODE .include "8515def.inc" ; Подключение внешней библиотеки с описанием ; символических имен и определением адресов ; регистров микроконтроллера .cseg ; CODE segment .org 0 ; rjmp init ; Вектор прерывания по включению питания, ; сбросу RESET или от сторожевого таймера .org $0d ; .include "MyLib.inc" ; Подключение файла с описанием символических ; имен портов и подпрограммами .def Dat_LCD= r20 ; Данные/команды передаваемые на LCD
;****** Инициализация контроллера **************************************** ;** выполняется при включении питания, сбросу RESET, или от ;** сторожевого таймера ;************************************************************************* init: ldi temp, low(RAMEND) ; Инициализация указателя стека out SPL, temp ; в конце внутреннего ОЗУ ldi temp, high(RAMEND) ; out SPH, temp ; rcall Config_Port ; Вызов подпрограммы конфигурирования портов rcall Init_lcd ; Вызов подпрограммы инициализации ЖКИ
;****** Подпрограмма чтения BUSY флага и счетчика адреса ЖКИ *********** read_busy: clr temp ; Линии порта A как входы out ddra, temp ; out porta, temp ; sbi ddrc, LCD_RW ; Установка R/W cbi ddrc, LCD_RS ; Сброс RS sbi portb, LCD_E ; Установка бита 0 порта B (сигнал E=1). nop ; Формирование задержки 1 мкс nop ; nop ; nop ; in dat_lcd, pina ; Чтение данных из ЖКИ cbi portb, LCD_E ; Cброс бита 0 порта B (сигнал E=0) ser temp ; Линии порта A как выход out ddra, temp ; ret
;****** Подпрограмма ожидания сброса BUSY флага ЖКИ ******************** wait_busy: ; rcall read_busy ; sbrc dat_lcd, busy ; rjmp wait_busy ; ret
;****** Вывод в DDRAM постоянного текста******************* rcall wait_busy ; ldi zl,low(text0*2) ; Установить указатель Z на начало буфера text0 ldi zh,high(text0*2); ldi temp2, 30 ; Установить счетчик программируемых ячеек DDRAM ddram: lpm ; Извлечь из flash-памяти байт данных mov dat_lcd, r0 ; rcall lcd_dat ; Записать его в DDRAM rcall wait_busy ; ld r0, z+ ; Увеличить на 1 указатель Z адреса flash-памяти dec temp2 ; Если еще не все ячейки запрограммированы brne ddram ; вернуться назад
;****** Основная программа *********************************************** main: ldi temp, 2 ; Установить дисплей относительно буфера rcall lcd_dat ; DDRAM в начальную позицию ldi r24,5 ; остановка stop1: rcall del200 dec r24 brne stop ldi r24, 10 ; установка счетчика символов shift: ldi dat_lcd,$18 ; сдвиг дисплея на один символ rcall lcd_com rcall del200 ; задержка ~1/5 с при кварце 4 МГц dec r24 brne shift ldi r24,5 ; остановка после вывода каждой строки stop: rcall del200 dec r24 brne stop rjmp main ; повторить сначала
;****** Инициализация ЖКИ ********************************************** INIT_LCD: ;ПОДПРОГРАММА ИНИЦИАЛИЗАЦИИ ЖКИ rcall DEL_5MS ;Задержка 15 мс rcall DEL_5MS ; rcall DEL_5MS ; ldi Dat_LCD,$38 ;ЖКИ 8 бит,2 строки, 5х7 точек rcall lcd_dat ;Запись управляющего слова в ЖКИ rcall DEL_5MS ;Задержка 5.4 нс ldi Dat_LCD,$38 ;ЖКИ 8 бит,2 строки, 5х7 точек rcall lcd_dat ;Запись управляющего слова в ЖКИ rcall DEL_100us ;Задержка 100 мкс ldi Dat_LCD,$38 ;ЖКИ 8 бит,2 строки, 5х7 точек rcall lcd_dat ;Запись управляющего слова в ЖКИ rcall DEL_100us ;Задержка 100 мкс ldi Dat_LCD,$38 ;ЖКИ 8 бит,2 строки, 5х7 точек rcall lcd_dat ;Запись управляющего слова в ЖКИ rcall DEL_100us ;Задержка 100 мкс ldi Dat_LCD,$04 ;Выключить ЖКИ rcall lcd_dat ;Запись управляющего слова в ЖКИ rcall DEL_100us ;Задержка 100 мкс ldi Dat_LCD,$01 ;Очистить ЖКИ,и устан. курсор в начало rcall lcd_dat ;Запись управляющего слова в ЖКИ rcall DEL_5MS ;Задержка 5.4 мс ldi Dat_LCD,$0c ;вкл. дисплей, выкл. кусор,мерцание выкл. rcall lcd_dat ;Запись управляющего слова в ЖКИ rcall DEL_100us ;задержка 100 мкс; ret
;****** Запись команды в ЖКИ ******************************************* lcd_com: in temp, ddrc ; Чтение состояния выводов порта С andi temp, 0b11001111 ; Сброс RS и R/W (Выводы PC4, PC5) out ddrc, temp ; sbi portb, LCD_E ; Установка бита 0 порта B(сигнал E=1). out porta, dat_lcd ; Вывод команды на шину данных LCD cbi portb, LCD_E ; Cброс бита 0 порта B(сигнал E=0) ret
;****** Запись данных в ЖКИ ******************************************** lcd_dat: cbi ddrc, LCD_RW ; Сброс R/W sbi ddrc, LCD_RS ; установка RS ???????????????????????? sbi portb, LCD_E ; Установка бита 0 порта B(сигнал E=1). out porta, dat_lcd ; Вывод ASCII символа на шину данных LCD cbi portb, LCD_E ; Cброс бита 0 порта B(сигнал E=0) ret ;****** Подпрограмма формирования задержки ***************************** DEL_5MS: ;ЗАДЕРЖКА 5 МС ldi R25,27 d: ldi R24,255 d1: dec R24 brne d1 dec R25 brne d ret
;****** Подпрограмма формирования задержки ***************************** DEL_100us: ;ЗАДЕРЖКА 100 МКС ldi R25,125 d2: dec R25 brne d2 ret
;****** Подпрограмма формирования задержки ***************************** del200: ldi temp2, 5 d3: ser temp1 d4: ldi temp, 209 d5: dec temp brne d5 dec temp1 brne d4 dec temp2 brne d3 ret
;****** Во flash - памяти после программы размещаем постоянные данные ** .org $200 text0: .DB 168,112,111,180,112, 97,188,188,97 ;Программа
|
|
|
|
|
May 5 2010, 19:02
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(Prevan @ May 5 2010, 20:52)  Здравствуйте! Подкорректировал код с учётом задержек (руководствовался ДШ и примерами схожих программ). Программа компилируется и при запуске видно, как перебегают сигналы порта А, подключенного к ЖКИ, но дисплей по-прежнему ничего не отображает. По логике вещей, дело в последовательности установления битов RW, RS и Е, но просмотренный мною на несколько раз код явных ошибок не таит. Буду рад прочесть идеи, советы по направлению программы в рабочее русло... 1. Файл Mylib.inc и плиз в архиве , а не кодом 2. Какой LCD?
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
May 6 2010, 00:53
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 7-04-10
Пользователь №: 56 469

|
LCD LM016L (HD44780)
Прикрепленные файлы
MyLib.rar ( 1.16 килобайт )
Кол-во скачиваний: 15
|
|
|
|
|
May 26 2010, 17:30
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 7-04-10
Пользователь №: 56 469

|
Нашёл в интернете примеры инициализации и функций. Дисплей загорается и выводит строчки на экран. Чтобы сделать бегущую строку я после вывода каждого символа вызываю функцию задержки, а в конце главной программы main ставлю строчку "rjmp main". После запуска прогамма зависает. Не могу понять в каком месте программа зацикливается: CODE ;------------------------------------------------------------------------------------------
; подключаем файл .include "8515def.inc"
.equ LCDRS = 5 .equ LCDWR = 4 .equ LCDCLK = 3 .def temp1 = r17 ; Временные регистры .def temp2 = r18 ; ;------------------------------------------------------------------------------------------
reset: ldi r16,high(RAMEND); инициализация указателя стека out SPH, r16 ; ldi r16,low(RAMEND) ; out SPL, r16 ; ser r16 ; out DDRC, r16 ; устанавливает порт С на выход ldi r16, 0x30 ; устанавливает сигналы RS и RW out DDRC, r16 ; в LCD ldi r16, 0x08 ; устанавливает сигнал E out DDRD, r16 ; в LCD rcall lcd_init ; вызывает инициализацию дисплея
;------------------------------------------------------------------------------------------
lcd_init: rcall DEL_5MS ;Задержка 15 мс rcall DEL_5MS ; rcall DEL_5MS ; ldi r16, 0x38 ; определяет 8 разр. шину данных, 5х7 точек, 2 строки rcall lcd_cmd ; rcall DEL_5MS ;Задержка 5.4 нс ldi r16, 0x0C ; включить дисплей, показать курсор rcall lcd_cmd ; rcall DEL_5MS ;Задержка 5.4 нс ldi r16, 0x01 ; очистить дисплей, курсор в начальную позицию rcall lcd_cmd ; rcall DEL_5MS ;Задержка 5.4 нс ldi r16, 0x06 ; направление сдвига курсора вправо rcall lcd_cmd ; rcall DEL_100us ;Задержка 100 мкс ret
;------------------------------------------------------------------------------------------
lcd_prt: sbi PORTD, LCDCLK; устанавливает строб E sbi PORTC, LCDRS ; устанавливает RS=1 (передаются данные) out PORTA, r16 ; записывает данные в порт А cbi PORTD, LCDCLK; сбрасывает строб Е rjmp lcd_wait ; вызывает подпрограмму чтения BUSY флага LCD ret
;------------------------------------------------------------------------------------------
lcd_cmd: sbi PORTD, LCDCLK; устанавливает строб E cbi PORTC, LCDRS ; устанавливает RS=0 (передаются команды) out PORTA, r16 ; записывает команды в порт А cbi PORTD, LCDCLK; сбрасывает строб Е rjmp lcd_wait ; вызывает подпрограмму чтения BUSY флага LCD ret
;------------------------------------------------------------------------------------------
lcd_wait: cbi PORTC, LCDRS ; устанавливает RS=0 (передаются команды) sbi PORTC, LCDWR ; устанавливает RW (чтение) sbi PORTD, LCDCLK; устанавливает строб E clr r16 ; out DDRA, r16 ; устанавливает порт данных на вход out PINA, r16 ; очищает данные PINA in r16, PINA ; записывает адрес BUSY флага cbi PORTD, LCDCLK; сбрасывает строб Е push r16 ser r16 ; out DDRA, r16 ; установить порт А на вывод cbi PORTC, LCDWR ; сбросить RW снова pop r16 sbrc r16, 7 ; если BUSY флаг пуст - вернуться (LCD не готов) rjmp lcd_wait ; если нет - ждать готовности LCD ret
;****** Подпрограмма формирования задержки ***************************** DEL_5MS: ;ЗАДЕРЖКА 5 МС ldi R25,27 d: ldi R24,255 d1: dec R24 brne d1 dec R25 brne d ret
;****** Подпрограмма формирования задержки ***************************** DEL_100us: ;ЗАДЕРЖКА 100 МКС ldi R25,125 d2: dec R25 brne d2 ret
;****** Подпрограмма формирования задержки ***************************** del200: ldi temp2, 5 d3: ser temp1 d4: ldi R16, 209 d5: dec R16 brne d5 dec temp1 brne d4 dec temp2 brne d3 ret ;------------------------------------------------------------------------------------------
main: ldi r16, 0x00|0x80 ; помещает курсор в 1ю строку, первый символ rcall lcd_cmd ; String1 ldi r16, 'S' rcall lcd_prt rcall del200 ldi r16, 't' rcall lcd_prt rcall del200 ldi r16, 'r' rcall lcd_prt rcall del200 ldi r16, 'i' rcall lcd_prt rcall del200 ldi r16, 'n' rcall lcd_prt rcall del200 ldi r16, 'g' rcall lcd_prt rcall del200 ldi r16, '1' rcall lcd_prt
ldi r16, 0x40|0x80 ; помещает курсор во 2ю строку, второй символ rcall lcd_cmd ; String2 ldi r16, 'S' rcall lcd_prt rcall del200 ldi r16, 't' rcall lcd_prt rcall del200 ldi r16, 'r' rcall lcd_prt rcall del200 ldi r16, 'i' rcall lcd_prt rcall del200 ldi r16, 'n' rcall lcd_prt rcall del200 ldi r16, 'g' rcall lcd_prt rcall del200 ldi r16, '2' rcall lcd_prt rjmp main
Сообщение отредактировал Prevan - May 26 2010, 17:31
|
|
|
|
|
Jun 3 2010, 11:05
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 7-04-10
Пользователь №: 56 469

|
akl, я скачивал пример по этой ссылке, пробовал собрать к нему схему в протеусе, чтобы запустить и потом переделать в свою работу. Пример сразу не запустился. Так как только начинаю программировать для AVR, с ошибками не смог разобраться. Сейчас пробую сделать программу, которая при нажатии на кнопку матричной клавиатуры выводит её код на LCD дисплей. В книге нашёл похожий пример. Собранная по примеру из книги схема запускается, работает согласно задуманному алгоритму, но у нее есть недостаток, заключающийся в том, что у меня по-другому подключены порты: Пример: У меня: PС(0..7) PA(0..7) PD0 PD4 PD1 PD5 PD(4..7) PC(0..3) PA5 PC5 PA6 PC4 PA7 PD3 Пример: CODE ;****************************************************** .include "8515def.inc" ;файл определений AT90S8515 .def temp=r16 ;временная переменная .def cols=r18 ;номер сканируемого ряда ;клавиатуры .def rots=r21 ;номер строки клавиатуры .def key=r19 ;номер кнопки .def scancod=r20 ;сканирующий код .def lcd=r22 ;регистр LCD (ЖК-дисплея) .def count_lcd=r23 ;счетчик выводимых символов ;на LCD ;Разряды порта РА для управления LCD .equ rs=5 ; (RS=1) - данные, (RS=0) - команды .equ rw=6 ; (RW=1) - чтение LCD, (RW=0) - запись в LCD .equ e=7 ;строб сигналов на шине команды/данные
.org $000 rjmp init .org $007 rjmp scankeys ;обработка клавиатуры
;Инициализация init: ldi temp,low(RAMEND) ;Инициализация out spl,temp ;указателя стека ldi temp,high(RAMEND) out sph,temp ;Инициализация портов ser temp out DDRA,temp ;порт РА на вывод out DDRC,temp ;порт РC на вывод ldi temp,$0F ;линии порта PD0-PD3 на вывод, out DDRD,temp ;PD4-PD7 на ввод ldi temp,$F0 out PORTD,temp ;Инициализация таймера 0 ldi temp,$05 out TCCR0,temp ;коэффициент деления 1024 ldi temp, (1<<TOIE0) out TIMSK, temp ;разрешение прерываний от таймера ;Инициализация ЖК-дисплея rcall delay2ms ldi lcd,$38 ;8-битовый режим вывода, rcall lcdcom ;2 строки, шрифт 5х7 ldi lcd,$06 ;Направление сдвига курсора вправо, без сдвига дисплея rcall lcdcom ldi lcd,$0C ;включить дисплей rcall lcdcom ;погасить курсор ldi lcd,$01 ;Очистить дисплей и установить курсор в нулевую позицию rcall lcdcom rcall delay2ms ;Установка адреса буферной памяти для вывода верхней ;строки дисплея ldi lcd,$80 rcall lcdcom ldi count_lcd,12 ;вывод на верхнюю строку дисплея ldi zl,low(str_0*2) ldi zh,high(str_0*2) out0: lpm adiw zl,1 mov lcd,r0 rcall lcddat dec count_lcd brne out0 ;Установка адреса буферной памяти для вывода нижней строки ;дисплея ldi lcd,$C0 rcall lcdcom ldi count_lcd,17 sei ;разрешение прерываний loop: rjmp loop
;Подпрограмма обработки клавиатуры scankeys: clr key clr scancod ldi cols,2 sec scan: rol scancod ;формирование очередного скан-кода out PORTD,scancod ;вывод на клавиатуру clc ldi rots,4 in temp,PIND ;ввод состояния клавиатуры mm: rol temp brcc nn ;проверка замыкания кнопки rjmp press ;переход при замыкании (С=0) nn: inc key ;увеличение номера кнопки dec rots ;уменьшение номера строки brne mm dec cols ;уменьшение номера ряда brne scan press: cpi key,8 breq f1 ;выход при отсутствии замыканий rcall lcd_str_1 ;вывод на дисплей f1: reti
;Подпрограмма вывода значения клавиши на нижнюю строку ; дисплея lcd_str_1: dec count_lcd brne met ;При достижении конца строки обновить счетчик вывода на ;дисплей, очистить дисплей и установить курсор в нулевую позицию ldi count_lcd,16 ldi lcd,$01 rcall lcdcom rcall delay2ms ;Установка адреса буферной памяти на начало нижней строки ldi lcd,$C0 rcall lcdcom ;Определение символа клавиши по ее номеру и вывод на ;дисплей met: ldi zl,low(str_1*2) ldi zh,high(str_1*2) add zl,key brcc me2 inc zh me2: lpm mov lcd,r0 rcall lcddat ret
;Подпрограмма вывода на дисплей байта команды lcdcom: out PORTC,lcd ;вывод команды ldi temp,0x80 ;установка режима записи команд out PORTA,temp cbi PORTA,e ;фронт 1/0 строба rcall delay40us ret
;Подпрограмма вывода на дисплей байта данных lcddat: out PORTC,lcd ;вывод символа ldi temp,0xA0 ;установка режима записи данных out PORTA,temp cbi PORTA,e ;фронт 1/0 строба rcall delay40us ret
delay40us: ;задержака 40 мкс при Fclk - 3,69 МГц ldi r18,48 d0:dec r18 brne d0 ret
delay2ms: ;задержка 2 мс ldi r17,48 d1:rcall delay40us dec r17 brne d1 ret
;Текст сообщения для верхней строки дисплея str_0: .db 'K','E','Y','P','A','D',' ','+',' ','L','C','D' ;Обозначения клавиш, выводимые на нижнюю строку дисплй str_1: .db '/','x','-','+','9','6','3','=','8','5','2','0','7','4','1','*'
У меня: CODE ;****************************************************** .include "8515def.inc" ;файл определений AT90S8515 .def temp=r16 ;временная переменная .def cols=r18 ;номер сканируемого ряда ;клавиатуры .def rots=r21 ;номер строки клавиатуры .def key=r19 ;номер кнопки .def scancod=r20 ;сканирующий код .def lcd=r22 ;регистр LCD (ЖК-дисплея) .def count_lcd=r23 ;счетчик выводимых символов ;на LCD ;Разряды порта РА для управления LCD .equ rs=5 ; (RS=1) - данные, (RS=0) - команды .equ rw=4 ; (RW=1) - чтение LCD, (RW=0) - запись в LCD .equ e=3 ;строб сигналов на шине команды/данные
.org $000 rjmp init .org $007 rjmp scankeys ;обработка клавиатуры
;Инициализация init: ldi temp,low(RAMEND) ;Инициализация out spl,temp ;указателя стека ldi temp,high(RAMEND) out sph,temp ;Инициализация портов ser temp out DDRA,temp ;порт РА на вывод
out DDRC,0b00110000 ; конфигурируем биты 4, 5 порта C на вывод. out DDRD,e ; конфигурируем биты e порта D на вывод.
ldi temp,$30 ;линии порта PD4-PD5 на вывод, out DDRD,temp ldi temp,$F0 ;PC4-PC7 на ввод out PORTC,temp
;Инициализация таймера 0 ldi temp,$05 out TCCR0,temp ;коэффициент деления 1024 ldi temp, (1<<TOIE0) out TIMSK, temp ;разрешение прерываний от таймера ;Инициализация ЖК-дисплея rcall delay2ms ldi lcd,$38 ;8-битовый режим вывода, rcall lcdcom ;2 строки, шрифт 5х7 ldi lcd,$06 ;Направление сдвига курсора вправо, без сдвига дисплея rcall lcdcom ldi lcd,$0C ;включить дисплей rcall lcdcom ;погасить курсор ldi lcd,$01 ;Очистить дисплей и установить курсор в нулевую позицию rcall lcdcom rcall delay2ms ;Установка адреса буферной памяти для вывода верхней ;строки дисплея ldi lcd,$80 rcall lcdcom ldi count_lcd,12 ;вывод на верхнюю строку дисплея ldi zl,low(str_0*2) ldi zh,high(str_0*2) out0: lpm adiw zl,1 mov lcd,r0 rcall lcddat dec count_lcd brne out0 ;Установка адреса буферной памяти для вывода нижней строки ;дисплея ldi lcd,$C0 rcall lcdcom ldi count_lcd,17 sei ;разрешение прерываний loop: rjmp loop
;Подпрограмма обработки клавиатуры scankeys: clr key clr scancod ldi cols,2 sec scan: rol scancod ;формирование очередного скан-кода out PORTD,scancod ;вывод на клавиатуру clc ldi rots,4 in temp,PINC ;ввод состояния клавиатуры mm: rol temp brcc nn ;проверка замыкания кнопки rjmp press ;переход при замыкании (С=0) nn: inc key ;увеличение номера кнопки dec rots ;уменьшение номера строки brne mm dec cols ;уменьшение номера ряда brne scan press: cpi key,8 breq f1 ;выход при отсутствии замыканий rcall lcd_str_1 ;вывод на дисплей f1: reti
;Подпрограмма вывода значения клавиши на нижнюю строку ; дисплея lcd_str_1: dec count_lcd brne met ;При достижении конца строки обновить счетчик вывода на ;дисплей, очистить дисплей и установить курсор в нулевую позицию ldi count_lcd,16 ldi lcd,$01 rcall lcdcom rcall delay2ms ;Установка адреса буферной памяти на начало нижней строки ldi lcd,$C0 rcall lcdcom ;Определение символа клавиши по ее номеру и вывод на ;дисплей met: ldi zl,low(str_1*2) ldi zh,high(str_1*2) add zl,key brcc me2 inc zh me2: lpm mov lcd,r0 rcall lcddat ret
;Подпрограмма вывода на дисплей байта команды lcdcom: out PORTA,lcd ;вывод команды ldi temp,0x04 ;установка режима записи команд out PORTD,temp cbi PORTD,e ;фронт 1/0 строба rcall delay40us ret
;Подпрограмма вывода на дисплей байта данных lcddat: out PORTA,lcd ;вывод символа
ldi temp,0x20 ;установка режима записи данных out PORTC,temp ldi temp,0x04 ;установка режима записи данных out PORTD,temp
cbi PORTD,e ;фронт 1/0 строба rcall delay40us ret
delay40us: ;задержака 40 мкс при Fclk - 3,69 МГц ldi r18,48 d0:dec r18 brne d0 ret
delay2ms: ;задержка 2 мс ldi r17,48 d1:rcall delay40us dec r17 brne d1 ret
;Текст сообщения для верхней строки дисплея str_0: .db 'K','E','Y','P','A','D',' ','+',' ','L','C','D' ;Обозначения клавиш, выводимые на нижнюю строку дисплй str_1: .db '/','x','-','+','9','6','3','=','8','5','2','0','7','4','1','*'
моя программа запускается, ошибок не выдаёт, но и не работает.
Сообщение отредактировал Prevan - Jun 3 2010, 11:06
Эскизы прикрепленных изображений
Прикрепленные файлы
___.rar ( 55.35 килобайт )
Кол-во скачиваний: 10
______.rar ( 80.86 килобайт )
Кол-во скачиваний: 13
|
|
|
|
|
Jun 3 2010, 23:48
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 7-04-10
Пользователь №: 56 469

|
Цитата(ILYAUL @ Jun 4 2010, 03:40)  Код out DDRD,e ; конфигурируем биты e порта D на вывод. ldi temp,$30 ;линии порта PD4-PD5 на вывод, out DDRD,temp Объясните зачем это - сначала 3 и тут же 48. Так надо? Ну да, тут можно было сразу задать: ldi temp,$38 ;линии порта PD4-PD5 на вывод (0011 1000), out DDRD,temp но мне кажется проблема не в этом
|
|
|
|
|
Jun 4 2010, 21:17
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата(Prevan @ Jun 4 2010, 03:48)  но мне кажется проблема не в этом {e } у Вас равен 3 , в какой бы системе это не было , но 3 всегда 3 т.е 0000 0011 , а сие значит что на "выход" вы установили PD0 & PD1, но Вам это "показалась" мало и Вы переконфигурировали порт DDRD на 48 или $30 или 0011 0000 т.е теперь выход стал PD4 PD5 , а PD0 и PD1 стали входами. Зачем Вы конфигурировали первое. А в итоге Вы пишите, что надо оказывается Цитата ldi temp,$38 ;линии порта PD4-PD5 на вывод (0011 1000), Зачем PD3 выход?
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Jun 5 2010, 02:26
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 7-04-10
Пользователь №: 56 469

|
Цитата(ILYAUL @ Jun 5 2010, 04:17)  {e } у Вас равен 3 , в какой бы системе это не было , но 3 всегда 3 т.е 0000 0011 , а сие значит что на "выход" вы установили PD0 & PD1, но Вам это "показалась" мало и Вы переконфигурировали порт DDRD на 48 или $30 или 0011 0000 т.е теперь выход стал PD4 PD5 , а PD0 и PD1 стали входами. Зачем Вы конфигурировали первое. А в итоге Вы пишите, что надо оказывается Зачем PD3 выход? С замечанием согласен по поводу конфигураций DDRD. Только {e } = 3 я так понял это просто присваивается имя четвертой ножке порта. И если я пишу к примеру: sbi DDRD,e ; установить бит 3 порта D в «1» Программу с матричной клавиатурой подкорректировал согласно замечаниям, получил: CODE
;****************************************************** .include "8515def.inc" ;файл определений AT90S8515 .def temp=r16 ;временная переменная .def cols=r18 ;номер сканируемого ряда ;клавиатуры .def rots=r21 ;номер строки клавиатуры .def key=r19 ;номер кнопки .def scancod=r20 ;сканирующий код .def lcd=r22 ;регистр LCD (ЖК-дисплея) .def count_lcd=r23 ;счетчик выводимых символов ;на LCD .equ rs=5 ; (RS=1) - данные, (RS=0) - команды .equ rw=4 ; (RW=1) - чтение LCD, (RW=0) - запись в LCD .equ e=3 ;строб сигналов на шине команды/данные
.org $000 rjmp init .org $007 rjmp scankeys ;обработка клавиатуры
;Инициализация init: ldi temp,low(RAMEND) ;Инициализация out spl,temp ;указателя стека ldi temp,high(RAMEND) out sph,temp ;Инициализация портов ser temp out DDRA,temp ;порт РА на вывод ldi temp,$30 out DDRC,temp ; конфигурируем биты 4, 5 порта C на
вывод. ldi temp,$38 ;линии порта PD4-PD5 на вывод, out DDRD,temp ldi temp,$0F ;PC0-PC3 на ввод out PORTC,temp
;Инициализация таймера 0 ldi temp,$05 out TCCR0,temp ;коэффициент деления 1024 ldi temp, (1<<TOIE0) out TIMSK, temp ;разрешение прерываний от таймера ;Инициализация ЖК-дисплея rcall delay2ms ldi lcd,$38 ;8-битовый режим вывода, rcall lcdcom ;2 строки, шрифт 5х7 ldi lcd,$06 ;Направление сдвига курсора вправо, без сдвига дисплея rcall lcdcom ldi lcd,$0C ;включить дисплей rcall lcdcom ;погасить курсор ldi lcd,$01 ;Очистить дисплей и установить курсор в нулевую позицию rcall lcdcom rcall delay2ms ;Установка адреса буферной памяти для вывода верхней ;строки дисплея ldi lcd,$80 rcall lcdcom ldi count_lcd,12 ;вывод на верхнюю строку дисплея ldi zl,low(str_0*2) ldi zh,high(str_0*2) out0: lpm adiw zl,1 mov lcd,r0 rcall lcddat dec count_lcd brne out0 ;Установка адреса буферной памяти для вывода нижней строки ;дисплея ldi lcd,$C0 rcall lcdcom ldi count_lcd,17 sei ;разрешение прерываний loop: rjmp loop
;Подпрограмма обработки клавиатуры scankeys: clr key clr scancod ldi cols,2 sec scan: rol scancod ;формирование очередного скан-кода out PORTD,scancod ;вывод на клавиатуру clc ldi rots,4 in temp,PINC ;ввод состояния клавиатуры mm: rol temp brcc nn ;проверка замыкания кнопки rjmp press ;переход при замыкании (С=0) nn: inc key ;увеличение номера кнопки dec rots ;уменьшение номера строки brne mm dec cols ;уменьшение номера ряда brne scan press: cpi key,8 breq f1 ;выход при отсутствии замыканий rcall lcd_str_1 ;вывод на дисплей f1: reti
;Подпрограмма вывода значения клавиши на нижнюю строку ; дисплея lcd_str_1: dec count_lcd brne met ;При достижении конца строки обновить счетчик вывода на ;дисплей, очистить дисплей и установить курсор в нулевую позицию ldi count_lcd,16 ldi lcd,$01 rcall lcdcom rcall delay2ms ;Установка адреса буферной памяти на начало нижней строки ldi lcd,$C0 rcall lcdcom ;Определение символа клавиши по ее номеру и вывод на ;дисплей met: ldi zl,low(str_1*2) ldi zh,high(str_1*2) add zl,key brcc me2 inc zh me2: lpm mov lcd,r0 rcall lcddat ret
;Подпрограмма вывода на дисплей байта команды lcdcom: out PORTA,lcd ;вывод команды ldi temp,0x08 ;установка режима записи команд out PORTD,temp cbi PORTD,e ;фронт 1/0 строба rcall delay40us ret
;Подпрограмма вывода на дисплей байта данных lcddat: out PORTA,lcd ;вывод символа
ldi temp,0x20 ;установка режима записи данных out PORTC,temp ldi temp,0x08 ;установка режима записи данных out PORTD,temp
cbi PORTD,e ;фронт 1/0 строба rcall delay40us ret
delay40us: ;задержака 40 мкс при Fclk - 3,69 МГц ldi r18,48 d0:dec r18 brne d0 ret
delay2ms: ;задержка 2 мс ldi r17,48 d1:rcall delay40us dec r17 brne d1 ret
;Текст сообщения для верхней строки дисплея str_0: .db 'K','E','Y','P','A','D',' ','+',' ','L','C','D' ;Обозначения клавиш, выводимые на нижнюю строку дисплй str_1: .db '/','x','-','+','9','6','3','=','8','5','2','0','7','4','1','*'
При запуске программа ошибок не выдает, но на дисплей сразу без нажатия на любую кнопку клавиатуры выводит первую строку и ещё несколько символов, которые заполняют первую строку до конца (и продолжила бы заполнять, если бы дисплей был больше). На нажатия кнопок программа никак не реагирует.
Сообщение отредактировал Prevan - Jun 5 2010, 02:27
Эскизы прикрепленных изображений
|
|
|
|
|
Jun 7 2010, 03:41
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 7-04-10
Пользователь №: 56 469

|
Цитата(ILYAUL @ Jun 6 2010, 20:46)  Можно всё таки вкладывать код в архиве так сложно его считывать
Прикрепленные файлы
______.rar ( 80.53 килобайт )
Кол-во скачиваний: 15
|
|
|
|
|
Jun 11 2010, 10:18
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 7-04-10
Пользователь №: 56 469

|
Ещё раз здравствуйте! По-прежнему пытаю микроконтроллер, а именно SPI интерфейс. Пытаюсь считать данные с АЦП и передать их на ЦАП. Не знаю как запустить регулятор напряжения.
Эскизы прикрепленных изображений
Прикрепленные файлы
SPI.rar ( 49.02 килобайт )
Кол-во скачиваний: 10
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|