Mam następujący problem:
Zadaniem docelowym jest wysyłanie wiadomości sms przez podłączony do ATmega32 terminal GSM przez RS-232. Problem polega na tym, że modem nie odpowiada na komendy AT wysyłane z ATmegi.
PARAMETRY UKłADU:
- Terminal Siemens MC55:
- Atmega32, zewnętrzny kwarc 8MHz.
Komunikacja Terminal GSM -> PC działają poprawnie. Wysyłająć z PC przez hyperterminal komendy do terminala GSM, np. "AT" - odpowiada OK, niezależnie od parametrów transmisji w hyperterminalu (jest to prawdopodobnie zasługą wykrywania szybkości transmisji autobaundrate).
Wysyłanie i odbiór znaków z ATmegi do kompa również działa OK.
Problem pojawia się, gdy łączę ATmegę z terminalem. Prosty program w C wysyła "AT"+CR do terminala i oczekuje na odbiór znaku, po czym powinien zamrugać 3 razy diodą. Do mrugania jednak nie dochodzi bo program wiesza się na odbiorze znaku z terminala (listing poniżej). Próbowałem również wysyłać pojedyncze znaki, które teoretycznie terminal powinien odsyłać ze względu na włączone echo.
Dodam jeszcze, że PC łączą z ATmegą kablem żeńsko-żeńskim z przeplotem, a PC z terminalem GSM, oraz terminal z ATmegą mesko-żenskim bez przeplotu. Na płytce z ATmega mam wyprowadzone piny, które odpowiednio zwierając zworkami mogę robić przeplot między liniami TXD, RXD (wyjścia z MAX232) a pinami 2,3 gniazda DB9 (RS-232) zatem raczej nie jest to problem kabla.
Gdyby ktoś mógł pomóc będę bardzo wdzięczny
Zadaniem docelowym jest wysyłanie wiadomości sms przez podłączony do ATmega32 terminal GSM przez RS-232. Problem polega na tym, że modem nie odpowiada na komendy AT wysyłane z ATmegi.
PARAMETRY UKłADU:
- Terminal Siemens MC55:
- Atmega32, zewnętrzny kwarc 8MHz.
Komunikacja Terminal GSM -> PC działają poprawnie. Wysyłająć z PC przez hyperterminal komendy do terminala GSM, np. "AT" - odpowiada OK, niezależnie od parametrów transmisji w hyperterminalu (jest to prawdopodobnie zasługą wykrywania szybkości transmisji autobaundrate).
Wysyłanie i odbiór znaków z ATmegi do kompa również działa OK.
Problem pojawia się, gdy łączę ATmegę z terminalem. Prosty program w C wysyła "AT"+CR do terminala i oczekuje na odbiór znaku, po czym powinien zamrugać 3 razy diodą. Do mrugania jednak nie dochodzi bo program wiesza się na odbiorze znaku z terminala (listing poniżej). Próbowałem również wysyłać pojedyncze znaki, które teoretycznie terminal powinien odsyłać ze względu na włączone echo.
Dodam jeszcze, że PC łączą z ATmegą kablem żeńsko-żeńskim z przeplotem, a PC z terminalem GSM, oraz terminal z ATmegą mesko-żenskim bez przeplotu. Na płytce z ATmega mam wyprowadzone piny, które odpowiednio zwierając zworkami mogę robić przeplot między liniami TXD, RXD (wyjścia z MAX232) a pinami 2,3 gniazda DB9 (RS-232) zatem raczej nie jest to problem kabla.
Gdyby ktoś mógł pomóc będę bardzo wdzięczny
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <string.h>
#define F_CPU 8000000ul // 8Mhz
#define UART_BAUD 19200ul // prędkość transmisji bit/s
#define UART_CONST (F_CPU/(16ul*UART_BAUD))-1
#define uchar unsigned char
void UART_Init()
{
UBRRH = (unsigned char)(UART_CONST>>8);
UBRRL = (unsigned char)UART_CONST;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* ustawienie 8 bitów danych i 1 bity stopu */
UCSRC = (1<<URSEL)|(3<<UCSZ0);
}
void SendChar( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = data;
}
unsigned char ReceiveChar( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
;
/* Get and return received data from buffer */
return UDR;
}
int main()
{
UART_Init();
DDRA |= _BV(PA2); // PA2 jako wyjście
// potrzebne do stdio.h:
FILE uart_str = FDEV_SETUP_STREAM(SendChar, ReceiveChar, _FDEV_SETUP_RW);
stdout = stdin = &uart_str;
PORTA &= ~_BV(PA2); // zapal diode
printf("at\c", 0x0D); // wyslij "at"+CR
ReceiveChar(); // tu program sie wiesza
PORTA |= _BV(PA2); // zgaś diode
_delay_ms(1000);
PORTA &= ~_BV(PA2); // zapal diode
_delay_ms(1000);
PORTA |= _BV(PA2); // zgaś diode
_delay_ms(1000);
PORTA &= ~_BV(PA2); // zapal diode
_delay_ms(1000);
PORTA |= _BV(PA2); // zgaś diode
_delay_ms(1000);
PORTA &= ~_BV(PA2); // zapal diode
_delay_ms(1000);
while(1)
{
}
return 0;
}