Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Тема закрыта

Re: Как прочитать int из AVR USART ?

Чт июн 07, 2012 15:03:40

тоже нет, 5-ый не вычитается.

Re: Как прочитать int из AVR USART ?

Чт июн 07, 2012 15:06:25

Гы, самому интересно. Знатоки Си, подскажите, в чём может быть дело?

Re: Как прочитать int из AVR USART ?

Чт июн 07, 2012 15:23:26

ploop писал(а): Мистика, или вы что-то не так делаете.
Мистикой не пахнет тут. Код сивола '0' = 0x30. И именно столько и надо вычитать. А откуда взялось 32?

Re: Как прочитать int из AVR USART ?

Чт июн 07, 2012 15:28:13

так работает?
Код:
ISR(USART_RXC_vect)
{
   unsigned char ReceivedByte;
   ReceivedByte = UDR;
   UDR = ReceivedByte;
   PORTB=d2led[ReceivedByte - '0'];
}

Re: Как прочитать int из AVR USART ?

Чт июн 07, 2012 15:38:48

да, так работает..

Re: Как прочитать int из AVR USART ?

Чт июн 07, 2012 15:38:53

Код сивола '0' = 0x30. И именно столько и надо вычитать. А откуда взялось 32?

Я тупанул. Перепутал с 0x20 (32 в десятичной) - начало печатных символов. Теперь ясно.

Re: Как прочитать int из AVR USART ?

Чт июн 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);
}


А вот тут проблема. Надо померять напряжение и отправить его значение на комп. Тут что не так?
на комп приходить только go go go....
Код:
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);
    }
}

Re: Как прочитать int из AVR USART ?

Чт июн 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);
Тема закрыта