Hallo
da ich mich nun doch entschieden habe RS485 zwischen Mega8 und PC zu
verwenden, möchte ich vor jedem Senden PORTD2 auf high und nach jedem
Senden PORTD2 auf low schalten.
1 | #include <stdlib.h>
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 | #include <avr/signal.h>
|
5 | #include <avr/pgmspace.h>
|
6 |
|
7 | #include "uart.h"
|
8 |
|
9 |
|
10 | #define UART_BAUD_RATE 57600
|
11 |
|
12 |
|
13 | #ifndef F_CPU
|
14 | #define F_CPU 16000000UL
|
15 | #endif
|
16 |
|
17 | unsigned int a = 0;
|
18 |
|
19 |
|
20 | int main(void)
|
21 | {
|
22 | DDRD = 0x04;
|
23 |
|
24 | char buffer[10];
|
25 | unsigned int c;
|
26 |
|
27 |
|
28 | sei();
|
29 |
|
30 | uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
|
31 |
|
32 | PORTD |= (1 << PD2); //umschalten auf Senden
|
33 | uart_puts("\r\n");
|
34 |
|
35 | PORTD |= (1 << PD2); //umschalten auf Senden
|
36 | uart_puts("HALLO" );
|
37 |
|
38 | itoa( a, buffer, 10);
|
39 |
|
40 | uart_puts(buffer);
|
41 |
|
42 |
|
43 | for(;;)
|
44 | {
|
45 | /*
|
46 | * Get received character from ringbuffer
|
47 | * uart_getc() returns in the lower byte the received character and
|
48 | * in the higher byte (bitmask) the last receive error
|
49 | * UART_NO_DATA is returned when no data is available.
|
50 | *
|
51 | */
|
52 |
|
53 | c = uart_getc();
|
54 |
|
55 | if ( c & UART_NO_DATA )
|
56 | {
|
57 | //no data available from UART
|
58 | }
|
59 | else
|
60 | {
|
61 | PORTD |= (1 << PD2);
|
62 | uart_putc( (unsigned int)c );
|
63 |
|
64 | }
|
65 | }
|
66 |
|
67 | }
|
Das ist ein Ausschnitt aus der UART.c
1 | /*************************************************************************
|
2 | Function: UART Data Register Empty interrupt
|
3 | Purpose: called when the UART is ready to transmit the next byte
|
4 | **************************************************************************/
|
5 | {
|
6 | unsigned char tmptail;
|
7 |
|
8 |
|
9 | if ( UART_TxHead != UART_TxTail) {
|
10 | /* calculate and store new buffer index */
|
11 | tmptail = (UART_TxTail + 1) & UART_TX_BUFFER_MASK;
|
12 | UART_TxTail = tmptail;
|
13 | /* get one byte from buffer and write it to UART */
|
14 | UART0_DATA = UART_TxBuf[tmptail]; /* start transmission */
|
15 | }else{
|
16 | /* tx buffer empty, disable UDRE interrupt */
|
17 | UART0_CONTROL &= ~_BV(UART0_UDRIE);
|
18 | PORTD &= ~(1 << PD2); //umschalten auf Empfangen
|
19 | }
|
20 | }
|
hier schalte ich den Port wieder auf low. Der Mega springt mir aber nur
einmal bei uart_puts("\r\n"); rein und dann nie wieder. Außerdem
überträg er mir das "HALLO" nicht richtig.