Forum: Mikrocontroller und Digitale Elektronik NMEA - C - Garmin - atmega 8


von GPSler (Gast)


Lesenswert?

Hallo Forum!

Ich probiere gerade meinen Garmin mit dem Originalen Datenkabel von 
Garmin
über UART auszulesen.
seit 3 Tagen sehe ich alles nur keine NMEA datensätze.
ich brauche nur ein hinweis, damit ich mir den rest selbst erarbeiten 
kann.

Gegeben:
Atmega8
LCD
Garmin Oregon 300
Garmin Datenkabel mit freien Enden


Serielles Datenkabel an RX am Atmega8 angeschlossen


Liegt das Problem am UBRR ?
Es rauschen nur Sonderzeichen über das Display!

1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include "lcd-routines.h"
4
#include <util/delay.h>
5
#include <stdlib.h>
6
#include <inttypes.h>
7
8
9
#define F_CPU 15206400
10
#define BAUD 9600UL      // Baudrate
11
 
12
13
14
15
16
/***************************************************************************************************************************************************************/
17
18
void USART_vInit(unsigned int ubrr) 
19
20
{ 
21
22
23
// Set frame format to 8 data bits, no parity, 1 stop bit 
24
25
26
UCSRC = (1<<URSEL)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0); 
27
UBRRH = (char)(ubrr>>8); 
28
UBRRL = (char)ubrr; 
29
30
UCSRB =(1<<RXEN); 
31
32
} 
33
34
int USART_vReceiveByte() 
35
36
{ 
37
while ( !(UCSRA & (1<<RXC)) ); 
38
39
return UDR; 
40
41
} 
42
43
44
45
/***************************************************************************************************************************************************************/
46
47
int main() 
48
{ 
49
    lcd_init();
50
    USART_vInit(98);
51
    char start[7];
52
53
  
54
 
55
56
57
58
59
   while(1) 
60
   { 
61
    
62
      start[0]=USART_vReceiveByte(); 
63
                    
64
       
65
        //lcd_setcursor( 0, 2 );
66
        lcd_data( start[0] );
67
68
69
      if(start[0]=='$') 
70
      { 
71
         
72
      
73
     
74
      lcd_setcursor( 0, 2 );
75
    lcd_clear();
76
    lcd_string("juhuuuu");
77
    return 0;
78
    
79
    
80
  
81
82
   }
83
 
84
  
85
    }
86
    return 0;
87
  }

Ich wäre über einen Tipp sehr froh!
Danke im Vorraus !


GPSler

von L. P. (lpg)


Lesenswert?

Hi, klemm das Teil mal am PC an und schau ob das überhaupt rauskommt. 
Oder umgekehrt, teste dein Programm am PC.

Lg

von Dr. Faust (Gast)


Lesenswert?

>Gegeben:
>Atmega8
>LCD
>Garmin Oregon 300
>Garmin Datenkabel mit freien Enden
>Serielles Datenkabel an RX am Atmega8 angeschlossen


Fangen wir bei Adam und Eva an.
Die serielle Schnittstelle am Garmingerät ist für die Zusammenarbeit mit 
einem PC-RS232-Port ausgelegt.

http://de.wikipedia.org/wiki/RS-232

Die Gretchenfrage:
wird ein Pegelwandler&Inverter ein MAX232 macht das z. B.)verwendet?

von WAASy (Gast)


Lesenswert?

GPSler schrieb:
> #include <util/delay.h>
> ...
> #define F_CPU 15206400

Warum gaukelst du der Delay-Routine eine andere Frequenz als dem Rest 
des Programms vor?

von Gaukler (Gast)


Lesenswert?

Autor: WAASy (Gast) schrieb:
>Warum gaukelst du der Delay-Routine eine andere Frequenz als dem Rest
>des Programms vor?


Hallo Thread-Starter,

du mußt den RICHTIGEN CPU-Takt VOR dem inkludieren von delay.h angeben. 
Ansonsten nimmt er einen default Wert - und ob der auf deinem System 
passt ist reine Glückssache.

Das würde auch erklären, daß das GPS fleißig GPGGA (oder was auch immer 
für Datensätze) rausgibt, du aber nichts lesen kannst.

Stimmen denn die 9600Baud? Der NMEA-Standard sieht 4800Baud vor.

von Michael (Gast)


Lesenswert?

GPSler schrieb:
> #define BAUD 9600UL      // Baudrate

Nur weil du dem Präprozessor sagst, dass er "BAUD" durch "9600UL" 
ersetzen soll, weiß der USART noch lange nicht, mit welcher Taktrate er 
arbeiten soll. Und was macht deine magic number (98)? Paßt die zu deineM 
verwendeten (Stichtwort Fuse) Takt?

von GPSler (Gast)


Lesenswert?

Danke für die schnellen Antworten.
Funktioniert leider noch nicht.

>Hi, klemm das Teil mal am PC an und schau ob das überhaupt rauskommt.

Ja- Über GPS-Gate getestet - voller NMEA Datensatz

>Die Gretchenfrage:
>wird ein Pegelwandler&Inverter ein MAX232 macht das z. B.)verwendet?

Nein - muss man das auf jeden Fall machen ?

>Die serielle Schnittstelle am Garmingerät ist für die Zusammenarbeit mit
>einem PC-RS232-Port ausgelegt.

Ausgabe von
Garmin Seriell
Garmin Spanner
NMEA
Textout
RTSC o.s.Ä.


>du mußt den RICHTIGEN CPU-Takt VOR dem inkludieren von delay.h angeben.
>Ansonsten nimmt er einen default Wert - und ob der auf deinem System
>passt ist reine Glückssache.

Danke, das ist neu für mich. Ich war der Meinung, dass es keine Rolle 
spielt.


>>Stimmen denn die 9600Baud? Der NMEA-Standard sieht 4800Baud vor.

habe ich beide getestet,
Das Garmin Oregon kann seit einem der letzen Updates 4800 und 9600
habe es wieder auf 4800 umgestellt.


>Nur weil du dem Präprozessor sagst, dass er "BAUD" durch "9600UL"
>ersetzen soll, weiß der USART noch lange nicht, mit welcher Taktrate er
>arbeiten soll. Und was macht deine magic number (98)? Paßt die zu deineM
>verwendeten (Stichtwort Fuse) Takt?

Ich war der Meinung, dass
1
void USART_vInit(unsigned int ubrr) 
2
3
{ 
4
5
6
// Set frame format to 8 data bits, no parity, 1 stop bit 
7
8
9
UCSRC = (1<<URSEL)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0); 
10
UBRRH = (char)(ubrr>>8); 
11
UBRRL = (char)ubrr; 
12
13
UCSRB =(1<<RXEN); 
14
15
}

die UART Takt Rate festlegt mit meiner (ubrr) Magic Number, welche ich 
aus folgender Tabelle entnommen habe.
http://www.wormfood.net/avrbaudcalc.php?postbitrate=9600&clock_speed_table=on&postclock=16&bit_rate_table=on

oder sind die Angaben auf der Seite falsch ?


>Paßt die zu deineM verwendeten (Stichtwort Fuse) Takt?
Wie viele Takteinstellungen muss denn überall beachten ?

von WAASy (Gast)


Lesenswert?

GPSler schrieb:
> die UART Takt Rate festlegt mit meiner (ubrr) Magic Number, welche ich
> aus folgender Tabelle entnommen habe.
> 
http://www.wormfood.net/avrbaudcalc.php?postbitrate=9600&clock_speed_table=on&postclock=16&bit_rate_table=on
>
> oder sind die Angaben auf der Seite falsch ?

Warum ersetzt du dieses "mehrbändige Werk" nicht durch eine einfache 
Formel zum Berechnen der Konstanten durch den Präprozessor, so wie das 
im Artikel AVR-Tutorial: UART: UART konfigurieren beschrieben ist?

von Robert S. (p1337)


Lesenswert?

WAASy schrieb:
> GPSler schrieb:
>> die UART Takt Rate festlegt mit meiner (ubrr) Magic Number, welche ich
>> aus folgender Tabelle entnommen habe.
>>
> 
http://www.wormfood.net/avrbaudcalc.php?postbitrate=9600&clock_speed_table=on&postclock=16&bit_rate_table=on
>>
>> oder sind die Angaben auf der Seite falsch ?
>
> Warum ersetzt du dieses "mehrbändige Werk" nicht durch eine einfache
> Formel zum Berechnen der Konstanten durch den Präprozessor, so wie das
> im Artikel AVR-Tutorial: UART: UART konfigurieren beschrieben ist?

Danke für den Tipp, ich hatte es schon so , war mir aber nicht sicher, 
ob ich das richtig umgesetzt hatte.
darum wollte ich es aus einer Tabelle entnehmen.

ich baue es sicherheitshalber doch wieder rein.

Danke!

von Robert S. (p1337)


Lesenswert?

Ich aktualisiere :


SO IN ETWA ?

1
/* 
2
  UART-Init: 
3
Berechnung des Wertes für das Baudratenregister 
4
aus Taktrate und gewünschter Baudrate
5
*/
6
 
7
#ifndef F_CPU
8
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
9
   F_CPU im Makefile definiert werden, eine nochmalige Definition
10
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
11
   #ifndef/#endif 
12
 
13
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
14
   verwendet wird und dort eine andere, nicht zur Hardware passende 
15
   Taktrate eingestellt ist: Dann wird die folgende Definition 
16
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
17
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
18
   noch nicht definiert: */
19
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
20
#define F_CPU 4000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
21
                         // Ohne ergeben sich unten Fehler in der Berechnung
22
#endif
23
 
24
#define BAUD 4800UL      // Baudrate
25
 
26
// Berechnungen
27
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
28
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
29
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
30
 
31
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
32
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
33
#endif
34
35
36
#include <avr/io.h>
37
#include <avr/interrupt.h>
38
#include "lcd-routines.h"
39
#include <util/delay.h>
40
#include <stdlib.h>
41
#include <inttypes.h>
42
43
44
45
 
46
47
48
49
50
/***************************************************************************************************************************************************************/
51
52
void USART_vInit(unsigned int ubrr) 
53
54
{ 
55
56
57
// Set frame format to 8 data bits, no parity, 1 stop bit 
58
59
60
UCSRC = (1<<URSEL)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0); 
61
UBRRH = (char)(UBRR_VAL>>8); 
62
UBRRL = (char)UBRR_VAL; 
63
64
UCSRB =(1<<RXEN); 
65
66
} 
67
68
int USART_vReceiveByte() 
69
70
{ 
71
while ( !(UCSRA & (1<<RXC)) ); 
72
73
return UDR; 
74
75
} 
76
77
78
79
/***************************************************************************************************************************************************************/
80
81
int main() 
82
{ 
83
    lcd_init();
84
85
86
    USART_vInit();     
87
88
89
    char start[7];
90
91
  
92
 
93
94
95
96
97
   while(1) 
98
   { 
99
    
100
      start[0]=USART_vReceiveByte(); 
101
                    
102
       
103
     //   lcd_setcursor( 0, 1 );
104
        lcd_data( start[0] );
105
106
107
      if(start[0]=='$') 
108
      { 
109
         
110
      
111
     
112
      lcd_clear();
113
    
114
      lcd_setcursor( 4, 2 );
115
    
116
    lcd_string("juhuuuu");
117
  
118
    
119
    
120
  
121
122
   }
123
 
124
  
125
    }
126
    return 0;
127
  }

von WAASy (Gast)


Lesenswert?

Robert Stefanowicz schrieb:
> #ifndef F_CPU
> ...
> #define F_CPU 4000000UL  // Systemtakt in Hz - Definition als unsigned

So ein fester Default-Wert für F_CPU ist ausgesprochen gefährlich weil 
man trotz i.A. falschem Wert keine anständige Compiler-Fehlermeldung 
bekommt und die Warnungen werden zu gerne mal abgedreht oder nicht 
beachtet.

GPSler schrieb:
> Nein - muss man das auf jeden Fall machen ?
RS232 und USART Signale unterscheiden sich ganz grundlegend durch die 
Pegeldefinition und durch die Polarität. RS232-Treiber invertieren und 
konvertieren damit die Signale des USART in positiver Logik in die 
negative Logik der RS232-Schnittstelle. Außerdem wird von +/-3..12V auf 
0/3.3..5V umgesetzt.

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.