Проблема такая есть исходник, если его компилировать в CAVR заливаю в МК все работает, если этот же код (ПОДМОРОФЕЧЕННЫЙ) я компилирую в AVR Studio, заливаю в МК не работает, так же как и в Proteus.
Под CAVR
А вот он же, но под AVR Studio уже не фурычит!
Раздел: AVR
Под CAVR
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 уже не фурычит!
#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;
}
}
}
Раздел: AVR