реклама на сайте
подробности

 
 
> Avr90s8515, программа не работает
Prevan
сообщение Apr 7 2010, 11:38
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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
Причина редактирования: Оформление цитаты исходника.

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ILYAUL
сообщение Jun 3 2010, 20:40
Сообщение #2


Профессионал
*****

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



Код
out DDRD,e          ; конфигурируем биты e порта D на вывод.
ldi temp,$30        ;линии порта PD4-PD5 на вывод,
out DDRD,temp

Объясните зачем это - сначала 3 и тут же 48. Так надо?


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Prevan
сообщение Jun 3 2010, 23:48
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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
но мне кажется проблема не в этом
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Jun 4 2010, 21:17
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 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 выход?


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Prevan
сообщение Jun 5 2010, 02:26
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 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
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 21:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01459 секунд с 7
ELECTRONIX ©2004-2016