Gast
#452099
Hallo, Habe mal wieder ein Problem. Will einen gemessenen Analogwert an PORTA, 0 einfach über USART an den PC senden. Es reicht fürs erste das Lowbyte des ADC. Problem ist, dass der µC nicht immer direkt auf eine "Anfrage" vom PC reagiert und seinen aktuellen Wert sendet, dh ich muss teilweise ca 10 mal mein Steuerbyte 'r' schicken, bekomme dann aber auch mehr als nur einen Wert zurückgesendet. Zum anderen stimmt der Analogwert nicht. Er ändert sich nicht sondern scheint vielmehr zufällig zu sein. Nach einem Reset ändert sich der Wert, bleibt aber dann konstant. Hier das Programm (ATMEGA32) (hoffentlich ist die Darstellung nicht zu verschoben) #define F_CPU 4336180 #include <avr/io.h> #include <stdio.h> #include <stdlib.h> #include <avr/interrupt.h> #include <avr/iom32.h> #define UART_BAUD 28800 uint8_t a; ISR (USART_RXC_vect) //Echo an Sender { char b; while (!(UCSRA & (1<<RXC))); b = UDR; if (b == 'r') //wenn Steuerbyte empfangen { while (!(UCSRA & (1<<UDRE))); UDR = a; } } void usart_init(void) { UBRRH = 0; // Highbyte ist 0 UBRRL = (F_CPU / (16UL * UART_BAUD)) - 1; // UBRRL berechnen UCSRB |= ( 1 << TXEN )|( 1 << RXEN); // UART TX einschalten UCSRC |= ( 1 << URSEL )|( 1<<UCSZ0 )|( 1<<UCSZ1 )|( 0<<UCSZ2 ); // Asynchron 8N1 UCSRB |= ( 1 << RXCIE); //USART Interrupt an //DDRA = 0xff; //PORTA Ausgang a = 0; } void adc_on(void) { ADCSRA = (1 << ADPS2)|(1 << ADPS0); //ADC an, Vorteiler 32 ADMUX = 0; //PA0 ist analoger Eingang ADCSRA = (1 << ADEN); } void adc (void) { cli(); //globaler Interrupt aus ADCSRA |= _BV(ADSC); //Konvertierung starten while (ADCSRA & _BV(ADSC)); //Konvert. beendet a= ADCL ; //ADC Lowbyte sei(); //globaler Interrupt an } int main (void) { usart_init (); adc_on(); for (;;) { adc (); } }