Чт июн 07, 2012 15:03:40
Чт июн 07, 2012 15:06:25
Чт июн 07, 2012 15:23:26
Мистикой не пахнет тут. Код сивола '0' = 0x30. И именно столько и надо вычитать. А откуда взялось 32?ploop писал(а): Мистика, или вы что-то не так делаете.
Чт июн 07, 2012 15:28:13
ISR(USART_RXC_vect)
{
unsigned char ReceivedByte;
ReceivedByte = UDR;
UDR = ReceivedByte;
PORTB=d2led[ReceivedByte - '0'];
}
Чт июн 07, 2012 15:38:48
Чт июн 07, 2012 15:38:53
Код сивола '0' = 0x30. И именно столько и надо вычитать. А откуда взялось 32?
Чт июн 07, 2012 16:07:42
void USART_Init(void)
{
UCSRB |= (1 << RXEN) | (1 << TXEN);
UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
UBRRH = (BAUD_PRESCALE >> 8);
UBRRL = BAUD_PRESCALE;
UCSRB |= (1 << RXC);
}
void USART_SendByte(uint8_t u8Data)
{
while((UCSRA &(1<<UDRE)) == 0);
UDR = u8Data;
}
void USART_putstring(char* StringPtr)
{
while(*StringPtr != 0x00)
{
USART_SendByte(*StringPtr);
StringPtr++;
}
}
void ADC_init(void)
{
ADMUX=(1<<REFS0);
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
set_sleep_mode(SLEEP_MODE_ADC);
}
unsigned int ADC_read(unsigned char ch)
{
uint16_t summary = 0;
uint8_t count = 0;
uint8_t sreg;
ADMUX = (0<<ADLAR) | (ch&0b1111);
while(count<64)
{
ADCSRA |= (1<<ADSC);
while( ! (ADCSRA&(1<<ADIF)) ) asm("nop");
ADCSRA |= (1<<ADIF);
sreg = SREG;
cli();
summary += ADC;
SREG = sreg;
count++;
}
return (summary>>6);
}
int main(void)
{
ADC_init();
USART_Init();
char voltage;
while(1)
{
USART_putstring("go");
voltage=ADC_read(0)*5/1024;
_delay_ms(500);
USART_putstring(voltage);
_delay_ms(1000);
}
}
Чт июн 07, 2012 16:27:17
void readV(char *buffer)
{
int volatage;
volatage = ADC_read(0);
sprintf(buffer, "%d.%04u", volatage*5/1024);
}
//и потом в майн
readV(buffer);
USART_putstring(buffer);