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

компилятор

Добавлено: Чт фев 25, 2010 16:13:44
nikolenco
дайте пожалуйста компилятор для перевода asm в hex для avr все обыскал не где немогу найти

Добавлено: Чт фев 25, 2010 16:46:29
SII
Плохо искали. Что мешает скачать AVR Studio прямо с сайта производителя контроллеров, т.е. ATMEL?

Добавлено: Чт фев 25, 2010 19:17:41
Meteor
nikolenco, ну Вы "загадили" :shock: Уберите лишние посты.
Какие микроконтроллеры пользовать собрались? Если AVR, то как правильно сказали Вам туда и счастлиого пути.
Руководство к действию.
Скачиваем AVR Studio 4
Устанавливаем на компьютер (избегаем путей с русскими буквами)
Создаем проект.
Вставляем код из asm в проект (копируем).
Компилируем.
Наслаждаемся созданным хексом.

Добавлено: Пт фев 26, 2010 22:26:16
Esya
какой командой на асеме можно одновременно сбросить два пина порта ввода/вівода???
cbi portb ....... можно этой?? если да то как записать??

Добавлено: Сб фев 27, 2010 00:00:13
Esya
я разницу знаю между этими командами cbr работает с рон, а cbi с рвв,
cbr работает как логическая операция

Добавлено: Вт мар 02, 2010 23:56:22
DrunyaRuma
to Esya: прямой команды нет,нужно использовать конструкцию
"чиение-модификация-запись",например:

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

  in     r16,PORTD
  andi   r16,$45
  out    PORTD,r16

ATmega16: таймер

Добавлено: Ср мар 03, 2010 18:53:24
engel65536
Доброго времени суток, уважаемые форумчане. Недавно заинтересовался и начал изучать МК. В данный момент столкнулся с проблемой, причину и решение которой у меня найти не получается.
Я попробовал работать с таймерами по прерываниям, прерывания правильно отрабатываются, но вот частота срабатывания не совпадает с расчётной.
МК mega16, частота кварца 4 МГц, использую таймер T1 (16-битный), прерывание по переполнению, предделитель стоит на CLK/64. Итого частота срабатывания должна быть:
4000000/64/65536 = 0.95 Гц,
т.е. приблизительно должно происходить одно срабатывание в секунду. Однако период гораздо длинней - порядка 4 секунд (т.е. около 0.25 Гц). При каждом срабатывании инвертируется состояние светодиодов на выводах порта A.
В чём проблема - понять не могу... Если кто-то знает возможные причины и решения - буду благодарен за совет. Заранее спасибо за помощь.

Добавлено: Ср мар 03, 2010 19:04:01
Pooher
Скорее всего не правильно выставлены фьюзы.

Добавлено: Ср мар 03, 2010 19:06:26
Meteor
Согласен с Pooher'ом, скорее всего стоят настройки по умолчанию и тактируется частотой 1МГц

Добавлено: Пт мар 05, 2010 13:45:59
MTF
Всем Привет !!!!!

to Meteor Если помните недели две назад у меня были проблемы с RC5 , хотел фиксировать длительное и короткое нажатие кнопки , для того чтобы например при нажатии кнопки on off реле включилось и не выключалась даже если я передержал клавишу !!!!
пока инет не работал , пробовал разные варианты , вот один из последних....

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

scan: ;обработка RC5
      rcall  detect
      andi   command, 0x7F ;   обнулить 7 бит
      lds    r16, oldcommand  
      cp     r16, command     ;если 
      sts    oldcommand, r16
      brne   endscan1       
      ori    command, 0x80 ;  выставить  7 бит 
endscan1: 
ret 
применение

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

next:
     rcall scan
     cpi	 command,0b00000110	; on off  короткое 
     breq	 Key3			  
;     cpi	 command,0b10000110	; on off  длинное 
;     breq	 Key3			  
     rjmp   next

KEY1: rcall  KPlus           ;вызов процедуры нажатия +
          rjmp   next
KEY2: rcall  KMinus 
          rjmp   next
KEY3: rcall  KL 
          rjmp   next
KEY4: rcall  KL1 
........
........
    rjmp   next


KL: ;обработка  кнопки on off
            push  tmp 
	in    tmp , pinb
	sbrs  tmp, 3			
	rjmp  SET1			
	cbi	  OutPort,(6<<OutPin)  ;
	rjmp  ENDR			
SET1:
	sbi	  OutPort,(6<<OutPin)  ;
ENDR:
            pop  tmp 
ret

Вообщем ничего не получилось , при удержании все равно
переключает реле туда сюда????

Я так понял от управляющего бита походу нельзя отталкиваться для реализации длинного нажатия !!!

Может кто нибуть сказать в чем может быть дело и как правильно надо делать ????

Добавлено: Пт мар 05, 2010 13:57:09
GP1
Так и должно быть, у тебя ведь циклический опрос кнопок, а здесь нужно определять момент отпускания кнопки.
Предположим у нас девайс в положении ON, нажимаем и держим кнопку - фиксируется факт что нажата кнопка ON-OFF и ждем отпускания кнопки (т.е. когда значение прочитанного из порта изменится) и только после это переводим девайс в режим OFF.
Ну и аналогично для OFF.

Добавлено: Пт мар 05, 2010 14:37:26
MTF
Приветствую GP1!!!

это теперь не надо ????

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

scan: ;обработка RC5 
      rcall  detect 
      andi   command, 0x3F ;   обнулить 7 и 6 бит 
;      andi   command, 0x7F ;   обнулить 7 бит 
;      lds    r16, oldcommand  
;      cp     r16, command     ;если 
;      sts    oldcommand, r16 
;      brne   endscan1        
;      ori    command, 0x80 ;  выставить  7 бит 
;endscan1: 
ret
Не совсем понял , как ловить отпускание кнопки ????

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

KL: ;обработка  кнопки on off 
   push  tmp 
   lds   tmp oldcommand 
   cp    tmp , command 
   breq  ENDR  
   in    tmp , pinb 
   sbrs  tmp, 6          
   rjmp  SET1          
   cbi     OutPort,(6<<OutPin)  ; 
   rjmp  ENDR          
SET1: 
   sbi     OutPort,(6<<OutPin)  ; 
ENDR: 
            pop  tmp 
ret

в какой момент надо записывать oldcommand ???

Добавлено: Пт мар 05, 2010 14:42:42
GP1
Так уточним.
Ты пытаешься обработать код от пульта на ON-OFF?
Прием кода остается прежней, а вот сам код команды надо обработать чуть по-другому. Надо подумать.

Добавлено: Пт мар 05, 2010 14:49:21
MTF
Прием кода остается прежней
так нам нужен или нет
управляющий бит ???

Добавлено: Пт мар 05, 2010 14:51:19
GP1
Думаю пригодится.
Говорю же - надо подумать.
А тут мешают - столы накрывают :)))

Добавлено: Пт мар 05, 2010 19:39:07
Meteor
MTF,
введите переменные управления flag и времени time. тогда обработка будет выглядеть так:

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

control:
          sbrc flag, 2; Если уже обработали нажатие
          rjmp loop1;то не проверяем
          sbic  portd, knopka; Проверяем на уровень
          rjmp detected_time;Переходим к определению времени нажатия
loop1:
         sbis portd, knopka;
         rjmp strt_time;Переходим к запуску времени
exit_time:
         rcall delay;Задержка
         rjmp control;
;====
strt_time: ;проверяем флаг и устанавливаем начало отсчета
         sbrs flag,0; если флаг.0 =1, пропускаем очистку регистра
         clr time;
         cbr flag, 0x02;Убираем признак обработанного нажатия
         sbr flag,0x01;Ставим признак события "нажали"
         inc time;увеличиаем счетчик
         rjmp exit_control;
;====
time_ctrl: ;Проверяем время нажатия
         cbr flag,0x01; Сбросили флаг
         sbr flag, 0x02; Ставим флаг что обработали
         cpi time, var1; С чемто сравниваем
         brlo korotkoe; 
         .......; Чтото делаем с длительным нажатием
         .......
         rjmp exit_control;
korotkoe:   ;
          .....; Чтото делаем при краткоременном нажатии
          exit_control;
Подправил некоторые нюансы

Добавлено: Пт мар 05, 2010 22:45:25
MTF
To Meteor спасибо что откликнулись на мою проблему , я просто никак не могу дотумкать !!!!

код посмотрел только что то не пойму он похож для обработки кнопок расположенных на устройстве , или я что то не понял ???


с кнопками у меня проблем нет я их обрабатываю в прерывании T0 с частотой CK/256

сам таймер T0 работает CK/0 и CK/256
спасибо за помощь GP1 и _noise подсказали как сделать с 2 делениями !!!

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

    push  tmp
    in    tmp,sreg 
    push  tmp 
;============== CK/0 Hz Section =================
*************
*************
*************
    lds   tmp, tm2 
    inc   tmp 
    sts   tm2, tmp 
    tst   tmp 
    brne  tm0_exit 
;============== CK/256 Hz Section =================
    in     tmp, pind              ; читаем  порт  D 
    ori    tmp, 0b11001111  ;уст в 1 лишних pd 
    cpi    tmp, 0xff           ; 
    breq K1                  ;если все 1 то clr 
    cp     keyold ,tmp         ;сравниваем со старым кодом 
    mov  keyold, tmp         ;текущий код в keyold 
    brne  K1                  ;не совпад со старым кодом кнопки 
    inc    tmkey               ;tmkey +1 
;короткое 
    cpi   tmkey, 15   ;  0,1 c 
    brne  DL 
    mov   key, keyold 
    rjmp  keyend 
DL:
;длинное нажатие 
    cpi   tmkey , 50   ;  более 1 c 
    brne  keyend       ;  если не равно то end 
    lds   tmp, autorpt 
    sub   Tmkey, tmp   ; 50 - autorpt (0,3c)  
    ldi	  tmp, 0x80     ; 0b10000000
    or	  tmp, keyold   ; r16 + KeySold = 80h + Keyold 
    mov   key ,tmp
    rjmp  keyend 
K1:
    clr   tmkey               ;0
;   clr   Keyold              ;0
    rjmp  keyend         
keyend: 

**************
**************
tm0_exit:   
    pop   tmp 
    out   sreg,tmp	
    pop   tmp 
а вот с пульта RС5 никак не получается отличать длительное от короткого , за исходник взял Datasheet AVR410 , все бы ничего но не получается нажав на кнопку power пульта RC5 включить реле , еще раз нажать выключилась , проблема в том что если передержать нажатие на кнопку будет щелкать реле туда сюда , разбирались с GP1 вроде обещал подумать !!!

Добавлено: Пт мар 05, 2010 23:03:46
Meteor
MTF, какая половая разница какое воздействие отличать?
Я показал как работать с флагами. Думаю (читал посты Ваши и GP1) что он советует тоже самое. Конечно не слово в слово. Но суть одна, надо:
1) выделить 2 флага, один из которых будет соответстовать признаку начала, а второй признаку (GP1 прав на 100^100%) обработки "отпускания";
2) иметь процедуру запуска эталона времени;
3) иметь процедуру сравнения времени по наступлению события "отпустили";
4) иметь признак того что проведена операция распознавания отрезков времени.
Это все приведено примере. Вам остается только "перестроить" под себя.

Добавлено: Пт мар 05, 2010 23:43:19
MTF
Спасибо!!!! :beer: алгоритм с 2 флагами понятен попробую переделать..

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

Добавлено: Сб мар 13, 2010 20:36:01
poff
Уважаемые колеги, прошу Вашей помощи, поскольку сам, после трех бессонных ночей вошел в ступор, все идеи закончились..
Суть проблемы: Програмуля во вложенном файле выполняется только до первой метки - метка обозначена строкой из восьмерок в коментариях после точки с запятой.
Используется процессор MEGA8535 16PU. Таже програмуля переделанная под ATTINY2313 работает нормально. Для компиляции использую tavrasm.
Подскажите где грабли пожалуйста.. Заранее благодарен.