Witam!
Mam taki oto problem. Gdy chcę za pomocą uC skomunikować się z c45, to nie zawsze przyjmie on komendę AT, ponadto nigdy mi nie odpowiada:( dla przykładu:
na komendę UART_sendstring("ATD+48886160558\n\r"); telefon odpowiada, próbuje zestawić połączenie, ale tego nie robi, bo nie jest to tryb voice.
na komendę UART_sendstring("ATD+48886160558;\n\r"); już nie odpowiada
tak samo przyjmie komendę AT^SDLD kasując ostatnio wybrany numer, ale na zwykłą komendę ATE0 nie odpowie...
pisząc program wzorowałem się na Link
Podaję kod:
Połączenie pc-uC na rsie jest bezproblemowe... w terminalu wszystko działa. Program jest napisany na poczekaniu, tzn własne funkcje (aż 2). Połączenie telefon - pc działa bez problemu, na każdą komendę w terminalu telefon odpowiada. Dodatkowo podczas połączenia uC - c45 komenda UART_sendstring("ATD48886150669\n\r"); wykonuje się tylko raz.... zatem tak jakby telefon nie odpowiedział komendą zakończoną '\n'
Mam taki oto problem. Gdy chcę za pomocą uC skomunikować się z c45, to nie zawsze przyjmie on komendę AT, ponadto nigdy mi nie odpowiada:( dla przykładu:
na komendę UART_sendstring("ATD+48886160558\n\r"); telefon odpowiada, próbuje zestawić połączenie, ale tego nie robi, bo nie jest to tryb voice.
na komendę UART_sendstring("ATD+48886160558;\n\r"); już nie odpowiada
tak samo przyjmie komendę AT^SDLD kasując ostatnio wybrany numer, ale na zwykłą komendę ATE0 nie odpowie...
pisząc program wzorowałem się na Link
Podaję kod:
// Sterownie diodą LED podłączoną do dowolnej linii mikrokontrolera
// za pomocą dowolnego znaku odebranego z portu szeregowego
// mikrokontrolera i wysyłanie jej stanu na port szeregowy
#include <avr/io.h> // dostęp do rejestrów
#include <string.h>
#include <util/delay.h>
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
// Zmieniając poniższe definicje można dostosować program do potrzeb
#define F_CPU 4000000ul // częstotliwość zegara w Hz
#define UART_BAUD 19200ul // prędkość transmisji bit/s
#define LED_PORT PORTD // port diody LED
#define LED_BIT 4 // bit diody LED
#define DDR(x) _SFR_IO8(_SFR_IO_ADDR(x)-1) // adr. rej. kier. PORTx
#define PIN(x) _SFR_IO8(_SFR_IO_ADDR(x)-2) // adr. rej. wej. PORTx
#define LED_PORT_O LED_PORT // rejestr wyjściowy
#define LED_PORT_D DDR(LED_PORT) // rejestr kierunkowy
#define LED_PORT_I PIN(LED_PORT) // rejestr wejściowy
#define UART_CONST (F_CPU/(16ul*UART_BAUD)-1)
// _UCR_
#ifdef UCR
#define _UCR_ UCR
#endif
#ifdef UCSRB
#define _UCR_ UCSRB
#endif
#ifdef UCSR0B
#define _UCR_ UCSR0B
#endif
// _USR_
#ifdef USR
#define _USR_ USR
#endif
#ifdef UCSRA
#define _USR_ UCSRA
#endif
#ifdef UCSR0A
#define _USR_ UCSR0A
#endif
#define MAX_ODP_AT 15
char at_temp[MAX_ODP_AT];
// Definicje funkcji
// inicjalizacja portu szeregowego
void UART_init(void)
{
UBRR = (unsigned char)UART_CONST; // ustaw prędkość transmisji
_UCR_ = _BV(RXEN)|_BV(TXEN); // załącz tx, rx
}
// wysyła znak podany jako parametr na port szeregowy
void UART_putchar (char c)
{
UDR = c; // wpisz c do rejestru UDR
loop_until_bit_is_set(_USR_,TXC); // czekaj na zakończenie transmisji
sbi(_USR_,TXC); // ustaw bit TXC w rej. USR
}
// odbiera znak z portu szeregowego i zwraca go jako wartość funkcji
char UART_getchar (void)
{
loop_until_bit_is_set(_USR_,RXC); // czekaj na zakończenie odbioru
cbi(_USR_,RXC); // skasuj bit RXC w rej. USR
return UDR; // zwróć zawartość rejestru UDR
}
void UART_sendstring(char *string)
{
int dlugosc;
dlugosc = strlen(string);
for ( int i=0 ; i<dlugosc ; i++)
UART_putchar(*(string+i));
}
int main(void) // program główny
{
UART_init(); // inicjalizacja portu szeregowego
sbi(LED_PORT_D,LED_BIT); // użyj linii jako wyjścia
cbi(LED_PORT_O,LED_BIT); // zgaś diodę LED
char znak;
int i =0;
while(1)
{
UART_sendstring("ATD48886150669\n\r");
znak = UART_getchar();
i =0;
while(1)
{
if (i == MAX_ODP_AT) break;
if (znak != 13)
at_temp[i++] = znak;
else
{
at_temp[i] = '\0';
break;
}
znak = UART_getchar();
}
UART_sendstring(at_temp);
}
}Połączenie pc-uC na rsie jest bezproblemowe... w terminalu wszystko działa. Program jest napisany na poczekaniu, tzn własne funkcje (aż 2). Połączenie telefon - pc działa bez problemu, na każdą komendę w terminalu telefon odpowiada. Dodatkowo podczas połączenia uC - c45 komenda UART_sendstring("ATD48886150669\n\r"); wykonuje się tylko raz.... zatem tak jakby telefon nie odpowiedział komendą zakończoną '\n'
