|
Avr90s8515, программа не работает |
|
|
|
Apr 7 2010, 11:38
|
Участник

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

|
Доброго времени суток! Возник вопрос, связанный с реализацией на МК 8515 программы, которая через порт А выполняет чтение данных с буфера (например число 11110000), а затем производит запись в регистр этого числа. В схеме используется дешифратор адреса на базе микросхемы 74ALS155, который осуществляет выбор через ножки МК (PС6 и PС7) буфера или регистра. Суть микросхемы заключатеся в том, чтобы считать значения с задатчиков (число 11110000) и выдать их на светодиоды (первые четыре включены, остальные выключены). При запуске в протеусе сама схема, кроме МК работает правильно. МК осуществляет управление дешифраторам неправильно (ножки МК PС6 и PС7 - выбор микросхемы, ножки PD6 и PD7 - стробирующие сигналы дешифратора). Код программы: Код ;************************************************* ********************** ; Программ один раз в секунду считывает данные с входов и выводит их ;без изменений на выходы. ;************************************************* ********************** .include "c:\8515def.inc"; Подключение внешней библиотеки с описанием ; символических имен и определением адресов ; регистров микроконтроллера .cseg .org 0 rjmp init; Вектор прерывания по включению питания, .org $0d;
.def inl = r3; Данные получаемые с входов .def inh = r4; .def outl = r5; Данные на выходы .def outh = r6; .def temp = r16; Временные регистры .def temp1 = r17; .def temp2 = r18; ; имен портов и подпрограммами ;****** Инициализация контроллера **************************************** ; выполняется при включении питания, сбросу RESET, или от ; сторожевого таймера ;************************************************* ************************ ;****** Чтение данных ***************************************** read_in: clr zl; Устанавливаем адрес первого буфера ldi zh, $80; ld inh, z; Читаем содержимое первого буфера ldi zh, $40; Устанавливаем адрес второго буфера ld inl, z; Читаем содержимое второго буфера ret
;****** Запись данных **************************************** write_out: clr zl; Устанавливаем адрес первого регистра ldi zh, $80; st z, outh; Записываем значения в первый регистр ldi zh, $40; Устанавливаем адрес второго регистра st z, outl; Запмисываем значения во второй регистр ret ;****** Формирование задержки 1с ************************************** delay1: ldi temp2, 25; d0: ser temp1; d1: ldi temp, 209; d2: dec temp; brne d2; dec temp1; brne d1; dec temp2; brne d0; ret; init: ;****** Инициализация МК ********************************** ldi temp, low(RAMEND); Инициализация указателя стека out SPL, temp; в конце внутреннего ОЗУ ldi temp, high(RAMEND); out SPH, temp; ldi temp, (1<<SRE); Разрешение работы с внешним ОЗУ out mcucr, temp; ;****** Основная программа *********************************************** main: rcall read_in; Вызов подпрограммы чтения данных mov outh, inh; mov outl, inl; rcall write_out; Вызов подпрограммы записи данных rcall delay1; Вызов подпрограммы формирования задержки 1с rjmp main;
Сообщение отредактировал rezident - May 29 2010, 00:59
Причина редактирования: Оформление цитаты исходника.
Эскизы прикрепленных изображений
|
|
|
|
|
 |
Ответов
|
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
|
|
|
|
Сообщений в этой теме
Prevan Avr90s8515 Apr 7 2010, 11:38 domowoj А зачем так много переключателей, зачем и к питани... Apr 7 2010, 17:45 ILYAUL Цитата(Prevan @ Apr 7 2010, 15:53) Доброг... Apr 7 2010, 20:12 ae_ 2 Prevan:
на схеме перепутаны сигналы чтения и зап... Apr 8 2010, 01:20 Prevan Проблему с МК решил путём подключения HEX исходник... Apr 8 2010, 01:49 777777 Микроконтроллеры придуманы для того, чтобы не став... Apr 8 2010, 04:15  Prevan Цитата(777777 @ Apr 8 2010, 11:30) Микрок... Apr 8 2010, 11:57 IgorKossak В схеме можно оставить только переключатели (матри... Apr 8 2010, 05:53 ILYAUL Цитата(Prevan @ Apr 7 2010, 15:53) Суть м... Apr 8 2010, 13:40 Prevan Цитата(ILYAUL @ Apr 8 2010, 20:55) У данн... Apr 8 2010, 15:13 Prevan А не знаете, можно ли код составить, не используя ... Apr 12 2010, 14:13 ILYAUL Цитата(Prevan @ Apr 12 2010, 18:28) А не ... Apr 12 2010, 16:14 ae_ Цитата(Prevan @ Apr 12 2010, 22:28) А не ... Apr 13 2010, 12:17 Prevan Ещё раз здравствуйте! Спасибо всем за помощь. ... Apr 20 2010, 15:50 ILYAUL Цитата(Prevan @ Apr 20 2010, 20:05) ........ Apr 20 2010, 19:19 domowoj Выдерживайте все времянки , рекомендованные в ДШ
и... Apr 20 2010, 19:08 Prevan Здравствуйте! Подкорректировал код с учётом за... May 5 2010, 16:52 ILYAUL Цитата(Prevan @ May 5 2010, 20:52) Здравс... May 5 2010, 19:02 Prevan LCD LM016L (HD44780) May 6 2010, 00:53 akl Здравствуйте. Непонятно чему верить- схеме, коду и... May 6 2010, 03:14 akl "...Дисплей загорается и выводит строчки на э... May 27 2010, 04:52 Prevan akl, я скачивал пример по этой ссылке, пробовал со... Jun 3 2010, 11:05 ILYAUL Кодout DDRD,e ; конфигурируем биты e порта ... Jun 3 2010, 20:40 Prevan Цитата(ILYAUL @ Jun 4 2010, 03:40) Кодout... Jun 3 2010, 23:48  ILYAUL Цитата(Prevan @ Jun 4 2010, 03:48) но мне... Jun 4 2010, 21:17   Prevan Цитата(ILYAUL @ Jun 5 2010, 04:17) {e } у... Jun 5 2010, 02:26 ILYAUL Можно всё таки вкладывать код в архиве так сложно... Jun 6 2010, 13:46 Prevan Цитата(ILYAUL @ Jun 6 2010, 20:46) Можно ... Jun 7 2010, 03:41 Prevan Ещё раз здравствуйте! По-прежнему пытаю микрок... Jun 11 2010, 10:18
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|