реклама на сайте
подробности

 
 
> Прерывание при обращении к СОМ порту
ovsvictor
сообщение May 4 2009, 11:48
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 1-05-09
Пользователь №: 48 512



Скажите пожалуйста! Как организовать прерывание на ATmega8 при наличии сигнала по СОМ порту от компьютера??? СПАСИБО!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 10)
chief_olimp
сообщение May 4 2009, 11:57
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344



что вы имеете ввиду под наличием сигнала? Приход байта или что то другое?
В какой среде программируете?
Go to the top of the page
 
+Quote Post
ovsvictor
сообщение May 4 2009, 12:58
Сообщение #3





Группа: Новичок
Сообщений: 9
Регистрация: 1-05-09
Пользователь №: 48 512



Приход байта!


В CodeVisionAVR.....
Go to the top of the page
 
+Quote Post
chief_olimp
сообщение May 4 2009, 13:25
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344



а чем генератор не устравивает? С этим проблем вроде как быть не должно.
CODE
#include <mega8.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
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
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;
};
};
}

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

// Declare your global variables here

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

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=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: 9600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x2F;

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

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

while (1)
{
// Place your code here

};
}
Go to the top of the page
 
+Quote Post
ovsvictor
сообщение May 4 2009, 13:58
Сообщение #5





Группа: Новичок
Сообщений: 9
Регистрация: 1-05-09
Пользователь №: 48 512



Исправил в том коде вот так:

#asm("cli")
putchar(getchar());
//--rx_counter;

И не идет....Может как нибудь проще это можно реализовать????
Go to the top of the page
 
+Quote Post
chief_olimp
сообщение May 4 2009, 14:06
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344



в железе смотрите или в симуляторе?
Go to the top of the page
 
+Quote Post
ovsvictor
сообщение May 4 2009, 14:17
Сообщение #7





Группа: Новичок
Сообщений: 9
Регистрация: 1-05-09
Пользователь №: 48 512



На железе сразу делаю....
Go to the top of the page
 
+Quote Post
chief_olimp
сообщение May 4 2009, 14:27
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344



ну тогда опиште всю схему в двух словах что делаете и что хотите получить. Можно с куском кода
Go to the top of the page
 
+Quote Post
ovsvictor
сообщение May 4 2009, 15:10
Сообщение #9





Группа: Новичок
Сообщений: 9
Регистрация: 1-05-09
Пользователь №: 48 512



В двух словах....делаю идентификатор пользователей для ПК....Все уже сделал и дипломный руководитель сказал еще написать программку для смены пароля....вот Я и хочу это реализовать....При поступлении данных с ПК на контреллер они записывались в переменную в ERROM памяти....В общем все....
Go to the top of the page
 
+Quote Post
ovsvictor
сообщение May 4 2009, 21:07
Сообщение #10





Группа: Новичок
Сообщений: 9
Регистрация: 1-05-09
Пользователь №: 48 512



А где тут вписывать код который должен выполняться при прерывании???
CODE
#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 255
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<255
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
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
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;
};
};
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
char d;
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
Go to the top of the page
 
+Quote Post
DpInRock
сообщение May 4 2009, 22:00
Сообщение #11


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Бедные дети. Вам же олимп привел готовую программу. Даже с комментариями.
Там же по-русски написано "// USART Receiver interrupt service routine".
Преподавателей надо начинать Кио отдавать на распил.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 00:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01429 секунд с 7
ELECTRONIX ©2004-2016