Согласен, но запись a=(1<<n), если можно так выразиться, компиляторонезависимая.ARV писал(а):...
в WinAVR даже имеется специальный макрос, делающий битовые установки еще более наглядными:Код: Выделить всё
#define _BV(x) (1<<x)
Мелкие вопросы по МК и ПЛИС.
- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
- Реклама
- Сообщения: 80
- Зарегистрирован: Ср ноя 28, 2007 09:42:28
Выручайте советом, товарищи коты. Решил я собрать свое первое устройство на 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 КБ) 483 скачивания
- Сообщения: 58
- Зарегистрирован: Сб июн 14, 2008 12:00:32
- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
С помощью одного только МК не получиться - минмальная обвязка нужна.KDAlex писал(а):Как можно измерить индуктивность с помощью МК?
Принци измерения например, по иднуктивному сопротивлению.
Т. е. нужно сделать генератор синусоидального сигнала определенной частоты и амплитуды, к генератору подключать последоватьельную цепь из измеряемой индуктивности и резистора с известным сопротивлением, измерив амплитуду напряжения на иднуктивности, мы сможем вычислить ее индуктивное сопротивление, а затем, зная частоту нашего сигнала вычислим индуктивность. Соответсвенно в микроконтроллере должны присутствовать АЦП, чтобы с помощью него измерять амплитуду
Есть и другой способ - сделать генератор, частотозадающей цепью которого будет колебательный контур из измеряемой индуктиности и конденсатора известной емкости. Далее, измеряя частоту полученного сигнала и зная емкость конденсатора, можем вычислить индуктивность. Частоту с помощью микроконтроллера измерить не очень сложно, но нужно сначала сделать формирователь импульсов (который из синусоидального, ну или какой там есть, сигнала генератора сделает прямоугольные импульсы той же частоты).
Вот как-то так. Но должен заметить, что это всего-лишь принципы измерения, в реальности все посложнее будет.
- Реклама
- Сообщения: 88
- Зарегистрирован: Сб ноя 01, 2008 11:50:26
Товарище, у меня вопрос - помогите чайнегу. Есть ли разница между ATtiny 13A и ATtiny 13V ? Если программа писалась под 13А надо ли что-нибудь менять, что-бы эта программа заработала на 13V ?
Насколько я понимаю, 13А – это исправленная версия обычной (глюкавой) Tiny13, а 13V – просто низковольтная версия обычной Tiny13. Соответственно проблемы при взаимозамене очень вероятны.
- Сообщения: 88
- Зарегистрирован: Сб ноя 01, 2008 11:50:26
Ну во-первых у этих микрух разные допустимые напряжения питания. Во-вторых, у одной стандартное «вычислительное ядро», а у второй модифицированное. Полной совместимости точно нет. Так что всё только на свой страх и риск.FlyGreen писал(а):хм...а в чем они выразятЦо ?
- Сообщения: 27
- Зарегистрирован: Пн окт 13, 2008 00:31:05
Подскажите пожалуйста, как в Меге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
- Сообщения: 703
- Зарегистрирован: Вс янв 18, 2009 21:12:49
Подскажите пожалуйста какие новые модели МК AVR могут асинхронно тактировать свой таймер от частоты в несколько раз превышающую ч. ЦПУ, т.е. где-то 40 МГц.
Как я понял Atmega88 это не то...
Как я понял Atmega88 это не то...
- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
Из "мелких" это тиньки 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);
}
Что я неправильно делаю?
- Сообщения: 459
- Зарегистрирован: Вс июн 01, 2008 12:16:38
Вроде криминала нет, единственное, попробуйте сначала записать 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 шалит?
Как запрограммировать ATiny15 через LPT ?
P.S. Программатор для AVR есть (AVR910 USB), но именно ATiny15 он не шьёт...
P.S. Программатор для AVR есть (AVR910 USB), но именно ATiny15 он не шьёт...


