Hi,
hat jemand von euch den Code für SRF02 über UART programmieren.
Ich habe einen Code geschrieben aber der hat leider nicht funktioniert. Ich verwendet ein ATmega128 mit 2 UART. Das erste habe ich zum Debug vervendet. An den zweite habe ich den Ultraschallsensor angeschloßen (selbstverständlich an TTL 5V). Die Funktionen zum Ansprechen des Sensor und Bearbeitung der Daten wurde in main(Ultraschallsensor.c) und in einer Schleife aufgerufen.
Ich habe den Mustercode im Bascom ausprobiert und es hat funktioniert. Das heißt, es Fehler bei meinem Code gibt. Ich habe ein paar Zeil über andere UART zum Debug übertragen und mit Terminalprogramm angeschaut. Die ISR Receive wird niemals hineingesprungen.Der Ultraschallsensor funktioniert unter UART Modus mit Baudrate 9600,8 Data Bit, 2 Stop Bit.Code:#include "Ultraschallsensor.h" #include "uart1.h" unsigned volatile char SioTmp1 = 0; unsigned volatile char SendeBuffer1[MAX_SENDE_BUFF1]; unsigned volatile char RxdBuffer1[MAX_EMPFANGS_BUFF1]; unsigned volatile char NeuerDatensatzEmpfangen1 = 0; unsigned volatile char AnzahlEmpfangsBytes1 = 0; unsigned volatile int wandabstand; unsigned volatile char UebertragungAbgeschlossen1 = 1; void Sensoranforderung(void); unsigned volatile int test1=0; //############################################################################ //INstallation der Seriellen Schnittstelle void UART1_Init (void) //############################################################################ { //Teiler wird gesetzt UBRR=UBRR0L Siehe Seite 174 von Atmega 644P wegen des Double Speed Modus uint8_t sreg = SREG; uint16_t ubrr = (unsigned int) ((unsigned long) F_CPU/(8 * BAUD_RATE1) - 1); cli(); // disable RX-Interrupt UCSR1B &= ~(1 << RXCIE1); // disable TX-Interrupt UCSR1B &= ~(1 << TXCIE1); // disable DRE-Interrupt UCSR1B &= ~(1 << UDRIE1); // set direction of RXD1 and TXD1 pins // set RXD1 (PD2) as an input pin PORTD |= (1 << PORTD2); DDRD &= ~(1 << DDD2); // set TXD1 (PD3) as an output pin PORTD |= (1 << PORTD3); DDRD |= (1 << DDD3); // USART0 Baud Rate Register // set clock divider UBRR1H = (uint8_t)(ubrr>>8); UBRR1L = (uint8_t)ubrr; // enable double speed operation // UCSR1A |= (1 << U2X1); // enable receiver and transmitter UCSR1B = (1 << TXEN1) | (1 << RXEN1); // set asynchronous mode UCSR1C &= ~(1 << UMSEL1); // no parity UCSR1C &= ~(1 << UPM11); UCSR1C &= ~(1 << UPM10); // 2 stop bit UCSR1C |= (1 << USBS1); //UCSR1C &= ~ (1 << USBS1); // 8-bit UCSR1B &= ~(1 << UCSZ12); UCSR1C |= (1 << UCSZ11); UCSR1C |= (1 << UCSZ10); // flush receive buffer explicit while ( UCSR1A & (1<<RXC1) ) UDR1; // enable interrupts at the end // enable RX-Interrupt UCSR1B |= (1 << RXCIE1); // enable TX-Interrupt UCSR1B |= (1 << TXCIE1); // enable DRE interrupt //UCSR1B |= (1 << UDRIE1); // restore global interrupt flags SREG = sreg; /* UCSR1B=(1 << TXEN1) | (1 << RXEN1); // UART Double Speed (U2X) USR=UCSR0A UCSR1A |= (1<<U2X1); // RX-Interrupt Freigabe UCSR1B |= (1<<RXCIE1); // TX-Interrupt Freigabe UCSR1B |= (1<<TXCIE1); UBRR1L=(F_CPU / (BAUD_RATE1 * 8L) - 1); */ } //---------------------*********--------------------------------// // Weitere Befehl an Sensordaten senden //ISR(SIG_USART1_DATA) ISR(SIG_USART1_TRANS)//USART1_TX_vect) { static unsigned int ptr = 0; unsigned char tmp_tx; if(!UebertragungAbgeschlossen1) { ptr++; // die [0] wurde schon gesendet tmp_tx = SendeBuffer1[ptr]; if((tmp_tx == 84) || (ptr == MAX_SENDE_BUFF1)) { ptr = 0; UebertragungAbgeschlossen1 = 1; } UDR1 = tmp_tx; //Put data in the buffer ,sends the data uart_puts("In Sendenvorgang springen \n"); } else ptr = 0; } //---------------------*********--------------------------------// // Sensordaten empfangen ISR(SIG_USART1_RECV) //USART1_RX_vect { static unsigned char buf_ptr; uart_puts("Empfangsvorgang springen \n"); SioTmp1 = UDR1; // test1++; //test1 = SioTmp1; // alte Daten schon verarbeitet if(!NeuerDatensatzEmpfangen1) { NeuerDatensatzEmpfangen1=1; } // Buffer voll if (buf_ptr==MAX_EMPFANGS_BUFF1) { buf_ptr=0; } // Datenbytes des Ultraschalls im Buffer speichern RxdBuffer1[buf_ptr++] = SioTmp1; //test1 = SioTmp1; } //---------------------*********--------------------------------// void Sensoranforderung(void) { // Packen Daten in Buffer, sendet Daten //Übertragungvorgang noch nicht abgeschlossen -> nichts weitere übertragen if(!UebertragungAbgeschlossen1) return; //Messen in centimeter SendeBuffer1[1]=84; //ID von Sensor aufrufen SendeBuffer1[0]=4; //erste Byte im Buffer senden, gleichzeitig wird ISR vom UART1 für Senden aktiviert UebertragungAbgeschlossen1=0; UDR1 = SendeBuffer1[0]; uart_putc(SendeBuffer1[0]); } void BearbeiteRxDaten1(void) { if(!NeuerDatensatzEmpfangen1) return; wandabstand = RxdBuffer1[1]; wandabstand =+ RxdBuffer1[0]<<8; NeuerDatensatzEmpfangen1 = 0; }
Kann jemand von euch mir helfen?
Viele Grüsse







Zitieren

Lesezeichen