Forum: Mikrocontroller und Digitale Elektronik Problem: GPS-Maus an UART (RGM-2000, Mega8, Fleury)


von Ulrich L. (kaschpal)


Lesenswert?

Hallo miteinander,

beim Versuch, eine RGM-2000 GPS Maus auszulesen stecke ich leider fest:
Der TX der Maus ist an einen Mega8 angeschlossen und ich wollte die 
UART-Lib von Peter Fleury benutzen. Unten steht das kleine 
Test-Programm.
Leider erscheint bei mir am Display immer nur 256256256..., also sprich: 
das low byte mit dem Buchstaben ist leer im high byte steht 
UART_NO_DATA. Das Signal der GPS-Maus liegt am RX-Pin an, habe ich 
geprüft. Ebenfalls die Baudrate (4800, gegoogelt) scheint zu stimmen, 
hab ich mir am Oszi ebenfalls angeschaut. Die Maus hat einen Signalpegel 
von 3.3V, also größer als (5V * 0.6), was der AVR als High 
interpretieren sollte. Dann habe ich das Signal noch testweise zweimal 
durch einen übrigen 74014 (invertierender Schmitt-Trigger) geleitet, hat 
auch nichts gebracht. (Am Ausgang warens dann allerdings 
unerklärlicherweise nur 4V, sollte aber jetzt wirklich reichen ...).
Selbstverständlich benutze ich einen externen Quarz (8MHz) und die Fuses 
sind auch gesetzt (die Warteschleife ist korrekt eine Sekunde lang).
Im Moment bin ich mit meinem Latein am Ende. Mangels übrigem 
Pegelwandler kann ich mir das Signal leider grad auch nicht am PC 
anschauen, aber - wie gesagt - am Oszi macht es einen korrekten 
Eindruck.
Kann mir jemand helfen? Vielleicht habe ich auch eine Kleinigkeit 
übersehen, aber mir fällt wirklich nichts mehr ein ...

Danke im Vorraus,
Ulrich
1
int main(void)
2
{
3
  uint16_t  getc_tmp = 0;
4
  char    str[16];
5
6
  /* Richtungsregister setzen */
7
8
  *port_to_ddr(&BUTTON_PIN)    &= ~(1 << BUTTON);
9
10
  *port_to_ddr(&LCD_DATA0_PORT)    |= (1 << LCD_DATA0_PIN);
11
  *port_to_ddr(&LCD_DATA1_PORT)    |= (1 << LCD_DATA1_PIN);
12
  *port_to_ddr(&LCD_DATA2_PORT)    |= (1 << LCD_DATA2_PIN);
13
  *port_to_ddr(&LCD_DATA3_PORT)    |= (1 << LCD_DATA3_PIN);
14
  *port_to_ddr(&LCD_RS_PORT)    |= (1 << LCD_RS_PIN);
15
  *port_to_ddr(&LCD_RW_PORT)    |= (1 << LCD_RW_PIN);
16
  *port_to_ddr(&LCD_E_PORT)    |= (1 << LCD_E_PIN);
17
18
  
19
  lcd_init(LCD_DISP_ON);
20
  lcd_puts(init\n");
21
  
22
  wait_10ms(100);
23
24
  lcd_init(LCD_DISP_ON);
25
  uart_init(UART_BAUD_SELECT(SERIAL_BAUDRATE, F_CPU));
26
27
  for (;;) {
28
    wait_10ms(100);
29
  
30
    getc_tmp = uart_getc();
31
32
    utoa(getc_tmp, str, 10);
33
34
    lcd_puts(str);
35
  }  
36
37
  return(0);
38
39
}

von holger (Gast)


Lesenswert?

>    getc_tmp = uart_getc();

Ich denke mal dein GPS sendet mehr als ein Zeichen
pro Sekunde.

von Ulrich L. (kaschpal)


Lesenswert?

Das ist schon richtig, die Maus schickt alle Sekunden einen vollen 
Datensatz; aber dann müsste ich im lowbyte ein Zeichen haben und im 
highbyte ein UART_BUFFER_OVERFLOW.
Ich kriege aber immer nur 256 = 0x0100 ...

uart.h:
1
#define UART_FRAME_ERROR      0x0800              /* Framing Error by UART       */
2
#define UART_OVERRUN_ERROR    0x0400              /* Overrun condition by UART   */
3
#define UART_BUFFER_OVERFLOW  0x0200              /* receive ringbuffer overflow */
4
#define UART_NO_DATA          0x0100              /* no receive data available   */

von Manu (Gast)


Lesenswert?

Hi

Die UART Lib von Peter Fleury ist Interupt-Driven.
Kann es sein dass du die Interrupts nicht eingeschaltet hast?
Ich seh jedenfalls nirgends ein sei() oder ähnliches.

Manu

von Ulrich L. (kaschpal)


Lesenswert?

Manu wrote:

> Kann es sein dass du die Interrupts nicht eingeschaltet hast?

*PATSCH!*

Danke :)

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.