Пт сен 04, 2020 18:20:52
Пт сен 04, 2020 21:41:05
Сб сен 05, 2020 10:08:36
Сб сен 05, 2020 12:31:10
Ср окт 07, 2020 14:31:43
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
//#include <avr/delay.h>
unsigned char t;
ISR(ADC_vect) //Прерывание по АЦП
{
// Крутим резистор
// В переменной ADCH оцифрованное значение напряжения на лапке PB4 (adc
OCR0B=ADCH;
t=OCR0B;
}
int main(void)
{
//Инициализация АЦП
ADMUX=0x22;
ADCSRA=0xEA;
ADCSRB=0x00;
DDRB|=(1<<PB0)|(1<<PB1)|(0<<PB4); // ОПРЕДЕЛИМ ПИНЫ КАК ВыХОДЫ
PORTB|=(0<<PB0)|(0<<PB1); // ВКЛЮЧИМ ИХ (ВЫСОКИЙ УРОВЕНЬ)
DIDR0|=(1<<PB4);
//TCCR0A=0x83;
TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00);
//TCCR0A=
//(1<<COM0A1) // ПОДКЛЮЧИМ ШИМ НА НОГУ OC0A
// |(0<<COM0A0) // НЕ ИНВЕРТИРУЮЩИЙ ШИМ
//|(1<<COM0B1) // ПОДКЛЮЧИМ ШИМ НА НОГУ ОС0B
//|(0<<COM0B0) // инверт шим
//|(1<<WGM01) ///ФАЗОВАЯ
//|(1<<WGM02); ///КОРРЕКЦИЯ
//TCCR0B=0x02; // ЧАСТОТА И ДЕЛИТЕЛИ
TCCR0B=(0<<CS02)|(0<<CS01)|(1<<CS00); // 0-1-0 ДЕЛИТЕЛЬ НА 8 (150 КГЦ)
TCNT0=0x00; // Счетчик таймера (для инициализации Шима не нужен)
OCR0A=0x00; // Инициализация показателя ШИМа На PB0 0-255 (от него зависит Скважность шима)
OCR0B=0x00; // иНИциализация показателя Шима на PB1 0-255 (от него зависит Скважность шима)
sei();
while (1){}
}
Ср окт 07, 2020 14:59:59
Ср окт 07, 2020 15:33:44
когда не читаешь тему, не вникаешь в проблему, всегда все просто. вы где у attiny13 видели PORTD?!roman.com писал(а):Очень просто))
Ср окт 07, 2020 20:04:09
...
volatile unsigned char t;
ISR(ADC_vect) //Прерывание по АЦП
{
// Крутим резистор
// В переменной ADCH оцифрованное значение напряжения на лапке PB4 (adc
t = ADCH;
OCR0B = t;
}
...
Ср окт 07, 2020 21:59:29
да. там, сразу ADCH и/или OCR0B смотреть можноNStorm писал(а):Зачем вам t, когда в протеусе прямо можно смотреть регистры. Надо Watch Window открыть
Чт ноя 26, 2020 23:53:47
ISR(PCINT0_vect)
{
if [b] ((PINB & (1<<BUTTON0))==0)[/b]
{
//PORTB ^= (1<<LED); //переключаем состояние светодиода (вкл./выкл.)
Т.к. прерывание PCINT0 наступает при любом изменении логического уровня на входе, то нужно в обработчике проверять, была ли кнопка нажата, либо отпущена. Если любая из кнопок нажата, то выполняем нужное действие (инвертируем состояние выхода, к которому подключен светодиод):
Чт ноя 26, 2020 23:55:32
Чт ноя 26, 2020 23:56:18
Пт ноя 27, 2020 18:25:46
ISR(PCINT0_vect)
//|| (PINB & (1<<BUTTON2)) == 0
{
if ( (PINB & (1<<BUTTON2)) == 0 ) // если LOW
{
_delay_ms(25); //Ждем мсек
if ( (PINB & (1<<BUTTON2)) == 0 ) // если LOW
{
_delay_ms(25);
if ( (PINB & (1<<BUTTON2)) == 0 ) // если LOW
{
_delay_ms(25);
if ( (PINB & (1<<BUTTON2)) == 0 ) // если LOW
{
_delay_ms(25);
if ( (PINB & (1<<BUTTON2)) == 0 ) // если LOW
{
PORTB ^= (1<<LED); //переключаем состояние светодиода (вкл./выкл.)
_delay_ms(3000);
}
}
}
}
}
}
Пт ноя 27, 2020 19:20:35
Пт ноя 27, 2020 19:54:29
Пт ноя 27, 2020 20:28:29
Сб ноя 28, 2020 09:58:41
emax писал(а):а если серьезно посмотрите, например, здесь http://www.poprobot.ru/theory/ppm-pcm
olegue писал(а):В алгоритме я проверяю если пришел низкий уровень, то жду 25мс и проверяю опять ли низкий, если низкий, то жду 20мс и опять должен быть низкий. В итоге на 3-4 проверке можно сделать вывод что это именно мой сигнал и включить лампочку.
ISR(PCINT0_vect)
{
TCNT0=0x00;
if ( (PINB & (1<<BUTTON2)) == 0 ) // если LOW
{
TCCR0B=0x05; // запустим счетчик и поделим клок на 1024, шоб не шибко быстро.
while ( (PINB & (1<<BUTTON2)) == 0 ) { } // ждём отпускания кнопки -это и есть длина импульса
stat=TCNT0; // получаем время ожидания отпускания кнопки -это и есть длина импульса
TCNT0=0x00; // обнуляем счетчик
if (stat=33) // если длина первого импульса нас устраивает, то
{
// продолжаем упражнения и если
if ( (PINB & (1<<BUTTON2)) == 0 ) // если LOW
{
ИзмеряемСледущийИмпульс();
}
}
}
Сб ноя 28, 2020 17:18:33
Сб ноя 28, 2020 20:35:08
Сб ноя 28, 2020 21:19:17
NStorm писал(а):у вас переполнение таймера не проверяется.