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
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
A tutaj obsługa przerwania od USART
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
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
}