mix47 (17.05.2007 01:31, просмотров: 1) ответил mix47 на ATmega32 пример кода.
Отладка <c>
#include <avr/io.h>
void USART_Transmit( unsigned long data)
{
while( !( UCSRA & (1<<UDRE)) );
UDR=data;
}
int main(void)
{
unsigned long rez;
unsigned char i;
int hi;
int low;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x08; // 57600 8n1
ADCSRA =(1 << ADEN)|(1 << ADIF)|(1 << ADPS2)|(1 << ADPS1)|(1 << ADPS0)|0;
ADMUX = (1<<REFS1)|(1 << REFS0)|(1 << ADLAR) |0;
i=0;
while(1)
{
ADMUX=i|0xE0;
ADCSRA =(1 << ADEN)|(1 << ADIF)|(1 << ADPS2)|(1 << ADPS1)|(1 << ADPS0)|(1 << ADSC)|0;
#define AdcConversionComplete (!(ADCSRA & (1 << ADSC)))(ADCSRA & 0x40==1)
rez=ADCH;
hi=(rez>>4)&0x0F;
low=rez&0x0F;
if (hi > 9) USART_Transmit('A' + (hi - 10));
else USART_Transmit('0' + hi);
if (low > 9) USART_Transmit('A' + (low - 10));
else USART_Transmit('0' + low);
rez=ADCL;
hi=(rez>>4)&0x0F;
low=rez&0x0F;
if (hi > 9) USART_Transmit('A' + (hi - 10));
else USART_Transmit('0' + hi);
if (low > 9) USART_Transmit('A' + (low - 10));
else USART_Transmit('0' + low);
rez=i;
hi=(rez>>4)&0x0F;
low=rez&0x0F;
if (hi > 9) USART_Transmit('A' + (hi - 10));
else USART_Transmit('0' + hi);
if (low > 9) USART_Transmit('A' + (low - 10));
else USART_Transmit('0' + low);
i++;
if (i>=8) i=0;
USART_Transmit(13);
USART_Transmit(10);
}
};
</c>
режим АЦП - сравнение с внутренним ИОН
Mux singel
поодельности берем старший и младший бит ADCH и ADCL
переводим в HEX, кидаем в порт, далее также в HEX кидаем в порт номер канала...
при работе выдает следующие результаты:
сажаем ADC0 на землю - 00 00 01 (получаеться результат смешен на 1н порт, должен быть на 00 , т.к. i исчисляеться с 0), и так навсех портах сдвигаеться...
Сажаем +5 на ADC0 - FF FF 00 - FF FF 07 , если еще любой из портов посадить на землю то получаем FF FF 01 - FF FF 04 :( , и так все порты...
может с режимами АЦП что не так ? или mux ? или всеже код неправельный ?
Help please...