При _delay_ms(10000); работает на первой частоте, не изменяясь
AVR studio в вопросах и ответах
- Сообщения: 72
- Зарегистрирован: Пн окт 01, 2018 11:33:59
При Вашем _delay_ms(1000) зависает словно нет прерываний
При _delay_ms(10000); работает на первой частоте, не изменяясь
При _delay_ms(10000); работает на первой частоте, не изменяясь
- Реклама
Покажите ещё раз текущий вариант кода.
Никакая контра не уйдёт от нас
- Сообщения: 72
- Зарегистрирован: Пн окт 01, 2018 11:33:59
Ну держите еще раз
Оставлю одну доп частоту тогда
Оставлю одну доп частоту тогда
Код: Выделить всё
#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
uint16_t Sch=100;
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);
Sch=100; //в реале период / 2
ti_in();
sei();
while (1)
{
if (!(PINE & (1<<PE1)))
{
TI_Write(300);
_delay_ms(100);
}
}
}
вот так сделайте - что будет?
Код: Выделить всё
int main(void)
{
DDRC=0xFF;
PORTE = (1<<PE0) | (1<<PE1);
ti_in();
sei();
while (1)
{
OCR1A = 300;
_delau_ms(1000);
OCR1A = 1000;
_delay_ms(1000);
}
}если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 72
- Зарегистрирован: Пн окт 01, 2018 11:33:59
- Реклама
я просто не могу себе представить, как такое может быть. готов уже подумать самое страшное.
[оффтоп]
был в моей практике случай, когда вот так же помогал одному товарищу отладить его код. что ни посоветую - у него все не получается. почти неделю по вечерам бились, уже и TeamViewer поставили, я сам у него в IDE код собирал - ноль эффекта! пока не выдержал и потребовал поставить Скайп с вебкой, чтобы полюбоваться на его макетную плату... оказалось, у него питание не было подано вообще... не в ту клемму проводок вставил. и работало через пень колоду за счет паразитной запитки через пины ISP-программатора...
[/оффтоп]
[оффтоп]
был в моей практике случай, когда вот так же помогал одному товарищу отладить его код. что ни посоветую - у него все не получается. почти неделю по вечерам бились, уже и TeamViewer поставили, я сам у него в IDE код собирал - ноль эффекта! пока не выдержал и потребовал поставить Скайп с вебкой, чтобы полюбоваться на его макетную плату... оказалось, у него питание не было подано вообще... не в ту клемму проводок вставил. и работало через пень колоду за счет паразитной запитки через пины ISP-программатора...
[/оффтоп]
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Вот тоже плюсану за то, что что-то где-то не подключено.
Ну нечему в этом коде не работать.
Прошивка-то вообще обновляется?
Ну нечему в этом коде не работать.
Прошивка-то вообще обновляется?
Последний раз редактировалось prinv Пн окт 08, 2018 12:52:23, всего редактировалось 1 раз.
Никакая контра не уйдёт от нас
- Сообщения: 72
- Зарегистрирован: Пн окт 01, 2018 11:33:59
Что же такое страшное?
Хм... Ну я могу прислать фотографию, если потребуется
А у вас всё работает при сборке моего кода?
Хм... Ну я могу прислать фотографию, если потребуется
А у вас всё работает при сборке моего кода?
[uquote="An-SU",url="/forum/viewtopic.php?p=3475973#p3475973"]А у вас всё работает при сборке моего кода?[/uquote]
Дома могу проверить на ATMega16A на Pinboard
Дома могу проверить на ATMega16A на Pinboard
Никакая контра не уйдёт от нас
- Сообщения: 72
- Зарегистрирован: Пн окт 01, 2018 11:33:59
[uquote="An-SU",url="/forum/viewtopic.php?p=3475966#p3475966"]У меня светодиоды постоянно мигают на частоте OCR1A = 1000[/uquote]объясняю, что меня удивляет.
вы пишите, мигает как при OCR1A=1000.
но, во-первых, если оно зависает до начала главного цикла, то OCR1A=100 согласно вашего кода инициализации таймера!
во-вторых, если оно зависает на задержке в главном цикле, то 1 секунду оно обязано было отработать с OCR1A=300 - согласно моему коду!
а вы говорите, что у вас каким-то чудом не 100, не 300, а сразу 1000 - и ничего не меняется! а ведь цикл бесконечный...
вы пишите, мигает как при OCR1A=1000.
но, во-первых, если оно зависает до начала главного цикла, то OCR1A=100 согласно вашего кода инициализации таймера!
во-вторых, если оно зависает на задержке в главном цикле, то 1 секунду оно обязано было отработать с OCR1A=300 - согласно моему коду!
а вы говорите, что у вас каким-то чудом не 100, не 300, а сразу 1000 - и ничего не меняется! а ведь цикл бесконечный...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 72
- Зарегистрирован: Пн окт 01, 2018 11:33:59
оптимизация у вас при компиляции включена или отключена?
если мигает на 300, значит, прерывания работают и обновление OCR1A как минимум однократно происходит.
значит, остается задержка, как узкое место.
если мигает на 300, значит, прерывания работают и обновление OCR1A как минимум однократно происходит.
значит, остается задержка, как узкое место.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 72
- Зарегистрирован: Пн окт 01, 2018 11:33:59
Стоит optimize for size
Ну так прерывания в любом случае происходят, ибо светодиоды мерцают, разве не так?
Ну так прерывания в любом случае происходят, ибо светодиоды мерцают, разве не так?
прерывания происходят, мне не понятно, как частота этих прерываний может не меняться каждую секунду?! я ведь написал в коде менять частоту каждую секунду!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 72
- Зарегистрирован: Пн окт 01, 2018 11:33:59
Вообще Вы правы, поставил себе в цикл просто мигания после 1 секунды как инвертирование порта делай мс, на практике инвертирует лишь через секунд 16...
разбирайтесь с тактированием - задержки должны отрабатывать весьма точно, если включена оптимизация и правильно задана частота.
возможно, у вас и ранее все работало правильно, но вы об этом не догадывались...
возможно, у вас и ранее все работало правильно, но вы об этом не догадывались...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Вот такой код работает вообще без вопросов
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
uint16_t Sch = 1000;
ISR(TIMER1_COMPA_vect) /* Timer/Counter1 Compare Match A */
{
PORTB = ~PORTB;
};
static void ti_ini(uint16_t Sch)
{
// Инициализация Timer1 16bit
TCCR1B = 0; // Остановили таймер
TCCR1A = 0;
TCNT1 = 0; // Начальное значение счётчика таймера
OCR1A = Sch; // Значение сравнения
TIMSK = _BV(OCIE1A);// Разрешаем прерывание при совпадении с А
TCCR1B = _BV(WGM12) | _BV(CS12);
}
static void TI_Write(uint16_t Sch)
{
OCR1A=Sch;
}
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 = 5000;
TI_Write(Sch);
_delay_ms(100);
}
if (!(PINC & _BV(PC1))) // нажата кнопка PC1
{
PORTD ^= _BV(PD7); // Подтверждение нажатия кнопки
Sch = 2000;
TI_Write(Sch);
_delay_ms(100);
}
}
}
- Вложения
-
- IMG_20181008_203145_1.png
- Pinboard II
- (190.85 КБ) 426 скачиваний
Никакая контра не уйдёт от нас
[uquote="An-SU",url="/forum/viewtopic.php?p=3476051#p3476051"]Вообще Вы правы, поставил себе в цикл просто мигания после 1 секунды как инвертирование порта делай мс, на практике инвертирует лишь через секунд 16...[/uquote]
А что у вас с фьюзом CLKDIV8?
16 сек это 2 сек * 8, а 2 секунды это 1 сек вкл + 1 сек выкл.
А что у вас с фьюзом CLKDIV8?
16 сек это 2 сек * 8, а 2 секунды это 1 сек вкл + 1 сек выкл.
Никакая контра не уйдёт от нас
- Сообщения: 72
- Зарегистрирован: Пн окт 01, 2018 11:33:59
Итак, последние сводки с фронта - у меня не был установлен фьюз на частоту 8 МГц, теперь задержки адекватны, но!
Всё остальное работает по-прежнему, не считая именно самой изменившейся частоты
prinv, почти такой же код у меня и сейчас. Но видимо, дело обстоит в изменении еще каких-либо настроек
А CLKDIV8 разве есть в Атмеге128?
Всё остальное работает по-прежнему, не считая именно самой изменившейся частоты
prinv, почти такой же код у меня и сейчас. Но видимо, дело обстоит в изменении еще каких-либо настроек
А CLKDIV8 разве есть в Атмеге128?


