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

[c][ATMega16/32] - Peter Fleury UART lib.

mojsamspam 23 Wrz 2009 16:03 2133 3
REKLAMA
  • #1 7049381
    mojsamspam
    Poziom 11  
    Witam,

    staram się wyświetlić na konsoli terminalowej dane jakie odbiera uC z modułu GPS zgodnego z NMEA0183.

    Zmiany jakie przeprowadziłem w pliku uart.c:
    - dopisałem funkcję char *getstring(int item) zwracającą bufor danych UART do programu głównego
    
    char *getstring(int item)
    {
    while(semafor);
    if(item==0) return znak2;
    else return znak3;
    }
    

    - zmodyfikowałem obsługę przerwania SIGNAL(SIG_UART_RECV) dopisując następujący kawałek kodu na koniec funkcji:
    
        unsigned char tmptail;
    
        if(UART_RxHead!=UART_RxTail)
    	{
    		tmptail = (UART_RxTail + 1) & UART_RX_BUFFER_MASK;
    	    UART_RxTail = tmptail;
    	    data = UART_RxBuf[tmptail];
    
    		if(UDR=='$') {index=0;} //if znak $ w UDR
    		znak[index]=data;
    		if(znak[index]==0x0A) //if znak LF
    		{
    			znak[index]='\0';
    			int i;
    			semafor=1;
    			for(i=0;i<=index;i++) znak2[i]=znak[i];
    			semafor=0;
    		}
    		index++;
    	}
    


    I jeszcze poniżej main:
    
    #define F_CPU 16000000
    #include <stdlib.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    #include <avr/pgmspace.h>
    #include <util/delay.h>
    #include <string.h>
    
    #include "uart.h"
    
    #define UART_BAUD_RATE 9600
    
    int main(void)
    {
        uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
        sei();
    	uart_puts_P("\n\r---------------Program started---------------\n\r");
    
    	char a[83]="dummy",b[83]="dummy2";
        for(;;)
        {
    		strcpy(a,getstring(0));
    		if(strcmp(b,a)!=0)
    		{
    			uart_puts(a);
    			uart_putc('\r');
    			uart_putc('\n');
    			strcpy(b,a);
    		}
        }
    }
    


    A oto jaką bzdurę zwraca terminal:
    [c][ATMega16/32] - Peter Fleury UART lib.

    Program powinien rozróżniać, czy linia nie została już wyświetlona ponieważ przed każdym wyświetleniem danych z bufora, są one porównywane z danymi, które wyświetlono w poprzednim cyklu.
    Kolejnym problemem jest, iż program się restartuje bez przyczyny - widać to na zrzucie ekranu.

    Wszelkie sugestie i uwagi mile widziane.

    Pozdrawiam,
  • REKLAMA
  • #2 7049728
    maly_elektronik
    Poziom 23  
    Czy czasem nie trzeba w F_CPU 1600000[L] dodać na końcu L :?:
  • REKLAMA
  • #3 7050553
    mojsamspam
    Poziom 11  
    problem nadal występuje :(
  • #4 7485610
    mojsamspam
    Poziom 11  
    Problem okazał się brak rezystora dociągającego linię Tx modułu GPS to linii Rx procesora. Po podłączeniu linii danych do masy z użyciem rezystora 4.7kOm, problem znikł.

    Co ciekawe przy podłączeniu linii Tx modułu GPS do linii Rx modułu FT232RL problem nie występował.

    Mam nadzieję, że komuś pomoże to info :)

    P.S. Niestety dopiero po niespełna 4 miesiącach znalazłem czas, aby znowu wrócić do tego tematu.. lepiej późno niż wcale ;-)

    Pozdrawiam,
    mojsamspam
REKLAMA