Ich bekomme das UART einfach nicht zum laufen hier ist mal der Code:
Code:/* * SMARTINIUS.c * * Created: 26.07.2011 00:17:22 * Author: Martinius */ #define F_CPU 16000000 #define BAUD 9600UL // Baudrate #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler. #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010)) #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! #endif #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> char s[7]; const int FWD = 1; // Definition der Richtungswerte const int STOP = 0; const int BWD = 2; const int ON = 1; //andere Werte const int OFF = 0; const int Left = 2; const int Right = 1; const int Enable = 1; const int Disable = 0; const int Reset = 2; const float A = 11.925; const float BL = 0.660; const float BR = 0.610; const float ADCconst = 00.04883; void Setup(void){ // Stellt den Controller für das nachfolgende Programm ein // muss immer als erstes aufgerufen werden. UBRRH = UBRR_VAL >> 8; UBRRL = UBRR_VAL & 0xFF; UCSRB |= (1<<TXEN); // UART TX einschalten UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1 DDRC |= (1<<PC7); // Status LED DDRB |= (1<<PB0); // IR_Eable DDRA &= ~(1<<PA0); // IR_Left DDRA &= ~(1<<PA1); // IR_Right ADMUX |= (1<<REFS0);//Reverrenzspannungsquelle des ADC wird festgelegt ADCSRA = (1<<ADPS1) | (1<<ADPS2); // Frequenzvorteiler ADCSRA |= (1<<ADEN); // ADC aktivieren ADCSRA |= (1<<ADSC); // eine ADC-Wandlung while (ADCSRA & (1<<ADSC) ) {} // auf Abschluss der Konvertierung warten } void Status_LED(uint8_t Status){ if(Status == 1){ PORTC |= (1<<PC7); } if(Status == 0){ PORTC &= ~(1<<PC7); } } int uart_putc(unsigned char c) { while (!(UCSRA & (1<<UDRE))) /* warten bis Senden moeglich */ { } UDR = c; /* sende Zeichen */ return 0; } void uart_puts (char *s) { while (*s) { /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */ uart_putc(*s); s++; } } uint16_t get_Ir_Distance (uint8_t Dir){ // Distance in mm if(Dir==1){//Right float x; ADMUX = (ADMUX & ~(0x1F)) | (1 & 0x1F); ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while (ADCSRA & (1<<ADSC) ) {} // auf Abschluss der Konvertierung warten x = ADCW; x = x*ADCconst; x = x-BL; x = A/x; x = x*10 uart_puts( itoa( x, s, 10 ) ); return x; // ADC auslesen und zurückgeben } if(Dir==2){//Left float x; ADMUX = (ADMUX & ~(0x1F)) | (0 & 0x1F); ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while (ADCSRA & (1<<ADSC) ) {} // auf Abschluss der Konvertierung warten x = ADCW; x = x*ADCconst; x = x-BL; x = A/x; x = x*10; uart_puts( itoa( x, s, 10 ) ); return x; } return 0; } void Ir_Enable(uint8_t Status){ if (Status == 1){ PORTB |= (1<<PB0); } if(Status == 0){ PORTB &= ~(1<<PB0); } } int main(void) { Setup(); Ir_Enable(ON); while(1){ drive_ahead(); if(get_Ir_Distance(Right)<2000){ Status_LED(ON); } if(get_Ir_Distance(Left)< 2000){ Status_LED(ON); } } }






Zitieren

Lesezeichen