Hallo, bin komplett neu hier im Forum, auch wenn ich schon seit Jahren hier Tipps und Tricks gelernt habe. Daher entschuldigt bitte falls ich das thema falsch eingestellt habe oder es eventuell schon etwas ähnliches gibt. Habe aber bisher nichts passendes gefunden. Ich möchte mir eine Anzeige bauen mit 3 7-Sement anzeigen welche mir mit hilfe eines GPS Moduls die gefahrene Höchstegeschwindigkeit anzeigt. Am liebsten würde ich das mit einem Pic machen da ich bereits in meiner Ausbildung mit PIC's gearbeitet habe.(MPLab Assembler) Nun mein Problem: Welches GPS modul ist zu empfehlen? Es sollte möglichst klein und günstig sein. und bis 300Kmh messen. Welchen Pic brauche ich? (einen mit UART Schnitstelle?) und jetzt die eigentlich wichtigste frage.... Wie bekomme ich die Daten aus dem GPS modul? und wie werden die Daten von dem Modul im Pic gespeichert? das Auswerten und anzeigen der geschwindigkeit ist dann kein problem mehr. Würde das ganze dann auch mit eagle auf eine Platine ätzen. Hoffe es kann mir hier jemand weiterhelfen? MFG John
Alle GPS sind erts mal gleichwertig. Die Daten kommen im Sekundentakt automatisch aus dem modul, im NMEA protokoll. Entweder als RS232 oder als TTL version davon. Wahrscheinlich als TTL version. Ja, Ein PIC mit UART ist gut. Wie die Datem im PIC gehandhabt werden sollte trivial sein.
das mag zwar trivial sein, ich bin mir sogar sicher das es das ist aber mir fehlt einfach der anfang. eventuell ergibt sich das ganze auch wenn ich ein Modul habe und mit dem programmieren anfange aber im moment hätte ich keine idee:( wäre denn dieses Modul zb ok? http://www.navilock.de/produkte/F_829_GPS_60428/merkmale.html ist das nun TTL oder UART? Welches wäre besser für der verarbeitung? Brauche ich dafür noch eine Antenne? Eigenbau? Hätte vielleicht jemand ein paar zeilen wie man die Daten des GPS verarbeitet...steh da echt auf dem schlauch.....sorry:(
Eric John schrieb: > das Auswerten und anzeigen der geschwindigkeit ist dann kein problem > mehr. Eric John schrieb: > Hätte vielleicht jemand ein paar zeilen wie man die Daten des GPS > verarbeitet Was jetzt? Schau dir das NMEA Protokoll an. Eine einfache Suche im Internet liefert dir einen Haufen gute Treffer. unter anderem auch zu einem Artikel hier: NMEA
Google mal nach APRS. Wenn du mit PIC Programmieren möchtest, in ASM, dann findest du genug Programme wo du schauen kannst. 1. Uart (2400 BPS / 8N1) 2. NMEA Spec. dort den Entsprechenden Datensatz anscheuen 3. Kleines Filterprogramm zur Selektion der gewünschten Datenzeile 4. Anzeige des Wertes das bekommst du hin! OM
Eric John schrieb: > das mag zwar trivial sein, ich bin mir sogar sicher das es das ist aber > mir fehlt einfach der anfang. Das bedeutet dann, dass das Projekt für dich noch zu schwer ist und du dir erst mal ein einfacheres Projekt wählen solltest. Wenn du dann * Stringverarbeitung leidlich beherrscht * Mit deinem PIC eine UART bedienen kannst * Timer + Multiplexing beherrscht dann bist du soweit, dass du dein Projekt in Angriff nehmen kannst. "Ich will" unterscheidet sich von "Ich kann" in einem wichtigen Punkt. Das eine kann man schnell mal sagen. Das andere erfordert Arbeit. Der sicherste Weg ein Projekt 'erfolgreich' in den Sand zu setzen ist es, zu viele 'Kann-Ich-Nicht' Teilbereiche zu haben. Für einen Anfänger sollte die Anzahl n dieser Teile möglichst 1 nicht überschreiten. Stellt sich beim Zerlegen eines Projektes raus, dass man mehrere derartige Teile hat, dann ist es eine gute Strategie, diesen Teil erst mal abseits vom eigentlichen Projekt zu erforschen. Und PS: du willst mit der Ausgabeeinheit anfangen. Denn gerade am Anfang brauchst du eine Möglichkeit, wie dein Programm dir etwas mitteilen kann, so notwendig wie ein Stück Brot. Deine erste Sorge ist also nicht die GPS Maus, sondern das Anzeigesubsystem. Wobei 7-Segmentanzeigen etwas dürftig sind, aber immer noch besser als nichts.
Ein Modul zum Einbauen in eine Schaltung wird TTL haben, denn weshalb sollte man noch einen Max232 haben. Ein Modul im Gehaeuse fuer den Haushalt hat RS232, dann kann man's gleich an einen PC anschliessen
Es ist ja nicht so das ich noch garnichts mit pics gemacht habe. Aber es ist schon 2-3 Jahre her wo ich das letzte mal programmiert habe (in der Ausbildung) unter anderem I2C, Display, Stoppuhren mit Interrupt...usw Nur waren das alles Daten die aus Zahlen bestanden. Und mit der weiterverarbeitung der Daten meine ich nicht die Geschwindigkeit anzizeigen usw. Wenn das NMEA Protokoll beim Pic ankommt, wie greife ich da zu? in Welchem Register finde ich die Daten? Klar im Arbeitsregister....aber das Ganze protokoll passt doch wohl nicht ins Arbeitsregister oder? Hatten in der Ausbildung nur den 16F84 gehabt......vllt denke ich auch nur in zu kleinen Maßstäben. Werde mal nach ein paar beispielen googln....vllt löst sich das Problem ja von selbst. und ich werde mir erstmal ein GPS Modul besorgen. Was ich nur vermeiden wollte ist ein modul zu kaufen was hinterher nicht zu meiner Aufgabenstellung passt^^ Werde bis das modul hier ist mich mal wieder etwas einarbeiten mit Pics. Was würdet Ihr generell bevorzugen ASM oder C? Hatten im Studium jetztgelernt mit C Consolenprogramme zu schreiben und ich wollte auch mal meine Pic programme so schreiben. Was macht sich für solche aufgaben besser?
Eric John schrieb: > Wenn das NMEA Protokoll beim Pic ankommt, wie greife ich da zu? in > Welchem Register finde ich die Daten? > Klar im Arbeitsregister....aber das Ganze protokoll passt doch wohl > nicht ins Arbeitsregister oder? Das sind Strings. Also viele Zeichen hintereinander, die kommen über deine serielle Schnittstelle rein. Du brauchst also folgende teilbereiche (nach Karl Heinz) Serielle Schnittstelle lesen Daten in ein char-Array schreiben (Im Interrupt) Das Char Array nach Teil-Strings zu durchsuchen
Eric John schrieb: > Was würdet Ihr generell bevorzugen ASM oder C? > > Hatten im Studium jetztgelernt mit C Consolenprogramme zu schreiben und > ich wollte auch mal meine Pic programme so schreiben. > > Was macht sich für solche aufgaben besser? Klassische C Aufgaben. Der 16er Pic hatte doch auch noch die segmentierten RAM-Bereiche, oder? Das war grausam in Assembler. In C kümmert sich der Compiler drum, ausserdem nimmst du einen moderneren Pic mit mehr RAM. Die Stringverarbeitung und das zerlegen von NMEA Strings übst du am besten erst mal auf dem PC (Debugger!, einfaches Tracing). Das kannst du dann fast 1:1 auf den µC übernehmen.
AHHHHHHHH.......ich glaube jetzt habe ich den Anfang den ich gesucht habe^^ Wenn wir hier von C ausgehen dann ist mir klar wie ich den reinkommenden String nach meinem Datensatz durchsuche...das haben wir im Studium bis zum erbrechen gemacht^^ ich hatte nur kein Plan wie ich das mit Assembler realisieren soll. Denn werde ich mich mal mit C und Pic's auseinandersetzen und ein paar kleine programme schreiben. Vllt noch die Letzte kleine Frage da wir sowas in der Ausbildung nicht hatten..... Wenn ich die RX leitung vom GPS Modul an den Pic anschließe ist es doch völlig egal welchen Pin ich benutze da ich in C ja sicherlich vorher definiere über welchen Pin die Daten kommen? War ja bei Assembler und Display's auch so.
Bei den modernen PIC kann man die Funktion dem Pin zuweisen. Da die Leute hier ueblicherweise den Billigsten verwenden, wuerd ich mal sagen, nein, man muss im Datenblatt nachschauen, welcher Pin dem Rx zugewiesen wurde.
Im allgemeinen ist nicht jeder Pin ein Input für eine UART. Welche Pins das sind sagt dir im allgemeinen das Datenblatt (eher Buch :-)) des benutzten µCs. Das ist deine Bibel (incl. Errata). Ausser du willst die serielle in Software emulieren, dann kannst du jeden Pin mehmen, aber warum den Aufwand?
Eric John schrieb: > Wenn ich die RX leitung vom GPS Modul an den Pic anschließe ist es doch > völlig egal welchen Pin ich benutze da ich in C ja sicherlich vorher > definiere über welchen Pin die Daten kommen? Dein µC kann, wenn er in C programmiert wird, nicht mehr oder weniger als er kann, wenn er in Assembler programmiert wird. Nur weil man eine mathematische Arbeit über den letzten Satz vom Fermat nicht in Englisch abfasst sondern in Russisch, wird ja das Problem nicht leichter lösbar > > War ja bei Assembler und Display's auch so. Das Display war aber höchst wahrscheinlich auch nicht an eine Hardware-Unterstützung gebunden. Pin-wackeln kann man in jeder Programmiersprache immer. Aber wenn deine Hardware dir eine UART gibt und diese UARt an Pins gebunden ist, dann ist sie an diese Pins gebunden. Da kann eine Programmiersprache daran auch nichts ändern.
Das Problem, einen NMEA String auszuwerten, hatten schon andere vor Dir. Wenn Du das Rad nicht neu erfinden willst, google mal nach "NMEA Parser". Es gibt viele Beispiele in allen gängigen Programmiersprachen. Gruß, Bernhard
Und was ueberhaupt nicht gut ankommt, ist wenn Du beweist, dass Du nicht lesen kannst oder willst wie z.B. hier: Eric John schrieb: > wäre denn dieses Modul zb ok? > http://www.navilock.de/produkte/F_829_GPS_60428/me... > > ist das nun TTL oder UART? Das steht da ganz klar auf der verlinkten Seite, da haettest Du noch nicht mal das Datenblatt lesen muessen. Sorry, aber da hat dann kaum noch einer Lust, Dir zu helfen. fonsana
Ne eben nicht....auf der verlinkten seite Steht TTL und im Datenblatt steht UART....also was von beidem ist es nun? oder hat das Modul beides? oder ist UART=TTL...ich glaube nicht
- UART ist die Art, Daten zu transportieren (seriell, ansynchron) - TTL ist der Pegel auf dem das passiert ... also sind beide Aspekte mehr unabhängig von einander und deshalb widerspruchsfrei kombinierbar.
> Bei den modernen PIC kann man die Funktion dem Pin zuweisen. Da die > Leute hier ueblicherweise den Billigsten verwenden, wuerd ich mal sagen, > nein, man muss im Datenblatt nachschauen, welcher Pin dem Rx zugewiesen > wurde. ... wobei man sagen muss, dass die modernen PICs meist preiswerter sind als die ollen Kamellen.
Ich hoffe Ihr könnt mir jetzt weiterhelfen. Das programm soll die GPS Daten über die UART einlesen und gleich wieder rausschicken (erstmal). und nebenbei ein bisschen was anzeigen.... Leider produziert er am Ausgang nur Datenmüll, ab und zu kommen ein paar zeilen richtig raus. Habe das erst auf den Quarz geschoben aber mit dem neuen Quarz dürfte das ja nicht mehr passieren. Das schlimme ist das dieses Programm schonmal funktioniert hatte ohne probleme aber jetzt eben nicht mehr....ich verzweifle langsam. Vielleicht seht ihr etwas was ich falsch gemacht habe? list p=16f627 #define __16F627 #include <P16f627.INC> ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MESSAGES ;************************************************************** ; Configuration festlegen ; ;Power on Timer, kein Watchdog, HS-Oscillator, kein Brown out, kein LV-programming, MCLR, externer Oszillator __CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF & _MCLRE_ON & _ER_OSC_CLKOUT ;************************************************************** ;Registerzuordnung PORTA equ 0x05 PORTB equ 0x06 w_temp equ 0x20 status_temp equ 0x21 Eingang equ 0x22 Ausgang equ 0x23 DatenSindDa equ 0x24 einer equ 0x25 zehner equ 0x26 hunderter equ 0x27 zeit1 equ 0x28 org 0x000 goto init ;********************************************************** ; Interruptroutine für RS232-Empfang org 0x004 ; Interrupt beginnt immer bei Adresse 4 int movwf w_temp ; status retten swapf STATUS,w movwf status_temp ;RS232-Empfänger-Interupt? btfss PIR1,RCIF goto intEnde ; Interrupt kam von wo anders movfw RCREG ; RS232-Register auslesen movwf Eingang RS232out btfss PIR1,TXIF ; ist Sender leer ? goto RS232out ; nein, noch nicht leer movfw Eingang movwf TXREG ; und in den RS232-Sender schreiben bcf PIR1,RCIF ; interrupt-Flag löschen intEnde ; geretteten Status wieder zurückschreiben swapf status_temp,w movwf STATUS swapf w_temp,f swapf w_temp,w retfie ;************************************************************** ;Initialisierung init bsf STATUS,RP0 ;Bankumschaltung movlw b'11110000' movwf TRISA ;PortA Eingänge movlw b'00000110' movwf TRISB ;PortB Ausgänge bcf status,rp0 ;Bankumschaltung ; USART initialisieren BSF STATUS,RP0 ; Bank1 MOVLW 0x20 ; Sender: RS232 MOVWF TXSTA ; BCF STATUS,RP0 ; Bank 0 MOVLW 0x90 ; Empfänger: RS232 MOVWF RCSTA ; ; USART Baudrate einstellen BSF STATUS,RP0 ; Bank1 MOVLW D'23' ; Set Baud rate 14.7456 Mhz bei 38400 Baud MOVWF SPBRG BSF TXSTA, BRGH ; BRGH=1 BCF STATUS,RP0 ; Bank 0 ;Interrupts vorbereiten BSF STATUS,RP0 ; Bank1 BSF PIE1,RCIE ; Enable receive interrupts BCF STATUS,RP0 ; Bank 0 clrf PIR1 ; alle Interruptflags löschen BSF INTCON,GIE ; generell Interrupts erlauben BSF INTCON,PEIE ; Interrupts von Peripheriegeräten erlauben BSF CMCON, CM0 ;Komperatoreingänge auf Digital schalten BSF CMCON, CM1 BSF CMCON, CM2 ;************************************************************** ;Programm clrf PortB clrf POrtA clrf zeit1 movlw d'3' movwf einer movlw d'2' movwf zehner movlw d'1' movwf hunderter movlw d'200' movwf zeit1 goto multiplex multiplex movfw einer ;ständiges Multiplexen der anzeigen call anzeige bsf POrtA,0 call nachleucht clrf PortA movfw zehner ;ständiges Multiplexen der anzeigen call anzeige bsf POrtA,1 call nachleucht clrf PortA movfw hunderter ;ständiges Multiplexen der anzeigen call anzeige2 bsf POrtA,2 call nachleucht clrf PortA goto multiplex ;_____ Anzeige ____ anzeige addwf pcl, f ;Befehlszähler setzen goto angezeigte_null ;0 goto eins goto zwei goto drei goto vier goto fünf goto sechs goto sieben goto acht goto neun anzeige2 addwf pcl, f ;Befehlszähler setzen goto blinde_null ;0 goto eins goto zwei goto drei goto vier goto fünf goto sechs goto sieben goto acht goto neun ;______ Datensätze - Zahlen________ eins bsf PortB,7 ;a bcf PortB,6 ;b bcf PortB,5 ;c bsf PortB,4 ;d bsf PortB,3 ;e bsf PortB,0 ;f bsf PortA,3 ;g return zwei bcf PortB,7 ;a bcf PortB,6 ;b bsf PortB,5 ;c bcf PortB,4 ;d bcf PortB,3 ;e bsf PortB,0 ;f bcf PortA,3 ;g return drei bcf PortB,7 ;a bcf PortB,6 ;b bcf PortB,5 ;c bcf PortB,4 ;d bsf PortB,3 ;e bsf PortB,0 ;f bcf PortA,3 ;g return vier bsf PortB,7 ;a bcf PortB,6 ;b bcf PortB,5 ;c bsf PortB,4 ;d bsf PortB,3 ;e bcf PortB,0 ;f bcf PortA,3 ;g return fünf bcf PortB,7 ;a bsf PortB,6 ;b bcf PortB,5 ;c bcf PortB,4 ;d bsf PortB,3 ;e bcf PortB,0 ;f bcf PortA,3 ;g return sechs bcf PortB,7 ;a bsf PortB,6 ;b bcf PortB,5 ;c bcf PortB,4 ;d bcf PortB,3 ;e bcf PortB,0 ;f bcf PortA,3 ;g return sieben bcf PortB,7 ;a bcf PortB,6 ;b bcf PortB,5 ;c bsf PortB,4 ;d bsf PortB,3 ;e bsf PortB,0 ;f bsf PortA,3 ;g return acht bcf PortB,7 ;a bcf PortB,6 ;b bcf PortB,5 ;c bcf PortB,4 ;d bcf PortB,3 ;e bcf PortB,0 ;f bcf PortA,3 ;g return neun bcf PortB,7 ;a bcf PortB,6 ;b bcf PortB,5 ;c bcf PortB,4 ;d bsf PortB,3 ;e bcf PortB,0 ;f bcf PortA,3 ;g return angezeigte_null bcf PortB,7 ;a bcf PortB,6 ;b bcf PortB,5 ;c bcf PortB,4 ;d bcf PortB,3 ;e bcf PortB,0 ;f bsf PortA,3 ;g return blinde_null bsf PortB,7 ;a bsf PortB,6 ;b bsf PortB,5 ;c bsf PortB,4 ;d bsf PortB,3 ;e bsf PortB,0 ;f bsf PortA,3 ;g return nachleucht decfsz zeit1,1 goto nachleucht return END
Hier mal sehr vereinfch ohne Interrupt ohne anzeige und dem ganzen zeug es geht immernoch nicht, wenn ich das Programm so umschreibe das er nach jedem empfangenem Byte zb eine "3" sendet macht er das, auch in dem rythmus wie die Daten vom NMEA reinkommen. Daher denke ich das beim einlesen etwas nicht stimmt aber ich kann keinen fehler finden auch nach 3 std googeln und probiren nicht....hoffe wirklich das mir jemand helfen kann... ;************************************************************** ; Titel, Version und Datum festlegen ; Autor des Programms ;************************************************************** list p=16f627 #define __16F627 #include <P16f627.INC> ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MESSAGES ;************************************************************** ; Configuration festlegen ; ;Power on Timer, kein Watchdog, HS-Oscillator, kein Brown out, kein LV-programming, MCLR, externer Oszillator __CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF & _MCLRE_ON & _ER_OSC_CLKOUT ;************************************************************** ;Registerzuordnung Eingang equ 0x22 org 0x000 goto init ;************************************************************** ;Initialisierung init bsf STATUS,RP0 ;Bankumschaltung movlw b'11110000' movwf TRISA ;PortA Eingänge movlw b'00000000' movwf TRISB ;PortB Ausgänge BSF TRISB,1 ; RX-RS232 für USART-Modul BSF TRISB,2 ; TX-RS232 für USART-Modul bcf status,rp0 ;Bankumschaltung BSF CMCON, CM0 ;Komperatoreingänge auf Digital schalten BSF CMCON, CM1 BSF CMCON, CM2 ; USART initialisieren BSF STATUS,RP0 ; Bank1 MOVLW 0x24 ; Sender: RS232 MOVWF TXSTA ; BCF STATUS,RP0 ; Bank 0 MOVLW 0x90 ; Empfänger: RS232 MOVWF RCSTA ; ; USART Baudrate einstellen BSF STATUS,RP0 ; Bank1 MOVLW D'23' ; Set Baud rate 14.7456 Mhz bei 38400 Baud MOVWF SPBRG BSF TXSTA, BRGH ; BRGH=1 BCF STATUS,RP0 ; Bank 0 ;************************************************************** ;Programm RS232in btfss PIR1,RCIF goto RS232in ; Interrupt kam von wo anders movfw RCREG ; RS232-Register auslesen movwf Eingang RS232out btfss PIR1,TXIF ; ist Sender leer ? goto RS232out ; nein, noch nicht leer movfw Eingang movwf TXREG ; und in den RS232-Sender schreiben goto RS232in END
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.