Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[AVR] Data van de UART/GPS op een SD kaart schrijven

Pagina: 1
Acties:
  • 359 views sinds 30-01-2008
  • Reageer

  • Tim_bots
  • Registratie: April 2004
  • Laatst online: 15-10 07:59
Hallo,

Omdat ik GPS altijd leuk heb gevonden heb ik een tijd geleden een GPS ontvanger gekocht.

Nu zou ik alleen de data die van de GPS ontvanger afkomt willen opslaan op een SD kaartje zodat ik later kan zien waar de ontvanger allemaal geweest is.

Het opslaan van de data op het kaartje wil ik laten regelen door een ATMEGA32. Op http://www.roland-riegel.de/sd-reader/index.html heb ik de code gevonden om mijn ATMEGA32 met mijn SD kaartje te kunnen laten praten.

De data van mijn GPS ontvanger komt alleen niet goed ontvangen. Nu heb ik een simpele test uitgevoerd middels HyperTerminal. Als ik een "character delay" van 2 ms instel komt alle data goed door. Maar als ik deze instel op 0 ms komt de data niet goed door.

Het lijkt er dus op dat de data te snel binnenkomt. toch vreemd: de data komt binnen met "slechts" 4800 baud en de atmega32 is geklokt op 20MHz

In de code zit al een (ring) buffer van 512 intergers (8 bit) die wordt gevuld door de interrupt routine en wordt leeggehaald in de main lus.

Een samenvatting van de gegevens:
Atmega32 op 20MHz (4MHz overgeklokt)
Seriële instellingen (niet aan te passen in mijn GPS ontvanger): 4800-8-N-1 (geen flow control)
De code: http://tbots1.files-upload.com/files/318811/UARTSD.zip
Het testbestandje: http://tbots1.files-upload.com/files/318812/random.txt
Het resultaat zonder character delay : http://tbots1.files-upload.com/files/318814/LOG003.TXT
Het resultaat met character delay : http://tbots1.files-upload.com/files/319000/LOG004.TXT

Ter info: mijn ontvanger stuurt eens per seconde een "pakket" data uit.
Dit pakket ziet er als volgt uit:
code:
1
2
3
4
5
6
$GPGGA,084447,5133.4558,N,00451.7980,E,1,09,00.9,00004.9,M,047.0,M,,*49
$GPGSA,A,3,01,02,04,05,06,09,14,25,30,,,,01.7,00.9,01.4*04
$GPGSV,3,1,12,01,28,310,48,02,27,093,51,04,21,053,49,05,73,076,51*7C
$GPGSV,3,2,12,06,29,205,48,09,30,138,48,14,42,264,50,20,03,350,00*70
$GPGSV,3,3,12,24,03,016,00,25,13,308,43,30,72,274,50,37,,,47*44
$GPRMC,084447,A,5133.4558,N,00451.7980,E,068.2,077.0,251205,,,A*78

Alvast hartelijk bedankt voor al jullie hulp en reacties, Tim Bots


  • StapelPanda
  • Registratie: Februari 2005
  • Laatst online: 19-11 11:29

StapelPanda

PB0MV

Ik heb geen verstand van AVR's, maar moet je niet ergens aangeven hoe snel je processor is, in de main.c zie ik het nergens staan. en dit is wel belangenrijk voor de timing, de karakters liggen namenlijk veels te hoog in hun hex waardes.

  • Tim_bots
  • Registratie: April 2004
  • Laatst online: 15-10 07:59
Gieltjev schreef op zondag 24 juni 2007 @ 14:31:
Ik heb geen verstand van AVR's, maar moet je niet ergens aangeven hoe snel je processor is, in de main.c zie ik het nergens staan. en dit is wel belangenrijk voor de timing, de karakters liggen namenlijk veels te hoog in hun hex waardes.
Gieltjev, De snelheid van de processor staat aangegeven in de makefile. Verder zou ik nog wel graag willen weten wat je bedoeld met "de karakters liggen namenlijk veels te hoog in hun hex waardes.". Mocht je hiermee de 0x30 bedoelen die ik optel bij de counter, Dit doe ik om op een gemakkelijke manier van decimaal naar decimaal (ascii) om te zetten. Kijk maar op http://www.asciitable.com/ en dan zie je dat je dat er een verschil van 0x30 tussen zit.

Alvast hartelijk bedankt voor al jullie hulp en reacties, Tim Bots


Verwijderd

Weet je zeker dat het niet door die overclock komt?
En voor de duidelijkheid, je hebt wel max232 of soortgelijke ic's gebruikt voor de seriele poorten?

  • StapelPanda
  • Registratie: Februari 2005
  • Laatst online: 19-11 11:29

StapelPanda

PB0MV

Tim_bots schreef op zondag 24 juni 2007 @ 15:37:
[...]

Gieltjev, De snelheid van de processor staat aangegeven in de makefile. Verder zou ik nog wel graag willen weten wat je bedoeld met "de karakters liggen namenlijk veels te hoog in hun hex waardes.". Mocht je hiermee de 0x30 bedoelen die ik optel bij de counter, Dit doe ik om op een gemakkelijke manier van decimaal naar decimaal (ascii) om te zetten. Kijk maar op http://www.asciitable.com/ en dan zie je dat je dat er een verschil van 0x30 tussen zit.
Het meeste in je logfile zijn letters, dit zijn hex 41 tot 7A.
terwijl jij de cijfers wilt hebben: hex 30 tot 39.
probeer het eens zo aan te sluiten:
code:
1
2
3
GPS              ATMEGA               MAX232              PC
tx ---------------  rx 
rx                  tx -----------------------------------rx

en zorg dan dat de atmega verstuurd wat deze ontvangd.
in de makefile staat F_CPU = 20000000 , terwijl je een clock hebt van 20mhz + 4mhz overclock = 24 mhz toch?

[ Voor 10% gewijzigd door StapelPanda op 24-06-2007 23:12 ]


Verwijderd

[b]Gieltjev schreef op zondag 24 juni 2007 @ 23:07:[/
in de makefile staat F_CPU = 20000000 , terwijl je een clock hebt van 20mhz + 4mhz overclock = 24 mhz toch?
Die Atmega32 gaat maar tot 16MHz :)

Over clocksnelheden gesproken, het is toch niet stiekem een Atmega32L? Die gaat maar tot 8MHz.

  • Tim_bots
  • Registratie: April 2004
  • Laatst online: 15-10 07:59
Voor het aanmaken van de bestandsnaam heb ik een aantal cijfers nodig. De data in de log-file moet voor 100% overeenkomen met de input (ik wil de logger ook voor andere doeleinden gaan gebruiken)

het idee is als volgt:
code:
1
2
3
4
5
6
7
8
9
.                      init
                        |
  zoek naar een niet bestaande file naam (de 0x30)
                        |
maak een nieuw bestand aan (LOGXXX.TXT) XXX = getal
                        |
          open dit nieuwe bestand
                        |
  schrijf de data uit de buffer naar het bestand


Mijn huidige opstelling is als volgt:
code:
1
2
3
GPS              ATMEGA               MAX232               PC
tx                  rx ----------------------------------- tx
rx                  tx ----------------------------------- rx

De data die ik stuur vanaf de PC staat in random.txt en het resultaat in LOG003.TXT en LOG004.TXT (zie startpost).

de GPS ontvanger bied zowel ttl als RS232 niveau's aan en voor de koppeling aan de p.c. heb ik een max232. Ik zal vanavond nog even kijken wat mijn avr doet op 16MHz en of het geen L versie is. De klok draait op 20MHz maar het officiële maximum is 16MHz (= dus 4MHz overclock)

Alvast hartelijk bedankt voor al jullie hulp en reacties, Tim Bots


  • Tim_bots
  • Registratie: April 2004
  • Laatst online: 15-10 07:59
Het antwoorden heeft even wat langer geduurd i.v.m. afstuderen is gelukt :D

De atmega32 is geen L versie. Het volledige typenummer is ATMEGA32 16PI

Ook heb ik de atmega32 nog op 16MHz laten draaien. Zonder character delay komt er dit uit. Met een character delay van 2 ms komt er dit uit. Met of zonder character delay maakt op 16MHz niet uit. Het resultaat is in beide gevallen slecht. (met 2 ms iets beter)

Van alle data die de ontvanger verstuurd heb ik in ieder geval het GPGGA en het GPRMC veld nodig. De andere velden mogen weggelaten worden.
(dus zo:)
code:
1
2
$GPGGA,084447,5133.4558,N,00451.7980,E,1,09,00.9,00004.9,M,047.0,M,,*49
$GPRMC,084447,A,5133.4558,N,00451.7980,E,068.2,077.0,251205,,,A*78


Ik hoop dat iemand mij kan helpen

Alvast hartelijk bedankt voor al jullie hulp en reacties, Tim Bots


  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 19-11 15:57

Armageddon_2k

Trotse eigenaar: Yamaha R6

En op welke manier heb je 16Mhz nu gezet?
Heb je het ingesteld of daadwerkelijk een ander kristal er op gezet, want dat laatste zal sowiso nodig zijn anders flipt je systeem...

Ik heb even door je code gebladerd maar de manier van aanpak is wel een van de meest efficente manieren om dit aan te pakken..

Wat je kan proberen:
Schrijf vanuit je atmega (via rs232) naar je pc en kijk wat je ontvangt.
Doe dit ook andersom.
Schrijf vaste waarden bv: "testing line" naar je SD kaart en kijk hoe dit gaat.

Sluit eerst uit waar de problemen kunnen zitten.

  • Tim_bots
  • Registratie: April 2004
  • Laatst online: 15-10 07:59
Armageddon_2k schreef op vrijdag 29 juni 2007 @ 14:19:
En op welke manier heb je 16Mhz nu gezet?
Heb je het ingesteld of daadwerkelijk een ander kristal er op gezet, want dat laatste zal sowiso nodig zijn anders flipt je systeem...
Ik heb zowel het kristal vervangen (speciaal printje) als een nieuw programma ingeladen.
Ik heb even door je code gebladerd maar de manier van aanpak is wel een van de meest efficente manieren om dit aan te pakken..

Wat je kan proberen:
Schrijf vanuit je atmega (via rs232) naar je pc en kijk wat je ontvangt.
Doe dit ook andersom.
Schrijf vaste waarden bv: "testing line" naar je SD kaart en kijk hoe dit gaat.
Dit laatste heb ik al gedaan middels het bestandje random.txt en het resultaat staat in de LOGXXX.TXT bestanden.
Sluit eerst uit waar de problemen kunnen zitten.
Ook heb ik nog wat huiswerk gedaan maar op 20 MHz en een delay van 2 ms komt dit neer op een magere 2400 bit's/sec :'( . Ik zal dus niet alle data kunnen opslaan. (de SPI bus draait nu op 10MHz en dat is niet te verhogen :'( ).

iemand ideen om het te verbeteren??

Alvast hartelijk bedankt voor al jullie hulp en reacties, Tim Bots


  • vso
  • Registratie: Augustus 2001
  • Niet online

vso

tja...

iemand was je voor
http://www.makezine.com/blog

ff zoeken hier op GPS + memorykaart (sd hadden ze ook geloof ik) wellicht dat hier inspiratie opdoet

Tja vanalles


  • Tim_bots
  • Registratie: April 2004
  • Laatst online: 15-10 07:59
vso schreef op zondag 01 juli 2007 @ 03:04:
iemand was je voor
http://www.makezine.com/blog

ff zoeken hier op GPS + memorykaart (sd hadden ze ook geloof ik) wellicht dat hier inspiratie opdoet
ff gezocht: en dan wordt je doorgelinkt naar deze site. Als je daar wat beter gaat kijken blijkt echter dat je deze set nodig hebt. Ik weet niet of iemand mij voor $154.70 exclusief verzendkosten ;) wil sponsoren maar ik verwacht het niet.

Daarom wil ik het toch graag zelf doen met een atmega32 (of eventueel een snellere in een dil behuizing)

edit: nog ff de source van die kit doorgekeken en er staan misschien wel wat handige dingen in. Wat vreemd is in mijn opzicht is dat er geen gebruik gemaakt wordt van een interrupt :?

edit2: Het is gelukt. Omdat het niet mogelijk blijkt te zijn om (momenteel) een hogere datasnelheid te halen tijdens het wegschrijven van de data heb ik mijn code zo aangepast dat nu alleen de GPGGA en de GPRMC plaketten opsla (bespaart ook nog ruimte) ;) toch bedankt voor alle tip's.

Voor de geïnteresseerden hier is de code te vinden (samenvoegen met die uit de startpost)

[ Voor 28% gewijzigd door Tim_bots op 01-07-2007 19:24 ]

Alvast hartelijk bedankt voor al jullie hulp en reacties, Tim Bots

Pagina: 1