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