Сб ноя 28, 2020 21:49:19
Сб ноя 28, 2020 22:01:41
Сб ноя 28, 2020 22:11:05
Сб ноя 28, 2020 22:46:57
Вс ноя 29, 2020 09:53:37
Вс ноя 29, 2020 10:09:56
Вс ноя 29, 2020 11:40:01
Вс ноя 29, 2020 12:34:57
Вс ноя 29, 2020 13:32:23
emax писал(а):рабочий код для attiny13 под AS4Спойлер
#include <avr/io.h>
#include <avr/interrupt.h>
#define OUTPORT PORTB //PORTB
#define OUT2 3 //pinout 2
#define OUT1 4 //pinout 3
#define OUT4 2 //pinout 7
#define OUT3 0 //pinout 5
#define PWMPIN PINB //PINB
#define PWM 1 //pinout 6
volatile unsigned char time; //текущее значение счетчика
volatile unsigned char time_begin; //время начала PWM импульса
volatile unsigned char ch; //длительность PWM импульса
volatile int tick4; //счетчик переполнений от последнего изменения на входе PWM
volatile unsigned char timer_mig; //таймер для мигания
//----------
// обработка прерывания от переполнения счетчика
ISR(TIM0_OVF_vect) //прерывание переполнения счетчика
{
tick4++;
timer_mig++; //3.413*256 = 876 ms
}
//----------
// обработка прерывания от изменения на входе PWM
ISR(PCINT0_vect)
{
time=TCNT0; //сохраняем текущее время
if ((PWMPIN & _BV(PWM))==0)
{
ch= time-time_begin; // это спад, определяем длительность импульса PWM
}
else
{
time_begin=time; // это фронт, запоминаем текущее время
}
tick4=0; //сброс счетчика переполнений
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// ГЛАВНАЯ ПРОГРАММА
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
int main(void)
{
CLKPR=0x80; //частота 4 800 000 гц
CLKPR=0x00;
DDRB = _BV(OUT1) | _BV(OUT2) | _BV(OUT3) | _BV(OUT4) ; //настроить выходы на вывод
// Настройка Timer0
TCCR0B= _BV(CS01) | _BV(CS00); // Частота счетчика: 4 800 000/256 = 75 000 Hz или 13.3mks
// 13.33*256 = 3,413 ms максимальная длина,которую можно измерить
// Настройка прерывания
GIMSK= _BV(PCIE); // прерывание по изменению
PCMSK=_BV(PWM); //маска - какой пин отслеживаем
GIFR= _BV(INTF0) | _BV(PCIF); //очистить все флаги прерываний
TIMSK0= _BV(TOIE0); //разрешаем прерывания по переполнению
// Global enable interrupts
sei();
// === ГЛАВНЫЙ цикл ========
while (1)
{
//1000/13.33=75
//1200/13.33=90
//1400/13.33=105
//1500/13.33=112.5
//1600/13.33=120
//1800/13.33=135
//2000/13.33=150
//...
if (tick4 > 300)
{
OUTPORT &= ~_BV(OUT1); //если счетчик переполнений больше чем 300*3.4 ~ 1сек
OUTPORT &= ~_BV(OUT2); //выключаем оба выхода
OUTPORT &= ~_BV(OUT3); //выключаем оба выхода
OUTPORT &= ~_BV(OUT4); //выключаем оба выхода
}
else
{
//включить-выключить
if (ch <76)
{
OUTPORT &= ~_BV(OUT1); //1-выключить
OUTPORT &= ~_BV(OUT2); //2-выключить
OUTPORT &= ~_BV(OUT3); //3-выключить
OUTPORT &= ~_BV(OUT4); //4-выключить
}
//.......
if ((ch > 78) && (ch <106))
{
OUTPORT |= _BV(OUT1); //1-включить
OUTPORT &= ~_BV(OUT2); //2-выключить
OUTPORT &= ~_BV(OUT3); //3-выключить
OUTPORT &= ~_BV(OUT4); //4-выключить
}
//.......
if (ch > 108)
{
OUTPORT |= _BV(OUT1); //1-включить
OUTPORT |= _BV(OUT2); //2-включить
if((timer_mig & 0x80) == 0)
{
if ((timer_mig & 0x68) == 0) OUTPORT |= _BV(OUT3);
else OUTPORT &= ~_BV(OUT3);
}
else
{
if ((timer_mig & 0x68) == 0) OUTPORT |= _BV(OUT4);
else OUTPORT &= ~_BV(OUT4);
}
}
}
}
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
CLKPR=0x80; //частота 4 800 000 гц
CLKPR=0x00;
DDRB = _BV(OUT1) | _BV(OUT2) | _BV(OUT3) | _BV(OUT4) ; //настроить выходы на вывод
// Настройка Timer0
TCCR0B= _BV(CS01) | _BV(CS00); // Частота счетчика: 4 800 000/256 = 75 000 Hz или 13.3mks
// 13.33*256 = 3,413 ms максимальная длина,которую можно измерить
dgrett писал(а):А помигать светиком да сравнить расчётную частоту с наблюдаемой? А может, все- таки 9,6 ?
Такое впечатление, что у вас и правда CKDIV8 снят и тактовая просто 9.6 МГц, а не 1.2 МГц. Проверьте фьюзы. Раньше возможно прошивали их уже в этот МК и сняли этот бит.
ISR(PCINT0_vect)
{
// проверяю импульсы по LOw
if ( !(PINB & (1<<BUTTON2)) == 0 ) // если встретился high То нужно сбросить счетчик что бы не учитывть длительность
{
statHigh=TCNT0;
TCNT0=0x00;
}
if (ii==0)
{
if ( (PINB & (1<<BUTTON2)) == 0) // если LOW
{
statLow=TCNT0;
if (statLow==47){ii=ii++;} // измерим и получим первый имупльс ii=1;
TCNT0=0x00;
}
}
if (ii==1)
{
if ( (PINB & (1<<BUTTON2)) == 0) // если LOW
{
statLow=TCNT0;
if (statLow==47){ii=ii++;} // измерим и получим второй имупльс ii=2;
TCNT0=0x00;
}
}
if (ii==2)
{
if ( (PINB & (1<<BUTTON2)) == 0) // если LOW
{
statLow=TCNT0;
if (statLow==47){ii=ii++;} // измерим и получим второй имупльс ii=2;
TCNT0=0x00;
}
}
if (ii==3) // Набралось 3 "правильных" импульса. Можно включать лампочку
{
PORTB ^= (1<<LED); //переключаем состояние светодиода (вкл./выкл.)
ii=0; // Обнулим счетчик "правильных" импульсов. Ждем следующую комманду.
}
}
Вс ноя 29, 2020 14:02:01
ii=ii++;
Вс ноя 29, 2020 19:59:11
ISR(PCINT0_vect)
//|| (PINB & (1<<BUTTON2)) == 0
{
jj=jj+1;
if ( !(PINB & (1<<BUTTON2)) == 0 ) // если high
{
statHigh=TCNT0;
TCNT0=0x00;
}
if ( ((PINB & (1<<BUTTON2)) == 0) & (jj==2) & (TCNT0==66)) // если LOW
{
stat1=TCNT0; t1=1;
}
if ( ((PINB & (1<<BUTTON2)) == 0 )& (jj==4) & (TCNT0==57) ) // если LOW
{
stat2=TCNT0; t2=1;
}
if ( ((PINB & (1<<BUTTON2)) == 0 ) & (jj==6) & (TCNT0==52)) // если LOW
{
stat3=TCNT0; t3=1;
}
if (t1==t2==t3)
{
PORTB ^= (1<<LED); //переключаем состояние светодиода (вкл./выкл.)
//ii=5;
}
}
Пт дек 04, 2020 11:16:52
Пт дек 04, 2020 11:26:45
изучите битовые операции хорошенькоolegue писал(а):делаю операцию И ((PINB & 0b0000 0001)) между 0b0000 0000 И 0b0000 0001, получаю 0b0000 0001
Пт дек 04, 2020 11:45:03
Пт дек 04, 2020 12:44:30
т.е получаем в данном конкретном случает 0b0000 0000
if (!(PINB & (1<<PB0))) {}
Пт дек 04, 2020 13:59:57
if(bit_is_set(PINB, PB0)){
}
if(bit_is_clear(PINB, PB3){
}
Пт дек 04, 2020 14:38:43
NStorm писал(а):а когда захотите проверить что бит установлен и напишите == 1 оно будет работать только для PB0,
Пт дек 04, 2020 15:01:34
или нужна именно единица младшего бита что бы приравнять к 1 (==1)?
Пт дек 04, 2020 16:39:27
NStorm писал(а):Разве 0b0000 0100 равно 1?
Сб дек 05, 2020 11:22:52
Bits and Bytes
lowByte()
highByte()
bitRead()
bitWrite()
bitSet()
bitClear()
bit()