Согласен, но запись a=(1<<n), если можно так выразиться, компиляторонезависимая.ARV писал(а):...
в WinAVR даже имеется специальный макрос, делающий битовые установки еще более наглядными:Код: Выделить всё
#define _BV(x) (1<<x)
Мелкие вопросы по МК и ПЛИС.
- Реклама
-
Ежик в тумане
- Встал на лапы
- Сообщения: 80
- Зарегистрирован: Ср ноя 28, 2007 09:42:28
- SarCity
- Прорезались зубы
- Сообщения: 215
- Зарегистрирован: Вт июн 10, 2008 09:17:06
- Откуда: г. Саратов
- Контактная информация:
Выручайте советом, товарищи коты. Решил я собрать свое первое устройство на AVR (часы 5 цифр), купил мегу8, собрал программатор. При первых попытках результата не было - ошибка 24 (пользовался понипрог 2.05а), но полазив по сайтам скачал версию 2.06f и ура все заработало! Но через несколько часов вспомнил, что мне надо другую версию прошивки, но залить ее укже не получилось
танцы с бубном не помогали и я решил на скорую руку смастерить "5 проводков" но результат отрицательный. У меня предположение, что я фьюзами отключил внутреннее тактирование. Пользовался скриптом, любезно выложенным автором "часов 5 цифр". выкладываю ту часть, где фьюзы выставляются:
Код: Выделить всё
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 - Вложения
-
- stk200_300.gif
- Схема программатора
- (19.37 КБ) 480 скачиваний
С помощью одного только МК не получиться - минмальная обвязка нужна.KDAlex писал(а):Как можно измерить индуктивность с помощью МК?
Принци измерения например, по иднуктивному сопротивлению.
Т. е. нужно сделать генератор синусоидального сигнала определенной частоты и амплитуды, к генератору подключать последоватьельную цепь из измеряемой индуктивности и резистора с известным сопротивлением, измерив амплитуду напряжения на иднуктивности, мы сможем вычислить ее индуктивное сопротивление, а затем, зная частоту нашего сигнала вычислим индуктивность. Соответсвенно в микроконтроллере должны присутствовать АЦП, чтобы с помощью него измерять амплитуду
Есть и другой способ - сделать генератор, частотозадающей цепью которого будет колебательный контур из измеряемой индуктиности и конденсатора известной емкости. Далее, измеряя частоту полученного сигнала и зная емкость конденсатора, можем вычислить индуктивность. Частоту с помощью микроконтроллера измерить не очень сложно, но нужно сначала сделать формирователь импульсов (который из синусоидального, ну или какой там есть, сигнала генератора сделает прямоугольные импульсы той же частоты).
Вот как-то так. Но должен заметить, что это всего-лишь принципы измерения, в реальности все посложнее будет.
- Реклама
Тини 13
Товарище, у меня вопрос - помогите чайнегу. Есть ли разница между ATtiny 13A и ATtiny 13V ? Если программа писалась под 13А надо ли что-нибудь менять, что-бы эта программа заработала на 13V ?
- Секретный кот
- Поставщик валерьянки для Кота
- Сообщения: 2106
- Зарегистрирован: Ср сен 17, 2008 14:32:15
- Откуда: Старые Васюки
- Контактная информация:
хм
хм...а в чем они выразятЦо ?
- Секретный кот
- Поставщик валерьянки для Кота
- Сообщения: 2106
- Зарегистрирован: Ср сен 17, 2008 14:32:15
- Откуда: Старые Васюки
- Контактная информация:
Re: хм
Ну во-первых у этих микрух разные допустимые напряжения питания. Во-вторых, у одной стандартное «вычислительное ядро», а у второй модифицированное. Полной совместимости точно нет. Так что всё только на свой страх и риск.FlyGreen писал(а):хм...а в чем они выразятЦо ?
Подскажите пожалуйста, как в Меге16 занести значения в регистры ICR1A, OCR1A, OCR1B
В начале программы записываю сначала старшую, потом младшую часть а симулятор заносит 0x00ff либо 0xffff
все прерывания и устройства еще не включены
ldi r16,0x04
out icr1h,r16
ldi r16,0xb2
out icr1l,r16
ldi r16,0x04
out ocr1ah,r16
ldi r16,0xb0
out ocr1al,r16
В начале программы записываю сначала старшую, потом младшую часть а симулятор заносит 0x00ff либо 0xffff
все прерывания и устройства еще не включены
ldi r16,0x04
out icr1h,r16
ldi r16,0xb2
out icr1l,r16
ldi r16,0x04
out ocr1ah,r16
ldi r16,0xb0
out ocr1al,r16
-
pirotehnick
- Потрогал лапой паяльник
- Сообщения: 327
- Зарегистрирован: Пт фев 08, 2008 13:46:03
- Откуда: Воронеж
- Контактная информация:
Из "мелких" это тиньки 26 (уже старенькие) или 261 - поновее, также 25, еще 90PWM3b. Из семейства мега - не знаю.pirotehnick писал(а):Подскажите пожалуйста какие новые модели МК AVR могут асинхронно тактировать свой таймер от частоты в несколько раз превышающую ч. ЦПУ, т.е. где-то 40 МГц.
Как я понял Atmega88 это не то...
Начал программирование на C осваивать, не получается управлять ШИМ на 8-й меге.
Код:
Запускаю симуляцию в VMLAB. По прерванию INT0 ничего не происходит, ширина импульсов остаётся прежней, равной начальному значению. Прерывание происходит, видно на осциллографе.
Что я неправильно делаю?
Код:
Код: Выделить всё
# 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);
}
Что я неправильно делаю?
Вроде криминала нет, единственное, попробуйте сначала записать OCR1A, и настройки а затем запустить таймер т. е.GRAF писал(а):Начал программирование на C осваивать, не получается управлять ШИМ на 8-й меге.
...
Что я неправильно делаю?
Код: Выделить всё
TCCR1A= _BV(WGM10) | _BV(WGM11) | _BV(COM1A1);//10 разрядная, неивертирующая ШИМ
DDRB= _BV(PB1) | _BV(PB2);//определяем вывод OC1A как выход
OCR1A=10; //начальное значение ШИМ
TCCR1B= _BV(CS10);//делитель частоты не используетсяХм, не помогает.
Попробовал ещё такой пример, типа того, как в даташите описано:
По прерыванию вызываю другую функцию, которая возвращает в регистр OCR1A +10. Двойная работа. Один хрен-не получается регулировать ширину...
полный код:
UPD
Или это уже VMLAB шалит?
Попробовал ещё такой пример, типа того, как в даташите описано:
По прерыванию вызываю другую функцию, которая возвращает в регистр OCR1A +10. Двойная работа. Один хрен-не получается регулировать ширину...
Код: Выделить всё
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);
}
Или это уже VMLAB шалит?
- maverick5334
- Мучитель микросхем
- Сообщения: 491
- Зарегистрирован: Сб апр 05, 2008 07:59:10
- Откуда: Луганск
- Контактная информация:


