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

[ATmega 8][C][SiemensC35] - odczyt poziomu sygnału z anteny

cyber48 05 Kwi 2009 16:37 2187 4
REKLAMA
  • #1 6377261
    cyber48
    Poziom 10  
    Witam !

    Proboje stworzyc graficzna prezentacje poziomu sygnału dochodzącego do anteny mojego Siemensa C35. Uzywam Atmega8 i komendy AT+CSQ, pisze pod AVRStudio AVR/GCC.

    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <string.h>
    #include <util/delay.h>
    #include "lcd.h"
    
    #define FOSC 4000000
    #define BAUD 19200
    #define MYUBRR FOSC/16/BAUD-1
    
    unsigned char wys;
    
    void usart_init(unsigned int ubrr)
    {
    	UBRRH = (unsigned char)(ubrr>>8);
    	UBRRL = (unsigned char)ubrr;
    	UCSRB = (1<<RXEN)|(1<<TXEN);
    	UCSRC = (1<<URSEL)|(0<<USBS)|(3<<UCSZ0);
    }
    
    void nadaj_znak(unsigned char data)
    {
    	while(!(UCSRA&(1<<UDRE)));
    	UDR=data;
    }
    
    unsigned char odbierz_znak(void)
    {
    	while(!(UCSRA & (1<<RXC)) );
    	return UDR;
    }
    
    void wyslij_slowo(char *dana)
    {
    	int dlugosc_slowa, k =0 ;
    	dlugosc_slowa = strlen(dana);
    	for(k = 0; k<dlugosc_slowa; k++)
        {
       		nadaj_znak(dana[k]);
        }
    }
    
    int main(void)
    {
    
    	lcd_init(LCD_DISP_ON);
    
    	usart_init(MYUBRR);
    	_delay_ms(100);
    
    	wyslij_slowo("ATE0");
    	nadaj_znak(0x0D);
    
    	while(1)
       	{	
    		wyslij_slowo("AT+CSQ");	
    		nadaj_znak(0x0D);
       		
    		wys = odbierz_znak();
    		if(wys == 0x0A)			// jesli odebrano ENTER czyli LF 
    		{
    			lcd_gotoxy(0,0);
    			while(wys!=0x2B)	// dopoki nie odebrano '+' pobieraj znaki
     			{
    				wys = odbierz_znak();
    			}
    			lcd_putc(wys);
    			for(uint8_t p=0;p<10;p++)	// wpisz kolejno 10 znakow po '+' na LCD 
    				{
    					wys = odbierz_znak();	
    					lcd_putc(wys);				
    				}
    			
    		}
    		for(int j=0;j<100;j++) _delay_ms(10);
       	}
    }
    
    


    funkcje obslugi klawiatury i LCD sa ok. Transmisja do telefonu dziala bo wysylam SMS bez problemu. Uzywam kabelka Siemens ktory zasilam z pinu 4 napieciem +9V. Linie RX od stronu telefonu podlaczam do MAX232 na pin 8 - R2IN i dalej pinem 9 - R2OUT do ATmegi na jej pin 2 RxD. Niestety na LCD dostaje śmieci zamiast tego co powinienem - czyli chyba cos takiego: +CSQ: 20,99
  • REKLAMA
  • #2 6377984
    zumek
    Poziom 39  
    
    //...
                        Uart_napisz("AT+CSQ"); // podaj poziom sygnału
                        for(uint8_t k=1;k<100;k++) _delay_ms(10);
    		      
                        while(k<10)
                        {
                          poziom[k] = USART_in();
                          k++;
                        }
                           k = 0;
                           lcd_puts(poziom);
                                        
                           break;
           }
        }
    }

    a)Dlaczego uważasz, że telefon będzie czekał 1s z odpowiedzią :?:
    b)Jaką wartość ma zmienna 'k', po dojściu do pętli while(k<10) :?:
  • REKLAMA
  • #3 6378409
    cyber48
    Poziom 10  
    Ok, słusznie zauważyłeś mój błąd, już go poprawiłem jednak nadal nie odbieram tego co chcę,wiec prosze o kilka wyjaśnień.
    Otóż rozumiem, że funkcja "USART_in();" zwraca mi jeden znak, który przychodzi z telefonu. Napisałeś o tej 1 sekundzie - szczerze mowiąc robie pierwszy raz coś takiego i nie wiem ile należy tam zaczekać lub czy w ogole jakies opóźnienie w tym miejscu jest wymagane. Po podłączeniu telefonu do PC w terminalu i komendzie AT+CSQ dostaję +CSQ: 17,99. Problem w tym, że nie wiem jak to do konca jest - czy telefon po odebraniu AT+CSQ wysyła mi od razu cały string "+CSQ: 17,99" czy znak po znaku ? Prosiłbym o rozjaśnienie jak należałoby to odbierać :)
  • REKLAMA
  • #4 6378638
    zumek
    Poziom 39  
    cyber48 napisał:
    ... Prosiłbym o rozjaśnienie jak należałoby to odbierać :)

    Jasnowidzem niestety nie jestem :cry:
    Nie mam pojęcia, co robią Twoje funkcje Uart_napisz() i USART_in().
    Czy po wysłaniu kodu polecenia np. AT+CSQ, wysyłasz jeszcze znak końca linii :?: Bo jeżeli tego nie robisz, to telefon nadal czeka na dokończenie transmisji, gdyż "nie jest pewien", czy Ty czasem nie chcesz mu zaaplikować komendy AT+CSQ=?. Poza tym, odpowiedzi z telefonu, często i gęsto "poprzeplatane są" znakami końca linii i to Ty musisz wiedzieć "co jak, gdzie i kiedy", pisząc oprogramowanie
    I na koniec: zauważyłeś, że ciąg '+CSQ: 17,99' składa sie z 11 znaków, a Ty zarezerwowałeś na zmienną poziom , tylko 10 :?: A co ze znakami końca wiersza :?:
    Itp.
  • #5 6378827
    cyber48
    Poziom 10  
    Funkcje wkeiłem w listingu powyżej. Uart_napisz("xxxxxx"); -> wysyła do telefonu stinga xxxxx , natomiast USART_in(); -> pobiera z telefonu jeden znak odpowiedzi "+CSQ: 17,99"

    Wiec algorytm wygląda tak:

    1. wyslij do telefonu komendę AT+CSQ oraz znak CR - tutaj znow dzieki za blad, zapomniałem tego wysyłać..za dlugo juz na to patrze :/

    2. odbieraj funkcją USART_in(); znak po znaku z odpowiedzi "+CSQ: 17,99" do tablicy poziom[12]

    3. wyswietl odebrana tablice 'poziom' na LCD

    proboje dalej...


    OK, wkoncu działa jak chciałem. Dziekuje za cenne uwagi dot. znaków końca linii. Funkcje wysyłania komendy i odbioru działają, przyczyna smieci było odczytywanie z tel. nie tych linii które należało. Temat zamykam, zainteresowanych kodem odsyłam wyżej - edit. Pozdrawiam !
REKLAMA