Скорее глюки компилятора.YS писал(а):
Я схожу с ума, или глючит реальность?
Ассемблер (ASM) для AVR в вопросах и ответах
- Реклама
- aleks_bmw528
- Встал на лапы
- Сообщения: 122
- Зарегистрирован: Вт ноя 17, 2009 11:05:02
Уважаемые коты!!! Необходимо проверить до загрузки в 16 разрядный таймер колличество тиков > или = могу ли я сделать это так ???
equ time = 35135
equ timemax = 65135
Вопрос если я изменил time +1000 то при следующем вызове подпрограммы time будет опять time 31135 ???
мне надо как то запоминать текущий time????
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????
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18647
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
если у вас time определена как константа (а это следует из директивы equ), то вообще не понятно, что с чем и, главное, зачем сравнивать - константа всегда останется неизменной, можете смело ее заносить в таймер без всяких проверок.
кстати, сама по себе проверка двубайтного числа у вас все равно неправильно сделана.
если же подразумевалось, что time есть какая-то переменная (т.е. метка пары ячеек в ОЗУ), то тогда код вообще не в дугу - он работать не будет. и суммирование так же не будет работать. в общем, во всех с лучаях у вас не рабочий код
кстати, сама по себе проверка двубайтного числа у вас все равно неправильно сделана.
если же подразумевалось, что time есть какая-то переменная (т.е. метка пары ячеек в ОЗУ), то тогда код вообще не в дугу - он работать не будет. и суммирование так же не будет работать. в общем, во всех с лучаях у вас не рабочий код
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- aleks_bmw528
- Встал на лапы
- Сообщения: 122
- Зарегистрирован: Вт ноя 17, 2009 11:05:02
AVR попытаюсь обьяснить !!!!
для фазового управления симистором требуется импульс от 0 до 10мс ,
для этого используется таймер T1 режим CK
ты правильно понял !!! time это текущая задержка которая по идеи должна записываться в EPPROM, но я интересовался сколько раз можно записать в EEPROM на форуме
GP1 ответил
time текущая задержка,
далее есть константы timemin , timemax минимальное и максимальное время задержки таймера
timenach начальная задержка для запуска с середины
сравнение нужно для того time было не меньше не больше при нажатии на кнопку + или -
Фишка в том что после включения еще до начала выхода на текущий режим считанный из EEPROM , запускать мотор со средних оборотов(~5 мс задержка таймера) и плавного уменьшения или увеличения до текущей мощности time !!!
начну с записи и чтения
с однобайтным числом разобрался а с двух надо через X Y Z регистры но не пойму как ????
для фазового управления симистором требуется импульс от 0 до 10мс ,
для этого используется таймер T1 режим CK
ты правильно понял !!! time это текущая задержка которая по идеи должна записываться в EPPROM, но я интересовался сколько раз можно записать в EEPROM на форуме
GP1 ответил
ну впринципе запаришся включать и выключать 100000 разв EEPROM, согласно ДШ, 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
- Откуда: Россия, Волгоград
- Контактная информация:
1. рекомендуется пускать движок с 25-30% мощности, меньше может не запуститься, больше - излишняя нагрузка.
2. т.к. в AVR-ках инструкций по работе с парными регистрами очень мало, оставь их в покое, все равно сравнение придется делать в "ручную", а парные регистры еще пригодятся для всяких там указателей.
2. т.к. в AVR-ках инструкций по работе с парными регистрами очень мало, оставь их в покое, все равно сравнение придется делать в "ручную", а парные регистры еще пригодятся для всяких там указателей.
- aleks_bmw528
- Встал на лапы
- Сообщения: 122
- Зарегистрирован: Вт ноя 17, 2009 11:05:02
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 мс
допустим проверил оказалось меньше по идеи надо плавно уменьшить до текущего time никак не придумаю то ли надо через задержку по чуть чуть уменьшать значение timestart до time , либо где то хранить временные задержки ????????
с большим управлюющим импульсом разобрался переделал на 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
Код: Выделить всё
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
- Откуда: Россия, Волгоград
- Контактная информация:
зачем использовать Т1 как 8-ми битный?
есть же Т0?
чтобы мотор плавно набирал/сбавлял обороты надо между изменениями значения вводить задержку
читать/писать в eeprom можно с любого адреса
ЗЫ: опять везде r16, r17..., а как же правила хорошего тона?
заведи себе одну переменную - power и храни в ней установленное значение мощности.
тебе еще понадобятся 3 конcтанты: power_start, power_min, power_max
есть же Т0?
чтобы мотор плавно набирал/сбавлял обороты надо между изменениями значения вводить задержку
читать/писать в eeprom можно с любого адреса
ЗЫ: опять везде r16, r17..., а как же правила хорошего тона?
заведи себе одну переменную - power и храни в ней установленное значение мощности.
тебе еще понадобятся 3 конcтанты: power_start, power_min, power_max
- aleks_bmw528
- Встал на лапы
- Сообщения: 122
- Зарегистрирован: Вт ноя 17, 2009 11:05:02
таймер T0 занят
powerstart уже прописан в TCNT1
GP1 поставил твою задержку которую ты тогда написал очень маленькая
ищу оператор и никак не найду подходящий для проверки EEPROM ??? я думаю надо проверять на наличие записи EEPROM вдруг ни чего не записано .
Код: Выделить всё
.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
я думаю что не надо ldi power, powerstart т.к если ничего нет тоexit :
ldi power, powerstart
powerstart уже прописан в TCNT1
GP1 поставил твою задержку которую ты тогда написал очень маленькая
ищу оператор и никак не найду подходящий для проверки EEPROM ??? я думаю надо проверять на наличие записи EEPROM вдруг ни чего не записано .
Последний раз редактировалось aleks_bmw528 Вт дек 08, 2009 13:29:18, всего редактировалось 1 раз.
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
1. задержку надо выбирать из времени нарастания от power_start до power_max с учетом шага изменения мощности. Сделаешь слишком маленькую будет пролетать быстро, сделаешь большую - он у тебя пол-дня разгоняться будет.
к примеру
30%-старт
99%- макс
1% - шаг регулировки
tразгона - 3сек
задержка = 3сек/(99%-30%) - ~40мс на 1%
2. по умолчанию в eeprom во всех ячейках 0xFF. но если ты будешь при выключении сохранять значение power, то уже после первого выключения там будет твое значение power.
зы: на Т1 по переполнению с однобайтовыми переменными как-то не очень. ИМХО.
к примеру
30%-старт
99%- макс
1% - шаг регулировки
tразгона - 3сек
задержка = 3сек/(99%-30%) - ~40мс на 1%
2. по умолчанию в eeprom во всех ячейках 0xFF. но если ты будешь при выключении сохранять значение power, то уже после первого выключения там будет твое значение power.
зы: на Т1 по переполнению с однобайтовыми переменными как-то не очень. ИМХО.
- aleks_bmw528
- Встал на лапы
- Сообщения: 122
- Зарегистрирован: Вт ноя 17, 2009 11:05:02
я в принципе думал считать раздницу между powerstart и power
исходя из разницы высчитывать время но еще не придумал как
ну а если после совсем первого запуска я выдернул провод и не записал там же будет 0xFF правильно
in power ,eedr
cpi power , 0xFF
breq exit
все таки надо записывать в power powerstart
exit :
ldi power, powerstart
исходя из разницы высчитывать время но еще не придумал как
ну а если после совсем первого запуска я выдернул провод и не записал там же будет 0xFF правильно
in power ,eedr
cpi power , 0xFF
breq exit
все таки надо записывать в power powerstart
exit :
ldi power, powerstart
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
если хранить power в виде процентов, тогда все просто:
находишь разницу N, и запускаешь N раз цикл с задержкой 40мс (для моего примера) в котором переписывается значение в таймере.
power_start ты записываешь при старте программы в Т1, а уже после старта движка смотришь что там надо установить.
находишь разницу N, и запускаешь N раз цикл с задержкой 40мс (для моего примера) в котором переписывается значение в таймере.
power_start ты записываешь при старте программы в Т1, а уже после старта движка смотришь что там надо установить.
Последний раз редактировалось GP1 Вт дек 08, 2009 13:41:04, всего редактировалось 1 раз.
- aleks_bmw528
- Встал на лапы
- Сообщения: 122
- Зарегистрирован: Вт ноя 17, 2009 11:05:02
- aleks_bmw528
- Встал на лапы
- Сообщения: 122
- Зарегистрирован: Вт ноя 17, 2009 11:05:02
- aleks_bmw528
- Встал на лапы
- Сообщения: 122
- Зарегистрирован: Вт ноя 17, 2009 11:05:02
- aleks_bmw528
- Встал на лапы
- Сообщения: 122
- Зарегистрирован: Вт ноя 17, 2009 11:05:02
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
стр.104
tdh:tdl - время задержки в 5*тиков процессора.
Код: Выделить всё
delay:
subi tdl,1
sbci tdh,0
brcc delay


