Обсуждаем контроллеры компании Atmel.
Ответить

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:04:55

Как-то больно мудро опрашиваете клавиатуру
Попробуйте
Код:
if (!(PINE &= (1<<PE1)))

заменить на
Код:
if(!(PINE & (1<<PE1)))


"PINE &=" что вы этим хотите добиться?

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:05:38

кстати, да - глаз замылился уже :) не заметил &=

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:06:42

Как реализована подтяжка кнопок? Внешними резисторами?
Если нет, то её нужно включить
Код:
PORTE = (1<<PE0) | (1<<PE1);

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:11:27

Исправил все указанные вами ошибки, но по прежнему изменяется лишь во время нажатия :(

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:14:39

Покажите получившийся код :-)
Я кажется нашёл косяк.
У вас и глобальная переменная, и параметр функции имеют одно имя - Sch

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:17:28

prinv писал(а):Я кажется нашёл косяк.
У вас и глобальная переменная, и параметр функции имеют одно имя - Sch
по идее, это не косяк: по правилу экранирования локальная переменная (параметр) экранирует глобальную, т.е. внутри функции видна именно переменная-параметр.

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:18:43

Не косяк, если это не влияет на работу :)

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:20:47

ну так не должно влиять...

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:24:31

Ну видишь какие чудеса происходят - лучше исключить непонятки

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:29:04

Проверил - не влияет эта переменная.

Код:
#define F_CPU 8000000UL   //obyavleniye chastoty CPU mk
#include <avr/io.h>   //podklucheniye biblioteki mk
#include <avr/interrupt.h>   //podklucheniye biblioteki zaderjek
#include <util/delay.h>   //podklucheniye zaderjek
#include <stdio.h>

static void ti_in(void)
{
   TCCR1A|=0;   //регистр управления таймером/счетчиком
   TCNT1|=0;   //Регистр таймера/счетчика
   OCR1A=Sch;   //значение сравнения, до 16 бит
   TIMSK|=(1<<OCIE1A);
   TCCR1B|=(1<<CS12)|(1<<WGM12);   //установка делителя, режима работы таймера
}

ISR(TIMER1_COMPA_vect)   //функция, выполняемая автоматически, при совпадении числел - счетчика и установленного значения
{
   PORTC=~PORTC;
}

static void TI_Write(unsigned int Sch)
{
 //unsigned int sreg = SREG;
 //cli();
 OCR1A=Sch;
//SREG=sreg;
}

int main(void)
{
   cli();
   DDRC=0xFF;
   PORTE = (1<<PE0) | (1<<PE1);
   unsigned int Sch=100; //в реале период / 2
   ti_in();
   sei();

    while (1)
    {
      if (!(PINE & (1<<PE1)))
       TI_Write(300);

      if (!(PINE & (1<<PE0)))
       TI_Write(1000);
    }
}

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:31:02

А если вот так переписать?
Код:
void TI_Write(unsigned int Sch1)
{
 OCR1A=Sch1;
}

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:32:39

Пробовал, безрезультатно :(

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:33:23

а давайте-ка уточним, что вы вкладываете в понятие "не работает" программа? вы как ОЖИДАЕТЕ увидеть её работу?
период мигания у вас НЕ МЕНЯЕТСЯ, так как у вас не режим СТС, а просто счет таймера. при каком бы значении не происходило сравнение OCR1A с TCNT, период между этими событиями только в момент нажатия кнопки будет иным, что легко не заметить, а все прочее время - тем же самым, как определено предделителем таймера :)

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:36:16

не режим СТС

Почему не CTC? Только WGM12 установлен.
Я бы только поменял всё на безусловное присваивание
Код:
void ti_in(void)
{
   TCCR1B = 0; // И ПЕРВОЙ СТРОЧКОЙ ЭТО БЫ ДОБАВИЛ
   TCCR1A=0;   //регистр управления таймером/счетчиком
   TCNT1=0;   //Регистр таймера/счетчика
   OCR1A=Sch;   //значение сравнения, до 16 бит
   TIMSK=(1<<OCIE1A);
   TCCR1B=(1<<CS12)|(1<<WGM12);   //установка делителя, режима работы таймера
}
Последний раз редактировалось prinv Пн окт 08, 2018 10:40:28, всего редактировалось 2 раз(а).

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:38:35

Да, как раз в СТС именно и сравнивается счетчик с OCR.

А под "не работает" имею в виду то, что после нажатия на кнопку частота возвращается к старому значению, в то время как (почему я ранее и сделал Sch глобальным) по идее должно обновиться и не изменяться уже

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:38:58

prinv писал(а):Только WGM12 установлен
проглядел :(

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:40:20

Я бы только поменял всё на безусловное присваивание


Не влияет :dont_know:

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:42:32

А так?
Код:
    while (1)
    {
      uint8_t Value;
      Value = PINE;
      if (!(Value & (1<<PE1)))
       OCR1A=300;

      if (!(Value & (1<<PE0)))
       OCR1A=1000;
    }

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:51:42

prinv, аналогично

Прям чудеса :roll:

Re: AVR studio в вопросах и ответах

Пн окт 08, 2018 10:57:12

без кнопок-то хоть разная частота может быть вами получена?
Код:
OCR1A = 300;
_delau_ms(1000);
OCR1A = 1000;
_delay_ms(1000);
Ответить