Ассемблер (ASM) для AVR в вопросах и ответах
Да просто проверить твой код на любой макетке. Свою я распаял 
- Реклама
- Сообщения: 38
- Зарегистрирован: Пн авг 01, 2011 21:59:21
просто мне кажется тут все таки дело в STK500, хотя для начала можно и на другой проверить, может зря раньше времени на нее "пальцем тычу"ploop писал(а):Да просто проверить твой код на любой макетке. Свою я распаял
У меня точно иссякли. Прога чистая.
Docendo discimus
Люди понимающие толк в ассемблере, помогите переделать исходник. Собрал чудо с этого сайта, но в программе нет синхронизации. поставил на вход INT0 оптопару пробую соеденить два исходника но никак не получается. Может кто то подсказать где косяки, или расписать по пунктам как это сделать.
- Вложения
-
- Stroka.rar
- (2.78 КБ) 156 скачиваний
Всем известно что любая микросхема работает на дыме, и если волшебный дым из неё вышел то она перестает работать.
Начал разбираться с АЦП (atmega8)
.cseg
.org 0
ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
ldi R16, 0b11111111
out DDRB,R16
qw:
ldi R16,0b11000000
out ADMUX,R16
ldi R16,0b11100111
sbi ADCSRA,ADSC
in R16,ADCL
in R17,ADCH
OUT portb,R16 ; вывод на portb
rjmp qw
на порт ничего не выводит (опорное внутреннее), что не так?
.cseg
.org 0
ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
ldi R16, 0b11111111
out DDRB,R16
qw:
ldi R16,0b11000000
out ADMUX,R16
ldi R16,0b11100111
sbi ADCSRA,ADSC
in R16,ADCL
in R17,ADCH
OUT portb,R16 ; вывод на portb
rjmp qw
на порт ничего не выводит (опорное внутреннее), что не так?
- Реклама
надо дождаться окончания преобраззования АЦП. а вы постоянно его перезапускаете.ciph писал(а):.... что не так?
Ставим плюсы: )
Подправил
.cseg
.org 0
ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
ldi R16, 0b11111111
out DDRB,R16
qw:
ldi R16,0b11000000
out ADMUX,R16
ldi R16,0b11100111
out ADCSRA,R16
we:
sbis ADCSRA,ADIF
rjmp we
in R16,ADCL
in R17,ADCH
OUT portb,R16 ; ìëàäøèå 8 áèò ðåçóëüòàòà âûâåñòè â portb
rjmp qw
.cseg
.org 0
ldi r16, low(RAMEND)
out SPL, r16
ldi r16, high(RAMEND)
out SPH, r16
ldi R16, 0b11111111
out DDRB,R16
qw:
ldi R16,0b11000000
out ADMUX,R16
ldi R16,0b11100111
out ADCSRA,R16
we:
sbis ADCSRA,ADIF
rjmp we
in R16,ADCL
in R17,ADCH
OUT portb,R16 ; ìëàäøèå 8 áèò ðåçóëüòàòà âûâåñòè â portb
rjmp qw
Доброго времени суток.
Вопрос по программированию.
Кусок кода взят из книги, для изучения алгоритма программы.
Меня интересует строчка "brne PC+2"
Что означает PC +2, иногда встречал +4 или +7.
Вопрос по программированию.
Кусок кода взят из книги, для изучения алгоритма программы.
Меня интересует строчка "brne PC+2"
Что означает PC +2, иногда встречал +4 или +7.
Start:
sbic PinD,0 ; Кнопка нажата?
rjmp Start ; Нет, остаемся в цикле
inc Counter ; Да, увеличиваем Counter на 1
cpi Counter,10 ; Counter = 10?
brne PC+2 ; Нет, пропускаем команду
clr Counter ; Да, сбрасываем Counter
ldi ZL,20 ; Устанавливаем ZL на R20
add ZL,digit ; Прибавляем Counter к ZL
Id temp,Z ; Считываем Rx в temp
out PortB,temp ; Выводим temp в порт В
rcall Debounce ; Вставляем требуемую задержку
ReleaseWait:
sbis PinD,0 ; Кнопка отпущена?
rjmp ReleaseWait ; Нет, остаемся в цикле
rcall Debounce ; Вставляем требуемую задержку
rjmp Start ; Да, возвращаемся к началу
[size=85]Я знаю немного, но то, что знаю, — знаю в совершенстве.[/size]
- Сообщения: 38
- Зарегистрирован: Пн авг 01, 2011 21:59:21
означает "если не равно то переходим на 2(4,7) строчки вперед" может быть еще с "-" например "-2","-5" значит на такое число строк назад!dave_elektrik писал(а): Меня интересует строчка "brne PC+2"
Что означает PC +2,, иногда встречал +4 или +7.
PC - текущее состояние программного счетчика, т.е. адрес выполняемой команды. От него и пляшем.
Docendo discimus
полностью согласен, добавлю.pyzhman писал(а):PC - текущее состояние программного счетчика, т.е. адрес выполняемой команды. От него и пляшем.
Чтобы проще запомнить PC - Program Counter (программный счетчик).
Ставим плюсы: )
И я добавлю: такую запись применяют, чтобы не загромождать код метками.
Работает, кстати, не на всех ассемблерах.
Работает, кстати, не на всех ассемблерах.
- Сообщения: 38
- Зарегистрирован: Пн авг 01, 2011 21:59:21
Всем огромное спасибо за ответы.
И еще последний вопросик,
Извиняюсь за нестандартные вопросы.
И еще последний вопросик,
как можно используя этот же алгоритм написать программу, если убрать сточку PC+2, используя метку? Прошу показать на примере. Я новичок в этом нелегком деле.ploop писал(а):Работает, кстати, не на всех ассемблерах.
Извиняюсь за нестандартные вопросы.
[size=85]Я знаю немного, но то, что знаю, — знаю в совершенстве.[/size]
dave_elektrik писал(а):как можно используя этот же алгоритм написать программу, если убрать сточку PC+2, используя метку? Прошу показать на примере.
Код: Выделить всё
cpi Counter,10 ; Counter = 10?
brne METKA1 ; Нет, пропускаем команду
clr Counter ; Да, сбрасываем Counter
METKA1: ldi ZL,20 ; Устанавливаем ZL на R20
Позволю себе позанудствовать на данную тему.
На мой взгляд, использование конструкций типа "РС+/-чего-то там" является полным выносом мозга, аргументы:
1. при внесении изменений в текст программы нужно пересчитывать это самое "чего-то там" и как следствие - дополнительный источник косяков и залипух
2. использование меток, особливо если им давать осмысленные имена, а не типа "label1", улучшает читаемость программы.
На мой взгляд, использование конструкций типа "РС+/-чего-то там" является полным выносом мозга, аргументы:
1. при внесении изменений в текст программы нужно пересчитывать это самое "чего-то там" и как следствие - дополнительный источник косяков и залипух
2. использование меток, особливо если им давать осмысленные имена, а не типа "label1", улучшает читаемость программы.
А вот и нет. Такие конструкции используются там, где между ними по определению ничего вставить нельзя. Например тупое ожидание флага. Ну пусть будет ожидание флага готовности EEPROM:
Ничего путного сюда не вставишь. С меткой выглядело бы так:
Согласитесь, первый код короче и нагляднее.
Код: Выделить всё
SBIC EECR,EEWE ; Ждем флага готовности
RJMP PC-1Код: Выделить всё
EE_WAIT:
SBIC EECR,EEWE ; Ждем флага готовности
RJMP EE_WAITВерно. Такие вещи удобны именно в маленьких циклах, чтобы не изобретать названия меток. Так что PC может быть +-1...3 максимум, ну в крайнем случае в пределах половины экрана редактора.
Спорить не буду, но мне ближе к сердцу - с метками. 
Да я бы сказал, что на половину экрана - уже извращение. В том смысле, что ассемблерный код очень часто приходится править, даже после простых конструкций приходят идеи, как их еще упростить/улучшить. Значит - редактировать.
Тут да, на 2-3 шага имеет смысл. Просто чтобы разгрузить код.
Я даже очень часто использую казалось бы не нужные макросы. Ну допустим вместо SBI led_port, led_bit (зажечь светодиод) делаю макрос led_on и led_off. И еще много часто встречающихся вещей в макросы вытаскиваю. Возможно, это затруднит понимание кода другим человеком, но самому писать становится на много удобнее.
Тут да, на 2-3 шага имеет смысл. Просто чтобы разгрузить код.
Я даже очень часто использую казалось бы не нужные макросы. Ну допустим вместо SBI led_port, led_bit (зажечь светодиод) делаю макрос led_on и led_off. И еще много часто встречающихся вещей в макросы вытаскиваю. Возможно, это затруднит понимание кода другим человеком, но самому писать становится на много удобнее.



