Jump to content

Recommended Posts

Например решили удалить существующее прерывание, а в каком-то место оно снова разрешается при каком-то хитром событии (ну хотя бы в качестве костыля, что тоже не лучшая идея). Скажем прерывание от сторожевой собаки или компаратора. И при случайном (раз удалили обработчик прерывания то и основные пути его возникновения тоже) его появлении происходит прыжок куда-то в начало основной программы, причем, вполне возможно, после инициализации стека. Что будет происходить дальше не известно. Так что лучше заполнять либо rjmp'ами (прерывание просто не будет обрабатываться) либо nop'ами (тогда выполнится ближайшее "вниз" прерывание что вообще говоря менее опасно).

Share this post


Link to post
Share on other sites

Лучше ставить команду возврата из прерывания - максимум из последствий - будет потеряно 12 тактов(до 4 тактов на реакцию на прерывание + 4 такта на вход в прерывание и 4 такта на немедленный выход).

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

Если задавать не все прерывания а только нужные, ничего страшного - все будет работать. Но это неудобно с точки зрения поддержки кода, если ты сам же или кто-то другой залезет в исходник - высока вероятность попутать адреса прерываний и не заметить этого, а потом долго удивляться почему это все не работает. И только после доскональной сверки листинга скомпилированного исходника обнаружится что прерывание сидит не на своем месте. Причем - оно некоторое время может остаться незамеченным, свободная область заполняется $3FF что равносильно команде NOP, и просто будет осуществляться переход на следующее описанное прерывание, но когда определишь соседнее прерывание - вот тогда и начнутся грабли, прежнее прерывание перестанет работать а вместо него будет вызываться совсем другой обработчик.

Ради экономии 10 байт(а часто и того меньше) не стоит заниматься этим. Лучше определить полную таблицу прерываний и закрыть ненужные просто возвратами. В дальнейшем, вбивать каждый раз таблицу не нужно - просто берешь уже готовый шаблон и все... да и собственно само вбивание сводится к копированию сей заготовки с даташита на конкретный контроллер.

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

Share this post


Link to post
Share on other sites

Всем привет.

Решил заниматься МК, выбор пал на AVR. Дома есть ATtiny2313, но я думаю купить ATmega16. Собственно вопрос в чем: с чего лучше начать, AVR или PIC? И с какого чипа?

Сам склоняюсь к AVR, думаю начать с этого учебника: proavr.narod.ru, насмотрел программатор USBasp. Немного почитал про языки программирования на AVR, больше тянет к С или bascom.

З.Ы теоретических познаний в электронике практически нет, есть только практические умения в пайке, чтении схем, понимании даташитов и т.п

Буду благодарен если кто-нибудь сможет посоветовать учебники/курсы/книги простые для понимания.

Edited by kos

Share this post


Link to post
Share on other sites

Руководство для разработчика приложений на базе STM32WB55

Представив двухъядерные беспроводные микроконтроллеры STM32WB для IoT-приложений, компания STMicroelectronics предлагает разработчикам экосистему, включающую в себя отладочные платы, примеры кода для микроконтроллера, готовое ПО всех уровней и большой массив документации.

Читать статью

свободная область заполняется $3FF что равносильно команде NOP

свободная область заполняется полутора байтами: 0b0011 1111 1111 ? Скорее всего имелось в виду все же 0xFF или 0xFFFF, что соответствует истине так как команды двухбайтные.

Еще Atmel считает кодом nop'а не 0x3FF а 0x0000. Впрочем 0xFFFF контроллер видимо просто не может декодировать (или считает эквивалентным nop'у) и пропускает.

Логичнее начать с того что уже есть а еще логичнее с того по чему есть знакомые специалисты. Насчет холивара PIC vs AVR говорить ничего не буду, в PIC'ах не разбираюсь. По AVR же посоветую. Система команд и общая архитектура у конроллеров AVR одинаковая, могут отличаться объем памяти, допустимые параметры питающего напряжения и частоты а так же доступная переферия. Сейчас самым пожалуй популярным контроллером является ATmega8, также нередко используются ATtiny2313, ATtiny13, ATtiny45, ATtiny85 (они проще, меньше и дешевле) и ATmega16, ATmega128, ATmega161 (эти мощнее но дороже и зачастую в SMD-корпусе, что для начинающего плохо). Про корпус: лучше всего использовать DIP + панелька, и паять проще и заменить если что.

Язык программирования - однозначно ассемблер. Не потому что на нем все пишут или придется часто писать самому а потому что дает представление о работе контроллера. Потом можно перейти на ЯВУ, те же Си, Паскаль или там Бейсик.

Из справочников кроме даташитов очень хороши книги Евстифеева "Микроконтроллеры AVR семейства (mega/tiny/classic)", я начинал с Ревича, основы и начальные конструкции у него неплохо написаны. Ну и на сайте/форуме обучающие курсы можно посмотреть, впрочем на этом я с ходу ничего не нашел кроме двух групп статей, первая про совсем основы, программатор и cvavr (скорее всего она бесполезна) и про ATtiny13 (дурацкий выбор: 8 ног из которых 3 системные, простейшие спрсобы залочить, недостаток памяти: 1к флеша 128 байт ОЗУ) и BASCOM (начинать надо с ассемблера, я это уже упоминал, сам Бейсик мне тоже не по душе но это дело вкуса).

Про USBAsp могу сказать что особо на него не жаловались, схема похожа на Prottoss'овскую и avrdoper'овскую (в работоспособности которых я не сомневаюсь) так что в случае чего можно перепрошить, но это уже в отдаленном будущем.

Так что я бы советовал начать с ATtiny2313 (потому что она есть и на ней немало готовых схем), AVRStudio (потому что отладчик, впоследствии можно прикрутить avrgcc который лучше соответствует стандарту Си чем cvavr, подсказка по командам опять же) и Proteus впрочем начинать как раз лучше с макетки, в живую оно гораздо интереснее.

Share this post


Link to post
Share on other sites
Guest

моё мнение:

avr

ассм для начала, потом что угодно

только в железе (никаких Симуляторов! задолбался читать: ой, в протеусе работает, а спаял - не работает. Это мне плохой МК продали!аааа!!!)

Share this post


Link to post
Share on other sites
                     

Контроль в спящем режиме: повышение КПД батарейного питания с помощью DC/DC MAX17225 nanoPower

В статье описан практический опыт разработчика, применившего повышающий DC/DC-преобразователь MAX17225. В результате ряда практических экспериментов, потребовавших существенного обновления технической базы компании-разработчика, автор убедительно доказывает преимущества выбранного компонента и схемотехнической реализации. Увеличенное на 50% время автономной работы лучше других аргументов говорит об эффективности конвертеров MAX17225, а также о важности предварительной оценки элементной базы.

Подробнее

Спасибо большое за такой развернутый ответ.

Тогда остаются 2 вопроса:

ATtiny2313 или все же ATmega16? Просто я так почитал в том курсе, мол что хорошо начать с мощного мк и постепенно его изучить, или это ни к чему?

И все таки, именно ассемблер? Никакого С? Я к тому что С чем то напоминает паскаль (не кидайте камнями за такое сравнение) и он как то более человекопонятный в отличие от этого страшного ассемблера :).

Да и еще, ассемблер тогда будет только как ступенька, или все же можно на нем "идти до конца"?

За книги спасибо, скачаю.

Edited by kos

Share this post


Link to post
Share on other sites

Человекопонятный он только в области алгоритмов, более высокоуровневых чем работа с переферией. А часто стается так что программа контроллера это чисто работа с переферией... и C тут только мешать будет, раздувать прошивку и не давать сделать "как надо". Используя активно макроподстановки и дефайны можно и на ассемблере писать почти так же как и на С.

Если есть возможность - бери мегу 16-ю в корпусе DIP-40 - контактов хватит с головой для изучения. Да даже мега8515 и 8535 вроде даже подешевле будет.

Share this post


Link to post
Share on other sites
Guest

я бы рекомендовал с Мега8 всё таки начать

во-первых, купить не проблема

во-вторых, во многих описаниях он идет как контроллер, на котором примеры и строятся

в-третьих, в сети масса примеров на нём

я свой стенд именно под мега8 затачивал из-за этих причин

Share this post


Link to post
Share on other sites

ATmega8 конечно хорош но SPIEN и RSTDisable довольно опасны. Начинать все-таки лучше с того что есть под рукой там более что отличаются они только переферией и памятью. Ну какая разница новичку два таймера или три, 2К флеша или 8К если программа мигания светодиодом занимает байт 20 (считая таблицу прерываний). Если есть возможность купите и ATmega16 и ATmega8 (как раз потренируетесь лечить фузы) и, например ATtiny85 (это пожалуй самая мощная из восьминожек атмела). Я начинал с ATmega8515.

И все таки, именно ассемблер? Никакого С? Я к тому что С чем то напоминает паскаль (не кидайте камнями за такое сравнение) и он как то более человекопонятный в отличие от этого страшного ассемблера
Да Си и Паскаль чем-то похожи, точно так же начинал со второго и видел явную аналогию :-) На самом деле ассемблер это самый простой язык: каждый оператор однозначно транслируется в команду процессора, компиляторы не умничают и камень делает именно то что ему говорят с предсказуемыми задержками и порядком операций. С ЯВУ сложнее: у того же Си сотня ключей компилирования, шаманский оптимизатор и иногда неочевидные подводные камни. Да написать на Си программу можно быстрее и правильнее (в смысле ближе к алгоритму, меньше подробностей об архитектуре) но без понимания работы процессора она будет тормозить и творить непредсказуемые вещи. Раньше я сказал что учить ассемблер стоит уже ради обучения. Это верно но помимо этого ассемблер - самый быстрый и компактный язык потому что когда программист видит сколько усилий надо приложить для создания одной переменной когда можно использовать регистр он трижды подумает а надо ли ему оно. С математикой еще показательнее: посмотрите на листинг процедуры деления или там синуса. Захочется ли это пихать в какой-нибудь ATtiny13? Так что Си - для математики (потому что лень ручками да и отвлекает), нескоростной обработки интерфейсов (даже vusb который вроде Сишный содержит ассемблерный файл потому что обработать за 4 такта прием бита (тут гарантировать точность не буду только общий смысл) все-таки непросто). А ассемблер для изучения и сильного колдунства над тактами и байтами. Так что в любом случае лишним он не будет. Но и изучать только его все-таки маловато: он менее переносимый даже с одной AVR на другую.

Share this post


Link to post
Share on other sites
Guest

АССМ, конечно, царь языков!!!

но жизнь так коротка...

:) (с)

Share this post


Link to post
Share on other sites

Здравствуйте. Я тут новенький, ну и не только тут...)

Подскажите, пожалуйста, что это за МК? W27C512-45-1 DIP

или это не МК?

Share this post


Link to post
Share on other sites

Это микросхема памяти. 27 серия 512к. 64к/8. Ищите даташит и программатор по слову 27c512.

Share this post


Link to post
Share on other sites

Я сначала погуглил, но когда прочел про программатор - засомневался что это не МК. (думал программаторы предназначены только для МК)

Я пока слаб знаниями в таких вопросах...(

Share this post


Link to post
Share on other sites

Решил повторить конструкцию часов http://radiomaster.com.ua/1650-chasy-s-termometrom-svyazannye-s-kompyuterom-na.html и появились несколько вопросов. Какого номинала поставить конденсаторы в обвязке кварца?

Какой генератор выставить при программировании PIC16F887? (rc,lp,xt,hc) pic16f877a подойдёт? (не пинайте я по аврам соображаю пикушки на халяву достались)

Share this post


Link to post
Share on other sites

предложу несколько вариантов, выбирите лучший): Кондеры - 1) можно не ставить 2) поставить 47 пФ (наверняка) 3) посмотреть диапазон по даташиту. Генератор - 1) Поставить ХТ 2) Поставить HS (на худой конец).

Ну а вообще это база МК (биты конфигурации, номиналы кондеров обвес такта и портов). Всё прозрачно, ответ : Даташит на МК или отдельные пдф по разделам.

Share this post


Link to post
Share on other sites

всё понял. Глянул даташит на pic16f877 диаппазон для 4mhz от15-68pf осцилятор XT

Share this post


Link to post
Share on other sites

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

И как побочный эффект - генерация быстрее выходит в установившийся режим.

Насчет емкости - надо смотреть даташит на контроллер а так же и НА КВАРЦ, производитель кварца может рекомендовать другие значения - от емкостей зависит работа генератора и добротность кварца - а это в свою очередь отражается на точности выдаваемой частоты.

В контроллере могут быть подключаемые через конфигурацию встроенные конденсаторы, надо смотреть и тогда внешние не нужны будут.

Share this post


Link to post
Share on other sites

всем доброе время суток, это форум наверное моя последняя надежда,

недавно начал осваивать мк AVR,

остановился на меге8, дошёл до работы с ацп и тут ступор

настраиваю работу ацп(код будет ниже), запускаю преобразование, читаю регистры ADCH:ADCL дам все 1, если преобразование не запускаю то там все 0, использую вход ADC7 , считываю регистры в обработчике прерывания переполнения таймера0. на ножку ацп приходит напряжение через переменный резистор.

мучаюсь 3 день, может проблема с мультиплексором или я что-то упустил? жду вашей помощи, заранее благодарен.

код:

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>


#define F_CPU 8000000
#define nop asm ("PUSH R0": ;asm ("POP R0": 
volatile int y = 0;z = 0;i = 0;A = 0x7A;l = 0;
int MAS[] = {0xFC,0xDA,0x10,0x10,0x10,0xEE,0xCE,0x1C,0x9E,0x3A,0x10,0x10};//
void ispout(y) // работа с регистром сдвига, вывод информации "наружу"
{
for (l = 0; l<y; l++)
{
A = MAS[l];
for (i = 0; i < 8;i++)
{
z = ((A>>i)&(0x01));
PORTB |= ((z<<2)&(1<<PB2));nop;
PORTB &= ~_BV(PB0);nop;
PORTB |= _BV(PB0);nop;
PORTB &= ~(0x06);nop;
}
PORTB &= ~(0x07);nop;
PORTB |= _BV(PB1);nop;
PORTB &= ~(0x07);nop;
A = 0;nop;
if(((l+2)%2) == 1) {PORTD = _BV(PD5);_delay_ms(3000);} else {PORTD &= ~_BV(1<<PD5);}
}
PORTD |= _BV(PD5);
}

ISR(ADC_vect)
{

}

ISR(TIMER0_OVF_vect)
{
MAS[0] = ADCL;
MAS[1] = ADCL > 128? (MAS[1] = 0x6E) : (MAS[1] = 0x1C);
ADCSRA &= ~_BV(ADIE);
}

int main(void)
{
DDRB = 0xFF;
PORTB = 0x00;
DDRD = (1<<DDD5);
PORTD = (1<<PD5);
DDRC = 0x00;

ADCSRA |= _BV(ADEN)
|_BV(ADPS2)|_BV(ADPS1)|_BV(ADPS0)
|_BV(ADIE);
ADMUX |= _BV(REFS1)|_BV(REFS0)
|_BV(MUX2)|_BV(MUX1)|_BV(MUX0);
_delay_ms(50);
ADCSRA &= ~(1<<ADIF);
SFIOR |= 0x10000100// попытка настроить преобразование АЦП по переполнению таймера0
sei();
TCNT0 = 0;
TIMSK = _BV(TOIE0);
TCCR0 = _BV(CS02);

while(1)
{

ADCSRA |= _BV(ADSC)
nop;
cli();
ispout(4);
nop;
sei();
_delay_ms(400);
}
}

Edited by Alex
Тег CODE

Share this post


Link to post
Share on other sites

Зачем так разукрашивать код ? :) Есть для этого спец. тег - CODE

Share this post


Link to post
Share on other sites

Есть кнопочка для этого.

post-48853-0-58391100-1362866673_thumb.jpg

Или использовать теги

[code]
........
........
........
[/code]

Share this post


Link to post
Share on other sites

Ничерта непонятно из кода. Но повидимому даташит Вы не читали... Где настройка частоты работы АЦП?

Где старт преобразования и ожидание окончания преобразования? Или хотябы обработка по прерыванию от АЦП...

; Настройка АЦП (стр.200 даташита)
set_io ADMUX,  0b11000000 ; Опорное напряжение - внутренний, 2.56В
set_io ADCSRA, 0b10000110 ; ADC Enable, single-conversion mode, Fadc = 7,3728Мгц/64 = 115200


Получение измеренного значения с АЦП на заданном канале.
ANDI   ACCUM, 0x0F	   ; Ограничим входной параметр значением 0-15
ORI    ACCUM, 0b11000000
OUT    ADMUX, ACCUM	  ; Выбор канала АЦП, опорное = встроен. 2.56В
SBI ADCSRA, ADSC	  ; Старт преобразования
SBIC   ADCSRA, ADSC  ; Ожидание готовности данных
RJMP   PC-0x0001

Share this post


Link to post
Share on other sites

обработка прерывания от ацп ничего не дает

|_BV(ADPS2)|_BV(ADPS1)|_BV(ADPS0)

это не оно разве?

Share this post


Link to post
Share on other sites

Не дает значения, или не возникает? А если воплотить алгоритм приведенный выше?

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Jesterary
      Здравствуйте. Подскажите, был ли у кого-то опыт отправки изображений с камеры (подключенной через UART или bluetooth-камеры) через GPRS (у меня модуль SIM800L, но в целом это не принципиально) на удаленный сервер? Средствами управляющего микроконтроллера, пусть даже ардуины какой-нибудь, но не малины. Возможно ли это вообще? Хотелось бы, конечно, использовать в проекте беспроводную камеру и общаться с ней, ибо камеры, подключаемые напрямую так себе качество дают. 
      Сразу скажу, что важна именно такая связь. Микроконтроллер + модуль связи + камера находятся в коробке и путешествуют по городу, в это время человек сидя дома на диване может смотреть фото с этой камеры. Смартфон для моих целей не подойдет, суть именно в микроконтроллере с модулями.
      Если у кого-то такое получалось - поделитесь, пожалуйста :)
      А то нахожусь в некоторой прострации и даже не знаю, в какую сторону думать.
    • By Максим123456789
      делаю диплом, в схеме у меня микроконтроллер PIC16F688 и мне нужно его заменить на ATmega. Не могу найти похожий
    • By Anton Bondarenko
      Всем привет
      Прошу не ругать, впервые подобный вопрос задаю.
      Хочу сделать прибор, который будет посылать сигнал, когда возле прибора будет проходить металлический предмет. 
      — угол отслеживания до 30° а лучше прямая линия, траектория
      — время реакции очень высокое до 100 мс
      — ширина проема в котором нужно сканировать от 10 до 20метров,
      — передача сигнала через вифи
      Может есть готовые решения, или отдельные компоненты.
      Подскажите пжл в каком направлении искать.
      Смотрел датчики движения, но главная проблема — время реакции.
      Спасибо
       
    • By Sofia Vin
      Предлагаем проектную работу в Москве:
      Микроконтроллер STM32F103.
        
      Есть встроенный код с использованием функций библиотеки FreeRTOS, код имеет описанный протокол для связи с внешним миром.
        
      Необходимо проводить доработку кода под задачи программиста верхнего уровня и его тестирование в составе оборудования. 
      Работа в лаборатории (м.Университет) и удаленно. 
      Оплата по договоренности.
      Если Вы обладаете опытом схемотехнического проектирования и программирования микроконтроллеров, и Вас заинтересовала данная возможность, ждем Ваши отклики по контактным данным:
      8 (925) 023-60-02   Алексей
      E-mail: nassa@marathon.ru
       
    • By Антон Плюшкин
      В общем есть небольшая тривиальная задача - сделать свитюльку. Контроллер управляет светодиодиками, цвета меняются, людишки довольны.
      Схема проста: Attiny44a -> 2n3904 x3 -> RGB-светодиод.
      Собрал, протестил, всё норм, но!
      Как только в коде я использую функцию задержки - _delay_ms (util/delay.h) - контроллер повисает!
      #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { // Input/Output Ports initialization // Port A initialization // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit7=0 Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit3=In Bit2=Out Bit1=In Bit0=In DDRB=(0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit3=T Bit2=0 Bit1=T Bit0=T PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Phase correct PWM top=0xFF // OC0A output: Non-Inverted PWM // OC0B output: Non-Inverted PWM // Timer Period: 0,031875 ms // Output Pulse(s): // OC0A Period: 0,031875 ms Width: 0 us // OC0B Period: 0,031875 ms Width: 0 us TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Ph. correct PWM top=0x00FF // OC1A output: Non-Inverted PWM // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 0,031875 ms // Output Pulse(s): // OC1A Period: 0,031875 ms Width: 0 us // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1); // External Interrupt(s) initialization // INT0: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-11: Off MCUCR=(0<<ISC01) | (0<<ISC00); GIMSK=(0<<INT0) | (0<<PCIE1) | (0<<PCIE0); // USI initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR0=(0<<ADC1D) | (0<<ADC2D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); unsigned char VL_OCR0A = 0, VL_OCR0B = 0, VL_OCR1A = 0; OCR0A = 0; OCR0B = 0; OCR1A = 0; while(1) { _delay_ms( 100 ); VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } } Т.е. если указать задержку в начале цикла, то светодиод не светится вообще.
      Если задержку убрать - светодиод немного подсвечивает всеми цветами.
      while(1) { _delay_ms( 100 ); // <--- ЗАДЕРЖКА --- VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } Где я накосячил?
      З.Ы.: Замечаний по поводу оптимизации кода, излишних переменных и п.р. прошу не писать - изощряюсь как могу ибо не пойму почему не работает
  • Сообщения

    • Но мои клещи показывают существенно разный ток вдали и вблизи провода. Один из этих вариатнов бнуления соответсвенно даст существенную ошибку.   Просто видел где-то что обнуляют именно так, поднеся/прислонив закрытый зажим к проводу.   Я уже после того как спросил понял что можно просто измерить разными приборами ток в разрыве цепи, посмотреть при каком обнулении он больше похож на эти значения и так и обнулять.
    • Безусловно. Чтобы не лежали без дела - вполне достаточное оправдание. Подумал, или измерил? Чувствительность Musical Fidelity A1 около 0,7 Вольта, для полной мощности. Поскольку платы А1 самодельные, логичнее бы было уменьшить их усиление, "отдав" больше лампе. Оно и искажений в транзисторной части стало бы поменьше, и "ламповости" добавилось.
    • Мне кажется, нет смысла заморачиваться на подобных решениях, разве что для экзотики. Вот, например, микросхема PAM2803 - это готовый драйвер для питания светодиода от одной или двух батареек. Не надо мотать трансформатор (покупается или сдувается с какой-нибудь платы индуктивность заводского изготовления); остальных деталей минимум; резистором можно выставить любой ток светодиода. ИМС хорошо держит ток светодиода, стартует при напряжении 0,9 В и выше, работает при снижении аж до 0,4 В. КПД при 1,5 В не ниже 70%, а с двумя батарейками - до 90%. Ток светодиода можно задать любой, вполне реально и до 1 А. Есть защита от обрыва в цепи светодиода и от перегрева.
    • Прям столько? Нифига себе   Мне кажется это должно зависеть от размера замкнутого контура. У этих клещей диаметр зажимов пару десятков метров? А, вроде ж поля недостаточно, нудно ещё его движение. Они пару десятков метров в диаметре и вы ими активно махаете?
    • Ошибки в прошлом становятся опытом в будущем.  
    • Вадим, LME49710 не пробовал ставить? Усиление на 20 кГц под 70 дБ, должна подойти.
    • Давно это было, может что и путаю, но у меня про этот софт остались воспоминания, что в реальном времени он не работает. Можно только картинку скинуть. По-моему, где-то из меню на осциллографе, хотя может и из меню программы. В реальном времени идёт через VGA (если на вашем есть), но там только копия экрана во весь экран монитора, и ничего с компьютера делать нельзя. В общем, крутил я её тогда довольно долго, несколько дней. Искал альтернативные, штудировал форумы, ещё как-то копался... единственное, что осталось в памяти, - что эта прога может понадобиться только если понадобится сделать скриншот экрана осциллографа. Но за всё время, что использую, так ни разу и не понадобилось.
×
×
  • Create New...