Gast
#673208
Hallo Leute, ich habe ein kleine Code gecshrieben für ein ATmega16. mit meiner Code will ich die Daten zwischen die PC und die Controller austauchen und es soll mit Hardware handshanke gemacht werden. für die Handshake habe ich die Pin 3 und 4 der PORTD der Controller als RTS und CTS gewählt die sind zur MAX232 verbunden. Die sache ist so: das Programm functionniert einigemasse ganz gut aber in der sende Richtung von Mikrocontroller zur PC, die Daten sind unendlich gesendet und das ist das Problem ich wollte gerne das die daten nur ein mal gesendet werden. hier ist meine Code bitte schauen Sie die und helfen Sie mir bitte das Problem zu lösen MFG Jano int main(void) { unsigned char c; DDRD = 0xFF; // PORT D als Ausgang PORTD = 0x08; // 4.Pin des PORTD eischalten um das CTS anzusprechen (empfangt Bedingung im seit der controller) uart_init(); sei(); // Freigabe aller Interrupt : Enable USART Interrupt //uart_puts("hello world!\r\n\r\n"); /*while(1) { // Poll //c = uart_getdata(); // Echo //uart_putdata(c); }*/ return 0; } void uart_init(void) /****************************************************************** Function: Uart_init() Purpose: Initialise UART and set baudrate Input: baudrate Returns: none ******************************************************************/ { UCSRB |= (1<<TXEN) |(1<<RXEN) |(1<<RXCIE) |(1<<TXCIE)|(1<<UDRIE); // tx/rx enable UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 #if F_CPU < 2000000UL && defined(U2X) UCSRA |= (1<<U2X); /* improve baud rate error by using 2x clk */ UBRRL = (F_CPU / (8UL * UART_BAUD)) - 1; #else UBRRL = (F_CPU / (16UL * UART_BAUD)) - 1; #endif } ISR(USART_RXC_vect) { for ( g_idx=0; g_idx < MAX_BUFFER_SIZE; g_idx++ ){ while (!(UCSRA & (1<<RXC))) // warten bis Zeichen verfuegbar { } c=UDR; if (c == '\r'){ return; } else Buf[g_idx]=c; //Daten im Puffer laden } PORTD=0x04; return; } ISR(USART_UDRE_vect) { int n; n = g_idx; g_idx = 0; for ( g_idx=0; g_idx < n; g_idx++ ) { c = Buf[g_idx]; while (!(UCSRA & (1<<UDRE)))// Warten bis senden möglich { } UDR=c; } UCSRB &= ~UDRIE; PORTD= 0X08; //Senden im seit der PC ein: die daten können von PC gesendet und im controller empfangen werden return; }