Четверг, 25.04.2024, 03:50
Микроконтроллерная техника AVR
Главная Регистрация Вход
Приветствую Вас, Гость · RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Форум » Микроконтроллеры » Вопросы по МК » генератор на меге8515
генератор на меге8515
dsxДата: Четверг, 15.04.2010, 01:05 | Сообщение # 1
Рядовой
Группа: Пользователи
Сообщений: 4
Репутация: 0
Статус: Offline
случайно выставил фузы на меге8 на внешний генератор (везде 0000) и теперь он очень нужен. где-то читал про возможность собрать на ШИМ. Помогите как это сделать, а то я новичек и решение такой задачи не представляется возможным
 
my-avrДата: Четверг, 15.04.2010, 01:35 | Сообщение # 2
Admin
Группа: Администраторы
Сообщений: 79
Репутация: 10
Статус: 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
Репутация: 11
Статус: 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
Репутация: 0
Статус: Offline
my-avr, спасибо за информативные ссылки.
HiSER, среди множества советов, которые я получал, твой метод оказался самым простым и действенным, спасибо.
 
ShakalДата: Понедельник, 27.06.2011, 21:39 | Сообщение # 5
Рядовой
Группа: Пользователи
Сообщений: 16
Репутация: 0
Статус: Offline
а что нужно добавить что б было 2 кнопки для увеличения частоты и уменьшения( к тому примеру где 1 МГЦ)
 
HiSERДата: Понедельник, 27.06.2011, 23:08 | Сообщение # 6
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Соответственно менять значение регистра ICR1.
 
ShakalДата: Вторник, 28.06.2011, 01:20 | Сообщение # 7
Рядовой
Группа: Пользователи
Сообщений: 16
Репутация: 0
Статус: 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
Репутация: 11
Статус: 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
Репутация: 0
Статус: Offline
спасибо) а что нужно добавить что б менялась скважнасть нажатием клавиши, хотяб пару значений ???

Добавлено (05.07.2011, 20:08)
---------------------------------------------
что то не получаеться вывести показания частоты на 7 сегментник с 6цифрами .. есть у кого решения этой проблемы ?спасибо

 
HiSERДата: Среда, 06.07.2011, 15:04 | Сообщение # 10
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
а что именно не получается?
 
ShakalДата: Четверг, 07.07.2011, 12:04 | Сообщение # 11
Рядовой
Группа: Пользователи
Сообщений: 16
Репутация: 0
Статус: Offline
я работал только с 2 значнми числами а вот чтобы вывести на 6 циферный сигментник что то не получаеться
 
HiSERДата: Четверг, 07.07.2011, 18:13 | Сообщение # 12
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
точно так же как и с двумя! опиши конкретно что не получается.
 
ShakalДата: Пятница, 08.07.2011, 10:53 | Сообщение # 13
Рядовой
Группа: Пользователи
Сообщений: 16
Репутация: 0
Статус: Offline
а от каких и до каких частот прошлый код работает?
 
HiSERДата: Понедельник, 11.07.2011, 11:49 | Сообщение # 14
Продвинутый автор!
Группа: Проверенные
Сообщений: 254
Репутация: 11
Статус: Offline
Так посчитай:
[частота МК]/[делитель таймера]=частота таймера
([Частота таймера]/ICR-1)/2=Частота меандра
 
ShakalДата: Понедельник, 11.07.2011, 19:35 | Сообщение # 15
Рядовой
Группа: Пользователи
Сообщений: 16
Репутация: 0
Статус: 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);

}



}

вот что получилось вроде все работает, только вот как сделать так чтобы цыфры не моргали, а с увеличением частоты начинают еще больше моргать ?и если несложно можно подставить значения для расчета частоты ! спасибо
 
Форум » Микроконтроллеры » Вопросы по МК » генератор на меге8515
  • Страница 1 из 3
  • 1
  • 2
  • 3
  • »
Поиск:

Хостинг от uCoz