Forum: Mikrocontroller und Digitale Elektronik Attiny 25 - GPS -Empfang


von Mike (Gast)


Lesenswert?

Hallo zusammen!

benötige dringend eure Hilfe!

Ich benutze einen Attiny 25 und würde gerne kontinuierlich GPS-Daten 
auslesen, um diese im tiny weiter zu verarbeiten.

Allerdings verstehe ich leider nicht ganz wie ich Schnittstellen 
definieren muss, um mein GPS-Signal im Controller auswerten zu können.

Ich hoffe, dass mir da jemand weiterhelfen kann.

Gruß, Mike

: Verschoben durch Moderator
von Peter II (Gast)


Lesenswert?

woher sollen wir wissen was du für ein gps modul hast?

von Mike (Gast)


Angehängte Dateien:

Lesenswert?

Als GPS-Modul nutze ich ein NAVILOCK NL-203P (siehe Anhang)

von asyxdcvgh (Gast)


Lesenswert?

Das Vieh hat eine serielle Schnittstelle 4800 8N1. Um davon Daten zu 
empfangen musst du ein passendes Programm schreiben und in den AVR 
laden.

http://www.mikrocontroller.net/articles/AVR-Tutorial
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

von Klaus Dieter (Gast)


Lesenswert?

Irgendwie klingt das für mich nach "Ich weiß nichts, erklärt mir alles!"
Die Schnittstelle ist bereits definiert, das brauchst du nicht zu tun. 
Du musst dich nur darum kümmern, das Protokoll zu implementieren. Dazu 
sollte sich aber mit ein paar Schlagwörtern genug Material im Internet 
finden lassen.

von Peter II (Gast)


Lesenswert?

eventuell braucht du noch ein pegelwandler.

von Mike (Gast)


Lesenswert?

Klaus Dieter schrieb:
> Die Schnittstelle ist bereits definiert, das brauchst du nicht zu tun.


Also ziehe ich mein Datensignal auf den SDA des Controllers und kann 
direkt die Daten über das USIDR auslesen?

von Peter II (Gast)


Lesenswert?

Mike schrieb:
> Also ziehe ich mein Datensignal auf den SDA des Controllers und kann
> direkt die Daten über das USIDR auslesen?

ja wenn die pegel passen.

von Fragender (Gast)


Lesenswert?

Muß sowas in die Codesammlung?
Ich sehe hier keinen...

Admin: Bitte verschieben

von Klaus Dieter (Gast)


Lesenswert?

Mike schrieb:
> Also ziehe ich mein Datensignal auf den SDA des Controllers und kann
> direkt die Daten über das USIDR auslesen?

Naja, SDA bezeichnet die Datenleitung von I²C/TWI. Der Empfänger 
kommuniziert normalerweise mit einer UART (Dier dert ATTiny25 glaub ich 
nicht hat), bedeutet: Die UART müsstest du in Software nachbauen. Pegel 
müssen sicherlich angepasst werden, das müsste man aber nachmessen.

von Mike (Gast)


Lesenswert?

Nochmal zum Verständnis:
Das hier kann ich mir sparen?

void USI_Init( void )
{
  USIDR = 0xFF;
  USICR = 0x22;
  USISR = 0xF0;
}

und kann ohne vorher irgendwas initialisiert zu haben trotzdem direkt 
folgendes machen?

  gps_Zeichen[j] = USIDR;



das klingt für mich irgendwie komisch.
Liegt vielleicht dadran, dass das mein erster Atmel-Controller ist, 
nachdem ich bisher nur mit NXP zu tun hatte.

von spess53 (Gast)


Lesenswert?

Hi

>und kann ohne vorher irgendwas initialisiert zu haben trotzdem direkt
>folgendes machen?

>  gps_Zeichen[j] = USIDR;

Nein. Nochmal: Der ATTiny25 hat keine UART. Wie die USI als UART zu 
benutzen ist findest du hier:

http://www.atmel.com/Images/doc4300.pdf
http://www.atmel.com/Images/AVR307.zip

MfG Spess

von Ralf (Gast)


Lesenswert?

Mike, an dem GPS-Daten aus einem Navilock-Empfänger auszulesen bin ich 
vor einiger Zeit gescheitert.
Wenn du es hinbekommst, dann wäre es nett, wenn du deinen Code hier 
veröffentlichen würdest.


Schon mal vorab, Danke
Ralf

von Mike (Gast)


Lesenswert?

Vielen Dank schonmal für die Antworten.

Gibt es da nicht eine einfacherere Lösung als mir softwaremäßig aus 
einer Usi eine Uart zu machen? - z.B. MOSI ?

Ich will ja einfach nur, dass mein tiny die empfangenen Zeichen in 
irgendein arry speichert, damit ich information herausfiltern kann.

von Klaus Dieter (Gast)


Lesenswert?

Mike schrieb:
> Gibt es da nicht eine einfacherere Lösung als mir softwaremäßig aus
> einer Usi eine Uart zu machen? - z.B. MOSI ?

Nein, gibt es nicht.

von TestX .. (xaos)


Lesenswert?

Klaus Dieter schrieb:
> Mike schrieb:
>> Gibt es da nicht eine einfacherere Lösung als mir softwaremäßig aus
>> einer Usi eine Uart zu machen? - z.B. MOSI ?
>
> Nein, gibt es nicht.

Doch! Er nimmt einfach einen anderen AVR COntroller, der eine UART 
besitzt... zB Attiny2313 etc..

von Stefan W. (dl6dx)


Lesenswert?

Ralf schrieb:
> an dem GPS-Daten aus einem Navilock-Empfänger auszulesen bin ich
> vor einiger Zeit gescheitert.

Was war denn das Problem? Im Normalfall sollte man bei aktiviertem 
NMEA-Modus "von Daten erschlagen" werden.

Grüße

Stefan

von Klaus Dieter (Gast)


Lesenswert?

Andi D. schrieb:
> Doch! Er nimmt einfach einen anderen AVR COntroller, der eine UART
> besitzt... zB Attiny2313 etc..

Dadurch macht er aber nicht aus einer USI einen UART.
Natürlich hast du recht, der Umstieg auf einen anderen Controller wäre 
die sinnvollste Variante.
Man kann natürlich auch eine I²C/SPI to UART bridge nehmen, Sinn macht 
das allerdings auch keinen. Aber da er die Software ja schon quasi 
"vorgekaut" serviert bekommen hat (die Links von Spess), sollte der Rest 
ja auch kein Problem sein wenn man beim ATTiny25 bleiben möchte.

von Chris P (Gast)


Lesenswert?

moin,

habe vor bald sowas ähnliches zu basteln.

Klaus Dieter schrieb:
> Aber da er die Software ja schon quasi
> "vorgekaut" serviert bekommen hat (die Links von Spess), sollte der Rest
> ja auch kein Problem sein wenn man beim ATTiny25 bleiben möchte.

habe mir die c-dateien noch nicht zu 100% angeschaut, ist ja auch schon 
ziemlich spät ;) aber du sagst also, dass man das ganze geschreibsel aus 
der datei einfach in die bestehende datei reinkopieren kann und dan 
damit im prinzip nur noch drauf wartet, dass die gpsmaus mir daten 
liefert und ich sonst nix mehr machen muss?

andere frage. ist der tiny25 überhaupt in der lage so eine "große" 
datenmenge an quellcode + datenmenge an gpssignal zu verarbeiten?

von spess53 (Gast)


Lesenswert?

Hi

>andere frage. ist der tiny25 überhaupt in der lage so eine "große"
>datenmenge an quellcode + datenmenge an gpssignal zu verarbeiten?

Was verstehst du unter verarbeiten? Es kommt darauf an was er mit den 
verbleibenden 4 PINs machen soll.

MfG Spess

von Cyblord -. (cyblord)


Lesenswert?

Also ich hab mit einem tiny45 schon erfolgreich ein serielles GPS Modul 
ausgelesen. Ein einfacher Software USART reicht, nur dann kann der tiny 
halt sonst nicht mehr viel machen. Auch wenn man mit Interrupts 
arbeitet. Bei meinem Modul konnte man die Pakete einstellen die man will 
und die anderen abschalten. So hält sich die Menge in Grenzen. Außerdem 
konnte man die Baudrate senken und auch die Frequenz mit der die Pakete 
kommen.
Danach muss man halt jedes Paket parsen und sich die Infos rausholen die 
man will. Mit der string.h ausm win-avr Projekt geht das ohne Probleme.

Nur ich denke dem TE fehlt hier einfach noch ein wenig Wissen und 
Programmiererfahrung, das hört man nunmal deutlich aus den 
Fragestellungen raus. Und für eine Anfänger ist sowas eher nicht 
geeignet. Also klein Anfangen und erstmal die Grundlagen, inkl. der 
seriellen Schnittstelle an sich, verstehen. Auch ein wenig tieferes 
C-Wissen, also eben das ganze Pointer Zeug, Structs usw. wird hier 
gebraucht.
Also Mike, wenn du nicht Fit mit der Hardware und in C bist, dann lass 
es erstmal!

gruß cyblord

von Milchbube (Gast)


Lesenswert?

Was sollen diese Tinies? Die machen erst bei hohen Stueckzahlen Sinn. 
Was spricht gegen einen normalen Mega? Und auch nicht den 8er, der ist 
zu klein.

von Cyblord -. (cyblord)


Lesenswert?

Milchbube schrieb:
> Was sollen diese Tinies? Die machen erst bei hohen Stueckzahlen Sinn.
> Was spricht gegen einen normalen Mega? Und auch nicht den 8er, der ist
> zu klein.

So ein quatsch. Der Vorteil eines Tiny ist seine gringe Größe. Bei mir 
gings um eine Modellfluganwendung, da kommts auf Größe und Gewicht an. 
Nicht jeder bastelt nur fürs Steckbrett du Checker..

gruß cyblord

von Mike (Gast)


Lesenswert?

Klaus Dieter schrieb:
> Aber da er die Software ja schon quasi "vorgekaut" serviert bekommen hat >(die 
Links von Spess), sollte der Rest ja auch kein Problem sein wenn man
> beim ATTiny25 bleiben möchte.


Naja, vorgekaut ist das nicht gerade. Höchstens erwärmt, da hier die 
halbe libary verändert werden muss, um sie verwenden zu können. Gibt es 
denn nicht eine komplett fertige libary, die nach dem copy-paste 
verfahren direkt auf dem tiny genutzt werden kann? es kann doch nicht 
sein, dass es sowas nicht gibt.

welchen anderen uC würdet ihr empfehlen, mit dem ich direkt eine 
Datenübertragung durchführen kann, ohne mir vorher softwaremäßig 
Schnittstellen definieren muss.

von Klaus Dieter (Gast)


Lesenswert?

Das die Tinys nur bei hohen Stückzahlen Sinn machen, sehe ich jetzt so 
auch nicht. Aber zum Basteln / Üben auf dem Steckbrett sehe ich in der 
Tat einen größeren Controller (z.B. ATMega32) als Sinnvoll an. Zum Einen 
hat man da eine Menge an Peripherie und muss sich (gerade als Anfänger) 
nicht mit dingen wie Soft-Uart/PWM oder was auch immer herumschlagen. 
Auch neigen Anfänger dazu, nicht gerade optimalen Code zu produzieren. 
Klar, ein größerer Flash ist kein Freischein für Spaghetticode, aber um 
die Anfangsfrustration so klein wie möglich zu halten, ist es glaube ich 
gar nicht mal schlecht, wenn der Code in den Controller passt und auch 
erstmal irgendwie funktioniert. Der geborene Bastler fängt dan von ganz 
alleine an, Dinge zu optimieren und zu verschönern (das hoffe ich 
zumindest) :-D
Um noch einmal auf das ursprüngliche Thema zu kommen: Ich habe mir jetzt 
nicht die Mühe gemacht, die AVR307 mal zu kompilieren (hab auch leider 
gerade keine IDE/Compiler zur Hand), aber ich denke, ein bisschen Luft 
wird da noch sein. Die Frage ist ja, was man mit den erhaltenen Daten 
anstellen möchte. Vielleicht wird sich der TE ja dazu mal äußern.

von Klaus Dieter (Gast)


Lesenswert?

Wieso muss die ganze Library verändert werden? Sie liefert dir die 
Daten, die von deinem GPS Empfänger kommen. Das ist doch das was du 
wolltest, oder nicht?

von Klaus Dieter (Gast)


Lesenswert?

Habe gerade gesehen, dass das für den IAR Compiler geschrieben ist, 
trotzdem ist das eine ganz brauchbare Basis.

von Mike (Gast)


Lesenswert?

Ich will damit die Geschwindigkeit ermitteln. Das ist auch kein Problem. 
Das Problem ist halt wie erwähnt, dass ich die Daten die mir der 
Empfänger liefert halt brauche, aber sie nicht auf den uC bekomme.

Nein, sie liefert mir keine Daten,da niemals ein interrupt ausgelöst 
wird. (habe das auch shcon auf meinen Compiler angepasst)

von Stefan W. (dl6dx)


Lesenswert?

Mike schrieb:
> Ich will damit die Geschwindigkeit ermitteln.

Das heißt, dein eigentlicher Anwendungscode wird
a) die empfangenen GPS-Daten zwischenspeichern müssen (zumindest einige 
Wegpunkte) und
b) auch einiges an numerischer Rechnerei enthalten.

Dann solltest du ernsthaft überlegen, einen größeren AVR zu verwendet, 
der genügend RAM und Flash hat. (Und auch einen UART.) (Tipp: Einfach 
mal überschlägig ausrechnen, wie viele Bytes RAM allein die FIFOs für 
den UART und die Buffer für die Empfangsdaten belegen. Du wirst dich 
wundern.)

Es ist wesentlich angenehmer, wenn man keine Klimmzüge machen muss, um 
das letzte Byte des Programms oder der Daten auch noch unterzubekommen.

Grüße

Stefan

von Klaus Dieter (Gast)


Lesenswert?

Dann hast du sicherlich irgendwo noch einen Fehler drin. Guck dir mal 
folgendes an:
Beitrag "Re: IAR vs. GCC"

von Rangi J. (rangi)


Lesenswert?

software-uart sind doch nur ein paar zeilen code, und bei der langsamen 
datenrate auch kein problem, er muss ja auch nur rx umsetzen, tx braucht 
er nicht, das ding sendet ja von alleine
hier mal ein bsp mit 57600Baud
1
u8 sio_rx_state;
2
u8 sio_rx_byte;
3
4
void ssio_init(void)
5
{
6
  DDRB &= ~(1<<2);   /*interrupt*/
7
  MCUCR |= ((1<<ISC01)|(0<<ISC00))  /*fallende flanke*/;
8
  GIFR|=(1<<INTF0);
9
  GIMSK |= (1<<INT0);
10
  /* Rx-Timer */
11
  TCCR0A = (0<<COM0A1)|(0<<COM0A0)|(0<<COM0B1)|(0<<COM0B0)|(1<<WGM01)|(0<<WGM00);
12
  OCR0A = 139;   /*17,361µs = 57600 Baud >> 138,8 * 0,125µs @ 8MHZ*/  
13
  TIMSK |= (1<<OCIE0A);
14
}
15
16
17
ISR(INT0_vect)   /* StartBit - Fallende Flanke*/
18
{
19
  GIMSK &= ~(1<<INT0);   /*interupt ausschalten und Timer starten nach dem 10. Bit wird der Int wieder eingeschaltet */
20
  TCNT0 = 0;
21
  sio_rx_state=0;
22
  TCCR0B = (0<<FOC0A)|(0<<FOC0B)|(0<<WGM02)|(0<<CS02)|(0<<CS01)|(1<<CS00);    /* Timer starten - kein vorteiler */
23
}
24
25
/* Rx - Timer */
26
ISR(TIMER0_COMPA_vect) 
27
{
28
  if(sio_rx_state<8)
29
  {
30
    sio_rx_state++;
31
    sio_rx_byte>>=1;
32
    if(PINB & (1<<2)) sio_rx_byte |= 0x80;
33
  }
34
  else
35
  {
36
    TCCR0B = 0;  /*timer stoppen*/
37
    GIFR |=(1<<INTF0); /*interrupt wieder an*/
38
    GIMSK |= (1<<INT0);
39
    if(PINB & (1<<2)) /* stop-bit = 1*/
40
    {
41
      /*
42
         hier wurde das byte empfangen und liegt in "sio_rx_byte"
43
      */
44
    }
45
  }
46
}

von spess53 (Gast)


Lesenswert?

Hi

>> Ich will damit die Geschwindigkeit ermitteln.

>Das heißt, dein eigentlicher Anwendungscode wird
>a) die empfangenen GPS-Daten zwischenspeichern müssen (zumindest einige
>Wegpunkte) und
>b) auch einiges an numerischer Rechnerei enthalten.

Nicht unbedingt. Im RMC-Datensatz ist 'Speed Over Ground' enthalten. Und 
VTG enthält die horizontale Geschwindigkeit in Knoten und km/h.
Wenn das reicht, braucht man nicht viel rechnen.

MfG Spess

von Stefan W. (dl6dx)


Lesenswert?

spess53 schrieb:
> Nicht unbedingt. Im RMC-Datensatz ist 'Speed Over Ground' enthalten. Und
> VTG enthält die horizontale Geschwindigkeit in Knoten und km/h.
> Wenn das reicht, braucht man nicht viel rechnen.

Stimmt. Da ich das bislang nie brauchte, hatte ich das nicht mehr in 
Erinnerung. (Meine GPS-Empfänger stehen fix, ich brauche nur das 
1PPS-Signal, die exakte Zeit und den Ort.)

Grüße

Stefan

von Morz Kerl (Gast)


Lesenswert?

>Milchbube schrieb:
> Was sollen diese Tinies? Die machen erst bei hohen Stueckzahlen Sinn.
> Was spricht gegen einen normalen Mega? Und auch nicht den 8er, der ist
> zu klein.

Cyblord...
So ein quatsch. Der Vorteil eines Tiny ist seine gringe Größe. Bei mir
gings um eine Modellfluganwendung, da kommts auf Größe und Gewicht an.
Nicht jeder bastelt nur fürs Steckbrett du Checker..

Naja, wenn Groesse ein Thema ist, das gibt's ja neben dem TQFP auch noch 
die MLF44 Gehaeuse. Dort ist ein Mega324 auch nur noch 7x7mm

von spess53 (Gast)


Lesenswert?

Hi

>Naja, wenn Groesse ein Thema ist, das gibt's ja neben dem TQFP auch noch
>die MLF44 Gehaeuse. Dort ist ein Mega324 auch nur noch 7x7mm

Deswegen ist und bleibt die Aussage von Milchbube trotzdem Unsinn. 
Außerdem hat jemand, der einen ATMega32 vorschlägt entweder seit Jahren 
nichts mit AVRs gemacht oder hat sich nicht getraut neuere AVRs 
anzufassen weil es dafür keine Tutorials gibt. Die aktuellen ATTinys 
haben außerdem einige Features, die ATMegas nicht haben.

MfG Spess

von Mike (Gast)


Lesenswert?

spess53 schrieb:
> Nicht unbedingt. Im RMC-Datensatz ist 'Speed Over Ground' enthalten. Und
> VTG enthält die horizontale Geschwindigkeit in Knoten und km/h.
> Wenn das reicht, braucht man nicht viel rechnen.

Ja, genauso habe ich es realisiert. Habe mir vorher auf dem Papier die 
kmh in kts umgerechnet und dann die kts-Werte zur realiserung genutzt, 
da es nur 6 verschiedene Werte sind, bei denen etwas passieren soll.



Des Weiteren habe ich den Interrupt von Extern zu PinChange gemacht, da 
mein Gps-Signal auf Pin 0 angeschlossen ist und dort nur der PCINT0 zur 
Verfügung steht. Mein Problem ist allerdings, dass trotz Änderung des 
Pin 0 in der main nie ein interrupt ausgelöst wird. Was mache ich 
falsch?


void ssio_init(void)
{
  DDRB = (0<<PB0) | (1<<PB3);   // PB0: Input -> GPS-Daten , PB3: Output 
-> Schaltsignal

  PCMSK |= (1<<PCINT0);     //PC Int0 aktiv
  GIFR|=(1<<PCIF);      //PC Int aktiv
  GIMSK |= (1<<PCIE);       //PC Int aktiv

  /* Rx-Timer */
  TCCR0A = 
(0<<COM0A1)|(0<<COM0A0)|(0<<COM0B1)|(0<<COM0B0)|(1<<WGM01)|(0<<WGM00); 
// Timer zurücksetzen nach Vergleich
  OCR0A = 33;   /*208,3µs = 4800 Baud >> 32,5 * 6,4 µs @ 10MHZ mit 
Prescaler = 64*/
  TIMSK |= (1<<OCIE0A); //Timer Interrupt aktiv

}


ISR(INT0_vect)
{
    x = 1;
}

von spess53 (Gast)


Lesenswert?

Hi

>Was mache ich falsch?

>ISR(INT0_vect)
>{
>    x = 1;
>}

Du willst nicht INT0. Du willst PCINT0! Also nimm auch den passenden 
Interrupt.

MfG Spess

von Mike (Gast)


Lesenswert?

Danke, manchmal sieht man den Wald vor lauter Bäumen nicht!

Trotzalle dem geht dieser Interrupt immer noch nicht, obwohl ich wie 
erwähnt den Pin seinen Zustand wechseln lasse.Weder bei In-, noch bei 
Output funktioniert das ganze.

von Klaus Dieter (Gast)


Lesenswert?

Stimmen die Signalpegel?

von spess53 (Gast)


Lesenswert?

Hi

>Trotzalle dem geht dieser Interrupt immer noch nicht,

Hast du die Interrupts auch global freigeschaltet?

MfG Spess

von Cyblord -. (cyblord)


Lesenswert?

Morz Kerl schrieb:

> Naja, wenn Groesse ein Thema ist, das gibt's ja neben dem TQFP auch noch
> die MLF44 Gehaeuse. Dort ist ein Mega324 auch nur noch 7x7mm

Ja na und? Haben wir übers Gehäuse geredet? Ich verwende auch einen 
tiny45 im SO8 Gehäuse. MLF44 zu löten ist nochmal ne andere Baustelle. 
Und da ist nunmal ein tiny in SO8 ein guter Kompromiss.
Aber darum gings doch gar nicht. Was soll das denn? Immer diese 
pauschalen Null-Aussagen. Da Atmel Tinys produziert wird es auch 
Abnehmer geben. Also haben sie wohl auch ihre Berechtigung. Oder sind 
die alle doof und nur ihr wisst Bescheid? Die neuen Tinys sind wirklich 
Klasse von der Ausstattung her.

Aber Spess hat schon recht, wer einen Tiny45 mit einem Mega32 ersetzen 
würde, der hat sowieso keine Ahnung mehr was um ihn rum so passiert.

gruß cyblord

von Mike (Gast)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Trotzalle dem geht dieser Interrupt immer noch nicht,
>
> Hast du die Interrupts auch global freigeschaltet?
>
> MfG Spess


Ja habe ich. Das komische ist aber, dass des I-FLag im Sreg manchmal 
durch die funktion "sei()" gesetzt wird und manchmal nicht.

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.