Hallo liebe AVR gemeinde, hab Problem mit meinem at90pwm216. Hab ein kleines Program, das 16 Bit sendet soll, er überträgt nur dann wenn ich denn Write Flash Baten klick neben dem Connect obwohl eine while schleife existiert. Weis jemand die Lösung für mein Problem. Vielen dank! #include <avr/io.h> #include <avr/interrupt.h> void EUSART_Transmit_data( unsigned int data ) { // Wartet, bis Transmit lehr ist while ( !( UCSRA & (1<<UDRE))) { }; //Die datei wird in den Buffer geladen und dann gesendet EUDR = data>>8; UDR = data; } int main (void) { UBRRL = 207; //Setzt Baudrate des Transmitters auf 1200; UCSRC = 0b00001000; //Setzt die Stop-Bits auf 2; MUBRR = 833; //Setzt Baudrate des reveivers auf 1200 und Frequenz auf 1MHz EUCSRA = 0b10110111; //Hier wird die Anzahl der zu senden Bits eingestellt (16) EUCSRB = 0b00011010; //EUSART-Mode wird eingeschaltet UCSRB = 0b00011000; //EUSART Transmitter wird eingeschaltet unsigned int data = 0b1010100101111001; EUSART_Transmit_data(data); while(1) { } }
Die Schleife tut ja auch nix. Dein Programm übertragt nach dem Start einmalig 16 Bits und dreht dann intensiv Däumchen. Nach Reset (oder Neuprogrammierung) geht das dann wieder von vorne los. Wenn sich daran was ändern soll, dann muss die Übertragung in die Schleife rein und nicht davor. Apropos: Wer sitzt denn am anderen Ende der Übertragung? PCs sind über UART-Transfer mit 16 Datenbits nicht wirklich glücklich.
jö sorry, hab ein Oszi drangehängt am TXD pin meinst du so? die while(1) in der main while(1) { EUSART_Transmit_data(data); } hab das auch schön probiert.
Yep, dann müsste mehr los sein. Wobei ich die Steuerbits aber nicht kontrolliert habe, diese EUSART war mir bisher noch nicht untergekommen. Probier das doch erst einmal ohne diese EUSART Funktionen und Register, also klassisch mit 8 Bits pro Frame.
kann es an der Baudrate liegen? ODER benutze extern 4MHz. UBRRL = 207; //Setzt Baudrate des Transmitters auf 1200; UCSRC = 0b00001000; //Setzt die Stop-Bits auf 2; MUBRR = 833; //Setzt Baudrate des reveivers
mal andere frage. am STK500 gibt es doch zwei rs232 anschlusse, kan ich von da direkt an die com1 am pc oder muss ich ein max232 bauen?
vielen dank, ich probiere es gleich mit dem Terminal von windows
hab ein programm aus dem buch, muss eigentlich funktionieren. #define TAKT 4000000UL #define UART_BAUDRATE 9600UL #define UART_SETTING ((TAKT/16UL/UART_BAUDRATE)-1) void USART_Init() //(unsigned int baud ) //beispiel USART Initialization { //Baudrate einstellen UBRRH = (unsigned char)(UART_SETTING>>8); UBRRL = (unsigned char)(UART_SETTING); //Empfänger und Sender einstellen UCSRB = (1<<RXEN)|(1<<TXEN); //Set frame format: 8data, no parity & 2 stop bits Asynchron UCSRC = (1<<UMSEL)|(0<<UPM1)|(0<<UPM0)|(1<<USBS)|(0<<UCSZ0)|(1<<UCPOL); //UCPOL=1 Steigende Flanke } void USART_Transmit( unsigned int data ) //im Beispiel einfach (char dat) { // Warte bis Buffer bereit while ( !( UCSRA & (1<<UDRE))); //erst ins EUDR die 16 Bits laden //befor das niedrigste Bit ins UDR geschrieben wird //das schreiben ins UDR ermöglicht das Starten der Übertragung // Put data into buffer, sends the data EUDR = data>>8; UDR = data; } unsigned int USART_Receive( void ) { // Wait for data to be received while ( !(UCSRA & (1<<RXC)) ); return UDR; } void string(char *str) { unsigned char i; for(i=0; i<255; i++) //Maximal 255 Zeichen ausgeben { if(str[i] !=0) USART_Transmit(str[i]); else break; //Ende des Strings erreicht } } int main (void) { USART_Init(); string("Test - RS232 [OK]...\r\n\r\n"); while (1) { } return 0; }
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.