Ассемблер (ASM) для AVR в вопросах и ответах
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Перед получением результата нужно дождаться окончания преобразования АЦП:
adc_conv:
sbic ADCSRA, ADSC
rjmp adc_conv
У Вас результат читается сразу после запуска АЦП.
adc_conv:
sbic ADCSRA, ADSC
rjmp adc_conv
У Вас результат читается сразу после запуска АЦП.
- Реклама
- gauss
- Держит паяльник хвостом
- Сообщения: 920
- Зарегистрирован: Сб янв 16, 2010 15:34:57
- Откуда: Sevsk/Moscow
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Переписал код так, ничего не изменилось:
Код: Выделить всё
.def temp=R16
.def del=R17
.def del2=R18
.cseg
.org 0
ldi temp,high(RamEnd)
out SPH,temp
ldi temp,low(RamEnd)
out SPL,temp
ldi temp,0b00100000
out ADMUX,temp
ldi temp,255
out DDRB,temp
Loop:
ldi temp,0b11000111
out ADCSRA,temp
rcall Delay
in temp, ADCH
cpi temp, 192
brpl two
cpi temp, 128
brpl red
cpi temp, 64
brpl yellow
cpi temp, 0
brpl no
Cont:
ldi temp,0b11000111
out ADCSRA,temp
rjmp Loop
Delay:
ldi del,128
ldi del2,128
Loop1:
dec del
brne Loop1
dec del2
brne Loop1
ret
red:
ldi temp,0b00000001
out PortB,temp
rjmp Cont
yellow:
ldi temp,0b00000010
out PortB,temp
rjmp Cont
two:
ldi temp,0b00000011
out PortB,temp
rjmp Cont
no:
ldi temp,0
out PortB,temp
rjmp Cont
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А как проверяете? В железе или в протеусе, можно глянуть?
- gauss
- Держит паяльник хвостом
- Сообщения: 920
- Зарегистрирован: Сб янв 16, 2010 15:34:57
- Откуда: Sevsk/Moscow
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Проверяю в железе, сейчас смоделирую в протеусе
В протеусе работает точно так же, в чем ошибка?!

В протеусе работает точно так же, в чем ошибка?!
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
С таким подходом ошибок не избежать. Чесно говоря, такую программу даже читать не хочется - рябит в глазах. Я не представляю как можно в такой программе как-то ориентироваться? Там ошибка может на ошибке сидеть и ошибкой погонять а ты ничего не заметишь в этой мешанине. Отдели мух от котлет, сделай отступы - метки должны быть четко видны и отличаться от кода. Это минимально необходимые действия по поиску причин неработоспособности программы. Улучшить читаемость программы можно заменить некоторые участки программы на макроподстановки используя хотя-бы директиву DEFINE.
Соблюдение этих элементарных правил ускорит поиск ошибок раз в 20 если не больше.
Соблюдение этих элементарных правил ускорит поиск ошибок раз в 20 если не больше.
- Реклама
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Так давай глянем, где смотреть то, протеусопроект выложи хоть.gauss писал(а):Проверяю в железе, сейчас смоделирую в протеусе
В протеусе работает точно так же, в чем ошибка?!![]()
Убери задержку и поставь проверку бита готовности результата АЦП, что Я выше писал.
brpl по-моему тут совсем не катит, наверно лучше будет brlo и проверять в порядке нарастания, а не убывания.
- unalex
- Мучитель микросхем
- Сообщения: 424
- Зарегистрирован: Сб авг 25, 2007 22:02:05
- Откуда: Германия, Viernheim
Re: Ассемблер (ASM) для AVR в вопросах и ответах
тебе надо не флаг N а флаг C (если со знаком - S)
и естественно вместо brpl использовать brcc (перейти если С очищен) либо brcs(перейти если С установлен)C: Устанавливается если абсолютное значение K больше абсолютного значения Rd, в ином случае очищается
Коктейль "Рекурсивный": 20% спирта, 30% воды, 50% коктейля "Рекурсивный"...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Попытался написать прог. в asm editor, проверку на ошибки не проходит, а допереть не могу. Нуждаюсь в помощи знатоков.
.model flat, stdcall
option casemap :none
include \MASM32\INCLUDE\windows.inc
include \MASM32\INCLUDE\kernel32.inc
include \MASM32\INCLUDE\shell32.inc
include \MASM32\INCLUDE\masm32.inc
includelib \MASM32\LIB\kernel32.lib
includelib \MASM32\LIB\shell32.lib
includelib \MASM32\LIB\masm32.lib
; #########################################################################
.data
_a equ 52
_a1 equ 8
_b equ -48
_b1 equ 8
_c equ 12
_c1 equ -8
m1:
mul al, bl
PrintDec al
jno
cbw
PrintDec ax
ret
m1:
imul al, bl
PrintDec ah
jno al
cbw
PrintDec ax
ret
.code
start:
mov al,0
mov bl,0
mov al,_a
mov bl, _a1
call m1
mov al,_b
mov bl,_b1
call m1
mov al,_c
mov bl,_c1
call m1
invoke ExitProcess, 0
end start
Спойлер
.386.model flat, stdcall
option casemap :none
include \MASM32\INCLUDE\windows.inc
include \MASM32\INCLUDE\kernel32.inc
include \MASM32\INCLUDE\shell32.inc
include \MASM32\INCLUDE\masm32.inc
includelib \MASM32\LIB\kernel32.lib
includelib \MASM32\LIB\shell32.lib
includelib \MASM32\LIB\masm32.lib
; #########################################################################
.data
_a equ 52
_a1 equ 8
_b equ -48
_b1 equ 8
_c equ 12
_c1 equ -8
m1:
mul al, bl
PrintDec al
jno
cbw
PrintDec ax
ret
m1:
imul al, bl
PrintDec ah
jno al
cbw
PrintDec ax
ret
.code
start:
mov al,0
mov bl,0
mov al,_a
mov bl, _a1
call m1
mov al,_b
mov bl,_b1
call m1
mov al,_c
mov bl,_c1
call m1
invoke ExitProcess, 0
end start
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Причем тут 386, тема по AVR
Re: Ассемблер (ASM) для AVR в вопросах и ответах
.DSEG
Variables: .byte 3
Variables2: .byte 1
.CSEG
LDS R16, Variables
LDS R17, Variables+1
LDS R18, Variables+2
SUBI R16,(-1)
SUBI R17,(-2)
SUBI R18,(-1)
STS Variables,R16
STS Variables+1,R17
STS Variables+2,R18
Ребят немогу понять глупую вещь вот тут в коде LDS R16, Variables - загружаем в R16 старший байт по адресу Variables (двухбайтовый же ) соответственно тут LDS R17, Variables+1 сохраняем в R17 его младший байт а затем инкрементным адрес, но я немного не понимаю как он соображает что в первой строчке мы грузим старший байт а во второй младшей прошу разъяснить или это вообще не так работает?
Variables: .byte 3
Variables2: .byte 1
.CSEG
LDS R16, Variables
LDS R17, Variables+1
LDS R18, Variables+2
SUBI R16,(-1)
SUBI R17,(-2)
SUBI R18,(-1)
STS Variables,R16
STS Variables+1,R17
STS Variables+2,R18
Ребят немогу понять глупую вещь вот тут в коде LDS R16, Variables - загружаем в R16 старший байт по адресу Variables (двухбайтовый же ) соответственно тут LDS R17, Variables+1 сохраняем в R17 его младший байт а затем инкрементным адрес, но я немного не понимаю как он соображает что в первой строчке мы грузим старший байт а во второй младшей прошу разъяснить или это вообще не так работает?
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: Ассемблер (ASM) для AVR в вопросах и ответах
никак не соображает.
вы же сами объявили метку Variables как базовый адрес 3-х байт. У первого байта смещение относительно базового адреса Variables равно нулю, у второго - 1, у третьего - 2.
Что там из этих трех байт старшее, а что младшее решает только программист. С чего Вы вообще взяли, что он соображает где старший байт, а где младший?
И еще, если Выходите произвести математическую операцию с числом, представленным в виде нескольких 8-битных регистров, то математическую операцию сначала надо провести над первым регистром, далее с остальными регистрами, но уже учитывая флаг Carry (C) - флаг переноса.
вы же сами объявили метку Variables как базовый адрес 3-х байт. У первого байта смещение относительно базового адреса Variables равно нулю, у второго - 1, у третьего - 2.
Что там из этих трех байт старшее, а что младшее решает только программист. С чего Вы вообще взяли, что он соображает где старший байт, а где младший?
И еще, если Выходите произвести математическую операцию с числом, представленным в виде нескольких 8-битных регистров, то математическую операцию сначала надо провести над первым регистром, далее с остальными регистрами, но уже учитывая флаг Carry (C) - флаг переноса.
Ставим плюсы: )
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Помогите пожалуйста вот с чем - принимаю по USART байт. Все единицы (это в нормальном состоянии). как проверить его, на наличие хотя бы одного нуля, а потом в принятом виде выдать в порт В? Думаю, но что-то громоздко получается, может что попроще подскажете... МК - тини2313.
Лень - двигатель прогресса!
- pyzhman
- Друг Кота
- Сообщения: 7016
- Зарегистрирован: Вс июл 12, 2009 19:15:29
- Откуда: Ижевск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Код: Выделить всё
INC R16
BREQ m1Docendo discimus
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Спасибо, Попробую сейчас.
Лень - двигатель прогресса!
-
Alexeyslav
- Друг Кота
- Сообщения: 4550
- Зарегистрирован: Чт май 05, 2011 21:26:34
- Откуда: Украина, Славутич
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Инвертировать и проверить на ноль. Или же сразу непосредственно проверить на 255 - CPI R16, 255. убедившись перед этим что 1) байт принят, 2) нет ошибок приема.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
контроллер Tiny13, происходит такая штука. В описании ассемблера для avr команда ST reg,longreg+
пишу
авр студио ругается на последнюю строчку что какой-то invalid register.
но в datasheet нашел что надо наоборот, ST Z+, Rr
Написал так и перестало ругаться.
пишу
Код: Выделить всё
clr ZH
ldi ZL,0x60
st tmp,Z+но в datasheet нашел что надо наоборот, ST Z+, Rr
Написал так и перестало ругаться.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Если бы было написано
то и в первом случае на ругался. Разберитесь и почувствуете разницу между загрузкой регистра из памяти и запоминанием регистра в памяти.
Код: Выделить всё
LD tmp,Z+- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Другими словами, первым операндом идёт приёмник (то, куда записывается), вторым — источник (то, откуда инфа берётся). Это применительно не только к работе с памятью, но и к арифметическим и логическим операциям:
add R1, R2 — результат останется в R1. И т.д.
add R1, R2 — результат останется в R1. И т.д.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
изучаю по книге Д. Мортона , похоже там опечатка, правильно будет так?
Код: Выделить всё
st Z,r0 ; сохранить то, что было в r0 по адресу содержащемуся в Z
ld r0,Z ; загрузить в r0 то, что хранится в ячейке адрес которой был в Z- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Да.
Совет на будущее: доверяйте больше даташитам, а не переведенным книгам, написанным непонятно кем.
Совет на будущее: доверяйте больше даташитам, а не переведенным книгам, написанным непонятно кем.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]


