Добавлено: Чт дек 31, 2009 12:03:23
установил другую студию. все скомпилилось с первого раза.
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
Код: Выделить всё
def tmkey = r17 ; счетчик времени
def key = r18 ; сюда пишется код кнопки для сравнения
def keyold = r19 ;
;основной цикл
main
cpi key, (код кнопки 1 короткое нажатие)
rcall Kn1short ;
cpi key, (код кнопки 2 короткое нажатие)
rcall Kn2short
cpi key, (код кнопки 1 длинное нажатие)
rcall Kn1long
cpi key, (код кнопки 2 длинное нажатие)
rcall Kn2long
rjmp main
T0_OVF
push r16
in r16,sreg ;push sreg
in r16, pind ;читаем порт D
andi r16 ,0b00110000 ;обнуляем лишние pd
cpi keyold ,r16 ;сравниваем со старым кодом
mov keyold, r16 ;
brne K1
inc tmkey ;tmkey +1
;короткое
cpi keyold , 5 ; ~0,1 c
breq keyset
;длинное нажатие
cpi keyold , 50 ; ~1 c
brne keyend ;если равно то end
.....
.....
.....
rjmp keyset
K1:
clr tmkey
rjmp keyend
keyset:
mov key ,keyold
keyend:
out sreg,r16 ;Pop sreg
pop r16 ;pop R16
RETI
ARV я просмотрел ваши коды, честно признаюсь не совсем понял т.к вы пишите на Си ,а я на asm пишу не так давно,поэтому полностью не разобратся !!!!я, по-моему, вам советовал обратить внимание на мой алгоритм? или не вам? и автоповтор, и все прочее
вот что пришло в головухотя логичнее просто возвращать в нужный момент повторяемый код, да и все
Код: Выделить всё
autorpt: .byte 1 ; для интервала между повтором
;длинное нажатие
cpi keyold , 50 ; ~1 c
brne keyend ;если равно то end
lds r16, autorpt
sub Tmkey, r16 ; 50 - autorpt через сколько надо повторять
rjmp keyset
Код: Выделить всё
def tmkey = r17 ; счетчик времени
def key = r18 ; сюда пишется код кнопки для сравнения
def keyold = r19 ;
autorpt: .byte 1 ; для интервала между повтором
;основной цикл
main
ser key
Key1:
cpi key , 255
breq Key1
cpi key, (код кнопки 1 короткое нажатие)
rcall Kn1short ;
cpi key, (код кнопки 2 короткое нажатие)
rcall Kn2short
cpi key, (код кнопки 1 длинное нажатие)
rcall Kn1long
cpi key, (код кнопки 2 длинное нажатие)
rcall Kn2long
rjmp main
T0_OVF
push r16
in r16,sreg ;push sreg
in r16, pind ;читаем порт D
ori r16 ,0b00110000 ;уст в 1 лишних pd
cpi r16 ,255 ;
breq K1 ;если все 1 то clr
cpi keyold ,r16 ;сравниваем со старым кодом
mov keyold, r16 ;
brne K1 ;не совпад со старым кодом кнопки
inc tmkey ;tmkey +1
;короткое
cpi tmkey , 5 ; 0,1 c
brne keyend
mov key ,keyold
rjmp keyend
;длинное нажатие
cpi tmkey , 50 ; более 1 c
brne keyend ; если не равно то end
lds r16, autorpt
sub tmkey , r16 ; 50 - autorpt (0,3c)
ldi r16,0x80 ; 0b10000000
or r16,keyold ; r16 + KeySold = 80h + Keyold
mov key ,r16
rjmp keyend
K1:
clr tmkey ;0
; clr Keyold ;0
rjmp keyend
keyend:
out sreg,r16 ;Pop sreg
pop r16 ;pop R16
RETI
Код: Выделить всё
.equ RS=pb0Код: Выделить всё
sbi PORTB,0если используете нормальные хидеры (inc-файлы описаний микроконтроллеров), то все биты всех стандартных регистров там уже описаны:Cat Career писал(а):Народ, не подскажете как в атмеловском ассемблере присваивать имена битам порта? допустим чтобы не писать
sbi PORB, 0
а писать допустим
sbi RS
подразумевая под RS PORB, 0?
Код: Выделить всё
sbi PORTB, PB0AVR assembler 2 уже немножко научился понимать C-шный препроцессор, поэтому можно такCat Career писал(а):а писать допустим
sbi RS
подразумевая под RS PORB, 0?
Код: Выделить всё
#define RS PORTB,0
sbi RSЗадачку решил сам, вижу тут не очень хотят помогать чайникам(жаль).aleksasm писал(а):Просьба о помощи. Имеется фаил прошивки PIC12F675 в формате аsm, сколько не бьюсь никак не могу перекомпилировать в нех файл. Много разных конвертеров перепробовал, ерунда какая то получается. Помогите, я так понимаю спецу тут на 5 мин.
Тема называется "Ассемблер (ASM) для AVR в вопросах и ответах", при чем тут PIC?aleksasm писал(а):Задачку решил сам, вижу тут не очень хотят помогать чайникам(жаль).aleksasm писал(а):Просьба о помощи. Имеется фаил прошивки PIC12F675 в формате аsm, сколько не бьюсь никак не могу перекомпилировать в нех файл. Много разных конвертеров перепробовал, ерунда какая то получается. Помогите, я так понимаю спецу тут на 5 мин.
Ну так что, неужели никто не может ответить на мой вопрос? Ладно, переформулирую свой вопрос - можно ли сбросить/установить разряд в порте ввода/вывода, при этом указав номер рязряда через значение одного из регистров общего назначения. Ну например, сначала записываю в r16 число 4, а потом устанавливаю в 1 разряд PORTB под номером , при этом номер устанавливаемого рязряда должен взяться из r16.Savelek писал(а):Нужна помощь.
Только начинаю разбираться в ассемблере, возникла необходимость установить/сбросить не кокретный разряд порта ввода/вывода, а динамичный, то есть во время работы микроконтроллера номер разряда для сброса/установки изменяется. Ну например, есть у меня цикл, от 0 до 7, и надо поочередно установить каждый разряд PORTB, но ведь SBI не может использовать в качестве разряда для установки значение из регистра, или откуда либо еще, только заданное при компилляции число. Как же тогда быть?
_noise, спасибо за ссылку, то что нужно!_noise писал(а):Savelek, http://radiokot.ru/forum/viewtopic.php?t=20076 . С таблицей красиво. Не надо оверпостить, здесь не чат.
Ассемблер не может сам сделать то, что не поддерживается процессором. Ну а АТмеги не имеют команд, позволяющих обращаться к битам косвенно -- т.е. по номерам битов, хранящимся в регистрах. Вот к ОЗУ обращаться косвенно можно (команды вида LD Rn, X и т.п.) -- но это доступ к байтам, а не отдельным битам.Savelek писал(а):_noise, спасибо за ссылку, то что нужно!_noise писал(а):Savelek, http://radiokot.ru/forum/viewtopic.php?t=20076 . С таблицей красиво. Не надо оверпостить, здесь не чат.Правда я думал, что ассемблеру можно как-то сказать, чтобы он брал значение из регистра или еще откуда-то, но, видимо, так нельзя. Но ничего, так даже интереснее.
Ну не забывайте про родные логические операции.Savelek писал(а):Нужна помощь.
Только начинаю разбираться в ассемблере, возникла необходимость установить/сбросить не кокретный разряд порта ввода/вывода, а динамичный, то есть во время работы микроконтроллера номер разряда для сброса/установки изменяется. Ну например, есть у меня цикл, от 0 до 7, и надо поочередно установить каждый разряд PORTB, но ведь SBI не может использовать в качестве разряда для установки значение из регистра, или откуда либо еще, только заданное при компилляции число. Как же тогда быть?
Код: Выделить всё
in tmp, PORTX
; В tmp1 установлен бит, который надо установить в порте
or tmp, tmp1 ; лог И регистров
out PORTX, tmp
Извините пожалуйста за возможно глупый вопрос, но что случится, если сделать логическую операцию между двумя регистрами (т.е. двумя байтами)? Ну например логическое ИЛИ. Будут поочередно сравниваться одинаковые п осчету биты двух регистров? А результат? Результат сравнения запишется в первый из сравниваемых регистров?Pooher писал(а):Ну не забывайте про родные логические операции.Savelek писал(а):Нужна помощь.
Только начинаю разбираться в ассемблере, возникла необходимость установить/сбросить не кокретный разряд порта ввода/вывода, а динамичный, то есть во время работы микроконтроллера номер разряда для сброса/установки изменяется. Ну например, есть у меня цикл, от 0 до 7, и надо поочередно установить каждый разряд PORTB, но ведь SBI не может использовать в качестве разряда для установки значение из регистра, или откуда либо еще, только заданное при компилляции число. Как же тогда быть?
На пример:Код: Выделить всё
in tmp, PORTX ; В tmp1 установлен бит, который надо установить в порте or tmp, tmp1 ; лог И регистров out PORTX, tmp