Зачем, если очевидно, что виновато прерывание АЦП? Его и приведите.
#include <avr/io.h>
#include <avr/interrupt.h>
// Code compatibility to new AVR-libc
// outb(), inb(), inw(), outw(), BV(), sbi(), cbi(), sei(), cli()
#ifndef outb
#define outb(addr, data) addr = (data)
#endif
#ifndef inb
#define inb(addr) (addr)
#endif
#ifndef inw
#define inw(addr) (addr)
#endif
#ifndef BV
#define BV(bit) (1<<(bit))
#endif
#ifndef cbi
#define cbi(reg,bit) reg &= ~(BV(bit))
#endif
#ifndef sbi
#define sbi(reg,bit) reg |= (BV(bit))
#endif
#ifndef cli
#define cli() __asm__ __volatile__ ("cli" :

#endif
#ifndef sei
#define sei() __asm__ __volatile__ ("sei" :

#endif
//*****************************************************************************
//
// TIMERS
//
//*****************************************************************************
void initTimer()
{
outb(TCNT0, 0); // reset TCNT0
sbi(TIMSK, TOIE0); // enable TCNT0 overflow interrupt
outb(TCCR0, (inb(TCCR0) & ~0x07) | 0x02);
outb(TCNT1H, 0); // reset TCNT1
outb(TCNT1L, 0);
sbi(TIMSK, TOIE1); // enable TCNT1 overflow
outb(TCCR1B, (inb(TCCR1B) & ~0x07) | 0x02);
outb(TCNT2, 0); // reset TCNT2
sbi(TIMSK, TOIE2); // enable TCNT2 overflow
outb(TCCR2, (inb(TCCR2) & ~0x07) | 0x02);
}
//! Interrupt handler for tcnt0 overflow interrupt
ISR(TIMER0_OVF_vect)
{
PORTD=0xFF;
}
//! Interrupt handler for tcnt1 overflow interrupt
ISR(TIMER1_OVF_vect)
{
}
//! Interrupt handler for tcnt2 overflow interrupt
ISR(TIMER2_OVF_vect)
{
}
//*****************************************************************************
//
// UART
//
//*****************************************************************************
#define BAUD_RATE 9600ul
#define USART_UBBR_VALUE ((F_CPU/(BAUD_RATE<<4))-1)
void usrtInit( )
{
/* Set baud rate */
UBRRH = (unsigned char)(USART_UBBR_VALUE>>8);
UBRRL = (unsigned char)USART_UBBR_VALUE;
/* Enable Receiver and Transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}
void usrtSendByte( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = data;
}
unsigned char usrtReadByte( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
;
/* Get and return received data from buffer */
return UDR;
}
//*****************************************************************************
//
// ADC
//
//*****************************************************************************
// initialize a2d converter
void a2dInit(void)
{
sbi(ADCSRA, ADEN); // enable ADC (turn on ADC power)
sbi(ADCSRA, ADATE); // choose free running mode
outb(ADCSRA, ((inb(ADCSRA) & ~0x07) | 0x06));
outb(ADMUX, ((inb(ADMUX) & ~0xC0) | (0x01<<6)));
cbi(ADMUX, ADLAR); // set to right-adjusted result
outb(ADMUX, (inb(ADMUX) & ~0x1F) | (0 & 0x1F)); // set channel
sbi(ADCSRA, ADIE); // enable ADC interrupts
}
// start a conversion on the current a2d input channel
void a2dStartConvert(void)
{
sbi(ADCSRA, ADIF); // clear hardware "conversion complete" flag
sbi(ADCSRA, ADSC); // start conversion
}
//! Interrupt handler for ADC complete interrupt.
SIGNAL(SIG_ADC)
{
unsigned char sample=(inb(ADCL) | (inb(ADCH)<<8)) >>2; // n?eoaai iiia?yiiia 10-aeoiia cia?aiea e ioa?inei 2 ieaaoeo aeoa
}
//*****************************************************************************
//
// MAIN
//
//*****************************************************************************
int main()
{
sei();
DDRD=0xFF;
initTimer();
a2dInit();
a2dStartConvert();
unsigned char data;
usrtInit( );
while(1)
{
data=usrtReadByte();
usrtSendByte(data);
}
}
Этот код падает при пересылке ~30000 сообщений (5-10 минут работы).
При этом до момента падения пересылаемое значение совпадает с ответом из AVR.
Контроллер ATMega32A-PU. Связь с ПК через Max232 (осциллограф каких-то проблем (завалы) на сигнальных линиях UART не показывает). Питание 5В от компьютерного БП.
Компилятор WinAVR-20090313, AVRStudio 4, -0s.
Фреймирование с помощью байтов со значениями 0, 0xFF соответственно до и после послыки байта данных пробовал - не помогает.
P.S. _delay_ms(2) зачем?
Последствия танцев с бубном.
Никак не пойму, где же быть ошибке...