Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
mansoff
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн сен 24, 2007 10:36:54

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение mansoff »

16 - мега она для тестов, то есть на ней кошачить прототип, а потом подбирать железку по запросам программы.
Проект:
Для начала - просто часы, которые показывают время с точностью до минуты, ну и само собой настройка.
Управление обычными кнопками, тактовый генератор - часовой кварц :)
slavik.ksu
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение slavik.ksu »

что то прием идет не так как надо по UARTу. Использую Atmega8515, отлаживаю на STK500.
задача: мк принимает данные и в двоичном коде показывает их на восьми светодиодах. Данные посылаю через програмку “Terminal v1.9b”. число вроде отображает, но на PB4 всегда лог.1, то есть
посыл “1″ должен показать 00000001 но показывает 00010001
посыл “2″ должен показать 00000010 но показывает 00010010 и так далее..

обработчик прерывания простейший:
PriemZavershen:
in r16,UDR
out PortB,r16
reti
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение pyzhman »

Значит где-то перебиваете этот бит. Или железо.
Docendo discimus
slavik.ksu
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение slavik.ksu »

Что значит "перебиваете"?
В этом же обработчике пишу строчку ldi r16, 0b00000000 и вывод PB4 уже показывает правильно:
PriemZavershen:
in r16,UDR
ldi r16, 0b00000000
out PortB,r16
reti
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Engineer_Keen »

Данные в каком виде посылаются? Как символы или в HEX? Если второе, то похоже, только еще PB5 должен светиться.
slavik.ksu
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение slavik.ksu »

на сколько я понимаю данный посылаются как HEX код. пользусь програмкой “Terminal v1.9b”. Вы сами какой прогой посылаете данные, давайте я попробую вашей переслать данные? и в каком виде она посылет данные?
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Engineer_Keen »

Терминал 1.9 посылает данные как код, если их вводить в виде $01$02$03$FF, если ввести просто 123, то он выдаст их ASCII коды. В любом случае, как я говорил должен был бы гореть еще и PB5, так как код символа "1" - $31, т.е. 00110001.
slavik.ksu
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение slavik.ksu »

Спасибо! большое! уже шаг есть для меня!
да, странно, но PB5 все таки не горит! только 4ый.. но это пока для меня не столь важно.
Большое Спасибо!
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Engineer_Keen »

slavik.ksu писал(а):да, странно, но PB5 все таки не горит! только 4ый.. но это пока для меня не столь важно.

Пошлите $FF - должны все загореться.
slavik.ksu
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение slavik.ksu »

да все верно! все горят!
slavik.ksu
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение slavik.ksu »

Уважаемый Engineer_Keen, оказывается проблема не совсем решилась. У меня последний Светодиод постоянно моргал( как бы говорил устройство работает!). счас я это моргание убрал и гляжу то же самое с восьмым светодиодом: всегда выставляется лог.1 только в отдличие от PB4 здесь на PB7 выставляется лог.1 когда посылаешь и "1" и "$01" через Терминал1.9
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Engineer_Keen »

Не, ну тут гадать уже бесполезняк. Нужен код целиком и схема.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение pyzhman »

И я о том же.
Docendo discimus
slavik.ksu
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение slavik.ksu »

Код: Выделить всё

; выполняемые функции: через модуль UART от компьютера принимаем числа
; которые отображаются на  8 СИДах в двоичном коде.

.device   ATmega8515
.nolist
.include   "m8515def.inc"
.list

;================
; Объявления

.def temp = r16

; FLASH =======
.CSEG ; Кодовый сегмент

;====== Таблица векторов прерываний================

    .ORG 0x0000 ; RESET - Аппаратный сброс
      RJMP Init
     .ORG 0x0001 ; INT0 - External Interrupt0 Vector Address; Внешнее прерывание 0 ;
     RETI
     .ORG 0x0002 ; INT1 - External Interrupt1 Vector Address; Внешнее прерывание 1 ;
     RETI       ; Ничего не делаем, возвращаемся в основную программу
     .ORG 0x0003 ; ICP1 - Input Capture1 Interrupt Vector Address; Событие захват Таймера/Счетчика 1  ;
     RETI
     .ORG 0x0004 ; OC1A - Output Compare1A Interrupt Vector Address ;Событие "совпадение A" Таймера/Счетчика 1  ;
     RETI
     .ORG 0x0005 ; OC1B - Output Compare1B Interrupt Vector Address; Событие "совпадение B" Таймера/Счетчика 1  ;
     RETI
     .ORG 0x0006 ; OVF1 - Overflow1 Interrupt Vector Address; Переполнение Таймера/Счетчика 1  ;
     RETI
     .ORG 0x0007 ; OVF0 - Overflow0 Interrupt Vector Address; Переполнение Таймера/Счетчика 0  ;
     RETI
     .ORG 0x0008 ; SPI  - SPI Interrupt Vector Address; Передача данных по SPI завершена
     RETI
     .ORG 0x0009 ; URXC - UART Receive Complete Interrupt Vector Address; Прием данных по UART завершена
     rjmp PriemZavershen ; Переходим к обработчику прерывания
     .ORG 0x000a ; UDRE - UART Data Register Empty Interrupt Vector Address; Регистр данных UART пуст
     RETI
     .ORG 0x000b ; UTXC - UART Transmit Complete Interrupt Vector Address; Передача данных по UART завершен
      reti;
     .ORG 0x000c ; ACI  - Analog Comparator Interrupt Vector Address; Готов результат аналогового компаратора
     RETI
     
     .ORG 0x000d ; INT2  - External Interrupt2 Vector Address
     RETI
     .ORG 0x000e ; OC0 - Output Compare0 Interrupt Vector Address
     RETI
     .ORG 0x000f ; ERDY -  EEPROM Interrupt Vector Address
     RETI
     .ORG 0x0010 ; SPM - SPM complete Interrupt Vector Address
     RETI
     ;.ORG 0x0011 ; SPMR - SPM complete Interrupt Vector Address
    ; RETI

    ; .ORG INT_VECTORS_SIZE

;================ ; Конец таблицы векторов прерываний===

;============ Блок подпрограмм обработки прерываний ===========
PriemZavershen:
in temp,UDR
out PortB,temp
reti

;============ конец Блока подпрограмм обработки прерываний ===========

;=================== Основная программа ====
   Init:
;++++++++++++++ Сдержимое файла INITCORE.INC +++++++++++++++++++++++++
;==== Инициализация ядра: Память; Регистры; Стек =============
.include "INITCORE.inc"
;++++++++++++++ Конец Содержимого файла INITCORE.INC +++++++++++++++++

;======= Инициализация внутренних периферийных устройств:======
ldi temp , 0b11111111  ; определяем входы\выходы порта В,
out DDRB , temp        ; 1 делает вывод выходом, 0 - входом!
ldi temp , 0b00000000  ; определяем в\в порта D
out DDRD , temp

ldi temp , 0b11111111  ; включаем подтяжку (1) для входов порта В
out portB , temp       ; и задаем начальние состояния выходов
ldi temp , 0b00000000  ; то же самое для D
out portD , temp

ldi temp, 1<<RXEN|1<<RXCIE ; разрешаем прием и прерывание по приему по UART
out UCSRB, temp

ldi temp,25     ; задаем скорость UART = 9600
out UBRRL, temp

ldi r16, (1<<URSEL|1<<UCSZ0|1<<UCSZ1) ; 8-мибитный формат посылки
out UCSRC,r16
sei      ; глобально разрешаем прерывания!


;==== Коенц Инициализация внутренних периферийных устройств====

;======= Главный цикл =====

Start:
nop
rjmp Start



а схема даже не знаю как показать: пользуюсь отладочной платой STK500 , шлейфом PortB подключаю к светодиодам (LEDS), и перемычкой соединяю PD0 с RXD и PD1 с TXD ,то есть настраиваю UART на плате. Использую Atmega 8515.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Engineer_Keen »

Что в INITCORE.inc и на какой частоте работает МК? Должно быть 4МГц, судя по UBRRL=25...
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ploop »

Если послать $FF - все должны загореться, $00 - все потухнуть на portB. Это работает?
Только посылать не символы, а байты.
Если не получается послать байты, пошлите русскую "р" (эр) в кодировке win1251 её код будет 240 ($F0) или 11110000 в двоичной, т.е. должны загореться первые 4 светодиода.
slavik.ksu
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение slavik.ksu »

Engineer_Keen писал(а):Что в INITCORE.inc и на какой частоте работает МК? Должно быть 4МГц, судя по UBRRL=25...


да MK работает на 4МГц.

Код: Выделить всё

;++++++++++++++ Сдержимое файла INITCORE.INC +++++++++++++++++++++++++
;==== Инициализация ядра: Память; Регистры; Стек =============
;================= Инициализация Памяти ====
RAM_Flush: LDI ZL,Low(SRAM_START)  ; Адрес начала ОЗУ в индекс
           LDI ZH,High(SRAM_START)
           CLR R16                 ; Очищаем R16
Flush:     ST Z+,R16               ; Сохраняем 0 в ячейку памяти
           CPI ZH,High(RAMEND)     ; Достигли конца ОЗУ?
           BRNE Flush              ; Нет! Крутимся дальше!
                                 ; Старший байт достиг конца ОЗУ!!!
                           ; Заполняем оставшиеся 255 байт ОЗУ нулями.
         CPI ZL,Low(RAMEND)      ; Младший байт достиг конца ОЗУ?
           BRNE Flush              ; Нет! Крутимся дальше, до конца ОЗУ.
           ST Z , r16              ; Да? тогда очиаем последний адрес и выходим из цикла
         
;=============== Инициализация регистров ===
          ; Очищаем 32 индексных регистра R0-R31
         ldi ZL, 30 ; ZL есть регистр R30
           CLR ZH ; ZH есть регистр R31
           dec Zl
           st  Z,ZH
           BRNE PC-2

;================ Инициализация стека ======    
          LDI R16,Low(RAMEND) ; Обязательно!!!
           OUT SPL,R16
           LDI R16,High(RAMEND)
           OUT SPH,R16
         CLR R16
;++++++++++++++ Конец Содержимого файла INITCORE.INC +++++++++++++++++
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Engineer_Keen »

Тогда с точки зрения софта похоже все в порядке.
Если дописать (то что жирным)
ldi temp, 1<<RXEN|1<<RXCIE|1<<TXen
и
PriemZavershen:
in temp,UDR
out PortB,temp
out UDR,temp
reti

то при посылке байт сразу придет обратно, если приходит - проблема 99% в плате...
Последний раз редактировалось Engineer_Keen Чт дек 15, 2011 16:57:41, всего редактировалось 1 раз.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение ibiza11 »

а передаете из терминала на той же скорости? 9600?
Ставим плюсы: )
slavik.ksu
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Пн авг 01, 2011 21:59:21

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение slavik.ksu »

ploop писал(а):Если послать $FF - все должны загореться, $00 - все потухнуть на portB. Это работает?

не совсем, последний светодиод загорается при отправке $00 !

ploop писал(а):Только посылать не символы, а байты.

как это сделать? я пользуюсь програмкой “Terminal v1.9b”

ploop писал(а): Если не получается послать байты, пошлите русскую "р" (эр) в кодировке win1251 её код будет 240 ($F0) или 11110000 в двоичной, т.е. должны загореться первые 4 светодиода.


так верно!загорается первые четыре СИДа, но если отсылаю $0F загорается один первый и четыре последних 10001111 а должно быть 00001111
Последний раз редактировалось slavik.ksu Чт дек 15, 2011 17:24:11, всего редактировалось 2 раза.
Ответить

Вернуться в «AVR»