Друзья!
Я написал коротенькую программку (ее код ниже), но компилятор (avr gcc) налабал больше 2K кода (у меня процессор ATTiny26, соответственно, программа уже не влезает. И это при том, что я еще не дошел до вычислений, которые там будут, и возможно, с плавающей точкой...
Посмотрел дизассемблер - что-то там и правда много всего лишнего на мой взгляд. Мой код компилируется нормально, беда в том, что компилятор добавляет еще кучу каких-то кусков назначение которых мне вовсе не понятно. Вот названия непонятных кусков: __gtsf2, __ltsf2, __floatunsisf, __clzsi2, __pack_f, __unpack_f, __fpcmp_parts_f, __prologue_saves__, __epilogue_restores__
Компилятор в режиме Os (это вроде как скорость, но в этом режиме получается самый компактный код, в других режимах код еще больше).
Что можно сделать?
1) Сменить компилятор? Мне вообще-то avr gcc что-то не очень нравится и по другим причинам. Если IAR поможет решить эти проблемы, то наверно я пересяду.
2) Что-то выкинуть из программы? Может я что-то не заметил и какие-то действия вызывают сложные мат.функции?
3) Что-то подкрутить в настройках компилятора?
4) Моя ставка на младший контроллер изначально была не правильной?
5) Еще что-нибудь?
Спасибо!
Ну и код, собственно:
Раздел: AVR
Я написал коротенькую программку (ее код ниже), но компилятор (avr gcc) налабал больше 2K кода (у меня процессор ATTiny26, соответственно, программа уже не влезает. И это при том, что я еще не дошел до вычислений, которые там будут, и возможно, с плавающей точкой...
Посмотрел дизассемблер - что-то там и правда много всего лишнего на мой взгляд. Мой код компилируется нормально, беда в том, что компилятор добавляет еще кучу каких-то кусков назначение которых мне вовсе не понятно. Вот названия непонятных кусков: __gtsf2, __ltsf2, __floatunsisf, __clzsi2, __pack_f, __unpack_f, __fpcmp_parts_f, __prologue_saves__, __epilogue_restores__
Компилятор в режиме Os (это вроде как скорость, но в этом режиме получается самый компактный код, в других режимах код еще больше).
Что можно сделать?
1) Сменить компилятор? Мне вообще-то avr gcc что-то не очень нравится и по другим причинам. Если IAR поможет решить эти проблемы, то наверно я пересяду.
2) Что-то выкинуть из программы? Может я что-то не заметил и какие-то действия вызывают сложные мат.функции?
3) Что-то подкрутить в настройках компилятора?
4) Моя ставка на младший контроллер изначально была не правильной?
5) Еще что-нибудь?
Спасибо!
Ну и код, собственно:
#include "avr/io.h"
#include "avr/interrupt.h"
#define fVCS(v) (255*v/5) // VP (0...300) (0...255)
#define VCSMAX fVCS(0.55) // VCS
#define VCSNORM fVCS(0.48) // VCS
#define fVP(v) ((unsigned)255*v/200/2.56)
// VCS (0...5) (0...255)
#define VPSTART fVP(175) // (175)
#define VPSAVE fVP(170) // SAVE (170)
#define VPSTOP fVP(60) // STOP(60)
#define NS 8 // START
volatile unsigned char ADC_data=0;// (0...255)
volatile unsigned char DAC_data=0;// , (0...255 = 0...5)
volatile unsigned int VP; // ?????
volatile unsigned int msec; // : 1
typedef struct
{
unsigned bit0:1;
unsigned bit1:1;
unsigned bit2:1;
unsigned bit3:1;
unsigned bit4:1;
unsigned bit5:1;
unsigned bit6:1;
unsigned bit7:1;
} BYTE_BITFIELD;
#define ddra (*((volatile BYTE_BITFIELD*)(&DDRA )))
#define ddrb (*((volatile BYTE_BITFIELD*)(&DDRB )))
#define porta (*((volatile BYTE_BITFIELD*)(&PORTA)))
#define portb (*((volatile BYTE_BITFIELD*)(&PORTB)))
#define pina (*((volatile BYTE_BITFIELD*)(&PINA )))
#define pinb (*((volatile BYTE_BITFIELD*)(&PINB )))
#define SAVE porta.bit5 //
#define LED_VPN porta.bit4 //
#define STOP porta.bit3 //
#define START porta.bit2 //
#define DAC_SYNC portb.bit3 // ()
#define DAC_SCLK portb.bit2 // ()
#define DAC_DIN portb.bit0 // ()
#define clrb_STOP STOP = 0
#define setb_STOP STOP = 1
#define clrb_START START = 0
#define setb_START START = 1
#define clrb_SAVE SAVE = 1
#define setb_SAVE SAVE = 0
#define clrb_EORLOCK ddrb.bit6=0// EORLOCK ( )
#define setb_EORLOCK portb.bit6=0; ddrb.bit6=0
// EORLOCK ( )
#define setb_ADSC ADCSR |= ( 1<<6 )
#define setb_I SREG != ( 1<<7 )
#define clrb_I SREG &= ~( 1<<7 )
void delay_us( volatile signed int usec )
{
usec -= 5; // 38 "" , @8 5 .
if( usec < 0 ) usec = 0;
usec = usec >> 1; // 1 = 16 , @8 = 2 .
for( ; usec>0; usec-- )
{
asm( "nop" );
asm( "nop" );
asm( "nop" );
asm( "nop" );
asm( "nop" );
}
}
void WriteDAC( unsigned char data )
{
unsigned int data1 = data;
data1 = data1 << 4;
DAC_SYNC = 1;
DAC_SCLK = 1;
DAC_SYNC = 0;
for( int i=0; i<16; i++ )
{
(data1&0x8000) ? (DAC_DIN=1) : (DAC_DIN=0);
data1 = data1<<1;
DAC_SCLK = 0;
DAC_SCLK = 1;
}
}
int main( void )
{
unsigned int i;
DDRA = 0b01111100;
DDRB = 0b00111101;
WDTCR = 0b00001000; // 000=(reserved)
// 0=Watchdog change disabled
// 1=Watchdog enabled
// 000=prescaler 1/16384
TCCR1A = 0b00000000; // 00=Comparator A disconected,
// 00=Comparator B disconected,
// 0=No Force Output Compare Match 1A
// 0=No Force Output Compare Match 1B
// 0=No PWM A
// 0=No PWM B
TCCR1B = 0b00000110; // 0=No Timer/Counter clear
// 0=No prescaler reset
// 00=(reserved)
// 0110=PCS/32
TIMSK = 0b00000100; // 0=(reserved)
// 0=TC1 A output compare int. disabled
// 0=TC1 B output compare int. disabled
// 00=(reserved)
// 1=TC1 overflow interupt enabled
// 0=TC0 overflow interupt disabled
// 0=(reserved)
ADMUX = 0b10100110; // 10=Internal Voltage Reference (2.56 V), AREF pin (PA3) not connected
// 1=ADC Left Adjust Result
// 00110=Input: ADC6 single ended
ADCSR = 0b11000111; // 1=ADC Enabled
// 1=Start conversion
// 0=No free-running mode (single conversion)
// 00=Clear interrupt flag,ADC interrupt disabled
// 111=Confersion time CK/128
msec = 0;
DAC_data = VCSMAX;
setb_STOP;
while( VP < VPSTART ) {}
clrb_STOP;
setb_EORLOCK;
for( i=0; i<NS; i++ ) {
delay_us( 300 );
setb_START;
asm( "nop" );
asm( "nop" );
asm( "nop" );
asm( "nop" );
asm( "nop" );
asm( "nop" );
asm( "nop" );
clrb_START; }
clrb_EORLOCK;
while( msec < 300 ) {}
DAC_data = VCSNORM;
while(1)
{
VP = ADC_data;
if( VP < VPSAVE ) setb_SAVE; // VP - SAVE
if( VP > VPSTART ) clrb_SAVE; // VP - SAVE
if( VP < VPSTOP) // VP ,
{
clrb_I; //
while(1) {} // ( WDT )
}
}
return 0;
}
ISR( TIMER1_OVF1_vect )
{
asm( "wdr" );
TCNT1 = 0xFF - 250;
msec++;
WriteDAC( DAC_data );
if( ( ADCSR&(1<<6) ) == 0 ) ADC_data = ADCH;
setb_ADSC;
}
Раздел: AVR