А зачем вам плата в proteus?
достаточно микроконтроллер в proteus, сигнал синус с генератора, осциллограф или граф и смотрите как работает ваша программа и почему не работает.
Myp писал(а):горящий шлейф - питание
мигающий шлейф - мигает при переходе.
Приведенный ниже код использует таймер1 и внешнее прерывание 0
Число одновременно работающих Dimmer каналов проверенных мной 10шт. использовал для них выходы D4 по D13, можно увеличивать и дальше, но мне лень это было делать потому как больше 10 думаю ни кому не понадобится
void setup ()
14 {
15 Serial.begin(9600);
16 TIMSK2 &= ~( (1<<OCIE2A) | (1<<OCIE2B) | (1<<TOIE2) );
17 TCCR2A &= ~((1<<WGM21) | (1<<WGM20));// Режим работы таймера/счетчика
18 TCCR2B &= ~(1<<WGM22);// Режим работы таймера/счетчика
19 ASSR &= ~(1<<AS2); //Выбор источника синхронизации таймера если AS2=0 от системного генератора
20
21 TCCR2B = (TCCR2B & ~( (1 << CS22) | (1 << CS21) ) ) | (1 << CS20) ;
22 TIMSK2 |= (1<<TOIE2);
23 for (int i=1; i<=13; i++)
24 pinMode(i, OUTPUT);
25 PORTD=PORTD & ~(mpin1 | mpin2 | mpin3 | mpin4);
26 }
Dmitry__ писал(а):http://cyber-place.ru/showthread.php?t=525
#include <CyberLib.h> //Библиотека от Cyber-Place.ru
volatile uint8_t tic, Dimmer1;
uint8_t data;
void setup()
{
D3_Out;//Настраиваем порты на выход
D3_Low;//установить на выходах низкий уровень сигнала
D2_In; //настраиваем порт на вход для отслеживания прохождения сигнала через ноль
//CHANGE – прерывание вызывается при любом изменении значения на входе;
//RISING – вызов прерывания при изменении уровня напряжения с низкого (Low) на высокий(HIGH)
//FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкий (Low)
attachInterrupt(0, detect_up, LOW); // настроить срабатывание прерывания interrupt0 на pin 2 на низкий уровень
StartTimer1(halfcycle, 40); //время для одного разряда ШИМ
StopTimer1(); //остановить таймер
}
//********************обработчики прерываний*******************************
void halfcycle() //прерывания таймера
{
tic++; //счетчик
if(Dimmer1 < tic ) D3_High; //управляем выходом
}
void detect_up() // обработка внешнего прерывания. Сработает по переднему фронту
{
tic=0; //обнулить счетчик
ResumeTimer1(); //запустить таймер
attachInterrupt(0, detect_down, HIGH); //перепрограммировать прерывание на другой обработчик
}
void detect_down() // обработка внешнего прерывания. Сработает по заднему фронту
{
StopTimer1(); //остановить таймер
D3_Low; //логический ноль на выходы
tic=0; //обнулить счетчик
attachInterrupt(0, detect_up, LOW); //перепрограммировать прерывание на другой обработчик
}
//*************************************************************************
void loop()
{
Dimmer1=100; //200=мин. 0=макс
}
Myp писал(а):попробовал, работает вот такое:
Myp писал(а):спать хочу
завтра подумаю в чём собака рылась.
Myp писал(а):вот к чему приводит увлечение ардуино...
человек деградирует совершенно
таймер с прерыванием уже неподъёмный труд.
чтобы использовать плату от пылесоса её нужно выбросить и сделать плату самостоятельно ?avr123.nm.ru писал(а):либо использовать полевики встречновкюченые и перейти на высокочастотный шим.
avr123.nm.ru писал(а):ЛУЧШЕ ВАЛ ЕЛЫМ ИЧЕРНЫЕ ЧЕРТОЧКИ
void Encoder()
{
LPulse=micros()-time;
time=micros();
}
Вернуться в Arduino и другие Xduino
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14