Страница 111 из 400

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

Добавлено: Вт дек 13, 2011 19:15:51
mansoff
16 - мега она для тестов, то есть на ней кошачить прототип, а потом подбирать железку по запросам программы.
Проект:
Для начала - просто часы, которые показывают время с точностью до минуты, ну и само собой настройка.
Управление обычными кнопками, тактовый генератор - часовой кварц :)

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

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

обработчик прерывания простейший:
PriemZavershen:
in r16,UDR
out PortB,r16
reti

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

Добавлено: Чт дек 15, 2011 12:02:33
pyzhman
Значит где-то перебиваете этот бит. Или железо.

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

Добавлено: Чт дек 15, 2011 12:14:34
slavik.ksu
Что значит "перебиваете"?
В этом же обработчике пишу строчку ldi r16, 0b00000000 и вывод PB4 уже показывает правильно:
PriemZavershen:
in r16,UDR
ldi r16, 0b00000000
out PortB,r16
reti

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

Добавлено: Чт дек 15, 2011 12:22:01
Engineer_Keen
Данные в каком виде посылаются? Как символы или в HEX? Если второе, то похоже, только еще PB5 должен светиться.

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

Добавлено: Чт дек 15, 2011 12:31:39
slavik.ksu
на сколько я понимаю данный посылаются как HEX код. пользусь програмкой “Terminal v1.9b”. Вы сами какой прогой посылаете данные, давайте я попробую вашей переслать данные? и в каком виде она посылет данные?

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

Добавлено: Чт дек 15, 2011 12:46:54
Engineer_Keen
Терминал 1.9 посылает данные как код, если их вводить в виде $01$02$03$FF, если ввести просто 123, то он выдаст их ASCII коды. В любом случае, как я говорил должен был бы гореть еще и PB5, так как код символа "1" - $31, т.е. 00110001.

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

Добавлено: Чт дек 15, 2011 12:59:46
slavik.ksu
Спасибо! большое! уже шаг есть для меня!
да, странно, но PB5 все таки не горит! только 4ый.. но это пока для меня не столь важно.
Большое Спасибо!

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

Добавлено: Чт дек 15, 2011 13:13:00
Engineer_Keen
slavik.ksu писал(а):да, странно, но PB5 все таки не горит! только 4ый.. но это пока для меня не столь важно.
Пошлите $FF - должны все загореться.

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

Добавлено: Чт дек 15, 2011 13:25:08
slavik.ksu
да все верно! все горят!

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

Добавлено: Чт дек 15, 2011 14:59:45
slavik.ksu
Уважаемый Engineer_Keen, оказывается проблема не совсем решилась. У меня последний Светодиод постоянно моргал( как бы говорил устройство работает!). счас я это моргание убрал и гляжу то же самое с восьмым светодиодом: всегда выставляется лог.1 только в отдличие от PB4 здесь на PB7 выставляется лог.1 когда посылаешь и "1" и "$01" через Терминал1.9

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

Добавлено: Чт дек 15, 2011 15:35:13
Engineer_Keen
Не, ну тут гадать уже бесполезняк. Нужен код целиком и схема.

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

Добавлено: Чт дек 15, 2011 16:05:18
pyzhman
И я о том же.

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

Добавлено: Чт дек 15, 2011 16:08:40
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.

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

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

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

Добавлено: Чт дек 15, 2011 16:28:21
ploop
Если послать $FF - все должны загореться, $00 - все потухнуть на portB. Это работает?
Только посылать не символы, а байты.
Если не получается послать байты, пошлите русскую "р" (эр) в кодировке win1251 её код будет 240 ($F0) или 11110000 в двоичной, т.е. должны загореться первые 4 светодиода.

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

Добавлено: Чт дек 15, 2011 16:37:09
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 +++++++++++++++++

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

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

то при посылке байт сразу придет обратно, если приходит - проблема 99% в плате...

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

Добавлено: Чт дек 15, 2011 16:53:35
ibiza11
а передаете из терминала на той же скорости? 9600?

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

Добавлено: Чт дек 15, 2011 17:00:51
slavik.ksu
ploop писал(а):Если послать $FF - все должны загореться, $00 - все потухнуть на portB. Это работает?
не совсем, последний светодиод загорается при отправке $00 !
ploop писал(а):Только посылать не символы, а байты.
как это сделать? я пользуюсь програмкой “Terminal v1.9b”
ploop писал(а): Если не получается послать байты, пошлите русскую "р" (эр) в кодировке win1251 её код будет 240 ($F0) или 11110000 в двоичной, т.е. должны загореться первые 4 светодиода.
так верно!загорается первые четыре СИДа, но если отсылаю $0F загорается один первый и четыре последних 10001111 а должно быть 00001111