|
|
| ||||||||
|
|
|
|
18070
71
5
0
|
|
Опции темы | Поиск в этой теме |
|
|
61
|
![]() Регистрация: 07.04.2013 Последняя активность: 13.06.2023 02:24
Сообщений: 5759
Сказал(а) спасибо: 340
Поблагодарили: 8163 раз(а) в 2386 сообщениях
|
Mishany, А код где?
|
|
|
|
|
62
|
|
Новичок
Регистрация: 30.09.2013 Последняя активность: 13.04.2014 11:40
Сообщений: 30
Сказал(а) спасибо: 6
Поблагодарили: 0 раз(а) в 0 сообщениях
|
Код:
#include <avr/io.h>
#include <avr/interrupt.h>
__attribute__((OS_main))
SIGNAL(SIG_ADC)
{
OCR1A=OCR1A*164/ADCH;
}
int main(void)
{
CLKPR=0x80;
CLKPR=0x00;
PORTB=0b00000000;
DDRB=0b00000010;
PLLCSR=0x02;
while ((PLLCSR & 1)==0);
PLLCSR|=0x04;
TCCR1=0x61; //64
GTCCR=0x00;
TCNT1=0x00;
OCR1A=0x00;
OCR1B=0x00;
OCR1C=0xFF;
ACSR=0x80;
ADCSRB=0x00;
OCR1A=10;
ADMUX=0b10100011;
ADCSRA=0b11111101;
sei();
while (1)
{
}
}
|
|
|
|
|
|
63
|
![]() Регистрация: 07.04.2013 Последняя активность: 13.06.2023 02:24
Сообщений: 5759
Сказал(а) спасибо: 340
Поблагодарили: 8163 раз(а) в 2386 сообщениях
|
Я там ничего не вижу. Именно там, где мне интересно было посмотреть как читается, модифицируется и затем записывается обратно значение в OCR1A. Тупая копипаста не обязана работать - это вообще комментарий с ассемблерного полотна, стилизованный под Си. Как я нарисую в арифметической формуле проверку на переполнения через флаги статуса, к которым в Си прямого доступа просто нет? А без этих проверок глючить что угодно будет. Важно как именно объявлены переменные, и какие именно параметры заданны компилятору. Он ведь сам решает что в коде нужно, а что можно выпилить. И часто это делает неправильно. Поэтому можно заглянуть в листинг и посмотреть что он там нафантазировал выполняя Ваши капризы...
OCR1A CR1A*164/ADCH; - а этот код как себя ведёт на жесткой нагрузке? Если драйвер перейдёт в ДД из-за нехватки напряжения питания, какие световые эффекты нас ожидают?
[Исправлено: INFERION, 24.10.2013 в 19:39] |
|
|
|
|
64
|
|
Новичок
Регистрация: 30.09.2013 Последняя активность: 13.04.2014 11:40
Сообщений: 30
Сказал(а) спасибо: 6
Поблагодарили: 0 раз(а) в 0 сообщениях
|
|
|
|
|
|
|
65
|
|
![]() Регистрация: 07.04.2013 Последняя активность: 13.06.2023 02:24
Сообщений: 5759
Сказал(а) спасибо: 340
Поблагодарили: 8163 раз(а) в 2386 сообщениях
|
Я конечно с Си слабо знаком, но обычно работают с объявленными переменными, которым предварительно присваиваются значения с нужных I/O регистров. Даже ассемблер говорит о том, что невозможно в этой архитектуре работать непосредственно с I/O. Можно максимум бит какой-то поставить или убрать, и то не везде. И доступны только операции чтения и записи. Арифметические операции компилятор может и не осилить. Это ж ему нужно догадаться куда-то временно что-то скопировать, там повозится и затем закинуть обратно. Тем более что переменная то скорее всего uint_8t, тогда как арифметика требует 8*8=16 бит как минимум. Сам компилятор такую переменную не родит, он просто не понимает что от него хотят...
Цитата:
[Исправлено: INFERION, 24.10.2013 в 23:15] |
|
|
|
|
|
66
|
|
Новичок
Регистрация: 30.09.2013 Последняя активность: 13.04.2014 11:40
Сообщений: 30
Сказал(а) спасибо: 6
Поблагодарили: 0 раз(а) в 0 сообщениях
|
т.е. надо как то считать значение с OCR1A, в моем случае он походу нули считывает только.
это как в ADCH нельзя записать значение, из OCR1A считать))) |
|
|
|
|
|
67
|
![]() Регистрация: 07.04.2013 Последняя активность: 13.06.2023 02:24
Сообщений: 5759
Сказал(а) спасибо: 340
Поблагодарили: 8163 раз(а) в 2386 сообщениях
|
ADCH и читается, и пишется, так же как и OCR1A. Почти все I/O и читаются, и пишутся. Пишутся даже PINB, при этом физическое состояние пина инвертируется.
Просто нужно использовать промежуточные переменные, выше я уже процитировал мнение более опытного (чем я) Сишника. Та скорость АЦП, которая указана в конфигурации, спокойно может оказаться не по силам МК, ибо эта строчка кода будет выполнятся далеко не одну сотню тактов. Деление оно такое, да... [Исправлено: INFERION, 24.10.2013 в 23:17] |
|
|
|
|
68
|
|
Новичок
Регистрация: 30.09.2013 Последняя активность: 13.04.2014 11:40
Сообщений: 30
Сказал(а) спасибо: 6
Поблагодарили: 0 раз(а) в 0 сообщениях
|
попробовать:
uint16_t x CR1A*164;OCR1A=x/ADCH; // unit16_t -потому что максимально возможное значение 256*256=FFFF может вообще убрать прерывание и запихнуть в вайл, и максимально понизить частоту ядра и предделитель ацп на 128 и в процессе вычисления выключать ацп? [Исправлено: Mishany, 25.10.2013 в 00:03] |
|
|
|
|
|
69
|
![]() Регистрация: 07.04.2013 Последняя активность: 13.06.2023 02:24
Сообщений: 5759
Сказал(а) спасибо: 340
Поблагодарили: 8163 раз(а) в 2386 сообщениях
|
Зачем выключать АЦП? Наоборот нужно стремится повышать его скорость и количество выборок, а работать он должен синхронно со всем остальным и полностью на автомате. Включение АЦП слишком дорого обходится - ему необходимо время для расчехление. Я его прерывание не использую, считаю это лишним. Мне хватает одного общего прерывания, по которому стартует и сам АЦП, и по которому основной цикл синхронизируется. В самом прерывании только флаг ставится. Обрабатывать там что-то массивное - себе дороже...
|
|
|
|
|
70
|
|
Новичок
Регистрация: 30.09.2013 Последняя активность: 13.04.2014 11:40
Сообщений: 30
Сказал(а) спасибо: 6
Поблагодарили: 0 раз(а) в 0 сообщениях
|
Нашел косяк в запусках, т.к. для тестов использую лампочку автомобильную Н3 55ватт на шунте получается напряжение выше питания ОУ и на выходе оу напряжение питания, у лампочки то нету падения напряжения как у диодов)))
откладываю испытания пока не куплю диодную ленту для испытаний ватт на побольше с запасом. |
|
|
|
|
71
|
|
Новичок
Регистрация: 30.09.2013 Последняя активность: 13.04.2014 11:40
Сообщений: 30
Сказал(а) спасибо: 6
Поблагодарили: 0 раз(а) в 0 сообщениях
|
моя формула не хочет работать в связи с низкой инерционностью всей системы в целом. надо выкидывать все конденсаторы и как то синхронизировать ацп с шим.
первоначальный вариант меня в общем то устраивает на 100%. пробовал убирать откл/вкл ацп при расчетах стабильность свечения сразу кончается, при убирании (усредненное значение из некоторого числа замеров ацп) - так же стабильность кончается. |
|
|
|
|
|
72
|
![]() Регистрация: 07.04.2013 Последняя активность: 13.06.2023 02:24
Сообщений: 5759
Сказал(а) спасибо: 340
Поблагодарили: 8163 раз(а) в 2386 сообщениях
|
Я ведь выше расчёт привёл - любой регулятор должен уметь подстраиваться под реальные физические процессы, наоборот сделать гораздо сложнее, ибо из аппаратной части с самого начала выжимается максимум. Задержи вносит ёмкость и индуктивность - выкинуть их из импульсного преобразователя, который по определению имеет инерцию? Обрабатывать поток данных тоже нужно с минимальным квантованием по времени. Т.е. не страдать интегрированием семплов, чтоб потом фиг знает через сколько их там обработать - это тоже задержки. Ну и наконец - сам МК не всесильный и деление там, где оно ненужно, будет обрабатывать в десятки-сотни раз дольше, расходуя на это времени раз в 10 больше, чем мог бы обеспечить АЦП. Беззнаковое деление 32/32 жрёт под тысячу тактов (сейчас сходу точно не скажу - нужно в симуляторе погонять), а 16/16 мало, ибо деление дико ошибкогенерирующая операция, и в результате можно потерять очень много младших бит. Отсюда и проблемы с шумами - медленно и грубо...
По возможности деление и умножение нужно заменять на сдвиги, сложения и вычитания. Но это возможно только если умножать и делить приходится на константу. Деления на переменные, если это возможно, нужно заменять на умножения со сдвигами (делениями на константу). Беззнаковое умножение 16*16 кушает немного больше сотни тактов. Формулы приходится здорово уродовать под возможности камня. Это не ПК, который плавающую запятую жуёт быстрее фиксированной, а деление 64/64 выполняет за такт. Ассемблер это прекрасно показывает... [Исправлено: INFERION, 03.11.2013 в 03:54] |
|
|
|