Terapefft
Nov 20 2006, 14:01
Я вот тут посидел подумал и у меня возник вопрос: у меня же процесс включения насоса будет находится в одном цикле с процесами нагрева продольных и поперечных губок автомата, и следовательно если я после выставления флага на включение насоса, перейду на ПП поддержания насоса во включеном состоянии, то у меня сдвинется весь рабочий цикл на величину поддержания насоса во включеном состоянии ??? а это не есть гуд.... подскажите пожалуста возможные пути решения этой проблемы. И еще вопрос, вот у меня есть второй счетчик
timer2:
push rin
ldi rin,$3c ; $3c=60
out tcnt2,rin ;
ldi rin,TNASOS ;
prov:
dec rin
cpi rin,0
brne prov
pop rin
reti
Как сделать так чтобы в рабочем цикле после включения насоса выдерживалось время TNASOS с помощью этого счетчика???
Wild007
Nov 20 2006, 14:50
Цитата(Terapefft @ Nov 20 2006, 13:01)

Я вот тут посидел подумал и у меня возник вопрос: у меня же процесс включения насоса будет находится в одном цикле с процесами нагрева продольных и поперечных губок автомата, и следовательно если я после выставления флага на включение насоса, перейду на ПП поддержания насоса во включеном состоянии, то у меня сдвинется весь рабочий цикл на величину поддержания насоса во включеном состоянии ??? а это не есть гуд.... подскажите пожалуста возможные пути решения этой проблемы. И еще вопрос, вот у меня есть второй счетчик
timer2:
push rin
ldi rin,$3c ; $3c=60
out tcnt2,rin ;
ldi rin,TNASOS ;
prov:
dec rin
cpi rin,0
brne prov
pop rin
reti
Как сделать так чтобы в рабочем цикле после включения насоса выдерживалось время TNASOS с помощью этого счетчика???
Выставить в прерывании флаг, типа
SBR FLAG,1<<timer_2
а в рабочий цикл, типа
SBRS FLAG,timer_2
RJMP <метка>
ldi rin,TNASOS ;
prov:
dec rin
cpi rin,0
brne prov
<метка>
и будет тебе счастье

А возможные пути решения этой проблемы... Возми бумажку и нарисуй какой алгоритм тебя устраивает и по нему пиши програму.
Terapefft
Nov 20 2006, 15:29
что то я не совсем понял, судя по этому:
SBR FLAG,1<<timer_2
это мне надо какому нить свободному регистру назначить имя flag, а timer_2 будет в нем просто битом ??? и вставить эту строку в процедуру обработки прерываний от таймера2 как нить так? :
timer2:
push rin
ldi rin,$3c ; $3c=60
out tcnt2,rin ;
sbr Flag,1<<timer_2
pop rin ;
reti
А рабочий цикл тогда получится будет таким ?:
.....................
sbr svet,0b00010000 ; светить Т1
ldi rin,0 ; включить поперечный нагрев
rcall nagr ;
rcall delay ; выдерживаем вермя для заварки Т1
ldi radr,doza_1 ; дозатор на всасывание
rcall decod ;
cbr reg_flgs,0b00000001 ; флаг на начало всасывания
SBRS Flag,timer_2
RJMP M10
ldi rin,TNASOS ;
prov:
dec rin
cpi rin,0
brne prov
M10:
cbr svet,0b00010000 ;погасить Т1
sbr svet,0b00100000 ; светить Т2
.......................................
Wild007
Nov 20 2006, 15:43
Ну да! Я тебе про это несколько постов назад говорил

.
Terapefft
Nov 20 2006, 16:13
понятно

а подскажите пожалуста как и ОЗУ в ППЗУ считать (мне надо значение TNASOS считать из ячейки $77 ) ???
Wild007
Nov 20 2006, 16:19
Цитата(Terapefft @ Nov 20 2006, 15:13)

понятно

а подскажите пожалуста как и ОЗУ в ППЗУ считать (мне надо значение TNASOS считать из ячейки $77 ) ???
Не совсем понял вопрос? Из EEPROM в RAM или как?
Terapefft
Nov 20 2006, 16:24
из RAM в EEPROM
Wild007
Nov 20 2006, 16:38
Цитата(Terapefft @ Nov 20 2006, 15:24)

из RAM в EEPROM
LDI ZL,LOW(метка на переменную)
LDI ZH,hi(метка на переменную)
LPM ; и в R0 имеешь свою переменную.
....
Assembly Code Example
EEPROM_write:
; Wait for completion of previous write
sbic EECR,EEWE
rjmp EEPROM_write
; Set up address (r18:r17) in address register
out EEARH, r18
out EEARL, r17
; Write data (r16) to data register
out EEDR,r16
; Write logical one to EEMWE
sbi EECR,EEMWE
; Start eeprom write by setting EEWE
sbi EECR,EEWE
ret
Это из любого DS/
Terapefft
Nov 20 2006, 17:19
просто вот здесь вот считываются уставки с 60 по 67-й адрес из ОЗУ в ППЗУ
ozu_pzu:
clr zh ;
clr zl ;
cli
ewrite:
sbic eecr,eewe ;
rjmp ewrite ;
out eearh,zh ;
out eearl,zl ;
subi zl,$A0 ;мне
ld rin,z ;вот эта
subi zl,$5F ;часть не понятна
out eedr,rin ;
sbi eecr,eemwe ;
sbi eecr,eewe ;
nop
nop
nop
cpi zl,24 ; и вот здесь причем тут 24?
brne ewrite ;
ret ;
может просто вот так сделать? (чтоб с 77-й ячейки считать) :
ozu_pzu:
clr zh ;
clr zl ;
cli
ewrite:
sbic eecr,eewe ;
rjmp ewrite ;
ldi zl,LOW(TNASOS) ;
ldi zh,HI(TNASOS)
ld rin,z ;
out eedr,rin ;
sbi eecr,eemwe ;
sbi eecr,eewe ;
brne ewrite ;
ret
Wild007
Nov 20 2006, 17:23
Извини срочно уезжаю на объект. Посмотрю и отвечу только завтра.
Wild007
Nov 21 2006, 09:57
В решение с флагом TIMER_2 вкраась существенная ошибка, надо:
brne prov
CBR FLAG,1<<TIMER_2M10:
По поводу записи в EEPROM:
ewrite:
sbic eecr,eewe ;
rjmp ewrite ;Это ожидание окончания предыдущего цикла записи.
out eearh,zh ;
out eearl,zl ; Это адрес в EEPROM,
куда пишем данные.
subi zl,$A0 ;мне
ld rin,z ;вот эта
subi zl,$5F ;часть не понятнаЭто вычисление адреса и загрузка переменной для записи в EEPROM и адрес для следующего цикла записи.
out eedr,rin ;
sbi eecr,eemwe ;
sbi eecr,eewe ; Это запись переменной RIN в EEPROM.
cpi zl,24 ; и вот здесь причем тут 24?
brne ewrite ; 24 это "конечная" точка. Я не вычислял какие адреса переписываются, но прошелся по логике програмы. А твой опус будет работать нерпедсказуемо

. Логика работы с EEPROM стандартна и менять ничего не надо. (смотри DATA_SHEET или два поста выше)
Terapefft
Nov 21 2006, 09:58
и еще один вопросик...судя вот по этому:
...............................
sbr svet,0b00010000 ; светить Т1
ldi rin,0 ; включить поперечный нагрев
rcall nagr ;
rcall delay ; выдерживаем время для заварки Т1
ldi radr,doza_1 ; дозатор на всасывание
rcall decod ;
cbr reg_flgs,0b00000001 ; флаг на начало всасывания
SBRS Flag,timer_2
RJMP M10
ldi rin,TNASOS ;
prov:
dec rin
cpi rin,0
brne prov
M10:
cbr svet,0b00010000 ; погасить Т1
sbr svet,0b00100000 ; светить Т2
ldi rin,1 ; включить продольный нагрев
rcall nagr ;
rcall delay ; выдерживаем время для заварки Т2
.................................................
импульс поперечного нагрева заканчмвается раньше, чем импульс прододольного. А на циклограме которая идет в паспорте с даным дозатором нарисовано что импульс продольного нагрева заканчивается раньше чем импульс поперечного. Это реально???
Wild007
Nov 21 2006, 10:25
Цитата(Terapefft @ Nov 21 2006, 08:58)

и еще один вопросик...судя вот по этому:
...............................
sbr svet,0b00010000 ; светить Т1
ldi rin,0 ; включить поперечный нагрев
rcall nagr ;
rcall delay ; выдерживаем время для заварки Т1
ldi radr,doza_1 ; дозатор на всасывание
rcall decod ;
cbr reg_flgs,0b00000001 ; флаг на начало всасывания
SBRS Flag,timer_2
RJMP M10
ldi rin,TNASOS ;
prov:
dec rin
cpi rin,0
brne prov
M10:
cbr svet,0b00010000 ; погасить Т1
sbr svet,0b00100000 ; светить Т2
ldi rin,1 ; включить продольный нагрев
rcall nagr ;
rcall delay ; выдерживаем время для заварки Т2
.................................................
импульс поперечного нагрева заканчмвается раньше, чем импульс прододольного. А на циклограме которая идет в паспорте с даным дозатором нарисовано что импульс продольного нагрева заканчивается раньше чем импульс поперечного. Это реально???
Сделать программно "реально" можно что угодно. Я такие проблемы решаю по другому. Запускаешь какой нить таймер на определенный "тик" (в милисекундах или тому подобное), в прерываниях изменяешь какие нить переменные, устанавливаешь флаги, а в MAIN_LOOP анализируешь их и включаешь\выключаешь, что угодно и как тебе угодно. И "поперечный нагрев" начинается раньше\позже "продольного" или наоборот
Terapefft
Nov 21 2006, 11:08
то есть грубо говоря допустим есть у меня таймер2 с точностью о,1с, в рабочем цикле я просто включаю насос и выставляю флаг которым запускается счетчик, а ПП обработки счетчика по истечению некоторого времени (допустим TASOS) насос отключается. так?
и если сделать запись таким образом:
ldi rin,TNASOS
ewrite:
sbic eecr,eewe
rjmp ewrite
out eear,..... вот сюда что надо написать если у меня переменая TASOS в 77-й ячейке ОЗУ
out eedr,rin
sbi eecr,eempe
sbi eecr,eepe
ret
а чтение вот так:
ldi z, TNASOS
eread:
sbic eecr,eewe
rjmp eread
out eear,z
sbi eecr,eere
in rin,eedr
поправьте пожалуста если что не так, просто у меня уже мозг опух...
Wild007
Nov 21 2006, 11:30
ldi rin,TNASOS
ewrite:
sbic eecr,eewe
rjmp ewrite
АДРЕС СЕСТРА, АДРЕС!!!
out eear,..... вот сюда что надо написать если у меня переменая TASOS в 77-й ячейке ОЗУ
out eedr,rin
sbi eecr,eempe
sbi eecr,eepe
ret
Включил чево-то -- выставил флаг -- в прерывании декрементируешь время (переменную равную (необходимое_время/"тик")) -- по нулю выключаешь чево-то, снимаешь флаг. Если надо включать\выключать много чиво -- надо много флагов и много переменных и все они включаются\выключаются так как нам надо не зависят от всяких DELAY.

А MAIN_LOOP крутится без всяких задержек и тормозов, можно добалять разные фичи без головной боли что не успеем. Прерывания неизбежны и включение\выключение устройств происходит по правильному алгоритму
Terapefft
Nov 21 2006, 13:24
вот я сделал отключение насоса в счетчике2:
timer2:
push rin
push rin1
ldi rin1,$a
ldi rin,$3c ; $3c=60
out tcnt2,rin
tm:
dec rin1
brne tm
pop rin ;
pop rin1
ldi radr,doza_0 ; отключаем насос
rcall decod
cbr reg_flgs,0b00000001
reti
в главном цикле просто:
...........................
ldi radr,doza_1 ; включаем насос
rcall decod
cbr reg_flgs,0b00000000
.................................
Но теперь происходит следующее: проходит 5 нормальных рабочих циклов и потом насос не включается не выключается. А остальное нормально работает. Причем длительность поддержания насоса во включеном состоянии не зависит от того какое значение я вношу в rin1.
Wild007
Nov 21 2006, 14:30
Цитата(Terapefft @ Nov 21 2006, 12:24)

вот я сделал отключение насоса в счетчике2:
timer2:
push rin
push rin1
ldi rin1,$a
ldi rin,$3c ; $3c=60
out tcnt2,rin
tm:
dec rin1
brne tm
pop rin ;
pop rin1
ldi radr,doza_0 ; отключаем насос
rcall decod
cbr reg_flgs,0b00000001
reti
в главном цикле просто:
...........................
ldi radr,doza_1 ; включаем насос
rcall decod
cbr reg_flgs,0b00000000
.................................
Но теперь происходит следующее: проходит 5 нормальных рабочих циклов и потом насос не включается не выключается. А остальное нормально работает. Причем длительность поддержания насоса во включеном состоянии не зависит от того какое значение я вношу в rin1.
О какой "длителности" зависимой от RIN1 может идти речь, если период прерывания 0,1 сек, а цикл
tm:
dec rin1
brne tm
даже при RIN1 = &FF (для 2МГЦ) будет 0,1 милисек?
Terapefft
Nov 21 2006, 15:29
ну а как же тогда сделать???
Wild007
Nov 21 2006, 15:34
Смотри два поста назад:
Цитата(Wild007 @ Nov 21 2006, 10:30)

Включил чево-то -- выставил флаг -- в прерывании декрементируешь время (переменную равную (необходимое_время/"тик")) -- по нулю выключаешь чево-то, снимаешь флаг. Если надо включать\выключать много чиво -- надо много флагов и много переменных и все они включаются\выключаются так как нам надо не зависят от всяких DELAY.

А MAIN_LOOP крутится без всяких задержек и тормозов, можно добалять разные фичи без головной боли что не успеем. Прерывания неизбежны и включение\выключение устройств происходит по правильному алгоритму

Terapefft
Nov 21 2006, 15:45
ну вот мне надо выдержать 1 секунду, я заношу в rin1 число $a
ldi rin1,$a
и дикрементирую его, по достижении нуля выключаю насос
dec rin1
brne tm
ldi radr,doza_0 ; отключаем насос
rcall decod
вроде все так как Вы говорили....
Wild007
Nov 21 2006, 16:00
Цитата(Terapefft @ Nov 21 2006, 14:45)

ну вот мне надо выдержать 1 секунду, я заношу в rin1 число $a
ldi rin1,$a
и дикрементирую его, по достижении нуля выключаю насос
dec rin1
brne tm
ldi radr,doza_0 ; отключаем насос
rcall decod
вроде все так как Вы говорили....
Я говорил
-- в прерывании декрементируешь время , а не создаешь цикл из декркментации. Декрементируется
ОДИН РАЗ в каждом прерывании, а так как прерывание возникает
КАЖДЫЕ 0,1 сек, то общее время и сложится из количества проведенных прерываний и декркментации до нуля.
Terapefft
Nov 21 2006, 16:32
как нить вот так:
timer2:
push rin
push rin1
ldi rin1,$a;
ldi rin,$3c ; $3c=60
out tcnt2,rin ;
dec rin1
cpi rin1,0
brne tm
ldi radr,doza_0 ; отключаем насос
rcall decod
tm:
pop rin ;
pop rin1
reti
Wild007
Nov 21 2006, 17:04
Нет, что-то такое:
MAIN_LOOP:
.......
SBRC FLAG,MOT1
RJMP NNN
LDI мотор включить
SBR FLAG,1<<MOT1 флаг включения мотора
LDI T_MOT1, &XX
NNN:
TIMER2:
.....
SBRS FLAG,MOT1
RJMP MMM
DEC T_OT1
BRNE MMM
CBR FLAG,1<<MOT1
LDI мотор выключить
MMM:
.....
Terapefft
Nov 21 2006, 17:50
сейчас сделал так как Вы сказали, но теперь он вобще перестал включатся. вот исходник, все вроде должно работать....я уже не знаю почему так
Terapefft
Nov 22 2006, 09:19
вернее насос только включается но не выключается потом, а если в главном цикле вместо SBRC FLAG,MOT1 поставить SBRS FLAG,MOT1, то он и включается и выключается, но время поддержания во включеном состоянии никак не изменяется. Насос просто выключается когда проходит весь цикл
Wild007
Nov 22 2006, 09:51
Можно еще так:
.....
SBRS REG_FLAG,FDOZ
RJMP rrr
TST T_NAS1
BRNE NNN
CBR reg_flgs,1<<FDOZ
LDI radr,doza_0 ;
rcall decod
RJMP NNN
; sbrc reg_flgs,FDOZ
; rjmp NNN
rrr: ldi radr,doza_1 ; дозатор на всасывание
rcall decod ;
SBR reg_flgs,1<<FDOZ ;флаг включения насоса
LDI T_NAS1,$a
NNN:
.......
timer2:
push rin
ldi rin,$3c ; $3c=60
out tcnt2,rin ;
SBRS reg_flgs,FDOZ
RJMP MMM
DEC T_NAS1
; BRNE MMM
; CBR reg_flgs,1<<FDOZ
; LDI radr,doza_0 ;
; rcall decod
MMM:
Terapefft
Nov 22 2006, 10:35
теперь вобще не работает.....
Terapefft
Nov 22 2006, 10:56
то есть цикл идет а насос не включается
Terapefft
Nov 22 2006, 11:58
я вот щас попробовал еще раз так как вы мне вчера написали, насос не включался из за того что в ПП delay параметр FDOZ выставлялся в "1" и поэтому вот здесь
sbrc reg_flgs,FDOZ ;
rjmp NNN
ldi radr,doza_1 ; вкл насос
rcall decod ;
SBR reg_flgs,1<<FDOZ ;флаг вкл насоса
LDI T_NAS1,$5
насос не включался. щас он включается но не выключается.
Wild007
Nov 22 2006, 12:23
Цитата(Terapefft @ Nov 22 2006, 10:58)

я вот щас попробовал еще раз так как вы мне вчера написали, насос не включался из за того что в ПП delay параметр FDOZ выставлялся в "1" и поэтому вот здесь
sbrc reg_flgs,FDOZ ;
rjmp NNN
ldi radr,doza_1 ; вкл насос
rcall decod ;
SBR reg_flgs,1<<FDOZ ;флаг вкл насоса
LDI T_NAS1,$5
насос не включался. щас он включается но не выключается.
Потому что нарушен старый алгоритм работы програмы, а я предлагал (по моим подсказкам) создать новый алгоритм. Сейчас насос выключается и сразу опять включается

. Существующий алгоритм слишком прямой и запутаный, с ним разбираться -- полный рабочий день надо потратить, а времени и так в обрез.
Сразу скажу, что не смотрел ваш код, но с подобными проблемами встречался. ИМХО: обратите внимания, не изменяется ли контекст процессора (регистры) при обработки прерываний. Для программ написанных на ассемблере, особенно для людей начавших заниматься микроконтроллерами с АВР, довольно распространенная ошибка.
Terapefft
Nov 23 2006, 13:37
сегодня переделал все очередной раз, насос включается и выключается (выключение в п/п обработки прерывания таймера2), но почему то время в течении которого насос включен не изменяется (пробовал заносить туда разные значения), дикрементируется время в п/п таймера2. насос выключается после всего цикла. почему же таймер не считает???
singlskv
Nov 23 2006, 14:35
Цитата(Terapefft @ Nov 23 2006, 13:37)

сегодня переделал все очередной раз, насос включается и выключается (выключение в п/п обработки прерывания таймера2), но почему то время в течении которого насос включен не изменяется (пробовал заносить туда разные значения), дикрементируется время в п/п таймера2. насос выключается после всего цикла. почему же таймер не считает???
В процедуре обработки прерывания Timer2 нужно ОБЯЗАТЕЛЬНО сохранять SREG.
посмотрите как это сделано в Timer0.
Terapefft
Nov 23 2006, 14:59
пробовал уже, все равно не помогает. причем когда меняешь параметры (время нагрева например), уже когда контролер находится в устройстве, никак не связаные со вторым таймером, насос все равно отключается только когда проходит весь цикл
Wild007
Nov 24 2006, 09:32
Цитата(Terapefft @ Nov 23 2006, 13:59)

пробовал уже, все равно не помогает. причем когда меняешь параметры (время нагрева например), уже когда контролер находится в устройстве, никак не связаные со вторым таймером, насос все равно отключается только когда проходит весь цикл
Програма изобилует
SEI и
CLI и скорее всего где-то запрещается прерывание и до окончания цикла оно не возобнавляется. (Пробовал в отладчике).
Terapefft
Nov 24 2006, 13:14
я уже щас попробовал убрать почти все CLI все равно выключается только когда проходит весь цикл

а из за чего еще может такое происходить???
Wild007
Nov 24 2006, 14:27
Цитата(Terapefft @ Nov 24 2006, 12:14)

я уже щас попробовал убрать почти все CLI все равно выключается только когда проходит весь цикл

а из за чего еще может такое происходить???
Прогони програму через DEBUG (CTRL+F7) и
САМ определишь где глюк. Потратишь 2-3 часа на отладку и найдешь. За тебя никто не будет этого делать

. Потом нам раскажешь

.
Dog Pawlowa
Nov 24 2006, 17:47
Цитата(Wild007 @ Nov 24 2006, 14:27)

За тебя никто не будет этого делать

. Потом нам раскажешь

.
Сломался, коллега?
Я бы может и занял место в строю, но ассемблер совсем не знаю.
singlskv
Nov 24 2006, 23:21
Цитата(Wild007 @ Nov 24 2006, 14:27)

За тебя никто не будет этого делать

. Потом нам раскажешь

.
2
TerfpefftЕсли Вы реально хотите разобраться как это все работает,
то ИМХО, Вам стоит потратить пару дней, на выяснение всех подробностей
работы прерываний, и прерываний таймеров в частности...
Попробуйте на время забыть про все Ваши насосы с нагревателями,
и просто напишите тестовую программу такого вида:
1.Используем 1 таймер, например таймер1 (только 1 таймер!!!)
2. В качестве испольнительных механизмов выбираем "светодиоды" ну
например на порту B, "1" горит ,"0" не горит, 4-8 штук.
3.Для каждого диода на порту В заданы, время сколько он должен гореть и
сколько "не гореть".
4.и так до бесконечности
Если Вы не поленитесь выполнить данное задание (если будут вопросы- поможем),
то, ИМХО, без труда исправите все ошибки в "Вашем" коде,
хотя, скорее всего после этого, Вы его перепишите полностью, причем в
худшем случае, неделя писать, неделя отлаживать...
А отлаживать(искать ошибки) в 70+Кб чужого кода не будет никто...
Terapefft
Nov 27 2006, 08:53
2 singlskv
харашо

) попробую....только с этой прогой я уже не успел, оборудование уже отгружать надо...придется аппаратно решать проблему
Dog Pawlowa
Nov 27 2006, 09:52
Цитата(Terapefft @ Nov 27 2006, 08:53)

2 singlskv
харашо

) попробую....только с этой прогой я уже не успел, оборудование уже отгружать надо...придется аппаратно решать проблему
В этой связи хочется выразиться матом по поводу руководства Вашего.
Козлы.
Будете увольняться (или Вас будут увольнять), скажите им это.
Но уже сейчас начинайте искать работу.
Terapefft
Nov 27 2006, 10:00
уже начал.....внутренняя политика компании оставляет желать лучшего.
2 Dog Pawlowa у меня уже давно есть желание все им высказать, вот жду не дождусь момента
Wild007
Nov 27 2006, 10:04
Цитата(Dog Pawlowa @ Nov 24 2006, 16:47)

Цитата(Wild007 @ Nov 24 2006, 14:27)

За тебя никто не будет этого делать

. Потом нам раскажешь

.
Сломался, коллега?
Я бы может и занял место в строю, но ассемблер совсем не знаю.

Да нет

.Просто найти ошибку програме в которой метки переходов не несут ни какой информации, а написаны так, как будто дезассемблированный исходник HEX файл... Так пишут начинающие, а после полугода (если приходится возвращаться к програме) сам не могут разобраться что имели ввиду. И начинают понимать что сэкономив время на длине меток потеряли читабельность програмы, а особенно для разброра другими людьми. Мне часто приходится консультировать таких "програмистов" и после нескольких отправок "домой на переделку" понимают как не надо писать и теперь очань благодарны. Я програму TERAPEFFTa просматривал кусками и пытался наставить его на путь истинный (за неделю переписать програму по другому алгоритму отладить ее и представить на обсуждение), а не вставлять куски кода в чужую програму у которой очень прямолинейный алгоритм (нужна задержка -- крутим цикл, делаем что-то -- опять задержка -- крутим цикл и т. д.) Я считаю что это принципиально не верно, для этого и существуют таймера в AVR. Научится правильно пользоваться ими -- великое дело для TERAPEFFTa т.к. он управляет железом в реалном времени и останавливать MAIN_LOOP на всякие задержки типа "цикл" это неразумное исползование ресурсов процессора.
И как сказал singlskv:"А отлаживать(искать ошибки) в 70+Кб чужого кода не будет никто... "
Dog Pawlowa
Nov 27 2006, 10:25
Цитата(Wild007 @ Nov 27 2006, 10:04)

Я считаю что это принципиально не верно, для этого и существуют таймера в AVR. Научится правильно пользоваться ими -- великое дело для TERAPEFFTa т.к. он управляет железом в реалном времени и останавливать MAIN_LOOP на всякие задержки типа "цикл" это неразумное исползование ресурсов процессора.
То, что автор без должного обучения и опыта, это, надеемся временное
Но меня действительно затронуло, что он оказался в этом месте в это момент. Фигню вот так напроизводят, в ящики заколотят, и отправят...
Wild007
Nov 27 2006, 10:41
Цитата(Dog Pawlowa @ Nov 27 2006, 09:25)

Цитата(Wild007 @ Nov 27 2006, 10:04)

Я считаю что это принципиально не верно, для этого и существуют таймера в AVR. Научится правильно пользоваться ими -- великое дело для TERAPEFFTa т.к. он управляет железом в реалном времени и останавливать MAIN_LOOP на всякие задержки типа "цикл" это неразумное исползование ресурсов процессора.
То, что автор без должного обучения и опыта, это, надеемся временное
Но меня действительно затронуло, что он оказался в этом месте в это момент. Фигню вот так напроизводят, в ящики заколотят, и отправят...
Надо узнать точные адреса куда отправили. На доводке
"такого" оборудования можно хорошие дивиденты срубить

.
Terapefft
Nov 27 2006, 11:32
Оборудование будет работать нормально, просто возьму старую програму, зашью ее туда. Сигнал с ПУ будет поступать на частотник, а с него на насос. Цикл равномерный, небольшие отклонения можно отрегулировать с помошью частотника. Я уже попробовал...

жаль конечно что не дали мне времени попробовать переделать всю прогу...
ну а с таймерами все равно буду разбиратся...попробую сделать прогу чтоб включала и выключала светодиоды как посоветовал singlskv
ИМХО: Попробуйте объяснить начальству, что бы сделать нормально, нужно с нуля переписать код, в противном случаи начинайте искать другую работу.
Terapefft
Nov 28 2006, 11:24
я тут пробовал испытывать оборудование, работает в принципе болеменее, тока вот насос надо немного позже включать. для этого ведб можно использовать компаратор на таймере1. я все расчитал за сколько тактов выполнится необходимая мне задержка. оцените пожалуста мою идею, если сделать таким образом
при инициализации таймера1:
;-------------- Timer1 -------------------------------------
; ldi rin,0b10000000
out timsk,rin
clr rin ; CK=2MHz
out tccr1a,rin
ldi rin,0b00000101 ; /1024
out tccr1b,rin
ldi Ttemp,0x07
out OCR1AH,Ttemp
ldi Ttemp,0xA1
out OCR1AL,Ttemp
а в п/п обработки прерывания
Taimer1_comp:
ldi Ttemp,0
out TCNT1H,Ttemp
out TCNT1L,Ttemp
ldi radr,doza_1
rcall decod
reti
а выключатся он будет в главном цикле. Просто непонятно по какому вектору переходить, в даташите их 2 timer1 compA и timer1 compB???
Wild007
Nov 28 2006, 12:10
Цитата(Terapefft @ Nov 28 2006, 10:24)

я тут пробовал испытывать оборудование, работает в принципе болеменее, тока вот насос надо немного позже включать. для этого ведб можно использовать компаратор на таймере1. я все расчитал за сколько тактов выполнится необходимая мне задержка. оцените пожалуста мою идею, если сделать таким образом
при инициализации таймера1:
;-------------- Timer1 -------------------------------------
; ldi rin,0b10000000
out timsk,rin
clr rin ; CK=2MHz
out tccr1a,rin
ldi rin,0b00000101 ; /1024
out tccr1b,rin
ldi Ttemp,0x07
out OCR1AH,Ttemp
ldi Ttemp,0xA1
out OCR1AL,Ttemp
а в п/п обработки прерывания
Taimer1_comp:
ldi Ttemp,0
out TCNT1H,Ttemp
out TCNT1L,Ttemp
ldi radr,doza_1
rcall decod
reti
а выключатся он будет в главном цикле. Просто непонятно по какому вектору переходить, в даташите их 2 timer1 compA и timer1 compB???
Как не понятно? Ты же используешь загрузку в регистр совпадений COMPA, ну и вектор должен быть соответствующий.
Alex_Pol
Nov 28 2006, 12:47
Цитата(Terapefft @ Nov 28 2006, 10:24)

Просто непонятно по какому вектору переходить, в даташите их 2 timer1 compA и timer1 compB???
Регистров совпадения 2. А и В. Прерывания соответствуют регистрам. Загрузи программу в AVRСтудию, поставь брекпоинты и посмотри по какому прерыванию будет срабатывать. Очень показательно.
З.Ы. Wild007 Опередил.