|
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
Причина редактирования: Оформление цитаты исходника.
Эскизы прикрепленных изображений
|
|
|
|
|
Apr 7 2010, 20:12
|

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

|
Цитата(Prevan @ Apr 7 2010, 15:53)  Доброго времени суток! Код программы: Я вижу , что Вы прочитали , что-то из памяти SRAM , поменяли регистры командой mov (не понятно зачем) и записали обратно по тем же адресам в память. ( выделено) И частоту процессора , плиз в студию. Может , конечно к регистрам портов ввода вывода в данной микросхеме надо обращаться только как к SRAM ? счас гляну DS Нет на месте , в области ввода вывода . Поэтому команды обычно IN и OUT
Сообщение отредактировал rezident - May 29 2010, 00:58
Причина редактирования: Нарушение п.3.4 Правил форума.
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Apr 8 2010, 01:49
|
Участник

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

|
Проблему с МК решил путём подключения HEX исходника вместо asm. Исправил переключатели. Частота процессора 1 МГц. Использование регистра с последовательным входом, как мне показалось, усложнит саму схему. Цитата(ae_ @ Apr 8 2010, 08:35)  2 Prevan: на схеме перепутаны сигналы чтения и записи первого буфера, надо поменять местами сигналы идущие к выводам U9(11) <-> U8(6) После того, как поменял местами эти сигналы, схема заработала правильно! Всем большое СПАСИБО
Сообщение отредактировал Prevan - Apr 8 2010, 01:50
Эскизы прикрепленных изображений
|
|
|
|
|
Apr 8 2010, 11:57
|
Участник

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

|
Цитата(777777 @ Apr 8 2010, 11:30)  Микроконтроллеры придуманы для того, чтобы не ставить мелкие микросхемы. Зачем, например, нужна микросхема U9 если на нее заходит 4 сигнала и выходит 4? Да и без U4-U7 можно было обойтись. В перспективе планируется расширение данной схемы. Я решил её собирать по частям (модулями), чтобы потом соединить их все вместе в одну схему. Насчёт U9 полностью согласен - можно было напрямую провода провести, а как можно без U4-U7 соединить в одну шину две группы диодов и задатчиков к ним, чтобы сигналы не налагались один на другой?
|
|
|
|
|
Apr 8 2010, 13:40
|

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

|
Цитата(Prevan @ Apr 7 2010, 15:53)  Суть микросхемы заключатеся в том, чтобы считать значения с задатчиков (число 11110000) и выдать их на светодиоды (первые четыре включены, остальные выключены). У данной микросхемы аж три порта ввода вывода. Один порт считывает , один выдает на светодиоды. Лишние здесь все микросхемы микросхемы Или сформулируйте , что Вы собственно хотите сделать, но если только то ,что Вы написали выше, то микроконтроллер в данной схеме -нонсенс
Сообщение отредактировал ILYAUL - Apr 8 2010, 13:45
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Apr 8 2010, 15:13
|
Участник

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

|
Цитата(ILYAUL @ Apr 8 2010, 20:55)  У данной микросхемы аж три порта ввода вывода. Один порт считывает , один выдает на светодиоды. Лишние здесь все микросхемы микросхемы Или сформулируйте , что Вы собственно хотите сделать, но если только то ,что Вы написали выше, то микроконтроллер в данной схеме -нонсенс "Суть микросхемы заключатеся в том, чтобы считать значения с задатчиков (число 11110000) и выдать их на светодиоды (первые четыре включены, остальные выключены)." - это только часть общей схемы. Полная схема задействует почти все выводы микроконтроллера и служит как раз для демонстрации работы с микроконтроллером. Задатчики и светодиоды - пример работы МК с портами ввода-вывода.
Сообщение отредактировал Prevan - Apr 8 2010, 15:16
|
|
|
|
|
Apr 12 2010, 14:13
|
Участник

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

|
А не знаете, можно ли код составить, не используя команды работы с внешней памятью?
|
|
|
|
|
Apr 13 2010, 12:17
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(Prevan @ Apr 12 2010, 22:28)  А не знаете, можно ли код составить, не используя команды работы с внешней памятью? Конечно можно: - Запретить использование External SRAM - обнулить бит SRE регистра MCUCR - самому конфигурировать каждый раз направление DDRA на input перед чтением данных с задатчиков, и DDRA на output перед записью во внешние регистры - самому выставлять старшую половину адреса на PORTC (PC6,PC7) для выбора буфера 1 или 2 - самому управлять сигналами PD6,PD7 (!WR, !RD) для чтения и записи из/в задатчиков/регистры - для чтения: in inh, PINA для записи: out PORTA, outh Если убрать дешифратор адреса и доп.инверторы, то можно подключить выводы записи регистров и выводы чтения задатчиков напрямую к контроллеру, будут задействованы те же 4 вывода, но управлять станет удобнее.
|
|
|
|
|
Apr 20 2010, 15:50
|
Участник

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

|
Ещё раз здравствуйте! Спасибо всем за помощь. Возник вопрос, связанный с программной частью МК, которая должна выводить бегущую строку на диплей. При запуске питание на микроконтроллер и на дисплей подаётся удачно, но требуемой задачи схема, приведённая ниже не выполняет (попросту говоря, дисплей вообще молчит). CODE .include "8515def.inc" ; Подключение внешней библиотеки с описанием ; символических имен и определением адресов ; регистров микроконтроллера .cseg ; CODE segment .org 0 ; rjmp init ; Вектор прерывания по включению питания, ; сбросу RESET или от сторожевого таймера .org $0d ; .include "MyLib.inc" ; Подключение файла с описанием символических ; имен портов и подпрограммами ;****** Инициализация контроллера **************************************** ;** выполняется при включении питания, сбросу RESET, или от ** ;** сторожевого таймера ** ;************************************************************************* init: ldi temp, low(RAMEND) ; Инициализация указателя стека out SPL, temp ; в конце внутреннего ОЗУ ldi temp, high(RAMEND); out SPH, temp ;
rcall Config_Port ; Вызов подпрограммы конфигурирования портов rcall Init_lcd ; Вызов подпрограммы инициализации ЖКИ ;****** Вывод в 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: ldi dat_lcd, 0b00001000 ; включить дисплей, выключить курсор rcall lcd_com ; rcall del40 ; ldi dat_lcd, 0b00110000 ; 8-битный интерфейс, 1-строка, шрифт-5х8 точек rcall lcd_com ; rcall del40 ; ldi dat_lcd, 0b00000110 ; Направление сдвига курсора вправо, rcall lcd_com ; запретить сдвиг дисплея вместе с курсором rcall del40 ; ldi dat_lcd, 0b00000001 ; Очистить дисплей и установить курсор в rcall lcd_com ; начальную позицию rcall del40 ; 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 ;****** Подпрограмма чтения 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 ;****** Подпрограмма формирования задержки ~40мкс ********************** del40: ldi temp, 53 d3: dec temp brne d3 ret ;****** Подпрограмма формирования задержки ***************************** del200: ldi temp2, 5 d0: ser temp1 d1: ldi temp, 209 d2: dec temp brne d2 dec temp1 brne d1 dec temp2 brne d0 ret ;****** Во flash - памяти после программы размещаем постоянные данные ** .org $200 text0: .DB 168,112,111,180,112, 97,188,188,97 ;Программа
Сообщение отредактировал rezident - Apr 20 2010, 15:52
Причина редактирования: Оформление цитаты.
Эскизы прикрепленных изображений
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|