Страница 1 из 1

простой генератор на avr

Добавлено: Вс сен 02, 2012 15:09:38
witia03
помогите разобраться-

Код: Выделить всё

#include <90s2343.h>
#include <delay.h>
void main(void)
{
unsigned char pause;

DDRB.4 =0xFF;

pause = 1;

while (1)
{
PORTB.4 =0xFF;
delay_ms(pause);
PORTB.4 =0x00;
delay_ms(pause);
}
}
как сделать что бы при нажатии кнопки 1 увеличивалось значение переменной pause а при нажатии кнопки 2 уменьшалось

Re: простой генератор на avr

Добавлено: Вс сен 02, 2012 15:16:07
просто КОТ
Возможно внешнее прерывание и в прерывании указать +1 или -1.

Re: простой генератор на avr

Добавлено: Вс сен 02, 2012 15:36:01
witia03
просто КОТ писал(а):Возможно внешнее прерывание и в прерывании указать +1 или -1.
мне бы это ввиде кода

Re: простой генератор на avr

Добавлено: Вс сен 02, 2012 16:51:36
просто КОТ
По идее, что-то типа:

Код: Выделить всё

#include <tiny13.h>

    interrupt[2] void ExtInt1(void)
        { if (PORTB.3=1)
            {pause=X+1
             X=pause};
           if (PORTB.4=1)
            {pause=X-1
             X=pause}           
    void main(void)
    {
    unsigned char X;
    unsigned char pause;
    pause=X
    DDRB=0b11101;
    PORTB=0b00010;
    MCUCR=0b00000010
    GTCCR=0b10000000
    #asm("sei")
    while (1)
    {
    PORTB.4 =0xFF;
    delay_ms(pause);
    PORTB.4 =0x00;
    delay_ms(pause);
    }
    }
Вот это для Тини13. Для своего переделать сможешь?!
(Надо покопаться в ДатаШите и подобрать выводы!)

Хм, я вот тут подумал, надо же ещё как-то запускать прерывание. . . Скоро дополню!

Re: простой генератор на avr

Добавлено: Вс сен 02, 2012 16:56:32
просто КОТ
Да, кстати -- Частоты будут: 1кГц, 500Гц, 333Гц, 250Гц, 200Гц, 166Гц, 143Гц, 125Гц, 111Гц, 100Гц.

Re: простой генератор на avr

Добавлено: Вс сен 02, 2012 17:43:46
witia03
просто КОТ писал(а):Да, кстати -- Частоты будут: 1кГц, 500Гц, 333Гц, 250Гц, 200Гц, 166Гц, 143Гц, 125Гц, 111Гц, 100Гц.
а почему? а если мне надо от 1 гц до 10 кгц?

Re: простой генератор на avr

Добавлено: Вс сен 02, 2012 19:25:49
просто КОТ
Ну, если у тебя мин. задержка 1мс и импульс 1мс, то максимальная частота 500Гц. Так что 1кГц это я ошибся. От 500Гц и ниже!


(Тут надо не через ДЭЛЭЙ, а по другому как-то. Таймером например!)

Re: простой генератор на avr

Добавлено: Вс сен 02, 2012 19:34:42
witia03
а если задача немного другая- регулировать задержку с частотой от 1 герца до 1 кгц, записывать последние установленные значения в епром?

Re: простой генератор на avr

Добавлено: Вс сен 02, 2012 21:55:59
просто КОТ
В смысле регулировать задержку?! Можно поподробнее -- чего ты хочешь сделать?!

Re: простой генератор на avr

Добавлено: Вт сен 04, 2012 17:18:37
Reloader
delay_ms(pause); однозначно убирай. Придется использовать таймер. Обработку нажатий на кнопки лучше всего через прерывания (можно и без прерываний). Не забыть про дребезг контактов! В принципе этого более, чем достаточно для истязания Гугла.

AVR таймер

avr кнопки дребезг

avr прерывания

Re: простой генератор на avr

Добавлено: Чт сен 06, 2012 20:09:19
YS
delay_ms(pause); однозначно убирай.
Да. В _delay_ms() запрещено использовать переменные.

"... delay time must be an expression that is a known constant at compile-time. If these requirements are not met, the resulting delay will be much longer (and basically unpredictable) ..."