Пятница, 26.04.2024, 05:35
Вы вошли как Гость | Группа "Гости"Приветствую Вас Гость | RSS
Главная | Измеритель разряда литиевых батарей - Страница 6 - Форум | Мой профиль | Регистрация | Выход | Вход
Обитель RC-инженера
Форма входа
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Модератор форума: ВитГо  
Форум » Разработка электронных устройств » Разработано и сделано ! » Измеритель разряда литиевых батарей
Измеритель разряда литиевых батарей
uwrteyДата: Пятница, 25.01.2013, 12:18 | Сообщение # 76
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
ок. с утра займусь... wink

Добавлено (25.01.2013, 12:18)
---------------------------------------------
Цитата
ну если два младших дрожат - то фиг с ним !
- если бы дрожали два младших бита - то фиг с ним. Но когда дрожат два шестнадцатеричных символа на экране - то это значит что дрожат ВОСЕМЬ младших битов.
Я как следует вымыл плату от остатков флюса, и выпаял дроссель - дрожание прекратилось ( иногда только помигивает младший символ...)
smile

немного изменил схему ( например - поставил многооборотный подстроечник на 10 кОм )
Прикрепления: 4440645.jpg (212.9 Kb)


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Пятница, 25.01.2013, 12:31
 
ВитГоДата: Пятница, 25.01.2013, 15:02 | Сообщение # 77
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
гм.. я неотмытую плату даже не включаю....
обычно после пайки беру спирт и зубную щетку - и вымываю все хорошенько. потом на батарею отопления...


Виталий (аka ВитГо)
 
uwrteyДата: Суббота, 26.01.2013, 17:48 | Сообщение # 78
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
я рассчитал делитель на входе АЦП ( на схеме значения подписаны - 5,9 кОм это между АЦП и общим )
написал программу, но что то она не работает wacko - на экране появляется "1" ( индикатор того что батарея заряжена ) и на этом все виснет
днем буду разбираться что к чему....

кстати, Виталий, а как подсчитать сколько времени длиться основной цикл ? Вдруг у меня основной цикл будет настолько велик, что программа не будет доходить до его конца и где то в середине будет срабатывать прерывание АЦП...
Прикрепления: 8553531.jpg (240.0 Kb) · ___.asm (10.0 Kb)


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Суббота, 26.01.2013, 17:52
 
uwrteyДата: Суббота, 26.01.2013, 17:53 | Сообщение # 79
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Странно.

Мне кажется, что программа не доходит до конца главного цикла - срабатывает прерывание АЦП.
И программа виснет в подпрограмме задержки

Код


;*****************************************************************************************
; подпрограмма задержки   
;*****************************************************************************************

zaderjka:

                       ldi Temp,255   ; ЗАДЕРЖКА   

                       Ldi Temp4,4

delay_256:
     
                       dec Temp
                       brne delay_256

                       dec Temp4
                       brne delay_256

   ret

;*****************************************************************************************

*
*
*
а вот например если сделать вот такую задержку, то на экран выводится значение АЦП
но я не успеваю увидеть заряженный аккумулятор или севший и не успеваю увидеть количество банок..
Код


;*****************************************************************************************
; подпрограмма задержки   
;*****************************************************************************************

zaderjka:

                    ldi Temp,255   ; ЗАДЕРЖКА   

delay_256:
     
                    dec Temp
                    brne delay_256

   ret

;*****************************************************************************************

*
*
*
а вот то, что показалось мне странным....
если сделать вот такую задержку, то она по сути ни чем не отличается от предыдущей, но так же НЕРАБОТАЕТ как в первом варианте
Код

;*****************************************************************************************
; подпрограмма задержки   
;*****************************************************************************************

zaderjka:

                           ldi Temp,255   ; ЗАДЕРЖКА   

                           Ldi Temp4,1

delay_256:
     
                          dec Temp
                          brne delay_256

                          dec Temp4
                          brne delay_256

   ret

;*****************************************************************************************
Прикрепления: 1781155.asm (10.0 Kb)


не успеваю за своими мыслями......
 
uwrteyДата: Суббота, 26.01.2013, 18:18 | Сообщение # 80
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
я заново переписал цикл задержки и увеличил ее - теперь все работает! biggrin

....а-а, вот оно что...
я кажется понял в чем дело...
в задержке я использовал РОН Temp4 и его же я использовал для сохранения SREG

основной цикл не доходит до конца - его прерывает обработчик прерываний и происходит вычисление АЦП в это время в Temp4 записывалось другое число и подпрограмма задержки не могла закончится..

Я вышел из ситуации использовав Temp1 вместо Temp4 ....
Но если будет нужна точность по времени, то так делать нельзя... нужно организовывать или одиночное вычисление АЦП или АЦП-по событию..

кстати, а как мигать светодиодом ? по таймеру?
В любом случае автозапуск АЦП придется переделать или на одиночное вычисление или на автозапуск по событию....
Прикрепления: 7019059.asm (10.0 Kb)


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Суббота, 26.01.2013, 20:33
 
ВитГоДата: Суббота, 26.01.2013, 23:53 | Сообщение # 81
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
ну во первых регистр использовал повторно

а во вторых - а нафига тебе вообще задержка ? ты же по прерыванию флаг выставляешь готовности данных - вот его и отслеживай

светодиодом мигать по таймеру.. запусти T1 что ли...

еще раз сверься с тем что и как работает в основном цикле:
- у нас прерывание от АЦП генериться само по себе, по результату устаналивается флаг готовности данных - никаких задержек не нужно !
- второе прерывание это Т1 в котором в зависимости от значения ацп (поделенного на количество банок) выводятся импульсы

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

мигание можно попробовать сделать через ШИМ таймера Т1 !!! прочитай, там прикольно, можно даже поизвращаться и плавно управлять шириной импульса - когда заряжена батарея гореть больше, когда разряжена - меньше... светодиоды потребляют мизерный ток (до 200 ма) по сравнению с двигателем модели (до 25-40 ампер) так что их током можно пренебречь

кстати что со значением АЦП - откалибровался ? получается получать разные значения в зависимости от входного напряжения?


Виталий (аka ВитГо)
 
ВитГоДата: Воскресенье, 27.01.2013, 00:02 | Сообщение # 82
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
Цитата (uwrtey)
кстати, Виталий, а как подсчитать сколько времени длиться основной цикл ?


гм, ну если очень нужно то по тактам для каждой команды, я беру максимальное значение длительности обычно...

но тебе это не нужно здесь


Виталий (аka ВитГо)
 
uwrteyДата: Воскресенье, 27.01.2013, 09:35 | Сообщение # 83
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Цитата (ВитГо)
а во вторых - а нафига тебе вообще задержка ? ты же по прерыванию флаг выставляешь готовности данных - вот его и отслеживай

Задержка была нужна для того, что бы увидеть на дисплее индикацию о состоянии акумулятора и количество банок.
*
*
Цитата (ВитГо)
кстати что со значением АЦП - откалибровался ? получается получать разные значения в зависимости от входного напряжения?

да
*
*
Цитата (ВитГо)
гм, ну если очень нужно то по тактам для каждой команды, я беру максимальное значение длительности обычно...
но тебе это не нужно здесь

это я для общего развития спросил - пригодится еще.
*
*
Цитата (ВитГо)
у нас прерывание от АЦП генериться само по себе, по результату устаналивается флаг готовности данных - никаких задержек не нужно !

да прерывание АЦП генерится сразу друг за другом..... с частотой 75кГц и основной цикл, при первом запуске, не доходит до конца - его прерывает АЦП.
и если я начну мигать светодиодом с определенной частотой, то эта частота может сбиться - из за того, что прерывание АЦП произойдет в неподходящее время.. Вот я и говорю может вычисление АЦП сделать однократно (вручную) или то же на таймер посадить ( что-бы синхронизировать с мигающим светодиодом и не сбивать им частоту мигания )
*
*
Цитата
мигание можно попробовать сделать через ШИМ таймера Т1 !!!
я ожидал услышать про ШИМ smile
пошел читать что это такое и с чем его едят...


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Воскресенье, 27.01.2013, 11:08
 
ВитГоДата: Воскресенье, 27.01.2013, 17:17 | Сообщение # 84
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
Цитата (uwrtey)
Задержка была нужна для того, что бы увидеть на дисплее индикацию о состоянии акумулятора и количество банок.


ааа, ну ее лучше тоже делать по тикам прерывания таймера...

Цитата (uwrtey)
да прерывание АЦП генерится сразу друг за другом..... с частотой 75кГц и основной цикл, при первом запуске, не доходит до конца - его прерывает АЦП.
и если я начну мигать светодиодом с определенной частотой, то эта частота может сбиться - из за того, что прерывание АЦП произойдет в неподходящее время.. Вот я и говорю может вычисление АЦП сделать однократно (вручную) или то же на таймер посадить ( что-бы синхронизировать с мигающим светодиодом и не сбивать им частоту мигания )


причем здесь частота светодиода и прерывания АЦП?

по прерыванию ацп ты получаешь данные о напруге...

в другом прерывании (по таймеру) ты выводишь инфу на светодиод.

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

в идеале как мигнули так после этого посмотрели следующее значение ацп...

в принципе может быть действительно через однократное преобразование удобнее было бы сделать


Виталий (аka ВитГо)
 
uwrteyДата: Воскресенье, 27.01.2013, 17:28 | Сообщение # 85
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Почитал про ШИМ. Похоже что придется использовать Compare Output Mode, Phase Correct PWM Mode ( WGM02 = 1: Toggle OC0A on Compare Match )
Только вот я что то не понял как управлять шириной импульса/скважности ? вручную менять значение в TCNT1 ??

Добавлено (27.01.2013, 17:28)
---------------------------------------------

Цитата (ВитГо)
оба процесса ассинхронны ! и работают независимо
правда один поставляет данные для другого.. но нам не обязательно отрабатывать каждое изменение значения ацп !!

Дак я про это и говорю. Допустим, наступит время для обработки прерывания по таймеру, а в это время будет обрабатываться прерывание АЦП.
Прерывание по таймеру наступит не вовремя, а сразу после того как закончится прерывание по АЦП - а значит не вовремя.. - я вот про чтотолкую..


не успеваю за своими мыслями......
 
ВитГоДата: Воскресенье, 27.01.2013, 21:31 | Сообщение # 86
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
Цитата (uwrtey)
Дак я про это и говорю. Допустим, наступит время для обработки прерывания по таймеру, а в это время будет обрабатываться прерывание АЦП.
Прерывание по таймеру наступит не вовремя, а сразу после того как закончится прерывание по АЦП - а значит не вовремя.. - я вот про чтотолкую..


и в чем ты видишь проблему ?

исполняющий поток у нас один..

работаем в главном цикле, например прочитали только что значение АЦП из ОЗУ.. и тут БАЦ ! - прерывание от АЦП !
идем в прерывание, сохраняем все регистры которые будут меняться, сохраням SREG
читаем значение АЦП, сохраняем его в память, восстанавливаем SREG, и восстанавливаем регистры, по reti выходим
попадаем в главный цикл. и как ни в чем небывало продолжаем его исполнение, да, у нас старые значения АЦП (в памяти они уже изменились после прерывания) - ну и что ? новые значения обработаем в следующем цикле, а сейчас работаем с теми что успели прочитать - печатаем их на дисплей (мигаем светодиодом), циклимся на главный цикл...

что тебя в таком процессе пугает ?

может быть даже еще интереснее - пока ты будешь печатать значение ацп на дисплее (а это процесс длительный) - произойдет еще одно прерывание, и в память будет записано новое значение АЦП, а предыдущее ты даже не успеешь обработать (так как читал состояние до предыдущего, и после выполнения зацикливания в главной программе прочитаешь уже следующее значение) - ну и что ? для наших целей это не страшно !!!

так что не грузись там где не нужно :-)


Виталий (аka ВитГо)
 
uwrteyДата: Воскресенье, 27.01.2013, 21:42 | Сообщение # 87
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
да я не про значение АЦП беспокоюсь, а про то что точность ШИМа испортиться может... dry
ну да ладно - разберемся... biggrin

Цитата (uwrtey)
Почитал про ШИМ. Похоже что придется использовать Compare Output Mode, Phase Correct PWM Mode ( WGM02 = 1: Toggle OC0A on Compare Match )
Только вот я что то не понял как управлять шириной импульса/скважности ? вручную менять значение в TCNT1 ??

?


не успеваю за своими мыслями......
 
ВитГоДата: Воскресенье, 27.01.2013, 21:47 | Сообщение # 88
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
Цитата (uwrtey)
да я не про значение АЦП беспокоюсь, а про то что точность ШИМа испортиться может...
ну да ладно - разберемся...


а почему шим должен испортиться ? он работает независимо от проца...

Цитата (uwrtey)
Почитал про ШИМ. Похоже что придется использовать Compare Output Mode, Phase Correct PWM Mode ( WGM02 = 1: Toggle OC0A on Compare Match )
Только вот я что то не понял как управлять шириной импульса/скважности ? вручную менять значение в TCNT1 ??


почему ? можно изменять OCR1A\OCR1B


Виталий (аka ВитГо)
 
uwrteyДата: Воскресенье, 27.01.2013, 21:58 | Сообщение # 89
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Репутация: 11
Статус: Offline
Цитата (ВитГо)
а почему шим должен испортиться ? он работает независимо от проца...

шим работает по прерыванию таймера ? или я что то не понимаю еще пока..

Цитата

почему ? можно изменять OCR1A\OCR1B

я это и имел ввиду... ( оговорился видимо )


не успеваю за своими мыслями......

Сообщение отредактировал uwrtey - Воскресенье, 27.01.2013, 22:26
 
ВитГоДата: Воскресенье, 27.01.2013, 22:25 | Сообщение # 90
Полковник
Группа: Администраторы
Сообщений: 2422
Репутация: 20
Статус: Offline
шим работает сам !!!

если например tcnt1 = ocr1a - то вывод oc1a сбрасывается в ноль (ну или в 1)...
процессор здесь не работает ! - это происходит аппаратно за счет схемы счетчика !!!

параллельно генериться прерывание в которое процессор попадет как только сможет чтобы обработать это событие... но состояние вывода уже поменялось !!!!!

в этом и смысл ШИМ !

можно задать делитель для счетчика
-----------
/по ocr1a например устанавливать в 1 вывод генерации
/по ocr1b сбрасывать счетчик таймера и устанавливать вывод генерации в 0
/------------ это все именно настройками счетчика а не силами процессора !!!

и больше ничего процом не делать !!! можно вообще его в sleep послать !!!!
а на выводе генерации будут импульСЫ !!!! счечик сам будет генерить импульсы в соответствии с настройками


Виталий (аka ВитГо)
 
Форум » Разработка электронных устройств » Разработано и сделано ! » Измеритель разряда литиевых батарей
Поиск:


Copyright MyCorp © 2024
Сделать бесплатный сайт с uCoz