logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATmega16][C] Moduł GPS nie przesyła ramek NMEA

golas17 18 Paź 2009 12:24 3291 7
  • #1 7143062
    golas17
    Poziom 16  
    Witam,
    Mam taki moduł: Link
    Za pierwszym razem kiedy go podłączyłem do ATmegi dałem odwrotnie napięcie zasilania... Myślicie że mogło go to uszkodzić? Diodka modułu miga... Dymu nie było. A ramek nie odbieram po RS-ie. Tylko jakieś krzaki.

    Dzięki za każdą opinię
  • #2 7143129
    Terminator
    Poziom 23  
    Krzaki - ustawiona zła prędkość interfejsu Rs232 ? sprawdź na ATmedze czy się zgadza z parametrami wysyłania danych z GPS. A jeszcze szybciej podłącz pod pc i przetestuj na innych prędkościach odczytując dane a później wprowadź poprawną konfiguracje rejestrów w ATmedze.
  • #3 7143147
    golas17
    Poziom 16  
    Domyślne ustawienia modułu GPS: 4800, 1 stop bit, none parity


    #include <stdlib.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #define F_CPU 8000000UL
    #include <util/delay.h>
    #include "lcd.h"
    
    volatile unsigned char buf[15],i,j;
    
    //--------------------------------------------------------------------------------
    SIGNAL(USART_RXC_vect)
    {
    	if((j==0)&&(UDR=='$'))
    	{
    		buf[i]=UDR;
    		i++;
    		i=i%15;
    	}
    	
    }
    
    //--------------------------------------------------------------------------------
    void USART_Transmit( unsigned char data )
    {
    /* Wait for empty transmit buffer */
    while ( !( UCSRA & (1<<UDRE)) )
    ;
    /* Put data into buffer, sends the data */
    UDR = data;
    }
    //--------------------------------------------------------------------------------
    unsigned char USART_Receive( void )
    {
    /* Wait for data to be received */
    while ( !(UCSRA & (1<<RXC)) )
    ;
    /* Get and return received data from buffer */
    return UDR;
    }
    
    
    //--------------------------------------------------------------------------------
    int main()
    {
    		lcd_init(LCD_DISP_ON);		
    		
    		//inicjalizacja usart
       		UBRRL=103;
       		UCSRB|=_BV(RXEN)|_BV(TXEN)|_BV(RXCIE);
       		UCSRC|=_BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0); 
    		
    
    		sei();
    
    		while(1)
    		{
    			if((i==14)&&(j==0))
    			{
    				j++;
    				lcd_puts(buf);
    			}
    		}
    }
    


    Prędkość wydaje mi się dobrze dobrana. Zgodnie z datasheetem atmega16 - dla kwarcu 8MHz UBRRL=103;

    Dodano po 1 [minuty]:

    A pod pc podłączę dopiero jak znajdę jakiegoś staruszka ze złączem COM... bo ten moduł który posiadam ma złącze PS/2 + przejściówka na COM.
  • #4 7146887
    golas17
    Poziom 16  
    Witam,
    W temacie Link znalazłem taki oto kod:

    Open "comd.3:4800,8,n,1,inverted" For Input As #1
    
    Odczytaj_gps:
    
    Gpstxt = ""
    Przerwanie = 0
    Do ' W tej pętli szukaj znaku "R" (82). Ona zsynchronizuje odczyt $GPRMC ...
     Gps = Inkey(#1)
     Incr Przerwanie
    Loop Until Gps = 82 Or Przerwanie = 1024
        If Gps = 82 Then ' Jak znajdziesz to odbierz resztę
    
          Input #1 , Gpstxt
          Gpstxt = Left(gpstxt , 43)
             Dobry_odczyttxt = Mid(gpstxt , 15 , 1)       ' Sprawdz
                If Dobry_odczyttxt = "A" Then
                   Czastxth = Mid(gpstxt , 4 , 2)
                   Czastxtm = Mid(gpstxt , 6 , 2)
                   Szerokosctxtst = Mid(gpstxt , 17 , 2)
                   Szerokosctxtmin = Mid(gpstxt , 19 , 2)
                   Szerokosctxtsek = Mid(gpstxt , 22 , 4)
                   Szerokoscsek = Val(szerokosctxtsek)
                   Szerokoscsek = 0.006 * Szerokoscsek
                   Szerokosctxtsek = Fusing(szerokoscsek , "#.##")
                   Dlugosctxtst = Mid(gpstxt , 30 , 2)
                   Dlugosctxtmin = Mid(gpstxt , 32 , 2)
                   Dlugosctxtsek = Mid(gpstxt , 35 , 4)
                   Dlugoscsek = Val(dlugosctxtsek)
                   Dlugoscsek = 0.006 * Dlugoscsek
                   Dlugosctxtsek = Fusing(dlugoscsek , "#.##")
                   Knotstxt = Mid(gpstxt , 42 , 2)
                   If Knotstxt = "0." Then
                   Kmh = 0
                   Else
                   Kmh = Val(knotstxt)
                   Kmh = Kmh * 1.852
                   End If
                   Knotstxt = Fusing(kmh , "#.#" )
               
                   Locate 1 , 1 : Lcd "N=" ; Szerokosctxtst ; "'" ; Szerokosctxtmin ; "'" ; Szerokosctxtsek ; "  " ; Czastxth ; ":" ; Czastxtm ; "  "
                   Locate 2 , 1 : Lcd "E=" ; Dlugosctxtst ; "'" ; Dlugosctxtmin ; "'" ; Dlugosctxtsek ; " V=" ; Knotstxt ; "  "
                Else
    
                Locate 1 , 1 : Lcd "BRAK ODCZYTU GPS    "
                Locate 2 , 1 : Lcd "                    "
                End If
             
           End If
    Return


    Proszę o wyjaśnienie mi pierwszej linijki (nie znam bascom-a). Co oznacza to "inverted"? Wydaje mi się, że to może być moim problemem... Tylko jak zrobić coś podobnego w C?

    Dodano po 46 [sekundy]:

    Zwykła negacja bitowa (~UDR) nie działa...
  • #5 7146914
    Compiler
    Poziom 12  
    INVERTED powoduje że nastąpi odwrócenie polaryzacji (zanegowanie) sygnałów programowego urządzenia UART.

    Open "COMD.3:4800,8,N,1,INVERTED" For Input As #1
    spowoduje, że końcówka PORTD.3 stanie się wejściem programowego urządzenia UART. Transmisja będzie przebiegać w trybie 8 bitowym, z prędkością 4800 bodów i 1 bitem stopu. Nastąpi także odwrócenie polaryzacji sygnału.


    PS używasz oryginalnego kabla? Być może tam jest jeszcze jakaś elektronika ...
  • #6 7146925
    golas17
    Poziom 16  
    A ma to sens tylko w programowym UART-cie prawda(bo w transmisji szeregowej poziomy napięć są jakby odwrotne do logiki)? W sprzętowym nie trzeba czegoś takiego robić (bo to już zostało zrobione?).

    Dodano po 41 [sekundy]:

    Używam oryginalnego kabla.
  • #7 7192192
    marik_te
    Poziom 22  
    Golas17
    Udało Ci się uruchomić ten odbiornik? Bo mam podobny problem, parę znaków jest ok parę nie i tak w kółko. Też się krzaki pojawiają
  • #8 7204193
    golas17
    Poziom 16  
    Tak, udało mi się go uruchomić. Po prostu nie dałem max'a232 do konwersji RS na TTL... Myślałem, że taką konwersję realizuje właśnie sprzętowy USART w atmega... Mój błąd. Udało mi się mój egzemplarz skonfigurować na prędkość 9600bps. Kiedy chciałem wycisnąć z niego więcej była kiszka niestety. Może tobie się uda osiągnąć lepsze rezultaty. Powodzenia
REKLAMA