Рисунок на колесе
- Реклама
- Lonleystranger
- Потрогал лапой паяльник
- Сообщения: 361
- Зарегистрирован: Ср янв 21, 2009 00:45:33
Не лучшая идея, динамо, то что на великах, оно неподвижное, а у нас линейка на колесе по идее закреплена, поэтому придется делать скользящие контакты типа щеток в эл. дрели и т.п. это дополнительный геморрой.Stalker46 писал(а): или: разобрать диск на ободе и придумать, как туда прикошачить динамогенератор ( что на великах), оттдуа провести провода в натяжку и все)))
В каком-то из номеров радио были то-ли часы из компьютерного кулера, то-ли еще что-то, так вот там для подачи питания использовался хитрый трансформатор, с вращающейся вторичной обмоткой, от которой как раз и производилось питание вращающейся линейки светодиодов.
- SeamaNCOS
- Встал на лапы
- Сообщения: 107
- Зарегистрирован: Ср дек 10, 2008 15:10:59
- Откуда: KPACHO9PCK
- Контактная информация:
В общем описываю весь проект:
1. один датчик хола (или ХоллА )
2. две линейкисветодиодов на ATTiny2313 по 15 через 180 градусов)))
3. думаю все таки с изменяемой задержкой выставляемой по таймеру МК TCCR1.
ВОПРОС В ТОМ КАК РАЗДЕЛИТЬ ЧИСЛО (допустим)31250={Ocr1ah=0x7a Ocr1al=0x12}
на 160 или 256 да хоть на 2!!!!!!!!!!!
В асемблере уже двое суток мозг напрягаю, КАК???
Железо на моторе не правиться и ни вариться и ни краситься. только и думаю как прогу написать!!!
Чтоб число более ли менее совподало с желаемым результатом 1h=0xff 1L=0xff (КАК делить в этом случае??????? и какие операторы использовать с наименьшей погрешностью:((
) .
С питанием ни каких проблем. МАсса (-) всем извесный и щетка с вилки на диск колеса(+) (испытаная система чем меньше радиус от оси вращения тем стобильнее питание).
вот и все питание (конечно кренка(или преобразователь12-5V) ,Фильтр, конденсаторы)
1. один датчик хола (или ХоллА )
2. две линейкисветодиодов на ATTiny2313 по 15 через 180 градусов)))
3. думаю все таки с изменяемой задержкой выставляемой по таймеру МК TCCR1.
ВОПРОС В ТОМ КАК РАЗДЕЛИТЬ ЧИСЛО (допустим)31250={Ocr1ah=0x7a Ocr1al=0x12}
на 160 или 256 да хоть на 2!!!!!!!!!!!
В асемблере уже двое суток мозг напрягаю, КАК???
Железо на моторе не правиться и ни вариться и ни краситься. только и думаю как прогу написать!!!
Чтоб число более ли менее совподало с желаемым результатом 1h=0xff 1L=0xff (КАК делить в этом случае??????? и какие операторы использовать с наименьшей погрешностью:((
) .
С питанием ни каких проблем. МАсса (-) всем извесный и щетка с вилки на диск колеса(+) (испытаная система чем меньше радиус от оси вращения тем стобильнее питание).
вот и все питание (конечно кренка(или преобразователь12-5V) ,Фильтр, конденсаторы)
Чем больше думаеш, тем дольше уснуть не можеш...
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
на два делить просто : сдвиг числа на один разряд вправо)))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- Реклама
Посмотрел я тот проект зарубежный. Здорово, конечно. Но вот 200 диодов будут стоить 2000р - дороговато. По крайней мере для меня. И жрать будут дофига. Написать программу - проще пареной репы. Вот собрать железо - это действительно сложно. А если дождь? А если грязь? Как потом это ЧУДО отмывать?! Может кто-то предложит широко доступный, подходящий для наших целей корпус?
- SeamaNCOS
- Встал на лапы
- Сообщения: 107
- Зарегистрирован: Ср дек 10, 2008 15:10:59
- Откуда: KPACHO9PCK
- Контактная информация:
Написал я прошивку(только прерывания без индикации) но она никак работать не хочет.
Сделал так как писал Evgen88 (как изначально и собирался делать сам)только все же на Attiny2313
[quote="Evgen88"]Кароче делать нада так:
1. забуть про 2313 - делай на меге (например Мега48 стоит почти также, но какая разница!)
2. запускаеш 16 битный таймер
3. делаеш захват значения таймера (нога ICR) датчиком хола
4. количество столбцов должно быть 256 (это шоб облегчить жизнь твоему контроллеру
)
5. береш старший байт захваченного значения 16 битного тайммера и это значение заносиш в регистр сравнения 8 битного таймера - по переполнению которого будет выводится новая строчка
6. в момент захвата 16 битного таймера обнуляеш оба таймера и записываеш новое значение сравнения в 8 битный таймер.
/quote]
Подозрения на то что при обнулении таимера0 обнуляется и таимер1
т.к. с Tcnt1h всегда читаеться 0.....
В чем может быть дело ???
Сделал так как писал Evgen88 (как изначально и собирался делать сам)только все же на Attiny2313
[quote="Evgen88"]Кароче делать нада так:
1. забуть про 2313 - делай на меге (например Мега48 стоит почти также, но какая разница!)
2. запускаеш 16 битный таймер
3. делаеш захват значения таймера (нога ICR) датчиком хола
4. количество столбцов должно быть 256 (это шоб облегчить жизнь твоему контроллеру
5. береш старший байт захваченного значения 16 битного тайммера и это значение заносиш в регистр сравнения 8 битного таймера - по переполнению которого будет выводится новая строчка
6. в момент захвата 16 битного таймера обнуляеш оба таймера и записываеш новое значение сравнения в 8 битный таймер.
/quote]
Подозрения на то что при обнулении таимера0 обнуляется и таимер1
т.к. с Tcnt1h всегда читаеться 0.....
В чем может быть дело ???
- Вложения
-
- code.asm
- (2.35 КБ) 500 скачиваний
-
- code.zip
- Схема п протеусе 7.4 sp3
- (28.05 КБ) 504 скачивания
Чем больше думаеш, тем дольше уснуть не можеш...
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Блин, немного не в тему, зачем делать в протеусе? неужели нельзя сделать в железе и на нем проверять?
1)удобнее в тысячу раз.
2)нет никакой уверенности,что протеус правду показывает, учитывая все его глюки.
по поводу кода:
зачем два раза? еще и по-разному....
- это тоже настрожило
в Tiny2313 для этих целей используется регистр TCCR0B
здесь обязательно сохраняйте SREG а потом восстанавливайте.
теперь программные недочеты:
не совсем понял, как вы боретесь с дребезгом, если за счет temp2, то вы явно перестарались... ну сработает у вас кнопка один раз и все... не будет больше temp2 = 0.... таким образом весь ваш код сводит на НЕТ вызов обработчика срабарывания кнопки... думаю поэтому и не работает...
насчет алгоритма который вам подсказал Evgen88.
он говорил о прерывании захвата, а не о банальном считывании из счетного регистра. может быть это не принципиально, но зачем огород городить, если можно сделать по прерыванию( если надумаете так сделать, опять таки не забудьте про SREG)
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
Код: Выделить всё
;******Прерывание по совподению ч.с. и таимер0*****
TIMER0_COMPA:
ldi temp1,0
OUT Tcnt0,temp1 ;обнуляем таимер0
inc temp4
reti ;выход из обработчика
теперь программные недочеты:
не совсем понял, как вы боретесь с дребезгом, если за счет temp2, то вы явно перестарались... ну сработает у вас кнопка один раз и все... не будет больше temp2 = 0.... таким образом весь ваш код сводит на НЕТ вызов обработчика срабарывания кнопки... думаю поэтому и не работает...
насчет алгоритма который вам подсказал Evgen88.
он говорил о прерывании захвата, а не о банальном считывании из счетного регистра. может быть это не принципиально, но зачем огород городить, если можно сделать по прерыванию( если надумаете так сделать, опять таки не забудьте про SREG)
Код: Выделить всё
.equ ICP1addr = 0x0003 ; Timer/Counter1 Capture Event- SeamaNCOS
- Встал на лапы
- Сообщения: 107
- Зарегистрирован: Ср дек 10, 2008 15:10:59
- Откуда: KPACHO9PCK
- Контактная информация:
В протеусе потому как нет осцилографа. да и в нем видно работает код или нет(за место кнопки ставим генератоp, меняем частоту считая импульсы с PB0).
Код поправил. Кнопка работает проверял (в место Tcnt1h при чтении ставил Tcnt1l частота меняеться).
Сохранять SREG куда ? точнее как или что в него сохранять(значение таимера1)?
так?
mov ICP1a,temp1
Код поправил. Кнопка работает проверял (в место Tcnt1h при чтении ставил Tcnt1l частота меняеться).
Сохранять SREG куда ? точнее как или что в него сохранять(значение таимера1)?
так?
mov ICP1a,temp1
Чем больше думаеш, тем дольше уснуть не можеш...
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
насчет кнопки не буду спорить, не проверял, работает и слава богу....
SREG сохранять:
SREG-речистр флагов лог/мат операции микроконтроллера
если у тебя происходит прерывание перед проверкой условия
типа: breq или brne... ну и подобные, которые используют флаги регистра SREG для принятия "решения"
и в этом прерывании опять происходит какая то операция, которая меняет регистр SREG, то после возврата в точку, откуда прерывались, это условие может сработать неверно, поэтому предлагают :
SREG сохранять:
SREG-речистр флагов лог/мат операции микроконтроллера
если у тебя происходит прерывание перед проверкой условия
типа: breq или brne... ну и подобные, которые используют флаги регистра SREG для принятия "решения"
и в этом прерывании опять происходит какая то операция, которая меняет регистр SREG, то после возврата в точку, откуда прерывались, это условие может сработать неверно, поэтому предлагают :
Код: Выделить всё
;---обработчик прерывания---
in tmp,sreg
push tmp
-----------------------------
-------какой то код-------
-----------------------------
pop tmp
out sreg,tmp
reti
;-----------------------------------Зачем же Вы новичку советы неправильные даете?! Ваш код будет портить регистр tmp, в результате, избавившись от одного глюка можно приобрести другой. Делать нужно либо такibiza11 писал(а):... это условие может сработать неверно, поэтому предлагают :
Код: Выделить всё
;---обработчик прерывания---
push tmp
in tmp,sreg
push tmp
-----------------------------
-------какой то код-------
-----------------------------
pop tmp
out sreg,tmp
pop tmp
reti
;-----------------------------------Код: Выделить всё
;---обработчик прерывания---
in tmp,sreg
-----------------------------
-------какой то код-------
-----------------------------
out sreg,tmp
reti
;-----------------------------------В принципе Ваш способ тоже имеет право на жизнь, при одном условии - если tmp будет отведен только под сохранение SREG.ibiza11 писал(а):действительно))![]()
тогда потимально будет просто сохранять в регистр и нигде его больше не использовать.
а насчет прерывания в прерывании не понял идеи... почему же нельзя? если так же сохранить SREG???
Про прерывания в прерывании относилось только к тому случаю когда для сохранения SREG используется регистр, а не стек. Посмотрите сами, вот у нас возникло прерывание, мы сохранили SREG и разрешили прерывания внутри обработчика, если внутри этого обработчика возникнет другое прерывание, то оно вызовет свой обработчик, в котором наверняка тоже нужно сохранять SREG, а у нас для этого используется регистр, и в нем уже есть какое-то значение SREG, значит это значение затрется, на его место встанет другое, и при извлечении может получиться косяк.
- SeamaNCOS
- Встал на лапы
- Сообщения: 107
- Зарегистрирован: Ср дек 10, 2008 15:10:59
- Откуда: KPACHO9PCK
- Контактная информация:
Сделал так
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
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
Чем больше думаеш, тем дольше уснуть не можеш...
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
тогда нет смысла операции pushsmac писал(а):если tmp будет отведен только под сохранение SREG.
если использовать один и тот же регистр, то естественно затрется, я думаю это и новички понимают.smac писал(а): значит это значение затрется...
для тех кто не понял:
если для сохранения регистра SREG используется регистр r0-r31 и разрешается прерывание в прерывании, то для каждой операции сохранения нужно использовать отдельный регистр.
- SeamaNCOS
- Встал на лапы
- Сообщения: 107
- Зарегистрирован: Ср дек 10, 2008 15:10:59
- Откуда: KPACHO9PCK
- Контактная информация:
Наконец то заработало
сохранил Tcnt1h и Tcnt1l в отдельно отведенные регистры до прерывания и востанавливал в прерывании.
Также запретил прерывание при индикации и обработке кнопки.
Теперь проблема с железом
при одном нажатии кнопка срабатывает 2а (или больше) раза из-за этого в железе не работает(постоянно обнуляет число сравнения), а в протеусе без проблем с частатой внешнего сигнала от 1 до 20Гц(это те граници в каторых проверял).
Буду думать как изменить обработчик кнопок чтоб не глючил... Может задержку после чтения поставить ??
С опто парой работает нормально
буду писать рисунок какой нибудь и светодиодов добавлю будет 14(пока8)
Решил остановиться пока на 1 полоске (при 3Гц уже нормально видно)
вот прошивка(пока без рисунка)
сохранил Tcnt1h и Tcnt1l в отдельно отведенные регистры до прерывания и востанавливал в прерывании.
Также запретил прерывание при индикации и обработке кнопки.
Теперь проблема с железом
Буду думать как изменить обработчик кнопок чтоб не глючил... Может задержку после чтения поставить ??
С опто парой работает нормально
Решил остановиться пока на 1 полоске (при 3Гц уже нормально видно)
вот прошивка(пока без рисунка)
- Вложения
-
- code.asm
- (2.6 КБ) 686 скачиваний
Чем больше думаеш, тем дольше уснуть не можеш...


