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

Обсуждаем контроллеры компании Atmel.
SV12
Нашел транзистор. Понюхал.
Сообщения: 187
Зарегистрирован: Пт апр 01, 2011 21:53:28

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

Сообщение SV12 »

Доброго всем времени суток.
Осваиваю С. AtmelStudio 7 . Пишу тестовую программу для I2C Slave.

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


Файл  Main.c 
------------------------------------------------------------------------
int main(void)
{
    Sb_Start() ;                        // Инициализация. Там же запускается Sb_I2c_Init()		
    while (1) 
    {		
        // Пустой цикл		
    }
}
------------------------------------------------------------------------

Файл  I2Cs.c 
------------------------------------------------------------------------
void Sb_I2c_Init(void){
 ... Тут инициализация TWI в режиме SLAVE
}

ISR(TWI_vect){	   // Прерывание  модуля  TWI 
    unsigned char I2c_uC_status   = 0    ;    // статус регистра TWSR

    I2c_uC_status = TWSR & 0xF8 ;         //  отбрасываем 3 лишних байта [ -, TWSP1,TWSP2 ]  

    switch (I2c_uC_status){  
        // .... код
        case 0x80: //** адресованы, был принят байт данных и послан ACK  ------
            Mr_I2C_SL_On_A ;                 // Макрос. Настраивает TWCR : Будет принят байт + ACK 	
            Mr_SetBit_0(PORTC, Led2) ;	 // Макрос. Записывает 0 в бит "Led2"  в регистре "PORTC" = Зажигает светодиод														
        break;
        //...... код
       }
       Mr_SetBit_1(TWCR, TWINT) ;  // <- 1 : Сброс флага прерывания (записать 1)	
}
------------------------------------------------------------------------



Испытываю в железе. Отправляю посылку по I2C. МК принимает. Светодиод зажигается. Всё ОК.
Обрабатывать принятый байт буду в MAIN. Поэтому вместо включения светодиода в прерывании ставлю флаг, который проверяется в главном цикле и при выставленном флаге включается светодиод.

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


Файл  Main.c 
------------------------------------------------------------------------
int main(void)
{
    Sb_Start() ;                        // Инициализация. Там же запускается Sb_I2c_Init()		
    while (1) 
    {		
        if (0 != (I2c_uC_Flags1 & (1<<I2c_Fe_Mess_Byte_New))) {   // ФЛАГ = принят байт ?	
            Mr_SetBit_0(I2c_uC_Flags1, I2c_Fe_Mess_Byte_New)    ;    // Макрос. Сброс флага
            Mr_SetBit_0(PORTC, Led2) ;	 // Макрос. Записывает 0 в бит "Led2"  в регистре "PORTC" = Зажигает светодиод
        }
    }
}
------------------------------------------------------------------------

Файл  I2Cs.c 
------------------------------------------------------------------------
void Sb_I2c_Init(void){
 ... Тут инициализация TWI в режиме SLAVE
}

ISR(TWI_vect){	   // Прерывание  модуля  TWI 
    unsigned char I2c_uC_status   = 0    ;    // статус регистра TWSR

    I2c_uC_status = TWSR & 0xF8 ;         //  отбрасываем 3 лишних байта [ -, TWSP1,TWSP2 ] 

    switch (I2c_uC_status){  
        // .... код
        case 0x80: //** адресованы, был принят байт данных и послан ACK  ------
            Mr_I2C_SL_On_A ;                 // Макрос. Настраивает TWCR : Будет принят байт + ACK 	
            Mr_SetBit_1(I2c_uC_Flags1, I2c_Fe_Mess_Byte_New)    ;  Макрос. УСТАНОВКА ФЛАГА.  Записывает 1 в бит "I2c_Fe_Mess_Byte_New"  в регистре "I2c_uC_Flags1"														
        break;
        //...... код
       }
       Mr_SetBit_1(TWCR, TWINT) ;  // <- 1 : Сброс флага прерывания (записать 1)	
}
------------------------------------------------------------------------

Компилируется без ошибок и предупреждений.
Собственно проблема в том, что так НЕ работает, светодиод не включается. Почему !?
Простейшая задача Поставить флаг в прерывании. А в главном цикле зажечь светодиод, если флаг установлен.
Одни хотели бы понимать то, во что верят, другие - поверить в то, что пнимают.
codenamehawk
Вымогатель припоя
Сообщения: 528
Зарегистрирован: Вт фев 09, 2010 17:52:26

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

Сообщение codenamehawk »

SV12 писал(а):Простейшая задача Поставить флаг в прерывании.
Странно выкладывать только часть программы, где не видно установки флага.
Есть волшебное слово volatile...
SV12
Нашел транзистор. Понюхал.
Сообщения: 187
Зарегистрирован: Пт апр 01, 2011 21:53:28

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

Сообщение SV12 »

[uquote="codenamehawk",url="/forum/viewtopic.php?p=4658541#p4658541"]Странно выкладывать только часть программы, где не видно установки флага.[/uquote]
Второй блок кода. (Вариант 2, в котором проблема)
Строка

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

Mr_SetBit_1(I2c_uC_Flags1, I2c_Fe_Mess_Byte_New)    ;  Макрос. УСТАНОВКА ФЛАГА. Записывает 1 в бит "I2c_Fe_Mess_Byte_New"  в регистре "I2c_uC_Flags1" 
Переписал код на BascomAVR - так же отдельными файлами. Заработало сразу.

[uquote="codenamehawk",url="/forum/viewtopic.php?p=4658541#p4658541"]Есть волшебное слово volatile...[/uquote]
Спасибо. volatile помог.

Ещё заметил, что удивило в варианте 2: Отлаживаю по шагам. Доходит до строки в MAIN, где макрос сброса бита в регистре I2c_uC_Flags1. Отладчик просто перепрыгивает её - игнорирует. Как будто там ничего нет !! Я там для чего это этот код писал ? Сволочь такая, хоть бы предупреждение какое-нибудь выдал! Это нормально ?

P.S.
Почитал про volatile
Переменная должна быть декларирована как volatile всякий раз, когда возможно её неожиданное изменение.

Как так "неожиданно" !?!? :shock:
Одни хотели бы понимать то, во что верят, другие - поверить в то, что пнимают.
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

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

Сообщение Just_Fluffy »

Неожиданно - это когда переменная может поменяться извне, а не только в линейном коде программы.
Компилятор в общем случае смотрит, где может меняться переменная. И если видит, что изменений нет в линейном коде, то он вправе вообще эту переменную выбросить. Что в вашем случае и произошло.
А когда вы ему сказали, что это волатильная переменная, тогда компилятор отбросил в сторону свои влажные мечты про оптимизацию и сделал как хотели вы.

А баском - ну сложно про него что либо сказать. Возможно, там или нет оптимизации такого уровня, как в си, или оптимизации вообще нет.
ИМХО - это вообще тупиковая ветвь в эмбедде.
Белая и Пушистая
codenamehawk
Вымогатель припоя
Сообщения: 528
Зарегистрирован: Вт фев 09, 2010 17:52:26

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

Сообщение codenamehawk »

SV12 писал(а):Второй блок кода. (Вариант 2, в котором проблема)
Строка
Код:
Mr_SetBit_1(I2c_uC_Flags1, I2c_Fe_Mess_Byte_New) ; Макрос. УСТАНОВКА ФЛАГА. Записывает 1 в бит "I2c_Fe_Mess_Byte_New" в регистре "I2c_uC_Flags1"
Так и я об этом, Mr_SetBit_1 кода нет.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

Есть код или нет, надо смотреть в дизассемблере, как там прыгает высокоуровневый отладчик, еще ни о чём не говорит.
При включенной оптимизации отладчик может показывать удивительные вещи, поскольку теряется прямое соответствие между строкой Си и машинными командами. Хотите гулять строго по строкам Си - отключайте оптимизацию.

Добавлено after 2 minutes 41 second:
Особенно весело это выглядит при отладке в Протеусе, который помечает точечкой строки исходника, для которых есть отладочная информация: смотришь, и волосы дыбом! На фигурной скобке точка есть, а в теле цикла, которое эта скобка ограничивает, ни одной точки нет!!! :)))

Добавлено after 1 minute 26 seconds:
Пардон, на счет точек это я с прямым углом перепутал... Протеус адреса вместо точек показывает, точки это из другого...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
SV12
Нашел транзистор. Понюхал.
Сообщения: 187
Зарегистрирован: Пт апр 01, 2011 21:53:28

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

Сообщение SV12 »

[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4658733#p4658733"]И если видит, что изменений нет в линейном коде, то он вправе вообще эту переменную выбросить.[/uquote]
Вообщето я считаю, это не уровнем ответственности компилятора. Раз написал, значит так нужно! И компилятор не вправе изменять мой код ! Ну или предупреждать, что переменная НЕ используется\меняется.
[uquote="Just_Fluffy",url="/forum/viewtopic.php?p=4658733#p4658733"]А баском - ну сложно про него что либо сказать. Возможно, там или нет оптимизации такого уровня, как в си, или оптимизации вообще нет.[/uquote]
Кстати, в Баскоме НЕиспользуемые переменные в месте их объявления окрашены в серый цвет. Видно, что они не попадут в готовую программу.

[uquote="ARV",url="/forum/viewtopic.php?p=4658781#p4658781"]Хотите гулять строго по строкам Си - отключайте оптимизацию.[/uquote]
Не подскажите, где отключить ?
Одни хотели бы понимать то, во что верят, другие - поверить в то, что пнимают.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

В свойствах проекта настройки компиляции. Находите, где там написана опция -Os и заменяете её на -O0
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Just_Fluffy
Вымогатель припоя
Сообщения: 532
Зарегистрирован: Ср июн 29, 2022 16:25:45

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

Сообщение Just_Fluffy »

SV12 писал(а):Вообщето я считаю, это не уровнем ответственности компилятора. Раз написал, значит так нужно! И компилятор не вправе изменять мой код ! Ну или предупреждать, что переменная НЕ используется\меняется.
Это ваше право. Включите в настройках компилятора соответствующие ворнинги. И почитайте про уровни оптимизации, что и до какого уровня может делать компилятор с вашим кодом.
Белая и Пушистая
codenamehawk
Вымогатель припоя
Сообщения: 528
Зарегистрирован: Вт фев 09, 2010 17:52:26

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

Сообщение codenamehawk »

SV12 писал(а):Вообщето я считаю, это не уровнем ответственности компилятора. Раз написал, значит так нужно! И компилятор не вправе изменять мой код ! Ну или предупреждать, что переменная НЕ используется\меняется.
Это последствия оптимизации кода, можете выключить, но код займет больше места(может даже не поместится в проц.) или будет медленнее исполнятся(иногда не будет успевать делать то, что вы задумали).

https://microsin.net/programming/avr/av ... ation.html
Батон Изюмыч
Родился
Сообщения: 17
Зарегистрирован: Пт янв 17, 2025 21:34:16

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

Сообщение Батон Изюмыч »

Приветствую всех. Лет 12 к электронике не прикасался. Но вот пришлось снова заняться ATMega8. БОльшую часть вопросов решил выкуриванием тем здесь на форуме и в Яндексе, но возникла одна проблема, которую я сам побороть не могу. Чтение Евстифеева пока тоже завесу не приоткрыло.

Собственно есть простой код с инициализацией таймера и потом вызов прерывания по совпадению. В прерывании переключение одного бита в регистре TCCR1B. Но переключения почему-то не происходит. Ни при отладке в ATMELStudio(в разных версиях эффект одинаковый) ни в Proteus.
Думал, что забыл какой-то бит настроить и прерывания просто не работают, но поставил обнуление маркерной переменной "i" в прерывании, и при совпадении TCNT1 и OSR1A она благополучно обнуляется, т.е. прерывания исполняются. Но команда записи в регистр нужный бит в регистре не меняет.
Но точно такая же команда в основном теле кода отлично нужный бит переключает. Может я упустил, и есть какой запрет на запись в этот регистр в прерывании? В литературе ничего такого не нашёл.
Как думаете, в чем может быть загвоздка?

Код, который вызывает вопрос:
#include <avr/io.h>
volatile unsigned int i;

//-- Инициализация таймера №1 --
void timer1_ini(void)
{
DDRB = 0b00000010; // -- PB1 настроен на выход
TIMSK = (1<<OCIE1A);
TCCR1A=(0<<COM1A1)|(1<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)|(0<<FOC1A)|(0<<FOC1B)|(0<<WGM11)|(0<<WGM10);
TCCR1B=(0<<ICNC1)|(1<<ICES1)|(0<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10);
TCNT1 = 0;
}
//------------------------------

ISR (TIMER1_COMPA_vect)
{ // Обработчик прерывания по совпадению TCNT1 и одного из регистров сравнения
TCCR1B^=0b00010000; // переключаем бит в регистре в противоположное состояние при каждом прерывании (и тут оно не работает сумуляции
i ^= 0; //--- А это отлично исполняется, видно через AddWatch
}

int main(void)
{
ICR1 = 100;
OCR1A = 200;
asm("sei");
timer1_ini(); // Вызов функции инициализации таймера

while(1) {

i++;
// TCCR1B^=0b00010000; // А здесь абсолютно тот же код исполняется отлично.
}
}
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

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

Сообщение shonty »

У вас тактирование таймера не внешнее?
(1<<ICES1) - вроде не нужен.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Батон Изюмыч писал(а): Но команда записи в регистр нужный бит в регистре не меняет.
Но точно такая же команда в основном теле кода отлично нужный бит переключает. Может я упустил, и есть какой запрет на запись в этот регистр в прерывании? В литературе ничего такого не нашёл.
Как думаете, в чем может быть загвоздка?
Нет никакого запрета. Конструкция типа как ниже работает

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

.org 6
T1_COMPA:
	LDI	R17,1<<WGM13
	IN	R0,TCCR1B
	EOR	R0,R17
	OUT	TCCR1B,R0
	RETI
Нужно поменять значения в ICR1 и OCR1A местами, тогда заработает.
OKF
Это не хвост, это антенна
Сообщения: 1387
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

Батон Изюмыч, код вставляй через тег Code, как люди.
И почему бы не писать:

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

TCCR1B ^= 1<<WGM13; //вместо TCCR1B^=0b00010000;
Зачем мне лезть в ДШ!
И, если хочешь показать все биты, так все и показывай, даже которых нет:

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

TCCR1B = 0<<ICNC1 | 1<<ICES1 | 0<<5 | 0<<WGM13 | 1<<WGM12 | 0<<CS12 | 0<<CS11 | 1<<CS10;
Это просто совет. Что бы люди не плевались.)
Батон Изюмыч
Родился
Сообщения: 17
Зарегистрирован: Пт янв 17, 2025 21:34:16

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

Сообщение Батон Изюмыч »

[uquote="shonty",url="/forum/viewtopic.php?p=4672687#p4672687"]У вас тактирование таймера не внешнее?
(1<<ICES1) - вроде не нужен.[/uquote]
Нет, тактирование от внутреннего генератора, без прескалера.
Да, действительно бит не имеет смысла, видимо ошибся.
akl писал(а):Нужно поменять значения в ICR1 и OCR1A местами, тогда заработает.
Не помогло. ( Бит в регистре как стоял в нуле, так и стоит.
Асмовский кусочек понял как работает, но может я не правильно его в код применил, т.к. эффекта тоже нет.

Выглядит так, как будто происходит оптимизация при компиляции. Но в настройках стоит -O0 (ATMELStudio 7.0.1931, если что. Более менее безглючное из того, что по нынешним временам удалось скачать).
Открыл дизассемблер, по идее, после обработки прерывания должна идти команда "reti" и по ней можно найти этот кусочек кода. Но в дизассемблере ни одной такой команды не встречается.
При этом эта чёртова i вполне себе сбрасывается при совпадении. И я пока не могу понять где (не силен в ассемблере).

Инициализировал еще один порт и добавил в обработчик прерываний еще одну команду, чтобы писать TCCR1B в порт D.
Хрена лысого, не пишет. Порт так и остаётся в нулях. И в Proteus и в ATMELStudio. Но эта чёртова i продолжает сбрасываться как положено.
Спойлер
OKF писал(а):код вставляй через тег Code, как люди.
1. Если вы обратили внимание, то это мой первый пост на форуме за последние минимум 12 лет. Если бы я на момент публикации сообщения знал как это работает, я бы именно так и сделал.
OKF писал(а): Зачем мне лезть в ДШ!
2. Вам незачем. Зачем Вам вообще кому-то помогать?! Это же требует столько усилий!
OKF писал(а): И, если хочешь показать все биты, так все и показывай, даже которых нет:
3. Я так делаю, чтобы быть уверенным, что всё, что можно изменить находится под контролем. Вам не стоит быть таким самоуверенным.
OKF писал(а): Это просто совет. Что бы люди не плевались.)
Можно было бы принять Ваши претензии, но Вы написали много, и ничего по теме вопроса.
OKF
Это не хвост, это антенна
Сообщения: 1387
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

Да что ж ты такой обидчивый то!
ПУсть даже 100 лет ты не посещал форум, но ты же прежде чем постить, посмотри как делают люди, уж соверши пару телодвижений.
А вот когда делается тяп-ляп, и так сойдёт, а вы там разбирайтесь, тогда и нет никакого желания помогать.
Именно это я и хотел донести. Жаль что не доходит с первого раза.(
Удачи!
Батон Изюмыч
Родился
Сообщения: 17
Зарегистрирован: Пт янв 17, 2025 21:34:16

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

Сообщение Батон Изюмыч »

СпойлерВопрос не обиды, а простого уважения к собеседнику.
Вы мне отвечаете не на тот вопрос, который я задаю. Это не мало мешает сосредоточиться на решении проблемы.
Ваши пожелания не имеют никакой ценности в этой ветке, и могли быть вполне озвучены в личных сообщениях. И поверьте мне, я на Вас сейчас не наезжаю. Просто присмотритесь к себе. Представьте, что мы поменялись местами.
Такие сообщения очень утомляют при поисках полезной информации на форуме. Я Вам говорю как человек, который уже неделю "курит" этот форум сообщение за сообщением.
В общем полез я в настройки ATMELStudio и начал отключать всё подряд, что касается оптимизации. В дизассемблере появился кусок кода обработчика прерывания.
Но при отладке по наступлении совпадения регистров, отладчик почему-то не делает переход на обработчик прерывания. Причём интересно, появилась возможность поставить в это место breakpoint. Но при запуске симуляции программа в это место так и не попадает.
И еще прикол. Если я делаю пошаговую симуляцию по коду СИ, то при совпадении переменная "i" сбрасывается на ноль как задумано в коде обработчика прерывания, а если я веду симуляцию в окне дизассемблера, то при достижении совпадения переменная "i" не сбрасывается и продолжает расти.

По сему делаю вывод, что глючит отладка в режиме симуляции.

Прошу подсказать какая версия ATMELStudio более менее стабильная? И если возможно, то где скачать. Нынче санкции, фирменный сайт просто не открывается. Пишет доступ запрещен. ((

Я где-то в сети видел, что у ATMELStudio есть проблемы с симуляцией прерываний, но там была пометка, что это только для прерываний поступающих извне. Как-то для меня все не понятно. Прошло больше 12 лет, а ПО стало только корявее. А старое ПО или не найти, или оно не ставится на современный Windows. ( Видимо Микрочип потихоньку сливает AVR серию в утиль.
Аватара пользователя
shonty
Мучитель микросхем
Сообщения: 473
Зарегистрирован: Ср янв 11, 2012 18:20:26

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

Сообщение shonty »

Батон Изюмыч писал(а):Но при отладке по наступлении совпадения регистров, отладчик почему-то не делает переход на обработчик прерывания.
Вы вектора прерывания настраивали?
Батон Изюмыч писал(а):А старое ПО или не найти, или оно не ставится на современный Windows.
На Win11 стоит студия 4.19 (2011 года) вроде свободно находится она.

Добавлено after 5 minutes 41 second:
https://www.mcu4you.ru/avr-studio-4-19/

сразу нашлось
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Замечу, студия не полностью адекватно справляется с режимами работы таймера. Например, игнорирует режим 12 CTC ICR1.Так что только проверка в железе.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19046
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

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

Сообщение Starichok51 »

причем, не только режим 12, и несколько других. зато Протеус правильно симулирует все режимы.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Ответить

Вернуться в «AVR»