USART не работают прерывания в Terminal

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
casino777
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Вт дек 13, 2011 00:00:15

USART не работают прерывания в Terminal

Сообщение casino777 »

Добрый вечер. Проблема в том, что не работает прерывание по UART. В протеусе всё работает, а в железе - нет. Для связи с компьютером использую программу Terminal. Строки putchar('G'); и putsf("Hello"); выдаёт, а при вводе клавиш, z и d ничего не происходит, хотя и должен по идее выдаваться текст.

Код: Выделить всё

#include <mega16.h>
#include <delay.h>

#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<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine


#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
#include <stdio.h>

void main(void)
{
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;   
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;     
MCUCR=0x00;
TIMSK=0x00;

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

ACSR=0x80;
SFIOR=0x00;

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

while (1)
{
// Place your code here
delay_ms(1000);
while(!(UCSRA & (1<<UDRE))); UDR = 'G';
while(!(UCSRA & (1<<UDRE)));
putchar('G');
delay_ms(1000);   
putsf("Hello");

};
}


   
interrupt [USART_RXC] void usart_rx_isr(void)
{
 unsigned char data;
 data = UDR;
 switch(data)
 {

  case 'z':putsf("zet"); ;break;
  case 'd': putsf("de");break;
  case 0x0D: putsf("");break;


 }
}
casino777
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Вт дек 13, 2011 00:00:15

Re: USART не работают прерывания в Terminal

Сообщение casino777 »

Хм, даже на такую простенькую программку отклика нет.

Код: Выделить всё

#include<mega16.h>
#include<stdio.h>
 char s;
void main (void)
{
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;


while (1)
      {
if (getchar())
{
putchar('G');
UDR='G';
printf("Hello, world!");
 }
       

      };
}
b612
Вымогатель припоя
Сообщения: 584
Зарегистрирован: Чт янв 07, 2010 16:58:11
Контактная информация:

Re: USART не работают прерывания в Terminal

Сообщение b612 »

к компу через max232 подключаете?
схему в студию
casino777
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Вт дек 13, 2011 00:00:15

Re: USART не работают прерывания в Terminal

Сообщение casino777 »

какая схема ?
вот плата
Изображение
вот кабель
Изображение

ну RX и TX соединены с PORTD 0,1 ATMEGA16


при нажатой кнопке RESET у микроконтроллера и отправке символов через программу, они приходят обратно

при скорости 600 и 1200 ересь выдаёт, на остальных и на моей 9600 ничего
Alkul
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Re: USART не работают прерывания в Terminal

Сообщение Alkul »

К компу подключается через USB, что-ли?

Ну и, конечно, удивляет вот это:
casino777 писал(а):какая схема ? вот плата

А какая схема у этой платы?
"TX" и "RX" с контроллера идут в уровнях TTL. Плата их как-то преобразует? Во что?

Судя по наличию DIP-микросхемы в окружении 4-х конденсаторов рискну предположить, что это MAX232-подобная микросхема, выдающая на разъем DB-9 сигнал в формате RS-232. А в шнурке стоит преобразователь RS-232->USB.
Тогда вопрос - для программы Терминал Вы порт как настраивали? Обычный COM-порт через USB программа видеть не будет, нужно ставить драйвер виртуального СОМ-порта (коих множество) и настраивать. У Вас как все сделано?

Вы обращаетесь за помощью, так почему из Вас информацию нужно клещами вытягивать?
casino777
Первый раз сказал Мяу!
Сообщения: 38
Зарегистрирован: Вт дек 13, 2011 00:00:15

Re: USART не работают прерывания в Terminal

Сообщение casino777 »

имел ввиду, что плата уже разведена, оставалось подсоединить RX и TX
проблема решена при переводе на внешний кварц
сорри за беспокойство
спасибо, кто откликнулся
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»