Hallo,
habe ein kleines Problem mit den UART.
Ich möchte an der UART0 Schnittstelle (RX=PE0 TX=PE1) ein GPS Modul
(navilock 552ETTL)anschließen. Also Atmel RX mit GPS TX verbinden. Das
ist leider auch die ISP Programmierschnittstelle, der andere UART wird
leider schon für was anderes benutzt. Da das GPS Modul die Daten
zyklisch von alleine sendet brauche ich ja nur RX. Das Problem ist halt
ich empfange nichts.
Ich muß natürlich den Atmel über die ISP-Programmieren können,
kann man die Schnittstelle trotzdem als UART benutzen (Ich meine
natürlich nicht zeitgleich)?
Wenn Ja, was muss man bei der Fuse Konfiguration beachten?
Ein weiteres Problem ist der Pegel der Atmel wird mit 5V betrieben und
das GPS Modul hat einen 3,3V Pegel. Braucht man hier einen Pegelwander
oder geht das auch ohne?
1 | #define F_CPU 14745600UL
|
2 | #define GPS_BAUD 38400UL // baud rate
|
3 | #define GPS_UBRR_VAL ((F_CPU+GPS_BAUD*8)/(GPS_BAUD*16)-1)
|
4 | #define GPS_BAUD_REAL (F_CPU/(16*(GPS_UBRR_VAL+1)))
|
5 | #define GPS_BAUD_ERROR ((GPS_BAUD_REAL*1000)/GPS_BAUD)
|
6 |
|
7 | #if ((GPS_BAUD_ERROR<990) || (GPS_BAUD_ERROR>1010))
|
8 | #error Systematischer Fehler der GPS Baudrate groesser 1% und damit zu hoch!
|
9 | #endif
|
10 |
|
11 | #define BV(bit) _BV(bit)
|
12 | #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) // Clear bit
|
13 | #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) // Set bit
|
14 |
|
15 | // GPS - UART
|
16 | #define GPS_UART_BAUDRATE 38400
|
17 | #define GPS_UART_DDR DDRE
|
18 | #define GPS_UART_PORT PORTE
|
19 | #define GPS_UART_RXPIN PIN0
|
20 | #define GPS_UART_TXPIN PIN1
|
21 | #define GPS_RX_vect USART0_RX_vect
|
22 |
|
23 |
|
24 | SIGNAL(GPS_RX_vect)
|
25 | {
|
26 | uint8_t data;
|
27 | data = (uint8_t)UDR0;
|
28 | // data parsen....
|
29 | }
|
30 |
|
31 | void GPS_Init()
|
32 | {
|
33 | cli(); // Deaktiviert die Interrupt für die Konfiguration
|
34 |
|
35 | // RX - Pin für das Empfangen von Daten
|
36 | cbi(GPS_UART_DDR, GPS_UART_RXPIN); // Eingang
|
37 |
|
38 | // Konfiguriert die Baudrate 38400
|
39 | UBRR0H = GPS_UBRR_VAL >> 8;
|
40 | UBRR0L = GPS_UBRR_VAL & 0xFF;
|
41 |
|
42 | // Aktiviert RX und den RX-Interrupt
|
43 | UCSR0B = (1<<RXEN0) | (1<<RXCIE);
|
44 |
|
45 | // UART Konfiguration: 8N1
|
46 | UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
|
47 | UCSR0A &= ~(1<<U2X0); //Disable 2x speed
|
48 |
|
49 | sei(); // Aktiviert die Interrupts wieder
|
50 | }
|