|
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
Причина редактирования: Оформление цитаты исходника.
Эскизы прикрепленных изображений
|
|
|
|
|
 |
Ответов
|
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
Эскизы прикрепленных изображений
|
|
|
|
Сообщений в этой теме
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 Prevan Нашёл в интернете примеры инициализации и функций.... May 26 2010, 17:30 akl "...Дисплей загорается и выводит строчки на э... May 27 2010, 04:52 Prevan akl, я скачивал пример по этой ссылке, пробовал со... Jun 3 2010, 11:05 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
|
|
|