[an error occurred while processing this directive]
Заблудился в одной сосне с UART ом..., посоветуйте
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено LDIR 07 июля 2005 г. 09:24

ATMega8515 должна дружить с телефоном C45 по шнурку.
(Весь текст тестовой программы ниже.)
Прием по прерыванию в буфер, передача напрямую.
Так вот телефон категорически не отзывается на ATZ, нет даже эха на первый символ А (подслушиваю через тройник, только RX, на СОМ компа).
Если между Mega и телефоном включить компьютер как повторитель- COM1 принял COM2 передал и обратно, то все работает. Программа в компьютере принимает пакет до \r а потом его выдает в другой порт.
В шнурках все перепроверено.
И самое веселое - эта-же програмка, прошитая в AT90S2313 (соотв. изменена инициализация) работает на ура с телефоном.
Где у меня лыжи не едут ????

/*********************************************
Chip type : ATmega8515
Program type : Application
Clock frequency : 4,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 128
*********************************************/

#include
#include

#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<#define PARITY_ERROR (1<#define DATA_OVERRUN (1<#define DATA_REGISTER_EMPTY (1<#define RX_COMPLETE (1<// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
unsigned char rx_wr_index,rx_rd_index,rx_counter;
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine
#pragma savereg-
interrupt [USART_RXC] void uart_rx_isr(void)
{
char status,data;
#asm
push r26
push r27
push r30
push r31
in r26,sreg
push r26
#endasm
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
#asm
pop r26
out sreg,r26
pop r31
pop r30
pop r27
pop r26
#endasm
}
#pragma savereg+

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

// Standard Input/Output functions
#include

// Timer 0 overflow interrupt service routine
//interrupt [TIM0_OVF] void timer0_ovf_isr(void)
//{
// Place your code here

//}

// Declare your global variables here
char chOK[7];

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
PORTA=0xFF;
DDRA=0xFF;
// Port B initialization
PORTB=0x00;
DDRB=0x00;
// Port C initialization
PORTC=0x00;
DDRC=0xFF;
// Port D initialization
PORTD=0x00;
DDRD=0x00;
// Port E initialization
PORTE=0x00;
DDRE=0x00;
// Timer/Counter 0 initialization
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
// Timer/Counter 1 initialization
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// External Interrupt(s) initialization
MCUCR=0x00;
EMCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 19200
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x0C;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
// Analog Comparator Output: Off
ACSR=0x80;

// Global enable interrupts
#asm("sei")

while (1)
{
// Place your code here
putsf("\rATZ\r");
gets(chOK,7);
while (strcmpf(chOK,"OK\r")!=0) gets(chOK,7);
putsf("ATE0\r");
gets(chOK,7);
while (strcmpf(chOK,"OK\r")!=0) gets(chOK,7);
putsf("AT+CPBS=\"SM\"\r");
gets(chOK,7);
while (strcmpf(chOK,"OK\r")!=0) gets(chOK,7);
putsf("AT+CPBR=1,8\r");
gets(chOK,7);
while (strcmpf(chOK,"OK\r")!=0) gets(chOK,7);

while (1)
{}

};
}

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 
NoIX ключ Запомнить

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru