Спасибо за совет.... Я включил CKDIV, и настроил все на частоту 9,6. По дефалту выходит 1,2МГц... Но все равно происходит какая-то бяка.... Нужно меня ткнуть носом, пендель пока не помог. Вот инит:
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Jman писал(а):Я взял 4.800000 / 258 (отключил CKDIV) Получил 18750
(вообще - то не 258, а 256)А Вы посмотрели код, котоый Вам нагенерил CodeVisionAVR ? Вы, для начала, выставили СИСТЕМНУЮ ЧАСТОТУ - которой тактируется микроконтроллер на 18 с небольшим килогерц. Нахуя? Электроэнергию решили экономить за счёт быстродествия?
Прежде, чем "галки" ставить, изучите внимательно даташит.
Пусть микроконтроллер молотит на частоте 1,2 МГц. Это частота по умолчанию, с заводскими установками Фьюзов.
Если хотите сделать нормальные системные часы, используйте таймер. Таймер запрограммируйте в режим CTC и выберите прескалер таймера и значение регистра OCR0A так, чтобы прерывание происходило каждую миллисекунду. Потом, временные интервалы будет легко отсчитывать. Тем более, в CodeVisionAVR это делается легко и наглядно.
От таймера запускаете АЦП. Тактовую частоту АЦП выбираете так, чтобы преобразование АЦП успело завершиться раньше, чем случится очередное прерывание от таймера. Запрограммируйте прерывание от АЦП. Сам АЦП запрограммируйте на запуск по совпадению таймера с регистром OCR0A.(запуск будет происходить АППАРАТНО, даже команду на запуск не надо писать в программе!!!) Таким образом, запуск АЦП будет происходить от таймера каждую миллисекунду.
И, самое смешное, не надо ждать в прерывании (а в прерывании ждать = дурной тон, спросите, где хотите) Пока закончатся переходные процессы переключения канала. А переключение канала закончилось ешё в предыдущем прерываниии!!! А результат преобразования будете считывать по прерыванию от самого АЦП. (Ясен пень, что прерывание от АЦП будет происходить тоже каждую миллисекунду)
Напоследок, совет. Читайте даташит на микроконтроллер до умопомрачения. Когда оно наступит, читайте тот же даташит до полной ясности сознания. И всё станет ясно, как майское утро
Вы же этим кодом устанавливаете ТАКТОВУЮ ЧАСТОТОТУ МИКРОКОНТРОЛЛЕРА = 18 КИЛОГЕРЦ.
НАХУЯ!!!!НАХУЯ!!!!НАХУЯ!!!!НАХУЯ!!!!НАХУЯ!!!!НАХУЯ!!!!НАХУЯ!!!! ?????????????????????????????????
Давайте начнём всё сначала. 1. Вам требуется что-то смотреть на входах АЦП. Это ясно - Вы хотите задавать порог срабатывания сигнала с датчика освещённности. Делается элементарно. 2. Вам требуется что-то включать, в зависимости от состояния датчика движения. Здесь алгоритм не ясен. И надо контролировать, подано ли напряжение питания куда то-там.
Поскольку ВАнга умерла, я не могу прочесть Ваши мысли, и понять, что же Вам надо.
Барсик писал(а):Давайте начнём всё сначала. 1. Вам требуется что-то смотреть на входах АЦП. Это ясно - Вы хотите задавать порог срабатывания сигнала с датчика освещённности. Делается элементарно. 2. Вам требуется что-то включать, в зависимости от состояния датчика движения. Здесь алгоритм не ясен. И надо контролировать, подано ли напряжение питания куда то-там.
Поскольку ВАнга умерла, я не могу прочесть Ваши мысли, и понять, что же Вам надо.
Не ругайтесь пожалуйста... Я не понимаю, что эта часть кода делает. Это мне выдает Код Вижн... Я перенес тему, ибо по входу 220в все более менее понятно. Тут тема с описанием http://radiokot.ru/forum/viewtopic.php?f=57&t=130842, я просто не могу настроит периферию...
adc_data[input_index]=ADCW;
//потом делаю функцию
void adc_read (void) // Функция считывания значения из АЦП. АЦП 8бит;
{
sensivity=adc_data[0]; // Значение 1 канала, PORTB2 ;
outdoor_sensor=adc_data[1]; // Значение 2 канала читаем из массива сканированных каналов АЦП, PORTB4;
}
в main вызываю
adc_read ();
if (outdoor_sensor > sensivity) тогда включаю лампочку....
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Вы мне говорите смотри датащит... Так в датащите написанно: пределитель CLKPS3...CLKPS0 - они у меня все 0, что значит предделитель 1. Значит и клок 1.2МГц, не обращайте внимание на надпись 18750 кГц...
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Jman писал(а):пределитель CLKPS3...CLKPS0 - они у меня все 0
Прошу прощения, не заметил.
Jman писал(а):что значит предделитель 1. Значит и клок 1.2МГц
Предделитель, да, именно 1, причём независимо от того, как запрограммирован фьюз CKDIV8. А вот клок у Вас при этом будет или 9,6 или 4,8 МГц, в зависимости от того, как запрограммированы фьюзы CKSEL0 и CKSEL1.
Этот кусок кода позволяет задать предделитель независимо от того, как установлен фьюз CKDIV8. Если этот кусок кода выкинуть совсем, то тактовая частота будет определяться только фьюзами CKSEL0, CKSEL1 и CKDIV8. Я обычно этот кусок выкидываю.
Jman писал(а):не обращайте внимание на надпись 18750 кГц.
Она меня и ввела в заблуждение...
У Вас осциллограф есть?
И мне подскажите пожалуйста про DIV8
Если фьюз установлен, то частота выполнения кода (программы) снижается в 8 раз.
Если в коде встречается "настройка фьюзов", то фьюз DIV8 не действует или действует, но таймер считает, как-будто не установлен фьюз (для генератора)
Этот момент я не понял.
Про АЦП... я делал так... Опрашивается АЦП в цикле (аппаратном) и по завершении преобразования происходит прерывание, в цикле которого заносит в регистр (ры) значение из АЦП и выходит из прерывания.
Далее этот регистр больше в коде не используется для других целей. Получить значение из этого регистра можно в любом месте программы, где это необходимо. Спойлер
Если фьюз CKDIV8 запрограммирован, то при старте микроконтроллера, в регистр прескалера CLKPR аппаратно пропишется значение для предделителя = 8, ещё до начала выполнения программы.
Если в процессе выполнения программы Вы уже программно измените значения регистра CLKPR, то получите предделитель не зависящий от того, запрограммирован фьюз CKDIV8, или нет. Точнее, фьюз CKDIV8 "работает" ровно до того момента, пока Вы программно не измените значение регистра CLKPR.
Барсик писал(а):Точнее, фьюз CKDIV8 "работает" ровно до того момента, пока Вы программно не измените значение регистра CLKPR.
А сама программа с какой скоростью будет исполняться? после смены значения в CLKPR. (в 8 раз медленнее или нет)
Я вот этот момент не понял.
Как мне тут объяснили. В Аттини13 по дефалту стоит аппаратный прескалер на 8 (CKDIV8), и частота 9600000Гц, соответственно 9,600000 / 8 = 1,200000Гц.
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]