C lib für RS485 und ATMEGA328P

Gast #4380213
Lesenswert?

Dazu brauchst du doch keine besonderen Funktionen?!
Nimm doch einfach eine bestehende für die UART-Schnittstelle und leg 
los.  Grob gesagt ist doch RS485 = RS232 nur differentiell und mit 
anderen Pegeln. Aber das sieht und weiß dein ATmega nicht, dafür hast du 
deinen MAX485.
Gast #4380321
Lesenswert?

Der MAX485 will aber gesagt bekommen, wann er senden soll und wann nicht 
mehr, d.h. man muß ihn vor dem ersten Startbit ein- und nach dem letzten 
Stopbit wieder ausschalten. Letzteres kann schwierig werden, wenn die 
Hardware keinen "transmission done"-Interrupt liefert und das Timing eng 
ist.
Gast #4380335
Lesenswert?

Nosnibor schrieb:
> Letzteres kann schwierig werden, wenn die Hardware keinen "transmission
> done"-Interrupt liefert und das Timing eng ist.

Die Hardware des ATmega328p liefert aber glücklicherweise einen 
"transmission done"-Interrupt, auch wenn der bei dem Prozessor "Transmit
Complete" heißt.
Gast #4387296
Lesenswert?

Hallo Gemeinde,

DANKE erstmal für die Hilfe, ja es hat gedauert, doch jetzt habe ich 
folgendes und es scheint zu funktionieren.
1
void USART0_Init( unsigned int baudrate )
2
{
3
  unsigned char x;
4
  DDRD |= (1<<DDD2);
5

6
  /* Set the baud rate 115200 bei 18,432mHz*/
7
  UBRR0H = (unsigned char) (baudrate>>8);
8
  UBRR0L = (unsigned char) baudrate;
9
  
10
  /* Enable UART receiver and transmitter und TXCIE0 Transmit Complete*/
11
  UCSR0B = ( ( 1 << RXCIE0 ) | ( 1 << RXEN0 ) | ( 1 << TXEN0 ) | ( 1 << TXCIE0) );
12
  
13
  /* Set frame format: 8 data 1stop */
14
  UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);              
15
  
16
  /* Flush receive buffer */
17
  x = 0;
18

19
  USART_RxTail = x;
20
  USART_RxHead = x;
21
  USART_TxTail = x;
22
  USART_TxHead = x;
23
}
24

25
ISR(USART_TX_vect)
26
{
27
  PORTD &= ~(1<<PORTD2);
28
}
29

30
ISR(USART_UDRE_vect)
31
{
32
  unsigned char tmptail;
33

34
  if ( USART_TxHead != USART_TxTail )
35
  {
36
    PORTD |= (1<<PORTD2);
37
    PORTD |= (1<<PORTD2);
38
    
39
    tmptail = ( USART_TxTail + 1 ) & USART_TX_BUFFER_MASK;
40
    USART_TxTail = tmptail;      
41
    
42
    UDR0 = USART_TxBuf[tmptail];  
43
  }
44
  else
45
  {
46
    UCSR0B &= ~(1<<UDRIE0);         
47
  }
48
}

Gruß

Oliver

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