Gast
#1406180
Hallo liebes Forum, da ich mich erst mit dem Thema Mikrocontroller am einarbeiten bin, bitte ich schon mal um Nachsicht wegen evtl "einfacher" Fragen. Ich haben einen Atmega 8515L (auf dem STK500), welchen ich nutzen will um einen IC ltc6802-2 zu konfigurieren und später auch auszulesen. Zunächst will ich einige Bytes vom Master (Atmega) zum Slave senden. Gleichzeitig will ich die gesendeten Bytes auf dem UART am Rechner zur Kontrolle (über uart_puts(comData);) ausgeben. Die Initialisierung des Uart sollte stimmen, da ich einen "Hello World" String normal ausgeben kann. Die LED on/off dienen lediglich zur eigenen Kontrolle, wo ich mich gerade befinde. Momentan werden die Bytes nicht sauber gesendet. Auch an der Uart Schnittstelle sehe ich ein anderes Ergebnis als erwartet. Wäre toll, wenn mir jemand weiterhelfen könnte. Hier ist mein verwendeter Code: #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #ifndef F_CPU #define F_CPU 1000000L // Systemtakt in Hz #endif #define BAUD 4800L // Baudrate // Berechnungen #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-1000) // Fehler in Promille #if ((BAUD_ERROR>10) || (BAUD_ERROR<-10)) #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! #endif #include <util/delay.h> /* in der aktuellen Version in util/ */ // UART Interface void uart_init(void) //Init Uart { //UCSRB |= (1<<RXEN) | (1<<TXEN); // UART TX einschalten UCSRB |= (1<<TXEN); // UART TX einschalten UCSRC = (1<<URSEL)| (1<<UCSZ1) | (1<<UCSZ0); // 8 Datenb , 1Stb UBRRH = UBRR_VAL >> 8; UBRRL = UBRR_VAL & 0xFF; } void uart_putch(char c) { while(!(UCSRA & (1<<UDRE))); UDR = c; } void uart_puts(char * str) { while (*str) { uart_putch(*str++); } } //////////// Test LED 3 on off //////////// void led3_on(void) { DDRB |= (1 << PB3); //Port 3 Out PORTB |= (1 << PB3); //LED on _delay_ms(1000); } void led3_off(void) { DDRB |= (1 << PB3); //Port 3 Out PORTB &= ~(1 << PB3); //LED off _delay_ms(1000); } // SPI Interface void spi_init (void) //Init SPI { DDRB |= (1<<PB4)|(1<<PB5)|(1<<PB7); // MOSI,SCK,SS als Output PORTB |= (1<<PB4); //SS auf High SPCR |= (1<<SPE)|(1<<MSTR); // SPI enable, Master Mode } void spi_senden (unsigned comData, unsigned CFGR0, unsigned CFGR1, unsigned CFGR2, unsigned CFGR3, unsigned CFGR4, unsigned CFGR5) { PORTB &= ~(1 << PB4); //START SENDEN SS auf Low SPDR = comData; //Command Byte while (!(SPSR & (1 << SPIF))); //warten bis gesendet while (!(UCSRA & (1<<UDRE))) //ist die Sendestufe bereit? { } uart_puts(comData); led3_on(); SPDR = CFGR0; while (!(SPSR & (1 << SPIF))); //warten bis gesendet SPDR = CFGR1; while (!(SPSR & (1 << SPIF))); //warten bis gesendet SPDR = CFGR2; while (!(SPSR & (1 << SPIF))); //warten bis gesendet SPDR = CFGR3; while (!(SPSR & (1 << SPIF))); //warten bis gesendet SPDR = CFGR4; while (!(SPSR & (1 << SPIF))); //warten bis gesendet SPDR = CFGR5; while (!(SPSR & (1 << SPIF))); //warten bis gesendet while (!(UCSRA & (1<<UDRE))) //ist die Sendestufe bereit? { } uart_puts(CFGR5); //led3_off(); PORTB |= (1 << PB4); //ENDE SS auf high } int main(void) { uart_init(); spi_init(); spi_senden(0x01, 0xE1, 0x04, 0x00, 0xFF, 0x73, 0xAF); // Write Config while(1) { led3_off(); } return 0; }