Страница 141 из 160
Re: AVR studio в вопросах и ответах
Добавлено: Пт окт 05, 2018 09:52:30
An-SU
Реакции никакой.
Проверил - именно на команды, связанные с таймером
Добавлено after 33 minutes 11 seconds:
В ходе последних мучений выяснил, что проблема именно в передаче значения как входного параметра - даже с volatile не хочет считывать так, как мне это нужно
Re: AVR studio в вопросах и ответах
Добавлено: Пт окт 05, 2018 09:55:10
prinv
Замени вызов функции прямым присвоением регистра.
Re: AVR studio в вопросах и ответах
Добавлено: Пт окт 05, 2018 09:58:37
ARV
An-SU писал(а):проблема именно в передаче значения как входного параметра - даже с volatile не хочет считывать так, как мне это нужно
чудеса, да и только!
Re: AVR studio в вопросах и ответах
Добавлено: Пт окт 05, 2018 10:14:27
prinv
[uquote="ARV",url="/forum/viewtopic.php?p=3473415#p3473415"]чудеса, да и только![/uquote]
Вот в этом и есть косяк AVR - отладчик стоит неразумных денег.
Я после MSP430 и теперь на STM32 смотрю на эту проблему с недоумением.
Re: AVR studio в вопросах и ответах
Добавлено: Пт окт 05, 2018 10:21:47
ARV
[uquote="prinv",url="/forum/viewtopic.php?p=3473424#p3473424"]Я после MSP430 и теперь на STM32 смотрю на эту проблему с недоумением.[/uquote]вот только давайте без вот этого вот!
для AVR в том их понимании, как у большинства любителей, вообще нет необходимости в отладчиках! если не симулятор студии, то уж протеус точно покрывает все потребности разработчика. для особо гениальных, конечно, потребуется нечто большее - тогда пусть и платят. разбаловались отладчиками, даже наподумать сил не оставили...
Re: AVR studio в вопросах и ответах
Добавлено: Пт окт 05, 2018 10:32:40
prinv
Вот сейчас как раз тот самый случай, когда отладка бы всё прояснила.
Re: AVR studio в вопросах и ответах
Добавлено: Пт окт 05, 2018 10:38:07
ARV
сейчас как раз тот случай, чтобы повыкидывать из кода лишние манипуляции с SREG, бесконечные cli()-sei(), повсеместные volatile, разобраться с алгоритмом управления таймером и сделать так, что бы заработало с пол-пинка. а отладчик тут окажет медвежью услугу.
Добавлено after 51 second:
хотя при желании можно воспользоваться симулятором студии или (для ШИМ-а предпочтительнее) протеусом.
Re: AVR studio в вопросах и ответах
Добавлено: Пт окт 05, 2018 10:53:40
An-SU
prinv, а не подскажете, каким образом можно записать, чтобы регистр считывал величины переменных?
ARV, команды с SREG и cli()-sei() я брал из технического описания для микросхемы (отечественный аналог 128), где приводился следующий отрывок кода как правильный для изменения регистров таймера. volatile накидывал до кучи, пытаясь оживить программу, да
Re: AVR studio в вопросах и ответах
Добавлено: Пт окт 05, 2018 11:09:33
ARV
An-SU писал(а):отечественный аналог 128
чевой-чевой?!

Re: AVR studio в вопросах и ответах
Добавлено: Пт окт 05, 2018 11:13:58
prinv
[uquote="An-SU",url="/forum/viewtopic.php?p=3473447#p3473447"]prinv, а не подскажете, каким образом можно записать, чтобы регистр считывал величины переменных?[/uquote]
Имя_регистра = имя_переменной
Добавлено after 1 minute 5 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3473461#p3473461"]чевой-чевой?!

[/uquote]
Вот тут тоже кофе поперхнулся. 1887ВЕ7Т, 1887ВЕ8Т используете?
An-Su, может покажете нам - что вы там делаете?

Re: AVR studio в вопросах и ответах
Добавлено: Пт окт 05, 2018 12:15:06
An-SU
Не, просто в связи с более подробным описанием таймеров на русском читал методичку для 1887ВЕ7Т.
"Имя_регистра = имя_переменной" - так в моем коде оно так и объявлялось...
Re: AVR studio в вопросах и ответах
Добавлено: Сб окт 06, 2018 04:41:34
prinv
Да, просто вместо вызова функции присвойте значение регистру.
Добавлено after 8 hours 50 minutes 48 seconds:
Сделал на ATMega16A.
Не работало, пока я не сообразил, что в прерывании нужно обнулить счётчик.
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
uint16_t Sch = 10000;
ISR(TIMER1_COMPA_vect) /* Timer/Counter1 Compare Match A */
{
PORTB ^= _BV(PB3);
/* Не забываем обнулить счётчик!!! */
TCNT1 = 0;
};
void ti_ini(uint16_t temp)
{
// Инициализация Timer1 16bit
TCCR1B = 0; // Остановили таймер
TCCR1A = 0; // Обычный режим
TCNT1 = 0; // Начальное значение счётчика таймера
OCR1A = temp; // Значение сравнения
TIMSK = _BV(OCIE1A);// Разрешаем прерывание при совпадении с А
TCCR1B = _BV(CS11) | _BV(CS10); // Запуск таймера, предделитель CLK/64
}
int main(void)
{
/* Светодиоды */
DDRB = _BV(PB3);
DDRD = _BV(PD7);
/* Подтяжка вверх для кнопок */
PORTC = _BV(PC1) | _BV(PC0);
ti_ini(Sch);
sei();
while (1)
{
if (!(PINC & _BV(PC0))) // нажата кнопка PC0
{
PORTD ^= _BV(PD7);
Sch /= 2;
ti_ini(Sch);
_delay_ms(100);
}
if (!(PINC & _BV(PC1))) // нажата кнопка PC1
{
PORTD ^= _BV(PD7);
Sch *= 2;
ti_ini(Sch);
_delay_ms(100);
}
}
}
Re: AVR studio в вопросах и ответах
Добавлено: Сб окт 06, 2018 07:08:52
ARV
prinv писал(а):Не работало, пока я не сообразил, что в прерывании нужно обнулить счётчик
так вроде ж шла речь про режим СТС, или я опять все перепутал?
Re: AVR studio в вопросах и ответах
Добавлено: Сб окт 06, 2018 07:49:56
prinv
И в режиме CTC тоже всё работает
Код: Выделить всё
ISR(TIMER1_COMPA_vect) /* Timer/Counter1 Compare Match A */
{
PORTB ^= _BV(PB3);
};
void ti_ini(uint16_t temp)
{
// Инициализация Timer1 16bit
TCCR1B = 0; // Остановили таймер
TCCR1A = 0;
TCNT1 = 0; // Начальное значение счётчика таймера
OCR1A = temp; // Значение сравнения
TIMSK = _BV(OCIE1A);// Разрешаем прерывание при совпадении с А
TCCR1B = _BV(WGM12) | _BV(CS11) | _BV(CS10); // Запуск таймера в режиме CTC, предделитель CLK/64
}
Добавлено after 11 minutes 32 seconds:
Работает и в случае простого присваивания OCR1A = Sch;
Код: Выделить всё
if (!(PINC & _BV(PC0))) // нажата кнопка PC0
{
PORTD ^= _BV(PD7);
Sch /= 2;
OCR1A = Sch;
// ti_ini(Sch);
_delay_ms(100);
}
if (!(PINC & _BV(PC1))) // нажата кнопка PC1
{
PORTD ^= _BV(PD7);
Sch *= 2;
OCR1A = Sch;
// ti_ini(Sch);
_delay_ms(100);
}
В общем, проблему так и не получилось повторить
Re: AVR studio в вопросах и ответах
Добавлено: Пн окт 08, 2018 09:07:29
An-SU
prinv, уважаемый, спасибо Вам огромное!
На самом деле код заработал у меня еще в пятницу, когда я поставил переназначение OCR сразу со входного параметра функции, а не путано, как у меня было (может, еще что изменил, но оно стало работать)
На данный момент имеется лишь проблема с тем, что изменение частоты при нажатии на кнопку происходит кратковременно, только во время нажатия, словно я использую while
Не подскажете..?
Re: AVR studio в вопросах и ответах
Добавлено: Пн окт 08, 2018 09:08:53
prinv
Покажите текущий код
Re: AVR studio в вопросах и ответах
Добавлено: Пн окт 08, 2018 09:23:46
An-SU
Код: Выделить всё
#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>
unsigned int Sch;
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;
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 09:26:28
ARV
An-SU писал(а):static void TI_Write(unsigned int Sch)
{
unsigned int sreg = SREG;
cli();
OCR1A=Sch;
SREG=sreg;
}
Re: AVR studio в вопросах и ответах
Добавлено: Пн окт 08, 2018 09:33:44
An-SU
ARV, ну удаление особой роли в данном случае не сыграет, повторюсь, я просто ориентировался на:
https://docplayer.ru/59393693-Mikroshem ... dl-to.html 124 страница сверху
Re: AVR studio в вопросах и ответах
Добавлено: Пн окт 08, 2018 10:01:53
ARV
у вас творятся чудеса, поэтому все лишнее - безжалостно отсекаем.
у вас кнопки на порту Е - я так понимаю, на общий? где настройка порта Е?