ARV писал(а):...
в WinAVR даже имеется специальный макрос, делающий битовые установки еще более наглядными:Код: Выделить всё
#define _BV(x) (1<<x)
Согласен, но запись a=(1<<n), если можно так выразиться, компиляторонезависимая.
ARV писал(а):...
в WinAVR даже имеется специальный макрос, делающий битовые установки еще более наглядными:Код: Выделить всё
#define _BV(x) (1<<x)
Код: Выделить всё
PAUSE "Прошить fuse биты?"
#Fuse High Byte: RSTDISBL WDTON SPIEN CKOPT EESAVE BOOTSZ1 BOOTSZ0 BOOTRST 0b11011001
#Fuse Low Byte: BODLEVEL BODEN SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0 0b11100011
# note that a 1 means programmed. (для понипрог инвертируем)
WRITE-FUSE 0x261C KDAlex писал(а):Как можно измерить индуктивность с помощью МК?
FlyGreen писал(а):хм...а в чем они выразятЦо ?
pirotehnick писал(а):Подскажите пожалуйста какие новые модели МК AVR могут асинхронно тактировать свой таймер от частоты в несколько раз превышающую ч. ЦПУ, т.е. где-то 40 МГц.
Как я понял Atmega88 это не то...
Код: Выделить всё
# include <avr>
# include <avr>
unsigned int wgm=10;
void ext_int0_isr(void)
{
OCR1A+=wgm;
}
void main (void)
{
GICR=0x40; // разрешаем прервание INT0
MCUCR=0x02;// по ниспадающему сигналу
PORTD=0x04;
TCCR1A= _BV(WGM10) | _BV(WGM11) | _BV(COM1A1);//10 разрядная, неивертирующая ШИМ
TCCR1B= _BV(CS10);//делитель частоты не используется
DDRB= _BV(PB1) | _BV(PB2);//определяем вывод OC1A как выход
OCR1A=10; //начальное значение ШИМ
sei();//общее разрешение прерываний
while(1);
}
GRAF писал(а):Начал программирование на C осваивать, не получается управлять ШИМ на 8-й меге.
...
Что я неправильно делаю?
Код: Выделить всё
TCCR1A= _BV(WGM10) | _BV(WGM11) | _BV(COM1A1);//10 разрядная, неивертирующая ШИМ
DDRB= _BV(PB1) | _BV(PB2);//определяем вывод OC1A как выход
OCR1A=10; //начальное значение ШИМ
TCCR1B= _BV(CS10);//делитель частоты не используетсяКод: Выделить всё
unsigned int TIM16_WriteOCR1A( unsigned int n )
{
unsigned char sreg;
//unsigned int i; -ошибка в даташите, переназначение переменной
/* Save Global Interrupt Flag */
sreg = SREG;
/* Disable interrupts */
cli();
/* Set TCNT1 to i */
return n;
/* Restore Global Interrupt Flag */
SREG = sreg;
}
void ext_int0_isr()
{
_delay_ms(10);
OCR1A+=TIM16_WriteOCR1A(10);
}
Код: Выделить всё
# include <avr>
# include <avr>
# include <avr>
void main (void)
{
GICR=0x40; // разрешаем прервание INT0
MCUCR=0x02;// по ниспадающему сигналу
PORTD=0x04;
TCCR1A= _BV(WGM10) | _BV(WGM11) | _BV(COM1A1);//10 разрядная, неивертирующая ШИМ
DDRB= _BV(PB1) | _BV(PB2);//определяем вывод OC1A как выход
OCR1A=10; //начальное значение ШИМ
TCCR1B= _BV(CS10);//делитель частоты не используется
sei();//общее разрешение прерываний
while(1);
}
unsigned int TIM16_WriteOCR1A( unsigned int n )
{
unsigned char sreg;
//unsigned int i; -ошибка в даташите, переназначение переменной
/* Save Global Interrupt Flag */
sreg = SREG;
/* Disable interrupts */
cli();
/* Set TCNT1 to i */
return n;
/* Restore Global Interrupt Flag */
SREG = sreg;
}
void ext_int0_isr()
{
_delay_ms(10);
OCR1A+=TIM16_WriteOCR1A(10);
}