Страница 24 из 400
Добавлено: Вс дек 06, 2009 17:23:45
GP1
YS писал(а):
Я схожу с ума, или глючит реальность?

Скорее глюки компилятора.
Добавлено: Вс дек 06, 2009 23:46:25
YS
Все, разобрался. Это глюк симулятора. В железе все работает. Не зря я всегда недолюбливал симуляторы...
Добавлено: Пн дек 07, 2009 12:06:35
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????
Добавлено: Пн дек 07, 2009 12:34:14
ARV
если у вас
time определена как константа (а это следует из директивы
equ), то вообще не понятно, что с чем и, главное, зачем сравнивать - константа всегда останется неизменной, можете смело ее заносить в таймер без всяких проверок.
кстати, сама по себе проверка двубайтного числа у вас все равно неправильно сделана.
если же подразумевалось, что
time есть какая-то переменная (т.е. метка пары ячеек в ОЗУ), то тогда код вообще не в дугу - он работать не будет. и суммирование так же не будет работать. в общем, во всех с лучаях у вас не рабочий код

Добавлено: Вт дек 08, 2009 02:11: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 регистры но не пойму как ????
Добавлено: Вт дек 08, 2009 09:57:47
GP1
1. рекомендуется пускать движок с 25-30% мощности, меньше может не запуститься, больше - излишняя нагрузка.
2. т.к. в AVR-ках инструкций по работе с парными регистрами очень мало, оставь их в покое, все равно сравнение придется делать в "ручную", а парные регистры еще пригодятся для всяких там указателей.
Добавлено: Вт дек 08, 2009 11:57:12
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 , либо где то хранить временные задержки ????????
Добавлено: Вт дек 08, 2009 12:13:16
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
Добавлено: Вт дек 08, 2009 12:45:11
GP1
зачем использовать Т1 как 8-ми битный?
есть же Т0?
чтобы мотор плавно набирал/сбавлял обороты надо между изменениями значения вводить задержку
читать/писать в eeprom можно с любого адреса
ЗЫ: опять везде r16, r17..., а как же правила хорошего тона?
заведи себе одну переменную - power и храни в ней установленное значение мощности.
тебе еще понадобятся 3 конcтанты: power_start, power_min, power_max
Добавлено: Вт дек 08, 2009 13:11:05
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 вдруг ни чего не записано .
Добавлено: Вт дек 08, 2009 13:27:49
GP1
1. задержку надо выбирать из времени нарастания от power_start до power_max с учетом шага изменения мощности. Сделаешь слишком маленькую будет пролетать быстро, сделаешь большую - он у тебя пол-дня разгоняться будет.
к примеру
30%-старт
99%- макс
1% - шаг регулировки
tразгона - 3сек
задержка = 3сек/(99%-30%) - ~40мс на 1%
2. по умолчанию в eeprom во всех ячейках 0xFF. но если ты будешь при выключении сохранять значение power, то уже после первого выключения там будет твое значение power.
зы: на Т1 по переполнению с однобайтовыми переменными как-то не очень. ИМХО.
Добавлено: Вт дек 08, 2009 13:32:39
aleks_bmw528
я в принципе думал считать раздницу между powerstart и power
исходя из разницы высчитывать время но еще не придумал как
ну а если после совсем первого запуска я выдернул провод и не записал там же будет 0xFF правильно
in power ,eedr
cpi power , 0xFF
breq exit
все таки надо записывать в power powerstart
exit :
ldi power, powerstart
Добавлено: Вт дек 08, 2009 13:37:57
GP1
если хранить power в виде процентов, тогда все просто:
находишь разницу N, и запускаешь N раз цикл с задержкой 40мс (для моего примера) в котором переписывается значение в таймере.
power_start ты записываешь при старте программы в Т1, а уже после старта движка смотришь что там надо установить.
Добавлено: Вт дек 08, 2009 13:40:26
aleks_bmw528
EEPROM стирается после выключения питания
и прописывается 0xff ???
Добавлено: Вт дек 08, 2009 13:43:38
GP1
aleks_bmw528 писал(а):EEPROM стирается после выключения питания
и прописывается 0xff ???
eeprom - это по русски что-то типа "энергонезависимая электрически перезаписываемая память" (дословно не помню) т.е. после записи данные сохраняются и при вык. питании.
Добавлено: Вт дек 08, 2009 13:46:00
aleks_bmw528
GP1 алгоритм понятен но никак не пойму как реализовать
надо же сделать такую задержку как то не использую при этом таймер , можешь набросать начальный код ну ни как

Добавлено: Вт дек 08, 2009 13:50:08
aleks_bmw528
GP1 с EEPROM теперь полностью разобраля спасибо !!!!!
Добавлено: Вт дек 08, 2009 13:53:09
GP1
код ща накидаю, но ОЧЕНЬ рекомендую почитать умную книжку
Ю.Ревич "Практическое программирование микроконтроллеров ATMEL AVR на языке ассемблера"
поверь отпадет куча вопросов.
ЗЫ: она (книжка) есть у Светы в библиотеке.

Добавлено: Вт дек 08, 2009 13:56:37
aleks_bmw528
GP1 я конечно очень извеняюсь ну у меня очень мало опыта отсюда и всякие дурацкие вопросы книгу попробую скачать

Добавлено: Вт дек 08, 2009 13:58:05
GP1
стр.104
tdh:tdl - время задержки в 5*тиков процессора.