atmega8 mit RS-485

Gast #1451120
Lesenswert?

Hallo nach langer suche hier im Forum und im Internet wollte ich euch 
mal fragen ob ihr mir bei einem Problem zum Kommunikation zwischen 2 
Atmega8 über RS 485 helfen könnt.
Ich habe ein kleines Testprogramm geschrieben was alle 2 Sekunden einen 
Text über denn Bus schicken soll doch nach 4 Sendungen bricht die 
Kommunikation ab und nichts passiert mehr.
Hier mal mein Programm:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/pgmspace.h>
4
#include <stdlib.h>
5
#define F_CPU 4000000UL    
6
#define BAUD 9600
7
#include <util/setbaud.h>
8
#include <util/delay.h>
9

10

11
void USART_Init()
12
{
13
 UBRRH = UBRRH_VALUE;
14
 UBRRL = UBRRL_VALUE;
15
 UCSRB =(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
16
 UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); 
17
}
18

19
int uart_putc(unsigned char c)
20
{
21
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
22
    {
23
    }                              
24
    UDR = c;                      /* sende Zeichen */
25
    return 0;
26
}
27
void uart_puts (char *s)
28
{
29
    while (*s)
30
    {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen" */
31
        uart_putc(*s);
32
        s++;
33
    }
34
}
35

36
int main()
37
{
38
  DDRB = 0xFF;
39
  sei();
40
  USART_Init ();
41
  while(1)
42
  {  
43
  _delay_ms(200);
44
  _delay_ms(200);
45
  _delay_ms(200);
46
  _delay_ms(200);
47
  PORTB |= (1<<PB0);
48
  _delay_ms(20);
49
  uart_puts("00010002H*");
50
  while (!(UCSRA & (1<<TXC)))
51
        ;
52
  PORTB &= ~(1<<PB0);
53
  }
54
}
Ich weiß wirklich nicht mehr weiter und währe über eure Hilfe sehr 
dankbar.
#1451133
Lesenswert?

Zwei Dinge sind mir aufgefallen:

>  UCSRB =(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);

Was macht das RXCIE hier?  Wenn Dein Programm vollständig ist, gibt es 
für den zugehörigen Interrupt keine Routine.  --> Aufhänger.

>   while (!(UCSRA & (1<<TXC)))
>         ;

Da Du TXC nirgends löschst und kein passender Interrupt das tut, wird 
TXC immer gesetzt sein und die Schleife wird immer sofort verlassen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren