Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.58/12: Рейтинг темы: голосов - 12, средняя оценка - 4.58
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 309
1

CAVR против AVR Studio, что не так в программе под AVR Studio

06.12.2014, 22:10. Просмотров 2110. Ответов 13
Метки нет (Все метки)

Проблема такая, есть исходник, если его компилировать в CAVR заливаю в МК все работает, если этот же код (ПОДМОРОФЕЧЕННЫЙ) я компилирую в AVR Studio, заливаю в МК не работает, так же как и в Proteus.

При получении посылки - происходит индикация при помощи светодиода подключенный к выводу PD5. Прием сигнал на входе PB0. Длительность детектируемого сигнала 4000мкс. Откомпилированный проект в CAVR - работает без проблем, а вот откомпилированный в AVR Studio - не работает!

Под CAVR

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
Chip type               : ATmega16
Program type            : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*******************************************************/
 
#include <mega16.h>
#include <delay.h>
 
#define packet_MIN 7000
#define packet_MAX 9000
unsigned long p0_len,p0_prev_len;
int prev_state;
 
 
void PR_KEELOQ(void)
{
   
    if(PINB.0==1) return;
    //Приходим после приема всего бита, когда на PINB.0 ноль
 
    if(((p0_prev_len+p0_len)>packet_MIN) && ((p0_prev_len+p0_len)<packet_MAX))
    {
        //Если импульс пожходит по длительности
        PORTD.5=1;
        delay_ms(100);
        PORTD.5=0;
         delay_ms(100);
                
        return;
        //Выходим из функции 
    }
 
}
 
 
void main(void)
{
TCNT1=0;//обнуляем регистр TCNT1
 
 
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
 
 
// Input/Output Ports initialization
// Port A initialization
// Function: Bit2=In Bit1=In Bit0=In 
DDRA=(0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit2=T Bit1=T Bit0=T 
PORTA=(0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);
 
// Port B initialization
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=In 
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (1<<DDB1) | (0<<DDB0);
 
 
// Port D initialization
// Function: Bit6=In Bit5=Out Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRD=(0<<DDD6) | (1<<DDD5) | (0<<DDD4) | (0<<DDD3) | (1<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTD=(0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
 
 
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1B = (0<<CS12)|(1<<CS11)|(0<<CS10); //xtall/8
 
 
 
prev_state = PINB.0;
 
while (1)
{
 
  
  if(PINB.0 != prev_state)
  {
    p0_len = TCNT1/2;
    TCNT1 = 0;
    prev_state = PINB.0;
 
    PR_packet();
 
    p0_prev_len = p0_len;
    
  }
}
}


А вот он же, но под AVR Studio уже не фурычит!


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#define   F_CPU 16000000UL //16MHz
#include <avr/io.h>
#include <util/delay.h>
#define   LED_H PORTD|=(1<<5)
#define   LED_L PORTD&=(~(1<<5))
#define packet_MIN 7000
#define packet_MAX 9000
unsigned long p0_len,p0_prev_len;
int prev_state;
 
 
void PR_packet(void)
{
    if((PINB&(1<<0))==1) return;
    //Приходим после приема всего бита, когда на RX единица
 
    if(((p0_prev_len+p0_len)>packet_MIN) && ((p0_prev_len+p0_len)<packet_MAX))
    {
        //Если импульс подходит по длительности
 
 
                
        LED_H;
        _delay_ms(100);
        LED_L;
        _delay_ms(100);
                
        return;
        //Выход
    }
 
}
 
int main(void)
{
TCCR1B = (0<<CS12)|(1<<CS11)|(0<<CS10); //xtall/8
 
    // Port B initialization
    // State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
    PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
    // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=In
    DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (1<<DDB1) | (0<<DDB0);
 
 
    // Port D initialization
    // Function: Bit6=In Bit5=Out Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
    DDRD=(0<<DDD6) | (1<<DDD5) | (0<<DDD4) | (0<<DDD3) | (1<<DDD2) | (0<<DDD1) | (0<<DDD0);
    // State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
    PORTD=(0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
 
 
    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer1 Stopped
    // Mode: Normal top=0xFFFF
    // OC1A output: Disconnected
    // OC1B output: Disconnected
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
 
prev_state = PINB&(1<<0);
 
    while (1)
    {
        if((PINB&(1<<0)) != prev_state)
        {
            p0_len = TCNT1/2;
            TCNT1 = 0;
            prev_state = PINB&(1<<0);
 
            PR_packet();
 
            p0_prev_len = p0_len;
            
        }
    }
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2014, 22:10
Ответы с готовыми решениями:

AVR Studio 6 и AVR Toolchain вопросы!
Всем доброго времени суток. Решил я написать софтинку в новой студии от...

GCC и AVR Studio 5 и AVR Studio 4.18
Доброго дня Всем! Кто может подсказать следующее - у меня установлена AVR...

Аналог AVR studio под мобильные устройства
Здравствуйте, уважаемые форумчане. У меня вопрос такой: есть ли аналоги AVR...

AVR Studio 6 Avr simulator
Подскажите каким образом стартануть прогу в avr symulator с адреса boottooder...

Установить AVR Studio 6 после Visual Studio 10 SP1
При уже установленной Visual Studio 10 установщик AVR Studio 6 устанавливает...

13
raxp
10188 / 6571 / 492
Регистрация: 28.12.2010
Сообщений: 21,166
Записей в блоге: 1
06.12.2014, 22:27 2
Нескромный вопрос - нафига, из спортивного интересу? Работает в CAVR и аминь. Для того и указывается среда разработки. Всегда будут различия в разных средах, ибо пишутся они разными разрабами. Код не смотрел.
0
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 309
06.12.2014, 22:37  [ТС] 3
Отвечаю на нескромный вопрос, изначально проект был оформлен под ATTINY2313. В среде разработки CAVR код работал в принципе без нареканий, но объема 2кило не хватало, как стоило добавить просто одно условие! Под AVR Studio та же самая программа занимает намного меньше. Да и не для кого не секрет, что если дизасмить прошивку под CAVR так много мусора будет!
Да и дело не в спорте, а реально понять причину, может в AVR Studio вообще косячно работать с таймерами, хочется понять чтобы "зарубки" иметь на будущее.
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
07.12.2014, 00:11 4
int prev_state; зачем использовать тип int?
Цитата Сообщение от GaFBich Посмотреть сообщение
я компилирую в AVR Studio
В симуляторе студии побывали прогнать?
0
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 309
07.12.2014, 00:14  [ТС] 5
Честно нет, да и никогда внутренним симуляторм никогда не пользовался! почему int, исторически, в prev_state пишется предыдущий уровень на входе. Подскажите как прогнать
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
07.12.2014, 00:19 6
Цитата Сообщение от GaFBich Посмотреть сообщение
почему int, исторически
судя по коду достаточно "unsigned char" и заодно сократиться размер кода.
Цитата Сообщение от GaFBich Посмотреть сообщение
Подскажите как прогнать
Не подскажу, у меня он не стоит, а на память боюсь неправильно написать.
0
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 309
07.12.2014, 00:27  [ТС] 7
Ну в любом случае спасибо! Для оптимизации это конечно +
0
pyzhman
791 / 485 / 66
Регистрация: 15.05.2012
Сообщений: 2,749
07.12.2014, 08:08 8
Цитата Сообщение от GaFBich Посмотреть сообщение
не для кого не секрет
Для меня секрет. Расскажите, пожалуйста, поподробнее.

Добавлено через 1 минуту
Цитата Сообщение от Витальич Посмотреть сообщение
заодно сократиться
А еще используйте внешний StartUp файл (для CVavr. Поставьте галку в настройках проекта.).
0
ValeryS
Модератор
7448 / 5640 / 716
Регистрация: 14.02.2011
Сообщений: 19,211
Завершенные тесты: 1
07.12.2014, 08:32 9
Лучший ответ Сообщение было отмечено raxp как решение

Решение

Цитата Сообщение от GaFBich Посмотреть сообщение
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
интересно
что можно добиться таким выражением?
Цитата Сообщение от GaFBich Посмотреть сообщение
Да и не для кого не секрет, что если дизасмить прошивку под CAVR так много мусора будет!
CAVR , про AVR Studio не знаю, слишком ответственно относится к арифметике длинных чисел, int для него длинное, и там пошло, вызов функций, проверка
посему, везде где только можно менять int на char
Цитата Сообщение от GaFBich Посмотреть сообщение
int prev_state;
Цитата Сообщение от GaFBich Посмотреть сообщение
prev_state = PINB&(1<<0);
один разряд, достаточно типа bit
1
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 309
07.12.2014, 12:58  [ТС] 10
Вопрос в данном случае, почему в одном случае работает в другом нет,
Цитата Сообщение от ValeryS Посмотреть сообщение
Сообщение от GaFBich
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
интересно
что можно добиться таким выражением?
Это Wizard CAVR так сформировал.
0
ValeryS
Модератор
7448 / 5640 / 716
Регистрация: 14.02.2011
Сообщений: 19,211
Завершенные тесты: 1
07.12.2014, 13:01 11
Цитата Сообщение от GaFBich Посмотреть сообщение
CAVR
это CodeVisionAVR??? или нет??
0
GaFBich
22 / 22 / 5
Регистрация: 18.03.2010
Сообщений: 309
07.12.2014, 14:09  [ТС] 12
Да, именно он.
0
ValeryS
Модератор
7448 / 5640 / 716
Регистрация: 14.02.2011
Сообщений: 19,211
Завершенные тесты: 1
07.12.2014, 14:30 13
Цитата Сообщение от GaFBich Посмотреть сообщение
Да, именно он.
тогда я не знаю
Цитата Сообщение от GaFBich Посмотреть сообщение
Это Wizard CAVR так сформировал.
никогда за ним таких глупостев не замечал
обычно сразу константы подставляет
0
pyzhman
791 / 485 / 66
Регистрация: 15.05.2012
Сообщений: 2,749
07.12.2014, 15:55 14
Цитата Сообщение от ValeryS Посмотреть сообщение
менять int на char
Дык там в установках проекта есть что-то вроде "не ассоциировать int c char".
0
07.12.2014, 15:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2014, 15:55

Почему AVR Studio 4, а не Atmel Studio 6?
По какой причине большинство специалистов по AVR микроконтроллерам в основном...

AVR studio
Всем привет. Когда-то давно писал под AT90S2313 на ассемблере. Недавно скачал...

AVR Studio 5.1
Скачал AVR Studyo 5.1: и красивая, и удобная(почти) и сама за тебя дописывает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru