Перейти к содержанию
    

AT90S2313-10PI(пробелема с получением данных по...

вопрос такой, кто-нибудь сталкивался с проблемой получния даннах с компа по RS-232?

 

Идея в том, что отсылка вроде понятно как осуществить, то есть когда сам захочешь.... а вот принять не понятно.... надо постоянно сканировать RxD?

 

может кто-нибудь помочь в этом деле, или предоставить исходник.... ?

 

задача: получить 4 байта(AnsiString из C++) с COM и записать их в

массив

тоесть что-то типа такого

char b[10];

 

b[0]=RxD1;

b[1]=RxD2;

b[2]=RxD3;

 

b[3]=RxD4;

 

я уже с месяц парюсь ничего придумать не могу.... помогите пожалуста

 

:maniac:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вопрос такой, кто-нибудь сталкивался с проблемой получния даннах с компа по RS-232?

 

Идея в том, что отсылка вроде понятно как осуществить, то есть когда сам захочешь.... а вот принять не понятно.... надо постоянно сканировать RxD?

 

может кто-нибудь помочь в этом деле, или предоставить исходник.... ?

 

задача: получить 4 байта(AnsiString из C++) с COM и записать их в

массив

тоесть что-то типа такого

char b[10];

 

b[0]=RxD1;

b[1]=RxD2;

b[2]=RxD3;

 

b[3]=RxD4;

 

Используй прерывания по приёму и передаче.

При возникновении прерывания записй данные в массив.

Это дело КодеВижен сам генерит. Там в генераторе кода укажи только размер массива и дело в шляпе!!!!!!!!! :)

я уже с месяц парюсь ничего придумать не могу.... помогите пожалуста

 

:maniac:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вопрос такой, кто-нибудь сталкивался с проблемой получния даннах с компа по RS-232?

 

Идея в том, что отсылка вроде понятно как осуществить, то есть когда сам захочешь.... а вот принять не понятно.... надо постоянно сканировать RxD?

 

может кто-нибудь помочь в этом деле, или предоставить исходник.... ?

 

:maniac:

 

Я так понял, что тебе надо исходник C. А каким компилятором пользуешся.

Если CodeVisionAVR DEMO, то он не создает код с прерываниями по приему UART.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я пользуюсь компилятором от ImageCraft, там в Application Builder можно заготовку программы получить со всеми прерываниями. Вот кусок для примера

 

//ICC-AVR application builder : 14.06.2005 8:37:51

// Target : 2313

// Crystal: 10.000Mhz

 

#include <io2313v.h>

#include <macros.h>

 

void port_init(void)

{

PORTB = 0x00;

DDRB = 0x00;

PORTD = 0x00;

DDRD = 0x00;

}

 

//UART0 initialize

// desired baud rate: 9600

// actual: baud rate:9615 (0,2%)

void uart0_init(void)

{

UCR = 0x00; //disable while setting baud rate

UBRR = 0x40; //set baud rate

UCR = 0xD8; //enable

}

 

#pragma interrupt_handler uart0_rx_isr:8

void uart0_rx_isr(void)

{

//uart has received a character in UDR

}

 

#pragma interrupt_handler uart0_tx_isr:10

void uart0_tx_isr(void)

{

//character has been transmitted

}

 

//call this routine to initialize all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

port_init();

uart0_init();

 

MCUCR = 0x00;

GIMSK = 0x00;

TIMSK = 0x00;

SEI(); //re-enable interrupts

//all peripherals are now initialized

}

 

//

void main(void)

{

init_devices();

//insert your functional code here...

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Фраза "//uart has received a character in UDR", очевидно, означает, что принятый байт находится в регирстре UDR. Следовательно, в подпрограмме обработки прерывания нужно вставить что-то вроде

void uart0_rx_isr(void)

{

b[i++]=UDR; // записываем полученный байт в следующий

//элемент массива

}

а в главной программе что-то вроде

i=0; // переходим на начало массива

while(i<4); // ждем пока примутся 4 байта

// (только если точно знаем, что в данный момент они будут передаваться, иначе тут и зависнем)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если пока не получишь 4 байта из уарта делать ничгео не надо, то проще полингом и не заморачиваться с прерываниями

 

if (UCSR0A & (1<<RXC0)) { // первый байт поступил

b[0]=UDR0;

while(!(UCSR0A & (1<<RXC0)));

b[1]=UDR0;

while(!(UCSR0A & (1<<RXC0)));

b[2]=UDR0;

while(!(UCSR0A & (1<<RXC0)));

b[3]=UDR0;

}

 

 

или можно по байтам считывать в главном цикле

 

if (UCSR0A & (1<<RXC0)) { // очередной байт поступил

b[i++]=UDR0;

if (!(i=(i+1) & 3)) {

.... // 4 байта приняты

}

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А какой смысл висеть в ожидании четырех принятых байт, что, заняться больше нечем? Обычно я делал проверку в самой процедуре прерывания от приема, и когда дождался всего, чего хотел, то уходил куда надо (не подумайте плохого) прямо оттуда (не лучший вариант) , либо вывешиваешь флаг готовности, а этот флаг в основном теле и анализируется. А тот код, который привел - это болванка, вся сгенерированная ICC. UDR читать в ней обязательно, иначе не сбросится флаг прерывания со всеми последующими удовольствиями.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И еще одна мысль. Чем заниматься длительными рассуждениями, дай четкую постановку - чего хочешь. Если только того, что написал, то укажи параметры UART - скорость, число бит, сколько старт-стоп и частоту твоего кварца. Проще написать готовую прогу,остальное вставишь, чем заниматься демагогией (особо веселые товарищи последнее слово могут поправить)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И еще одна мысль. Чем заниматься длительными рассуждениями, дай четкую постановку - чего хочешь. Если только того, что написал, то укажи параметры UART - скорость, число бит, сколько старт-стоп и частоту твоего кварца. Проще написать готовую прогу,остальное вставишь, чем заниматься демагогией (особо веселые товарищи последнее слово могут поправить)

 

// Programm by G14 POWER aka Mejia

// ICC-AVR application builder : 11.03.2002 20:01:52

// Target : 2313

// Crystal: 3.6864Mhz~4Mhz

 

//poluchaem 16 bit s kompa, analiziruem pervie 4 bita, esli ix

//soderjimoe=0, to smotrim sled. 8 bit, i po nim vkluchaem, ili

//vikluchaem svetodiodi na sootv. nojkax, nojki opisivautsa

//kak massiv nojkas

 

//ZADACHA: ZASTAVIT SVETODIODI MORGAT :) s kompa konechno cherez

//COM PORT

 

//PROBLEMA(THE LAST): NE PONATNO KAK GENERIROVAT PRERIVANIE

//na prixod s kompa

 

#include <math.h>

#include <stdlib.h> //project started June 1,2005

#include <stdio.h>

#include <string.h>

#include <string.h>

#include <time.h>

#include <stdio.h>

///special for MICRODEVICE

#include <io2313v.h>

#include <macros.h>

 

 

#define max_count 312

// po rez emul - signal

// s periodom bolle 2 ms schitaetsa

// nizkochastotnim

 

 

 

//////////////////////////

/// global peremennie

 

 

unsigned int temp; // ñîõðàíèòåëü ðåçóëüòàòà

char no_INT0=1; // INT0 îáíóëÿåò ýòó ïåðåìåííóþ

unsigned int counter; // ïåðåìåííàÿ ñ÷åò÷èê

char dig_out; // öèôðà äëÿ âûâîäà ïî rs232

short int nojkas[]={0,1,2,3,4,5,6,7}; //zdes nomera nojek

char x[20]; //ves massiv polucenii iz COM

short int prinataya_stroka;//zdes vixodnoya stroka

//////////////////////////

/// prototipi functii

 

void port_init(void); // initializatia porta

void uart0_init(void); // init baud rate for komp

void int0_isr(void);

void init_devices(void);

 

 

 

 

//////////////////////////

//get_result(void); //(ne napisano) //prosto doljna prinat short int

//int 0-15 bit or 2 bait for win

// 15-14-13-12 bit, - bit komandi

// 0000 - svetodiodi

// 0001 - dvigatel

// 0010 - ventilator

//11-10-9-8-7-6-5-4 biti dla svetodioda pri 0000

//3-2-1-0 reserved, ne ispolzuutsa

void svetodiodon(short int nojka); //vkluchaet svetodiod

void svetodiodoff(short int nojka); //vikluchaet svetodiod

 

 

 

 

 

 

 

 

void main(void)

{

init_devices();

 

 

while(1)

{

short int temp;

short int komanda; // 4 bita komandi

short int i;

short int soderjimoe; // soderjimoe komandi

short int tem;

 

temp=get_result();//polucili v temp komandu

 

if (temp) {

komanda=temp;

komanda>>=11; //v komande teper komanda

soderjimoe=temp;

soderjimoe<<=4;

soderjimoe>>=4;// v soderjimom teper soderjimoe

 

if (komanda==0)

{

char a; //suda budut vitesnatsa soderjimoe

char b; //vremenno xranitsa char chtob udobnee bilo

 

 

itoa(&a,soderjimoe,10); // v a xranitsa maska bitov

 

for (i=0;i<8;i++)

{

b=a;

b<<=i;

b>>=i;

if (b==1) svetodiodon(nojkas);

if (b==0) svetodiodoff(nojkas);

}

 

}

// if (komanda==1) {dvigatel;}

// if (komanda==2) {ventilator;}

}

}

 

}

 

// getting short int from COM PORT

#pragma interrupt_handler get_result:8

void get_result()

{

short int temprez; //zdes vremenie resultati

short int tempdes; //zdes vrem. xranatsa desatki

short int temped; // a zdes edinici

short int temp;

//poluchaet pachku bait nado preobrazovat etu xnu v short int

// v RXD -doljno bit podrad 4 baita poslanie s kompa

// 0-bait, kod

// 1-sotni

// 2-desatki

// 3-edinici

 

//x[0]=RXD;// 1 bait // kod

//x[1]=RXD;// 2 bait

//x[2]=RXD;// 3 bait

//x[3]=RXD;// 4 bait

 

// nujno temp= 0000xxxxyyyyzzzzpppp

// ^^^^ - kod operacii

// dopustim mi polucili 0123 nado preobr v verhnee

x[0]=getchar();

x[1]=getchar();

x[2]=getchar();

x[3]=getchar();

 

x[0]<<=4;

x[0]>>=4; //obnuli kod

itoa(&x[0],temp,10); // v a xranitsa maska bitov

//temp=x[0]; //pixnuli x[0] v temp (tolko tipi nado soglasovat)

temp<<=12; //sdvinuli vlevo

 

itoa(&x[0],temprez,10); // v a xranitsa maska bitov

//temprez=x[1]*100;

temprez=temprez*100;

itoa(&x[1],tempdes,10); // v a xranitsa maska bitov

tempdes=tempdes*10;

itoa(&x[2],temped,10); // v a xranitsa maska bitov

 

temprez=temprez+tempdes+temped;

 

temp=temp+temprez; //krainie levie 4 razrada ne smogut zateretsa :)

prinataya_stroka=temp;//zdes vixodnoya stroka

main();

 

}

 

////////////////////////////////////////////////

void svetodiodon(short int nojka)

{

PORTB &=~BIT (nojka);

}

void svetodiodoff(short int nojka)

{

PORTB ^= BIT (nojka);

}

 

 

//////////////////////////////////////////////////////////////

 

void port_init(void)

{

DDRB =0xFF; //init port B na vixod

PORTB = 0xFF; // initial timer

PORTD = 0x7F;

DDRD = 0x00;

}

 

 

 

 

//call this routine to initialise all peripherals

 

void init_devices(void)

{

 

CLI();

 

port_init();

uart0_init();

 

TCCR1B = 0x00;

TCNT1H = 0x00;

TCNT1L = 0x00;

TCCR1A = 0x00;

MCUCR = 0x02;

GIMSK = 0x00;

TIMSK = 0x02;

 

SEI();

 

}

//////////////////////////////////////////////////////////////

 

//TIMER0 initialisation - prescale:1024

// desired value: 50Hz

// actual value: 50,000Hz (0,0%)

 

 

//UART0 initialisation

// desired baud rate: 9600

// actual: baud rate:9600 (0,0%)

//

void uart0_init(void)

{

UCR = 0x00; //disable while setting baud rate

UBRR = 0x17; //set baud rate

UCR = 0x08; //enable

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а вот сам код, но у меня какая-то странная проблема, он при виде этой прагмы интерупт пишет мне такие ошибки:

Code Adress 0xe allready contains a value

Code Adress 0xf allready contains a value

 

Работаю в Image Craft, так как кодевижен у меня фривейный, и он не компелируетг говорит типа код слишком большой

 

#pragma interrupt_handler get_result:8

void get_result()

{

short int temprez; //zdes vremenie resultati

short int tempdes; //zdes vrem. xranatsa desatki

short int temped; // a zdes edinici

short int temp;

//poluchaet pachku bait nado preobrazovat etu xnu v short int

// v RXD -doljno bit podrad 4 baita poslanie s kompa

// 0-bait, kod

// 1-sotni

// 2-desatki

// 3-edinici

 

//x[0]=RXD;// 1 bait // kod

//x[1]=RXD;// 2 bait

//x[2]=RXD;// 3 bait

//x[3]=RXD;// 4 bait

 

// nujno temp= 0000xxxxyyyyzzzzpppp

// ^^^^ - kod operacii

// dopustim mi polucili 0123 nado preobr v verhnee

x[0]=getchar();

x[1]=getchar();

x[2]=getchar();

x[3]=getchar();

 

x[0]<<=4;

x[0]>>=4; //obnuli kod

itoa(&x[0],temp,10); // v a xranitsa maska bitov

//temp=x[0]; //pixnuli x[0] v temp (tolko tipi nado soglasovat)

temp<<=12; //sdvinuli vlevo

 

itoa(&x[0],temprez,10); // v a xranitsa maska bitov

//temprez=x[1]*100;

temprez=temprez*100;

itoa(&x[1],tempdes,10); // v a xranitsa maska bitov

tempdes=tempdes*10;

itoa(&x[2],temped,10); // v a xranitsa maska bitov

 

temprez=temprez+tempdes+temped;

 

temp=temp+temprez; //krainie levie 4 razrada ne smogut zateretsa

prinataya_stroka=temp;//zdes vixodnoya stroka

main();

 

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а может кто-нибудь выложить кряк к Image Craft?( у меня DEMO Evaluation)...

или ее невозможно крякнуть, так как она дема? тогда чем пользоваться простым смертным? :blink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сначала о кряке. Он в прицепе(если прицепится).Работает с версиями 6.хх.

С седьмой не хочет, сам просил в форуме, никто не дал. Насчет программы буду смотреть. Что касается указанных ошибок, то тут ничего страшного. Выбираешь закладку проект-опции-устройство и устанавливаешь нужный девайс. Все получится. А вот так я пользовался кряком.

1. Устанавливается демо-версии ICC

2. Запускается reg_iccavr.bat.

3. Запускается ICC и вперед.

4. После этого reg_iccavr.bat закрываеися и больше про него не вспоминаем

до апгрейда ICC.

Iccreg.zip

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И что это у тебя за версия ICC, что русских комментариев не понимает? Найди посвежее, наверняка на аргуссофтовском сайте шестая версия осталась, или на фирменный сайт сходи. В крайнем случае на мыло брошу (хотя это не один метр)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Там почему-то в двух кусках разные требования. Сделано по первому варианту, т.е. два байта: четыре бита ракорда, 8 бит данных, 4 не используются.

 

Ничего не оптимизировал, все в лоб.

 

 

//ICC-AVR application builder : 14.06.2005 15:51:36

// Target : 2313

// Crystal: 3.6864Mhz

 

#include <io2313v.h>

#include <macros.h>

 

char wait,temp,copy,byte1,byte2;

 

 

void port_init(void)

{

PORTB = 0xFF;

DDRB = 0xFF;

PORTD = 0x00;

DDRD = 0x00;

}

 

//UART0 initialize

// desired baud rate: 2400

// actual: baud rate:2400 (0,0%)

void uart0_init(void)

{

UCR = 0x00; //disable while setting baud rate

UBRR = 0x5F; //set baud rate

UCR = 0x90; //enable

}

 

#pragma interrupt_handler uart0_rx_isr:8

void uart0_rx_isr(void)

{

copy=UDR;

temp=copy&0xf0; // выделяем старшую тетраду

if (wait) {byte2=copy; // если ранее уже был принят байт с нужным ракордом

byte1=byte1<<4; // операцию склейки лучше проверить, мог ошибиться

byte2=byte2>>4;

byte1+=byte2;

PORTB=0xff-byte1; // вывести на порт

wait=0; // сбросить флаг

return;

}

 

if (!wait){ // если раньше байт с ракордом принят не был

if (temp==0){ // если ракорд наш

wait=1;

byte1=copy;

}

}

}

 

//call this routine to initialize all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

port_init();

uart0_init();

 

MCUCR = 0x00;

GIMSK = 0x00;

TIMSK = 0x00;

SEI(); //re-enable interrupts

//all peripherals are now initialized

}

 

//

void main(void)

{

init_devices();

while(1);

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...