Attiny 25 - GPS -Empfang

Gast #2750669
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
Gast #2750697
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.
Gast #2750739
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.
Gast #2750744
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.
Gast #2750789
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
Gast #2750881
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.
Gast #2751235
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.
Gast #2751680
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?
Gast #2751686
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
#2751730
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
#2751759
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
Gast #2752034
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.
Gast #2752042
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.
Gast #2752078
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)
#2752095
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
#2752105
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
}
Gast #2752109
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
#2752139
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
Gast #2752362
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
Gast #2752409
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
Gast #2752432
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;
}
Gast #2752589
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.
#2752673
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren