Измеритель разряда литиевых батарей
| |
uwrtey | Дата: Пятница, 25.01.2013, 12:18 | Сообщение # 76 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| ок. с утра займусь...
Добавлено (25.01.2013, 12:18) --------------------------------------------- Цитата ну если два младших дрожат - то фиг с ним ! - если бы дрожали два младших бита - то фиг с ним. Но когда дрожат два шестнадцатеричных символа на экране - то это значит что дрожат ВОСЕМЬ младших битов. Я как следует вымыл плату от остатков флюса, и выпаял дроссель - дрожание прекратилось ( иногда только помигивает младший символ...)
немного изменил схему ( например - поставил многооборотный подстроечник на 10 кОм )
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Пятница, 25.01.2013, 12:31 |
|
| |
ВитГо | Дата: Пятница, 25.01.2013, 15:02 | Сообщение # 77 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| гм.. я неотмытую плату даже не включаю.... обычно после пайки беру спирт и зубную щетку - и вымываю все хорошенько. потом на батарею отопления...
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Суббота, 26.01.2013, 17:48 | Сообщение # 78 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| я рассчитал делитель на входе АЦП ( на схеме значения подписаны - 5,9 кОм это между АЦП и общим ) написал программу, но что то она не работает - на экране появляется "1" ( индикатор того что батарея заряжена ) и на этом все виснет днем буду разбираться что к чему....
кстати, Виталий, а как подсчитать сколько времени длиться основной цикл ? Вдруг у меня основной цикл будет настолько велик, что программа не будет доходить до его конца и где то в середине будет срабатывать прерывание АЦП...
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Суббота, 26.01.2013, 17:52 |
|
| |
uwrtey | Дата: Суббота, 26.01.2013, 17:53 | Сообщение # 79 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: 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
;*****************************************************************************************
не успеваю за своими мыслями......
|
|
| |
uwrtey | Дата: Суббота, 26.01.2013, 18:18 | Сообщение # 80 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| я заново переписал цикл задержки и увеличил ее - теперь все работает!
....а-а, вот оно что... я кажется понял в чем дело... в задержке я использовал РОН Temp4 и его же я использовал для сохранения SREG
основной цикл не доходит до конца - его прерывает обработчик прерываний и происходит вычисление АЦП в это время в Temp4 записывалось другое число и подпрограмма задержки не могла закончится..
Я вышел из ситуации использовав Temp1 вместо Temp4 .... Но если будет нужна точность по времени, то так делать нельзя... нужно организовывать или одиночное вычисление АЦП или АЦП-по событию..
кстати, а как мигать светодиодом ? по таймеру? В любом случае автозапуск АЦП придется переделать или на одиночное вычисление или на автозапуск по событию....
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Суббота, 26.01.2013, 20:33 |
|
| |
ВитГо | Дата: Суббота, 26.01.2013, 23:53 | Сообщение # 81 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| ну во первых регистр использовал повторно
а во вторых - а нафига тебе вообще задержка ? ты же по прерыванию флаг выставляешь готовности данных - вот его и отслеживай
светодиодом мигать по таймеру.. запусти T1 что ли...
еще раз сверься с тем что и как работает в основном цикле: - у нас прерывание от АЦП генериться само по себе, по результату устаналивается флаг готовности данных - никаких задержек не нужно ! - второе прерывание это Т1 в котором в зависимости от значения ацп (поделенного на количество банок) выводятся импульсы
наверно лучше хранить переменные не в регистрах а в памяти, чтобы не следить за тем что мы используем а что нет.. одновременно при входе в прерывание сначала сохраняем регистры на стеке (смотри не перепутай когда будешь их восстанавливать со стека при выходе ! и про SREG не забудь !!!)
мигание можно попробовать сделать через ШИМ таймера Т1 !!! прочитай, там прикольно, можно даже поизвращаться и плавно управлять шириной импульса - когда заряжена батарея гореть больше, когда разряжена - меньше... светодиоды потребляют мизерный ток (до 200 ма) по сравнению с двигателем модели (до 25-40 ампер) так что их током можно пренебречь
кстати что со значением АЦП - откалибровался ? получается получать разные значения в зависимости от входного напряжения?
Виталий (аka ВитГо)
|
|
| |
ВитГо | Дата: Воскресенье, 27.01.2013, 00:02 | Сообщение # 82 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| Цитата (uwrtey) кстати, Виталий, а как подсчитать сколько времени длиться основной цикл ?
гм, ну если очень нужно то по тактам для каждой команды, я беру максимальное значение длительности обычно...
но тебе это не нужно здесь
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 27.01.2013, 09:35 | Сообщение # 83 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| Цитата (ВитГо) а во вторых - а нафига тебе вообще задержка ? ты же по прерыванию флаг выставляешь готовности данных - вот его и отслеживай Задержка была нужна для того, что бы увидеть на дисплее индикацию о состоянии акумулятора и количество банок. * * Цитата (ВитГо) кстати что со значением АЦП - откалибровался ? получается получать разные значения в зависимости от входного напряжения? да * * Цитата (ВитГо) гм, ну если очень нужно то по тактам для каждой команды, я беру максимальное значение длительности обычно... но тебе это не нужно здесь это я для общего развития спросил - пригодится еще. * * Цитата (ВитГо) у нас прерывание от АЦП генериться само по себе, по результату устаналивается флаг готовности данных - никаких задержек не нужно ! да прерывание АЦП генерится сразу друг за другом..... с частотой 75кГц и основной цикл, при первом запуске, не доходит до конца - его прерывает АЦП. и если я начну мигать светодиодом с определенной частотой, то эта частота может сбиться - из за того, что прерывание АЦП произойдет в неподходящее время.. Вот я и говорю может вычисление АЦП сделать однократно (вручную) или то же на таймер посадить ( что-бы синхронизировать с мигающим светодиодом и не сбивать им частоту мигания ) * * Цитата мигание можно попробовать сделать через ШИМ таймера Т1 !!! я ожидал услышать про ШИМ пошел читать что это такое и с чем его едят...
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Воскресенье, 27.01.2013, 11:08 |
|
| |
ВитГо | Дата: Воскресенье, 27.01.2013, 17:17 | Сообщение # 84 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| Цитата (uwrtey) Задержка была нужна для того, что бы увидеть на дисплее индикацию о состоянии акумулятора и количество банок.
ааа, ну ее лучше тоже делать по тикам прерывания таймера...
Цитата (uwrtey) да прерывание АЦП генерится сразу друг за другом..... с частотой 75кГц и основной цикл, при первом запуске, не доходит до конца - его прерывает АЦП. и если я начну мигать светодиодом с определенной частотой, то эта частота может сбиться - из за того, что прерывание АЦП произойдет в неподходящее время.. Вот я и говорю может вычисление АЦП сделать однократно (вручную) или то же на таймер посадить ( что-бы синхронизировать с мигающим светодиодом и не сбивать им частоту мигания )
причем здесь частота светодиода и прерывания АЦП?
по прерыванию ацп ты получаешь данные о напруге...
в другом прерывании (по таймеру) ты выводишь инфу на светодиод.
оба процесса ассинхронны ! и работают независимо правда один поставляет данные для другого.. но нам не обязательно отрабатывать каждое изменение значения ацп !!
в идеале как мигнули так после этого посмотрели следующее значение ацп...
в принципе может быть действительно через однократное преобразование удобнее было бы сделать
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 27.01.2013, 17:28 | Сообщение # 85 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: 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
Статус: Offline
| Цитата (uwrtey) Дак я про это и говорю. Допустим, наступит время для обработки прерывания по таймеру, а в это время будет обрабатываться прерывание АЦП. Прерывание по таймеру наступит не вовремя, а сразу после того как закончится прерывание по АЦП - а значит не вовремя.. - я вот про чтотолкую..
и в чем ты видишь проблему ?
исполняющий поток у нас один..
работаем в главном цикле, например прочитали только что значение АЦП из ОЗУ.. и тут БАЦ ! - прерывание от АЦП ! идем в прерывание, сохраняем все регистры которые будут меняться, сохраням SREG читаем значение АЦП, сохраняем его в память, восстанавливаем SREG, и восстанавливаем регистры, по reti выходим попадаем в главный цикл. и как ни в чем небывало продолжаем его исполнение, да, у нас старые значения АЦП (в памяти они уже изменились после прерывания) - ну и что ? новые значения обработаем в следующем цикле, а сейчас работаем с теми что успели прочитать - печатаем их на дисплей (мигаем светодиодом), циклимся на главный цикл...
что тебя в таком процессе пугает ?
может быть даже еще интереснее - пока ты будешь печатать значение ацп на дисплее (а это процесс длительный) - произойдет еще одно прерывание, и в память будет записано новое значение АЦП, а предыдущее ты даже не успеешь обработать (так как читал состояние до предыдущего, и после выполнения зацикливания в главной программе прочитаешь уже следующее значение) - ну и что ? для наших целей это не страшно !!!
так что не грузись там где не нужно :-)
Виталий (аka ВитГо)
|
|
| |
uwrtey | Дата: Воскресенье, 27.01.2013, 21:42 | Сообщение # 87 |
Генерал-майор
Группа: Администраторы
Сообщений: 3270
Статус: Offline
| да я не про значение АЦП беспокоюсь, а про то что точность ШИМа испортиться может... ну да ладно - разберемся...
Цитата (uwrtey) Почитал про ШИМ. Похоже что придется использовать Compare Output Mode, Phase Correct PWM Mode ( WGM02 = 1: Toggle OC0A on Compare Match ) Только вот я что то не понял как управлять шириной импульса/скважности ? вручную менять значение в TCNT1 ?? ?
не успеваю за своими мыслями......
|
|
| |
ВитГо | Дата: Воскресенье, 27.01.2013, 21:47 | Сообщение # 88 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: 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
Статус: Offline
| Цитата (ВитГо) а почему шим должен испортиться ? он работает независимо от проца... шим работает по прерыванию таймера ? или я что то не понимаю еще пока..
Цитата почему ? можно изменять OCR1A\OCR1B я это и имел ввиду... ( оговорился видимо )
не успеваю за своими мыслями......
Сообщение отредактировал uwrtey - Воскресенье, 27.01.2013, 22:26 |
|
| |
ВитГо | Дата: Воскресенье, 27.01.2013, 22:25 | Сообщение # 90 |
Полковник
Группа: Администраторы
Сообщений: 2422
Статус: Offline
| шим работает сам !!!
если например tcnt1 = ocr1a - то вывод oc1a сбрасывается в ноль (ну или в 1)... процессор здесь не работает ! - это происходит аппаратно за счет схемы счетчика !!!
параллельно генериться прерывание в которое процессор попадет как только сможет чтобы обработать это событие... но состояние вывода уже поменялось !!!!!
в этом и смысл ШИМ !
можно задать делитель для счетчика ----------- /по ocr1a например устанавливать в 1 вывод генерации /по ocr1b сбрасывать счетчик таймера и устанавливать вывод генерации в 0 /------------ это все именно настройками счетчика а не силами процессора !!!
и больше ничего процом не делать !!! можно вообще его в sleep послать !!!! а на выводе генерации будут импульСЫ !!!! счечик сам будет генерить импульсы в соответствии с настройками
Виталий (аka ВитГо)
|
|
| |
|