генератор на меге8515
|
|
dsx | Дата: Четверг, 15.04.2010, 01:05 | Сообщение # 1 |
Рядовой
Группа: Пользователи
Сообщений: 4
Статус: Offline
| случайно выставил фузы на меге8 на внешний генератор (везде 0000) и теперь он очень нужен. где-то читал про возможность собрать на ШИМ. Помогите как это сделать, а то я новичек и решение такой задачи не представляется возможным
|
|
| |
my-avr | Дата: Четверг, 15.04.2010, 01:35 | Сообщение # 2 |
Admin
Группа: Администраторы
Сообщений: 79
Статус: Offline
| dsx, Привет! вот тебе как новичку советую почитать http://cadzone.ru/content/view/843/33/ можно сделать на NE555 http://aes.at.ua/publ/26-1-0-129 подключать к ножки МК XTAL1, но частота таких генераторовдо 1.5 МГц
|
|
| |
HiSER | Дата: Четверг, 15.04.2010, 14:30 | Сообщение # 3 |
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: Offline
| Кварц на 8MHz на ножке PD5 будет меандр с частотой ~1MHz Code #include <mega8515.h>
void main(void) { PORTD=0; DDRD=0x20; TCCR1A=0x40; TCCR1B=0x19; TCNT1H=0; TCNT1L=0; ICR1H=0; ICR1L=3; //ICR1L=4; OCR1AH=0; OCR1AL=0; OCR1BH=0; OCR1BL=0; }
Сообщение отредактировал HiSER - Четверг, 15.04.2010, 14:38 |
|
| |
dsx | Дата: Пятница, 16.04.2010, 11:01 | Сообщение # 4 |
Рядовой
Группа: Пользователи
Сообщений: 4
Статус: Offline
| my-avr, спасибо за информативные ссылки. HiSER, среди множества советов, которые я получал, твой метод оказался самым простым и действенным, спасибо.
|
|
| |
Shakal | Дата: Понедельник, 27.06.2011, 21:39 | Сообщение # 5 |
Рядовой
Группа: Пользователи
Сообщений: 16
Статус: Offline
| а что нужно добавить что б было 2 кнопки для увеличения частоты и уменьшения( к тому примеру где 1 МГЦ)
|
|
| |
HiSER | Дата: Понедельник, 27.06.2011, 23:08 | Сообщение # 6 |
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: Offline
| Соответственно менять значение регистра ICR1.
|
|
| |
Shakal | Дата: Вторник, 28.06.2011, 01:20 | Сообщение # 7 |
Рядовой
Группа: Пользователи
Сообщений: 16
Статус: Offline
| #include <mega8515.h> #include <delay.h>
void main(void) { long pos=3; PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC=0xFF;
PORTD=0; DDRD=0x20; TCCR1A=0x40; TCCR1B=0x19; TCNT1H=0; TCNT1L=0; ICR1H=0; ICR1L=pos; //ICR1L=4; OCR1AH=0; OCR1AL=0; OCR1BH=0; OCR1BL=0; while(1) { if (PINB.1==1) { delay_ms(30); if (PORTB.1==1) pos++; } if (PINB.2==1) { delay_ms(30); if (PORTB.2==1) pos--; } if (pos<1) pos=1; if (pos>1000) pos=1023; ICR1L=pos; //ICR1L=4;
} } получилось как то так, но почему то когда жмеь на клавишу то на в ходе появляеться постоянно 1 и не происходит изменение перемоной pos и соотвественно не меняеться частота !!!!! если можно то исправте. спасибо
|
|
| |
HiSER | Дата: Среда, 29.06.2011, 22:00 | Сообщение # 8 |
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: Offline
| Какой-то код бредовый... Регистры ICR1L и ICR1H восьми битные, зачем использовать long (4 байта)? Если требуется 16 бит всего.
Code #include <mega8515.h> #include <delay.h>
union { struct { unsigned char low; unsigned char high; }b; unsigned int word; }pos;
void main(void) { PORTB=0; DDRB=0; PORTD=0; DDRD=0x20; TCCR1A=0x40; TCCR1B=0x19; TCNT1H=0; TCNT1L=0; ICR1H=0; ICR1L=255; OCR1AH=0; OCR1AL=0; OCR1BH=0; OCR1BL=0;
pos.word=255;
while(1) {
if (PINB.1!=0) { if (pos.word<1023) pos.word++; }
if (PINB.2!=0) { if (pos.word>1) pos.word--; }
ICR1H=pos.b.high; ICR1L=pos.b.low;
delay_ms(50); }
}
|
|
| |
Shakal | Дата: Вторник, 05.07.2011, 20:08 | Сообщение # 9 |
Рядовой
Группа: Пользователи
Сообщений: 16
Статус: Offline
| спасибо) а что нужно добавить что б менялась скважнасть нажатием клавиши, хотяб пару значений ??? Добавлено (05.07.2011, 20:08) --------------------------------------------- что то не получаеться вывести показания частоты на 7 сегментник с 6цифрами .. есть у кого решения этой проблемы ?спасибо
|
|
| |
HiSER | Дата: Среда, 06.07.2011, 15:04 | Сообщение # 10 |
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: Offline
| а что именно не получается?
|
|
| |
Shakal | Дата: Четверг, 07.07.2011, 12:04 | Сообщение # 11 |
Рядовой
Группа: Пользователи
Сообщений: 16
Статус: Offline
| я работал только с 2 значнми числами а вот чтобы вывести на 6 циферный сигментник что то не получаеться
|
|
| |
HiSER | Дата: Четверг, 07.07.2011, 18:13 | Сообщение # 12 |
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: Offline
| точно так же как и с двумя! опиши конкретно что не получается.
|
|
| |
Shakal | Дата: Пятница, 08.07.2011, 10:53 | Сообщение # 13 |
Рядовой
Группа: Пользователи
Сообщений: 16
Статус: Offline
| а от каких и до каких частот прошлый код работает?
|
|
| |
HiSER | Дата: Понедельник, 11.07.2011, 11:49 | Сообщение # 14 |
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Статус: Offline
| Так посчитай: [частота МК]/[делитель таймера]=частота таймера ([Частота таймера]/ICR-1)/2=Частота меандра
|
|
| |
Shakal | Дата: Понедельник, 11.07.2011, 19:35 | Сообщение # 15 |
Рядовой
Группа: Пользователи
Сообщений: 16
Статус: Offline
| [code] #include <mega8515.h> #include <delay.h> unsigned int t,t1,t2,t3; unsigned char Dig[10]; char Disp6, Disp7;
union { struct { unsigned char low; unsigned char high; }b; unsigned int word; }pos; void Display (unsigned int Number) //Ф-ция для разложения десятичного цисла { unsigned char Num2, Num3; Num2=0; while (Number >= 10) //десятичную { Number -= 10; Num2++; } Num3 = Number; //остаток Disp6 = Dig[Num2]; Disp7 = Dig[Num3]; } void Dig_init() //Массив для отображения цыфр на семисегментном индикаторе { Dig[0] = 95; // Сейчас у нас схема с общим катодом Dig[1] = 24; Dig[2] = 109; Dig[3] = 124; Dig[4] = 58; Dig[5] = 118; Dig[6] = 119; Dig[7] = 28; Dig[8] = 127; Dig[9] = 126; } void main(void) { PORTA=0x00; DDRA=0xFF; PORTC=0x00; DDRC=0xFF;
PORTB=0; DDRB=0; PORTD=0; DDRD=0x20; TCCR1A=0x40; TCCR1B=0x19; //TCNT1H=0; //TCNT1L=0; ICR1H=0; ICR1L=255; OCR1AH=0; OCR1AL=0; OCR1BH=0; OCR1BL=0; pos.word=255; t=1000; #asm("sei") Dig_init(); //инициализация массива с двоичным кодом
while(1) { if (PINB.1!=0) { if (pos.word<1023) pos.word++; t++; } if (PINB.2!=0) { if (pos.word>1) pos.word--; t--; } ICR1H=pos.b.high; ICR1L=pos.b.low; delay_ms(50); t1=t/10000; t2=t/100%100; t3=t%100; // выводим переменные (стробирование) Display(t1); //разложили на 2 цифры и отобразили по очереди PORTA=254; //даем лог 0 для катода 1 разряда PORTC=Disp6; //1 цифра delay_ms(5); PORTA=253; //даем лог 0 для катода 2 разряда PORTC=Disp7; //2 цифра delay_ms(5); Display(t2); //разложили на 2 цифры и отобразили по очереди PORTA=251; //даем лог 0 для катода 3 разряда PORTC=Disp6; //3 цифра delay_ms(5); PORTA=247; //даем лог 0 для катода 4 разряда PORTC=Disp7; //4... delay_ms(5); Display(t3); //разложили на 2 цифры и отобразили по очереди PORTA=239; //даем лог 0 для катода 3 разряда PORTC=Disp6; //5 цифра delay_ms(5); PORTA=223; //даем лог 0 для катода 4 разряда PORTC=Disp7; //6... delay_ms(5);
}
}
вот что получилось вроде все работает, только вот как сделать так чтобы цыфры не моргали, а с увеличением частоты начинают еще больше моргать ?и если несложно можно подставить значения для расчета частоты ! спасибо
|
|
| |