AVR:99 GPS duomenų analizė ir LUFA USB su COM

Šiais laikais, kai kiniški GPS imtuvai visai atpigo, kilo noras panaudoti juos kaip RTC. Tačiau iškilo paprasčiausia problema- programinė įranga internete arba “arduino” arba “C++” arba velniai žino kokia. O man reikėjo kažko paprasto, grynam AVR GCC. Todėl, pasižvalgant į svetimą softą, iškilo mano NMEA teksto analizatorius. Jo dirbimo rezultatas- struktūra užpildyta duomenim, tuos duomenis galima ir parodyti per COM portą, o galima panaudoti savo programoms.

putty output
Mano paprogramės duomenys parodyti raudonai, o baltai matosi duomenys iš GPS imtuvo. Pastabesni žmonės gali surasti kur tuo metu buvo Levas.
Matosi, kad ne visi sakiniai analizuojami- man visiškai neįdomu, kiek ir kur kabo satelitai, ar judėjimo gretis. Nereikalingus sakinius galima išjungti su konfiguracine programa, tačiau čia eina “default” duomenų srautas.

Hardwarė labai paprasta- dvi plokštelės iš kinijos ir keturi laidai: atmega32u4 ir uBlox NEO-6M:
LUFA AVR USB serial GPS uBlox NEO 6M

Programinės įrangos source code ir sukompiliuoti failai:
USB serial device on AVR ATMEGA32U4 source code LUFA and NMEA GPS parser for uBlox NEO 6M.

13 replies on “AVR:99 GPS duomenų analizė ir LUFA USB su COM”

  1. Sveikas,
    Gal teko domėtis, kaip pagal tuos RTC duomenis automatiškai pakoreguoti languoto kompo laiką? Manau, tam užtektų GPS imtuvo pajungto prie COM porto ir kažkokio serviso. Bet ant PC apie servisų programavimą visiškai nieko nežinau. Gal teko kažką panašaus kur užmatyti?

  2. Kad tu Civiku pilna:
    Čia.

    Dėl RTC ir languoto kompo. O koks tikslumas reikalingas? Nes plius-minus sekundė tai paprasta, bet sekundės dalimis tai jau problema- reikia įvertinti serial porto laginimą ir šiaip. Gal papildomai pagal pps signalą dar? Tačiau jau tai rimtesnis softas.

  3. Sveikas, Levai. Ant smugio perziurejau dali kodo, tai serial receive pertrauktyje radau klaida:
    if(a > 0x20 || a==0x0A || a==0x0D)
    {
    rx[rxn++]= a; // SAVE simbol, and POSTincrement rxn
    rx[rxn+1]=0; // cia gali iseiti uz buferio ribu…
    if(a==0x0A) {rxFlag=1;}// notify main of receipt of data.
    }
    siulau keisti:
    if ( ‘ ‘

  4. Dėl galimo buffer overflow. Yra toks:

    #define BUFFER_SIZE 100
    char rx[BUFFER_SIZE+2];

    ir

    if (rxn==BUFFER_SIZE)

    Tai kaip ir papildomi 2 baitai rezerve. Aš nežinau kaip rezervuoja GCC stringus, bet rodos dar vienas baitas nuliui automatiškai užsirezervuoja. Bet nepasitikiu, tai užtat +2.
    Tiesa, čia buvo copy-paste iš kito projekto, tai gali buti, kad to užnulinimo visiškai nereikia. Kitam projekte buvo kovojama su CR+LF, poto prijungus prie kitos OS, jau ten buvo LF+CR… ir buvo bėda su pabėgusiu ar CR arba LF.
    Čia rodos max NMEA ilgis iki 80 baitų…

    Dėkui už pastabą.

  5. Papildau, nes nukarpe ka siunciau…
    rx[rxn+1]=0; reikia keisti i rx[rxn]=0;
    simboli deti i podeli gali jei daugiau lygu SPACE
    kitaip jei NL arba CR ir rxn nelygu nuliui tik tada rxFlag=1 ir nereika rxn++ bei talpinimo i podeli.
    isvedant eilutes papildai tik NL arba NL+CR
    main cikle rxn apnulini ir rxFlag numeti tik atlikes viska kas priklauso…
    o del svetimo kodo tai uzjauciu, nes ko tik nepasitaiko interneto platybese.

  6. Čia kad ir kitiem skaitytojams aiškiau matytusi:

    Buvo:

    ISR(USART1_RX_vect, ISR_BLOCK)
    {
    unsigned char a = UDR1;
    
    	if (rxn==BUFFER_SIZE) // if BUFFER_SIZE is reached, reset to start of buffer. 
    		rxn=0;
    	if(a > 0x20 || a==0x0A || a==0x0D)
    	{
    		rx[rxn++]= a; // increment rxn and return new value.  
    		rx[rxn+1]=0;
    		if(a==0x0A) {rxFlag=1;}// notify main of receipt of data.
    	}
    }
    


    Gavosi:

    ISR(USART1_RX_vect, ISR_BLOCK)
    {
    unsigned char a = UDR1;
    
    	if (rxn==BUFFER_SIZE) // if BUFFER_SIZE is reached, reset to start of buffer. 
    		rxn=0;
    	if(a > 0x20 || a==0x0A || a==0x0D)
    	{
    		rx[rxn++]= a; // increment rxn and return new value.  
    		rx[rxn]=0;
    		if(a==0x0A) {rxFlag=1;}// notify main of receipt of data.
    	}
    }
    

    Deja, 0A ir oD išmesti negalima, nes tada negražiai rodo ant putty ekrano. Analizei ir mano paprogramei tikrai nereikia CR ir LF kodo.

  7. Šiandien per pietus kaiptik apie tai ir galvojau. Va pvz paimti Tavo projektuką, pasikoreguoti, kad duotų tik laiką ir datą ir su komandinės eilutės skriptu pažaisti per shedulerį Aišku reikia tikrinti, ar laikai, datos perdaug nesiskiria nuo esamo, kad paskui dėl blogo priėmimo nepradėtų serverio laikas šokinėti

  8. Standartinės priemonės netinka, nes nėra ir nebus interneto, saugumo sumetimais. Nors jei kokį labai gerą firewal’ą pastačius – galbūt

Leave a Reply

Your email address will not be published. Required fields are marked *