Страница 2 из 13

Добавлено: Ср мар 25, 2009 15:55:08
ibiza11
есть генераторы с изолированным ротором(вал не выходит наружу), на валу внутри есть груз, который раскручивается от инерции.
главное установить ось генератора соосно колесу. ну и добавить батарею аккумуляторов.

Добавлено: Ср мар 25, 2009 19:27:47
Lonleystranger
Насчет питания: по двум сторонам колеса (под осевые болты) две текстолитины фольгированные, к ним + и - от акомы мотоцикловской, на платах-шетки.

Добавлено: Ср мар 25, 2009 23:56:29
smac
Stalker46 писал(а): или: разобрать диск на ободе и придумать, как туда прикошачить динамогенератор ( что на великах), оттдуа провести провода в натяжку и все)))
Не лучшая идея, динамо, то что на великах, оно неподвижное, а у нас линейка на колесе по идее закреплена, поэтому придется делать скользящие контакты типа щеток в эл. дрели и т.п. это дополнительный геморрой.
В каком-то из номеров радио были то-ли часы из компьютерного кулера, то-ли еще что-то, так вот там для подачи питания использовался хитрый трансформатор, с вращающейся вторичной обмоткой, от которой как раз и производилось питание вращающейся линейки светодиодов.

Добавлено: Чт мар 26, 2009 00:20:27
SeamaNCOS
В общем описываю весь проект:
1. один датчик хола (или ХоллА )
2. две линейкисветодиодов на ATTiny2313 по 15 через 180 градусов)))
3. думаю все таки с изменяемой задержкой выставляемой по таймеру МК TCCR1.
ВОПРОС В ТОМ КАК РАЗДЕЛИТЬ ЧИСЛО (допустим)31250={Ocr1ah=0x7a Ocr1al=0x12}
на 160 или 256 да хоть на 2!!!!!!!!!!!
В асемблере уже двое суток мозг напрягаю, КАК???
Железо на моторе не правиться и ни вариться и ни краситься. только и думаю как прогу написать!!!
Чтоб число более ли менее совподало с желаемым результатом 1h=0xff 1L=0xff (КАК делить в этом случае??????? и какие операторы использовать с наименьшей погрешностью:((
) .


С питанием ни каких проблем. МАсса (-) всем извесный и щетка с вилки на диск колеса(+) (испытаная система чем меньше радиус от оси вращения тем стобильнее питание).
вот и все питание (конечно кренка(или преобразователь12-5V) ,Фильтр, конденсаторы)

Добавлено: Чт мар 26, 2009 23:44:43
ibiza11
SeamaNCOS писал(а): ВОПРОС В ТОМ КАК РАЗДЕЛИТЬ ЧИСЛО (допустим)31250={Ocr1ah=0x7a Ocr1al=0x12}
на 160 или 256 да хоть на 2!!!!!!!!!!!
на два делить просто : сдвиг числа на один разряд вправо)))
на 4 - сдвиг на 2 разряда вправо.
на 160 можно последовательно на 16 и 10 -
1) на 16 сдвиг на 4 разряда вправо
2) на 10 - привожу макрос :

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

;-------деление 16 разрядного числа на константу 
.macro Div
	clr Rest		;очистка остатка
	ldi tmp,16	;загрузка в счетчик кол-ва разрядов
loop:
	lsl @0L		;сдвиг влево
	rol @0H		;
	rol Rest		;
	subi Rest,@1	;вычитаем из остатка константу
	brlo NotBigger	;если остаток =< 0, то переходим на метку
	inc @0L		;заносим единицу в младший разряд
	rjmp dalee	;продолжаем разговор ;)
NotBigger:
	subi Rest,-(@1)	;отменяем вычитание
dalee:
	dec tmp		;уменьшаем кол-во разрядов на 1
	brne loop	;возвращаемся в начало цикла, если не все разряды сдвинуты 
.endm
для использования макроса нужно обьявить 16 битную переменную из двух 8 битных регистров. первый операнд - 16 битное делимое, второй операнд - 8 битный делитель. Rest и tmp изменяются. если нужно их сохранить, используйте push и pop. надеюсь помог)

Добавлено: Пт мар 27, 2009 07:25:34
SeamaNCOS
Спосибо :)
как я понял
@0H - старший регистр (в моем случае копия числа из таймера OCR1AH)
@0L- младший регистр (в моем случае копия числа из таймера OCR1AL)
@1 - то на что делим ( допустим 0x10)

Добавлено: Пт мар 27, 2009 10:16:19
ibiza11
да, все правильно)))

Добавлено: Вс мар 29, 2009 18:00:12
Инженер
Посмотрел я тот проект зарубежный. Здорово, конечно. Но вот 200 диодов будут стоить 2000р - дороговато. По крайней мере для меня. И жрать будут дофига. Написать программу - проще пареной репы. Вот собрать железо - это действительно сложно. А если дождь? А если грязь? Как потом это ЧУДО отмывать?! Может кто-то предложит широко доступный, подходящий для наших целей корпус?

Добавлено: Пн мар 30, 2009 19:27:27
SeamaNCOS
Корпус собираюсь делать из двух пластин оргстекла. А светодиоды надо было покупать как герлянды у китайцев под новый год :) выходило около 1.5-2 р за светодиод(+ провода и резистор на каждом светодиоде)

Добавлено: Сб апр 04, 2009 09:17:38
SeamaNCOS
Написал я прошивку(только прерывания без индикации) но она никак работать не хочет.
Сделал так как писал Evgen88 (как изначально и собирался делать сам)только все же на Attiny2313
[quote="Evgen88"]Кароче делать нада так:

1. забуть про 2313 - делай на меге (например Мега48 стоит почти также, но какая разница!)
2. запускаеш 16 битный таймер
3. делаеш захват значения таймера (нога ICR) датчиком хола
4. количество столбцов должно быть 256 (это шоб облегчить жизнь твоему контроллеру :) )
5. береш старший байт захваченного значения 16 битного тайммера и это значение заносиш в регистр сравнения 8 битного таймера - по переполнению которого будет выводится новая строчка
6. в момент захвата 16 битного таймера обнуляеш оба таймера и записываеш новое значение сравнения в 8 битный таймер.
/quote]

Подозрения на то что при обнулении таимера0 обнуляется и таимер1
т.к. с Tcnt1h всегда читаеться 0.....
В чем может быть дело ???

Добавлено: Сб апр 04, 2009 10:07:53
ibiza11
Блин, немного не в тему, зачем делать в протеусе? неужели нельзя сделать в железе и на нем проверять?
1)удобнее в тысячу раз.
2)нет никакой уверенности,что протеус правду показывает, учитывая все его глюки.

по поводу кода:

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

ldi Temp1,0b11111111
out ddrb, Temp1 ; настройка порта b

ldi Temp1,0b10111111
out ddrb, Temp1 ; настройка порта b
зачем два раза? еще и по-разному....

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

.def Temp4=R19
.def Temp5=R19
- это тоже настрожило

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

ldi Temp1,0b00000011
out [b]Tccr0[/b],Temp1 ;тактовый сигнал /64
в Tiny2313 для этих целей используется регистр TCCR0B

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

;******Прерывание по совподению ч.с. и таимер0*****
TIMER0_COMPA:
ldi temp1,0
OUT Tcnt0,temp1  ;обнуляем таимер0
inc temp4
reti                      ;выход из обработчика
здесь обязательно сохраняйте SREG а потом восстанавливайте.

теперь программные недочеты:
не совсем понял, как вы боретесь с дребезгом, если за счет temp2, то вы явно перестарались... ну сработает у вас кнопка один раз и все... не будет больше temp2 = 0.... таким образом весь ваш код сводит на НЕТ вызов обработчика срабарывания кнопки... думаю поэтому и не работает...

насчет алгоритма который вам подсказал Evgen88.
он говорил о прерывании захвата, а не о банальном считывании из счетного регистра. может быть это не принципиально, но зачем огород городить, если можно сделать по прерыванию( если надумаете так сделать, опять таки не забудьте про SREG)

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

.equ	ICP1addr	= 0x0003	; Timer/Counter1 Capture Event

Добавлено: Сб апр 04, 2009 10:14:18
ibiza11
и еще в догонку:))
Evgen88 писал(а):Кароче делать нада так:
4. количество столбцов должно быть 256 (это шоб облегчить жизнь твоему контроллеру :) )
скорее бедолаге программеру, который не может поделить 16 битное число на 8 битное))))

Добавлено: Сб апр 04, 2009 10:40:07
SeamaNCOS
В протеусе потому как нет осцилографа. да и в нем видно работает код или нет(за место кнопки ставим генератоp, меняем частоту считая импульсы с PB0).

Код поправил. Кнопка работает проверял (в место Tcnt1h при чтении ставил Tcnt1l частота меняеться).

Сохранять SREG куда ? точнее как или что в него сохранять(значение таимера1)?
так?
mov ICP1a,temp1

Добавлено: Сб апр 04, 2009 11:28:59
ibiza11
насчет кнопки не буду спорить, не проверял, работает и слава богу....
SREG сохранять:
SREG-речистр флагов лог/мат операции микроконтроллера

если у тебя происходит прерывание перед проверкой условия
типа: breq или brne... ну и подобные, которые используют флаги регистра SREG для принятия "решения"
и в этом прерывании опять происходит какая то операция, которая меняет регистр SREG, то после возврата в точку, откуда прерывались, это условие может сработать неверно, поэтому предлагают :

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

;---обработчик прерывания---
in tmp,sreg
push tmp
-----------------------------
-------какой то код-------
-----------------------------
pop tmp
out sreg,tmp
reti
;-----------------------------------

Добавлено: Сб апр 04, 2009 16:05:52
smac
ibiza11 писал(а):... это условие может сработать неверно, поэтому предлагают :
Зачем же Вы новичку советы неправильные даете?! Ваш код будет портить регистр tmp, в результате, избавившись от одного глюка можно приобрести другой. Делать нужно либо так

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

;---обработчик прерывания---
push tmp
in tmp,sreg
push tmp
-----------------------------
-------какой то код-------
-----------------------------
pop tmp
out sreg,tmp
pop tmp
reti
;-----------------------------------
Либо так как показано ниже, но в этом случае необходимо, чтобы tmp использовался только для сохранения SREG и ни для чего другого. Также в этом случае нельзя использовать вложенные прерывания, т. е. разрешать прерывания в обработчике прерывания.

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

;---обработчик прерывания---
in tmp,sreg
-----------------------------
-------какой то код-------
-----------------------------
out sreg,tmp
reti
;-----------------------------------

Добавлено: Сб апр 04, 2009 22:27:49
ibiza11
действительно)) :oops:
тогда потимально будет просто сохранять в регистр и нигде его больше не использовать.

а насчет прерывания в прерывании не понял идеи... почему же нельзя? если так же сохранить SREG???

Добавлено: Вс апр 05, 2009 02:22:37
smac
ibiza11 писал(а):действительно)) :oops:
тогда потимально будет просто сохранять в регистр и нигде его больше не использовать.

а насчет прерывания в прерывании не понял идеи... почему же нельзя? если так же сохранить SREG???
В принципе Ваш способ тоже имеет право на жизнь, при одном условии - если tmp будет отведен только под сохранение SREG.
Про прерывания в прерывании относилось только к тому случаю когда для сохранения SREG используется регистр, а не стек. Посмотрите сами, вот у нас возникло прерывание, мы сохранили SREG и разрешили прерывания внутри обработчика, если внутри этого обработчика возникнет другое прерывание, то оно вызовет свой обработчик, в котором наверняка тоже нужно сохранять SREG, а у нас для этого используется регистр, и в нем уже есть какое-то значение SREG, значит это значение затрется, на его место встанет другое, и при извлечении может получиться косяк.

Добавлено: Вс апр 05, 2009 07:38:53
SeamaNCOS
Сделал так

TIMER0_COMPA:
push tmp
in tmp,sreg
push tmp
inc temp4
ldi temp1,0
OUT Tcnt0,temp1 ;обнуляем таимер0

pop tmp
out sreg,tmp
pop tmp
reti

и так

TIMER0_COMPA:
in tmp,sreg
inc temp4
ldi temp1,0
OUT Tcnt0,temp1 ;обнуляем таимер0

out sreg,tmp
reti

и вот так пробовал

TIMER0_COMPA:
in temp6,Tcnt1h
in temp5,Tcnt1l
inc temp4
ldi temp1,0
OUT Tcnt0,temp1 ;обнуляем таимер0


out Tcnt1h,temp6
out Tcnt1l,temp5
reti



неработает.. все равно в Tcnt1h все время 0
temp5.temp6.tmp отводил только для SREG

Добавлено: Вс апр 05, 2009 11:59:47
ibiza11
smac писал(а):если tmp будет отведен только под сохранение SREG.
тогда нет смысла операции push:)
smac писал(а): значит это значение затрется...
если использовать один и тот же регистр, то естественно затрется, я думаю это и новички понимают.
для тех кто не понял:
если для сохранения регистра SREG используется регистр r0-r31 и разрешается прерывание в прерывании, то для каждой операции сохранения нужно использовать отдельный регистр.

Добавлено: Ср апр 08, 2009 12:42:45
SeamaNCOS
Наконец то заработало :))

сохранил Tcnt1h и Tcnt1l в отдельно отведенные регистры до прерывания и востанавливал в прерывании.
Также запретил прерывание при индикации и обработке кнопки.

Теперь проблема с железом :? при одном нажатии кнопка срабатывает 2а (или больше) раза из-за этого в железе не работает(постоянно обнуляет число сравнения), а в протеусе без проблем с частатой внешнего сигнала от 1 до 20Гц(это те граници в каторых проверял).

Буду думать как изменить обработчик кнопок чтоб не глючил... Может задержку после чтения поставить ??

С опто парой работает нормально :)) буду писать рисунок какой нибудь и светодиодов добавлю будет 14(пока8)
Решил остановиться пока на 1 полоске (при 3Гц уже нормально видно)

вот прошивка(пока без рисунка)