Forum: Mikrocontroller und Digitale Elektronik atmega8 mit RS-485


von Stefan (Gast)


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.

von Hc Z. (mizch)


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.

von Stefan (Gast)


Lesenswert?

Danke danke danke das war die Ursache des Problems.

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
Noch kein Account? Hier anmelden.