Полная версия этой страницы:
Генратор тактов на AT89
Muxamor
Dec 28 2005, 11:01
Народ надо сделать генератор тактовых ипульсов трех дипозонный
1) 2ms-20ms шаг 10
2) 20ms-200ms шаг 10
3) 20ms-2000ms шаг10
Зочу делать на 89 ! Кто что может посоветовать как грамотно алгоритм ореализовать? а то на ум чет п риходят только задержки!
Если кто делал такую фичу не поделитесь ?
Поскольку в AT89 аппаратного ШИМа нет и не будет, то конечно задержками. Таймер есть и не один, частоты у вас невысокие, так что нет проблем.
Muxamor
Dec 28 2005, 12:20
Скинь те ктонить пример запуска таимер счетчика ! А то както раньше мне он не нужен был совсем!
shamray
Dec 28 2005, 13:54
Можно так
// CPU clock speed
#define F_OSC 16000000 // 16MHz processor
//#define F_OSC 14745000 // 14.745MHz processor
//#define F_OSC 8000000 // 8MHz processor
//#define F_OSC 7372800 // 7.37MHz processor
//#define F_OSC 4000000 // 4MHz processor
//#define F_OSC 3686400 // 3.69MHz processor
//#define CPU_DIV 12
#define CPU_DIV 6 //internal divider
#define F_CPU F_OSC/CPU_DIV
#define F_CPU_1000 F_CPU/1000
void timer0init(u08 ms)
{
IEN0_bit.ET0=1;
TMOD_bit.M00=1;
TMOD_bit.M10=0; //16 bit
TMOD_bit.C_T0=0;
TCON_bit.TR0=1;
TIMER0RELOAD=0xffff-(F_CPU_1000*ms);
}
void timer1init(u08 ms)
{
IEN0_bit.ET1=1;
TMOD_bit.M01=1;
TMOD_bit.M11=0; //16 bit
TMOD_bit.C_T1=0;
TCON_bit.TR1=1;
TIMER1RELOAD=0xffff-(F_CPU_1000*ms);
}
void maain (void)
{
timer0init(2); //time 2 ms
timer0init(10); //time 10 ms
EA=1;
}
Muxamor
Dec 29 2005, 05:34
А в асеблере есть ?
А то я на Си не пишу и его не знаю!
А просто на делителе не хочеш пооробовать, если конечно задача стоит получить только заданную сетку частот.
Muxamor
Dec 29 2005, 07:08
Ну мне надо еще управление организовать между режимами !
Как на делителе ?
Вот нащел тут такю програмулину
;организация перехода к метке NEXT при переполнении Т/С0
ORG 0BH ;адpec вектора прерывания от Т/С0
CLR TCON.4 ;останов Т/С0
RETI ;выход из подпрограммы обработки прерывания
[/size]
[size="3"] ORG 100H ;начальный адрес программы
MOV TMOD, #01H ;настройка Т/С0
MOV TL0, #LOW(NOT(50000-1)) ;загрузка таймера
MOV TH0, #HIGH(NOT(50000-1))
SETB TCON.4 ;старт Т/С0
SETB IE.1 ;перевод в режим холостого хода
SETB PCON.0
NEXT: ...
зачем перходить в режим холостого хода и что дает SETB PCON.0?
Холостой ход нужен для снижения потребления. В данном случае это не актуально.
Просто после выполнения SETB PCON.0 процессор уснет, а после переполенения таймера (прерывания) продоолжит выполнение программы с метки NEXT.
Muxamor
Dec 29 2005, 08:54
А как сделать чтобы когда он переполнялся выставлялась единица на определенный порт !
Вообщим суть в том чтобы перед включения таимера я на пин подаю единицу а после переполнения я должен подать ноль ! Как так сказать написать прально это все?
а) Если делать на делителе то каждую частоту подаеш на цифровой коммутатор.
б) В начальных установках выполняеш SETB Рх.х,затем при обработке прерывания инвертируеш текущее состояние Рх.х. Только учти, что время работы счетчика должно быть равным 1/2 от требуемой.
Muxamor
Dec 29 2005, 09:56
Данная программа вроди должн авыполнять задержку 50 мс!
Пишу как там и почемуто не работает !
напишите че куда добавить чаинику!
Muxamor
Dec 29 2005, 12:32
ДА еще компилятор ругаеться на ORG 0BH и на SETB PCON.0
Muxamor
Dec 29 2005, 12:52
С ругательвом компелятора на ORG 0BH разобрался но на SETB PCON.0 всеравно ругаеться.
пиши вот такую прогу и не рабьотает так ка надо в чем дело ?
SCL EQU P1.4
SETB IE.7
Start:
CLR SCL
Call Zapusk
ORG 0BH
CLR TCON.4
RETI
Zapusk:
ORG 100H
MOV TMOD, #01H ;
MOV TL1, #LOW(NOT(10-1)) ;
MOV TH1, #HIGH(NOT(10-1))
SETB TCON.4 ;
SETB IE.1 ;
Jerdedo:
Setb SCL
JMP Start
end
Muxamor
Dec 30 2005, 04:48
Народ елки палки посоветйте че не так то ?
Roma_te
Dec 30 2005, 07:37
Цитата(Muxamor @ Dec 29 2005, 16:52)

С ругательвом компелятора на ORG 0BH разобрался но на SETB PCON.0 всеравно ругаеться.
Регистр PCON не предусматривает побитовой адресации, поетому с ним надо работать через маску. Попробуй MOV PCON, #80H
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.