Forum: Mikrocontroller und Digitale Elektronik C lib für RS485 und ATMEGA328P


von Paul (Gast)


Lesenswert?

Hallo,

kennt jemand eine Adresse in Netz, wo es eine Fertige C lib für die
Verwendung eines MAX 485 Chips?

Die lib sollte für einen atmega328p sein und an den pins RX/TX/int0 (pin 
2/3/4) sein, so ist die Hardware fest auf der Platine verdrahtet ;-)

Gruß

Paul

von Einfach (Gast)


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.

von Nosnibor (Gast)


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.

von Wolfgang (Gast)


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.

von Oliver (Gast)


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

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.