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

[Atmega8][C] - przełączanie USART poprzez 74hct125

Grzybens 30 Lis 2009 18:20 2853 1
REKLAMA
  • #1 7328317
    Grzybens
    Poziom 13  
    Witam :)
    Zrobiłem układ, którego głównym elementem jest uC Atmega 8. Problem w tym że posiada ona w swojej strukturze tylko jeden port USART. W mojej aplikacji posiadam dwa urządzenia które komunikują się wykorzystując właśnie ten interfejs. Dodatkowo jedno z nich zasilane jest napięciem 3,3 V (odbiornik GPS) drugie natomiast 5 V (telefon). Analizując dokumentacje poszczególnych układów, które rozwiązywały by oba te problemy wybór padł na 74HCT125

    Schemat układu przedstawiam poniżej

    [Atmega8][C] - przełączanie USART poprzez 74hct125

    Z odczytem danych z odbiornika GPS nie ma problemu, widać że komunikacja działa, ponieważ dioda odbiorcza (LED2) cyklicznie miga. Problem rozpoczyna się podczas komunikacji z telefonem. Nie mogę go nijak zmusić do działania. Widać że uC wysyła komendy do niego, ale nie dostaje żadnych odpowiedzi ( brak migania diody LED2). Dodam, że wcześniej wykonałem podobny układ tyle tylko że uC gadał jedynie z telefonem, wtedy wszystko działało jak należy. W tym układzie korzystam z wcześniej napisanych funkcji, z tą różnicą, że dodatkowo dochodzi sterowanie układem 74HCT125.
    Nie wiem czemu nie chce to zadziałać, szczerze powiedziawszy skończyły mi się już chyba wszystkie pomysły :(

    Nadmienie jeszcze, ze kiedy podpinam układ do kompa i wpisuje znaki z hyperterminala dioda odbiorcza cały czas miga. Wygląda na to że jednak jakas komunikacja jest.

    Poniżej przedstawiam fragment kodu
    int main(void)
    {
    DDRB=0xFF; 			//port b jako wyjściowy
    PORTB=0x00;			//bez podciągania
    DDRC=0xFF; 			//port c jako wyjściowy
    PORTC=0x00;			//bez podciaganiem
    DDRD=0xF2; 			//PD7-PD4 i PD1 jako wyjścia PD3-PD0 jako wejścia
    PORTD=0xFF;			//z podciaganiem
    /////////////////////////////////////////////////////////////////
    GPS_RD_DIS;					//wylacz zezwolenie odczytu ramek z GPS
    GSM_RD_EN;					//wlacz zezwolenie odczytu ramek z telefon
    czekaj(1000);
    //X_OFF;
    data_out=&bufferOut[0];		//ustaw wskaznik danych wyjsciowych
    data_in=&bufferIn[0];		//ustaw wskaznik danych wejsciowych
    USART_Init(VUBRR);			//inicjalizuj USART
    sei();						//wlacz globalne przerwania
    wyslijtekst(echo_off);		//wyłącz echo z modemu
    wyslijtekst(AT);
    check_modem();
    /////********************** najpierw sprawdz modem
    
    	if (check_modem())				
    	{	
    
    		PORTC=0x03;					//modem gotowy mozna zaczynac zapal diody
    		on=1;						//ustaw flage zezwolenia na petle glowna
    		czekaj(5000);				//zaczekaj 
    		PORTC=0x00;					//ponownie zgaś diody
    	}						
    
    	else	
    	{
    	//	PORTC=0x02;					//błąd zapal jedna diode
    		on=0;						//kasuj flage zezwolenia na petle glowna
    	}
    	
    	if(on)
    	{
    								//inicjalizacja przerwania od licznika	
    		TIMSK=1<<TOIE0;			//zezwól na przerwania od licznika T0
    		TCNT0=overflow;			//ładuj licznik
    		TCCR0=0x05;				//preskaler na 1024
    		licznik=200;			//licznik przerwan
    
    //////////////********* Petla glowna programu - modem OK **************/////
    
    		while(1)			//jezeli modem poprawnie przeszedl test
    	 						//rozpocznij program głowny
    		{
    			if(chk_SMS==1)
    			{
    			chk_SMS=0;
    			TIMSK=0<<TOIE0;		//wylacz przerwania od licznika T0	
    			check_SMS();		//wyslij zapytanie o nowego SMSa
    			TIMSK=1<<TOIE0;		//wlacz przerwania od licznika T0
    			}
    			
    //			if(USART_stop_flag)			//jeżeli przyszła poprawna komenda z modemu 
    //			{
    //			USART_stop_flag=0;
    //			}
    			if(SMS_recive)			//otrzymano SMSa
    			{
    			SMS_recive=0;			//wyzeruj flage odbioru SMSA
    			TIMSK=0<<TOIE0;		//wylacz przerwania od licznika T0
    			SMS_analize(bufferIn);	//analizuj odebrana ramke z SMSem
    			TIMSK=1<<TOIE0;		//wlacz przerwania od licznika T0
    			}	
    		}
    	}
    //////////////*********************************************************/////			
    
    	else
    	{
    	
    //////////////********* Petla glowna programu - modem BAD **************/////
    
    		while(1)
    		{}					//jesli blad w tescie modemu 
    									//rob pusta petle
    //////////////*********************************************************/////
    	}
    }


    A tutaj obsługa przerwania od USART

    SIGNAL(SIG_UART_RECV)
    {
    RX_ON;
    
    	*data_in++ = UDR;			//przepisz znak z UDR do tablicy
    	count_RECV++;				//licz znaki
    
    }
  • REKLAMA
  • #2 7333405
    Tantalos
    Poziom 18  
    Wyjście TXD z uC jest niepotrzebnie podane przez bufor 74HCT125. Kiedy 74HCT125 jest w stanie wysokiej impedancji to wejście T1IN układu MAX3232 wisi w powietrzu i może powodować, że układ będzie wysyłał śmieci do telefonu.
REKLAMA