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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

YS писал(а):
Я схожу с ума, или глючит реальность? :shock:


Скорее глюки компилятора.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Сообщение YS »

Все, разобрался. Это глюк симулятора. В железе все работает. Не зря я всегда недолюбливал симуляторы...
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

Уважаемые коты!!! Необходимо проверить до загрузки в 16 разрядный таймер колличество тиков > или = могу ли я сделать это так ???
equ time = 35135
equ timemax = 65135

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

PowerPlus: 
   ldi XL,low(time)
   ldi XH,high(time)
   cpi X , timemax
brge exit
   ldi   tmp,low(time + 1000)   
   ldi   tmp1,high(time + 1000)   
   out    TCNT1H,tmp1   
   out    TCNT1L,tmp               
или как в идеале нужно просто прибавить 1000 без заноса в TCNT1
   ldi   XL,low(time + 1000 )               
   ldi   XH,high(time + 1000)            
   ?        X , 1000       ; каким оператором можно прибавить 1000  ???
exit:
ret

Вопрос если я изменил time +1000 то при следующем вызове подпрограммы time будет опять time 31135 ???
мне надо как то запоминать текущий time????
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

если у вас time определена как константа (а это следует из директивы equ), то вообще не понятно, что с чем и, главное, зачем сравнивать - константа всегда останется неизменной, можете смело ее заносить в таймер без всяких проверок.

кстати, сама по себе проверка двубайтного числа у вас все равно неправильно сделана.

если же подразумевалось, что time есть какая-то переменная (т.е. метка пары ячеек в ОЗУ), то тогда код вообще не в дугу - он работать не будет. и суммирование так же не будет работать. в общем, во всех с лучаях у вас не рабочий код :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

AVR попытаюсь обьяснить !!!!

для фазового управления симистором требуется импульс от 0 до 10мс ,
для этого используется таймер T1 режим CK
ты правильно понял !!! time это текущая задержка которая по идеи должна записываться в EPPROM, но я интересовался сколько раз можно записать в EEPROM на форуме
GP1 ответил
в EEPROM, согласно ДШ, 100000 циклов записи.

ну впринципе запаришся включать и выключать 100000 раз

time текущая задержка,
далее есть константы timemin , timemax минимальное и максимальное время задержки таймера
timenach начальная задержка для запуска с середины


сравнение нужно для того time было не меньше не больше при нажатии на кнопку + или -

Фишка в том что после включения еще до начала выхода на текущий режим считанный из EEPROM , запускать мотор со средних оборотов(~5 мс задержка таймера) и плавного уменьшения или увеличения до текущей мощности time !!!

начну с записи и чтения

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

запись time в eeprom  
  ldi     r16 ,0x10
  out    eear, r16
  ldi     r16 ,time
  out    eedr, r16
  sbi    eecr ,1
EW
  sbic    eecr ,1
  rjmp  EW
 

чтение time из eeprom
  idi     r16  , 0x10
  out    eear, r16
  sbi    eecr ,0
  in      r17 ,eedr
  cpi    r17 , timenach   
  далее необходимо сделать проверку



с однобайтным числом разобрался а с двух надо через X Y Z регистры но не пойму как ????
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

1. рекомендуется пускать движок с 25-30% мощности, меньше может не запуститься, больше - излишняя нагрузка.
2. т.к. в AVR-ках инструкций по работе с парными регистрами очень мало, оставь их в покое, все равно сравнение придется делать в "ручную", а парные регистры еще пригодятся для всяких там указателей.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

GP! ты прав мотор уверенно запускается где то с 1/3 мощности
с большим управлюющим импульсом разобрался переделал на BTA08
moc3051 все OK
вопрос : а если использовать T1 типа как 8 разрядный например прескаллер 256 в TCNT1H в старший сразу запишу 0xff (255), а в TCNT1L отсчет

вот пример
ldi r16,0xff
ldi r17,0x64
TCNT1H ,r16 ;255
TCNT1L , r17; 100
ldi r16 , 0b00000100 ; ck256
TCCR1B r16

время 9,9 мс


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

.equ powerstart  =0x50 ;   3,8 мс  
.equ powemax  = 0xFA 
.equ powermin  = 0x60
.equ   OutPort   =   PORTB
.equ   OutCntr   =   DDRB

reset
    ldi   tmp,low(ramend)      ;stack init SP=0xdf
    out   spl,tmp
    sbi   ACSR,ACD      ;Analog comparator off
    ser   tmp
    out   OutCntr,tmp
    clr   tmp
    out   OutPort,tmp
    ldi   tmp,(1<<ISC01)|(0<<ISC00)   
    out   MCUCR,tmp         ;INT0
    ldi   tmp,(1<<INT0)
    out   GIMSK,tmp
; установки для Т1
    ldi   tmp,0b00000000
    out   TCCR1B,tmp
загрузка стартого значения
    ldi  r16,0xff   
    ldi  r17, timestart   
    TCNT1H  ,r16  ;255
    TCNT1L , r17; 100 
; установка разрешений прерываний от таймеров
    clr   tmp
    ldi   tmp,(1<<TOV1)
    out   TIMSK,tmp
    clt            ;
; разр прерывание
    sei

основная программа
считываем из EEPROM текущий time
  idi     r16  , 0x10
  out    eear, r16
  sbi    eecr ,0
  in      r17 ,eedr
  cpi    r17 , timestart   
  brlo  min   
   
вот здесь встал в ступор ,??????

next:
вычисление , изменение мощности ,обработка кнопок   и тд
 
 rjmp next




допустим проверил оказалось меньше по идеи надо плавно уменьшить до текущего time никак не придумаю то ли надо через задержку по чуть чуть уменьшать значение timestart до time , либо где то хранить временные задержки ????????
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

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


reset:
 
sei

;основная программа 
;запуск мотора при включении считываем из EEPROM ,тупой вопрос: с какой ячейки можно  начинать??
  idi     r16  , 0x10 ;???
  out    eear, r16
  sbi    eecr ,0
  in      r17 ,eedr
как проверяется есть что в ячейки или нет???
;
  cpi    r17 ,     ; здесь надо проверить ,если пусто ничего не записано  то power = timepower 
  преход exit
;
 
  cpi    r17 , powerstart 
  brlo min

MAX:
   ldi     r16 , r17
ma01: 
   inc    r16
   cpi    r16 , power 
   brne  ma01
ret

MIN:
   ldi     r16 , r17
m01: 
   dec   r16
   cpi    r16 , power
   brne  m01
ret

exit:
   ldi  power, powerstart

next:


rjmp next




но что то это все быстро происходит а нужно плавно :?
попробую с задержкой перед dec inc
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

зачем использовать Т1 как 8-ми битный?
есть же Т0?
чтобы мотор плавно набирал/сбавлял обороты надо между изменениями значения вводить задержку

читать/писать в eeprom можно с любого адреса

ЗЫ: опять везде r16, r17..., а как же правила хорошего тона? :shock:
заведи себе одну переменную - power и храни в ней установленное значение мощности.
тебе еще понадобятся 3 конcтанты: power_start, power_min, power_max
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

таймер T0 занят


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

.include "tn2313def.inc" 

.def   tmp   =   r16
.def   tmp1   =   r17
.def   power   =   r18
.equ powerstart  =0x50 ;   3,8 мс 
.equ powemax  = 0xFA 
.equ powermin  = 0x60
.equ   OutPort   =   PORTB
.equ   OutCntr   =   DDRB

reset:
    ldi   tmp,0b00000000         
    out   TCCR1B,tmp 
    ldi  tmp,0xff   
    ldi  tmp1, powerstart   
    TCNT1H  ,tmp   ;255
    TCNT1L , tmp1  ; 100 
sei

;основная программа 
;запуск мотора при включении считываем из EEPROM ,тупой вопрос: с какой ячейки можно  начинать??
  idi     tmp  , 0x10 ;???
  out    eear, tmp
  sbi    eecr ,0
  in     power ,eedr

;как проверяется есть что в ячейки или нет???
 
;  здесь надо проверить ,если пусто ничего не записано  то выход
   переход  exit
;
 
  cpi    power , powerstart 
  brlo min

MAX:
   ldi     tmp , powerstart
ma01: 
   inc    tmp
   rjmp delay
   cpi    tmp , power 
   brne  ma01
ret

MIN:
   ldi     tmp , powerstart
m01: 
   rjmp delay
   dec   tmp
   cpi    tmp , power
   brne  m01
ret

exit:
   ldi  power, powerstart

next:
rjmp next


delay:           
   clr  tmp
m01:
   dec  tmp
   brne  m01
ret





exit :
ldi power, powerstart



я думаю что не надо ldi power, powerstart т.к если ничего нет то
powerstart уже прописан в TCNT1

GP1 поставил твою задержку которую ты тогда написал очень маленькая
ищу оператор и никак не найду подходящий для проверки EEPROM ??? я думаю надо проверять на наличие записи EEPROM вдруг ни чего не записано .
Последний раз редактировалось aleks_bmw528 Вт дек 08, 2009 13:29:18, всего редактировалось 1 раз.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

1. задержку надо выбирать из времени нарастания от power_start до power_max с учетом шага изменения мощности. Сделаешь слишком маленькую будет пролетать быстро, сделаешь большую - он у тебя пол-дня разгоняться будет.
к примеру
30%-старт
99%- макс
1% - шаг регулировки
tразгона - 3сек
задержка = 3сек/(99%-30%) - ~40мс на 1%

2. по умолчанию в eeprom во всех ячейках 0xFF. но если ты будешь при выключении сохранять значение power, то уже после первого выключения там будет твое значение power.

зы: на Т1 по переполнению с однобайтовыми переменными как-то не очень. ИМХО.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

я в принципе думал считать раздницу между powerstart и power
исходя из разницы высчитывать время но еще не придумал как


ну а если после совсем первого запуска я выдернул провод и не записал там же будет 0xFF правильно

in power ,eedr
cpi power , 0xFF
breq exit

все таки надо записывать в power powerstart
exit :
ldi power, powerstart
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

если хранить power в виде процентов, тогда все просто:
находишь разницу N, и запускаешь N раз цикл с задержкой 40мс (для моего примера) в котором переписывается значение в таймере.

power_start ты записываешь при старте программы в Т1, а уже после старта движка смотришь что там надо установить.
Последний раз редактировалось GP1 Вт дек 08, 2009 13:41:04, всего редактировалось 1 раз.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

EEPROM стирается после выключения питания
и прописывается 0xff ???
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

aleks_bmw528 писал(а):EEPROM стирается после выключения питания
и прописывается 0xff ???

eeprom - это по русски что-то типа "энергонезависимая электрически перезаписываемая память" (дословно не помню) т.е. после записи данные сохраняются и при вык. питании.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

GP1 алгоритм понятен но никак не пойму как реализовать
надо же сделать такую задержку как то не использую при этом таймер , можешь набросать начальный код ну ни как :oops:
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

GP1 с EEPROM теперь полностью разобраля спасибо !!!!!
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

код ща накидаю, но ОЧЕНЬ рекомендую почитать умную книжку
Ю.Ревич "Практическое программирование микроконтроллеров ATMEL AVR на языке ассемблера"
поверь отпадет куча вопросов.
ЗЫ: она (книжка) есть у Светы в библиотеке. :wink:
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
aleks_bmw528
Встал на лапы
Сообщения: 122
Зарегистрирован: Вт ноя 17, 2009 11:05:02

Сообщение aleks_bmw528 »

GP1 я конечно очень извеняюсь ну у меня очень мало опыта отсюда и всякие дурацкие вопросы книгу попробую скачать :oops:
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

Сообщение GP1 »

стр.104

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

delay:
   subi tdl,1
   sbci tdh,0
   brcc delay

tdh:tdl - время задержки в 5*тиков процессора.
Чем дальше, тем больше становлюсь занудой...
Изображение
Ответить

Вернуться в «AVR»