mejia 0 12 июня, 2005 Опубликовано 12 июня, 2005 · Жалоба вопрос такой, кто-нибудь сталкивался с проблемой получния даннах с компа по RS-232? Идея в том, что отсылка вроде понятно как осуществить, то есть когда сам захочешь.... а вот принять не понятно.... надо постоянно сканировать RxD? может кто-нибудь помочь в этом деле, или предоставить исходник.... ? задача: получить 4 байта(AnsiString из C++) с COM и записать их в массив тоесть что-то типа такого char b[10]; b[0]=RxD1; b[1]=RxD2; b[2]=RxD3; b[3]=RxD4; я уже с месяц парюсь ничего придумать не могу.... помогите пожалуста :maniac: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
at90 0 12 июня, 2005 Опубликовано 12 июня, 2005 · Жалоба вопрос такой, кто-нибудь сталкивался с проблемой получния даннах с компа по RS-232? Идея в том, что отсылка вроде понятно как осуществить, то есть когда сам захочешь.... а вот принять не понятно.... надо постоянно сканировать RxD? может кто-нибудь помочь в этом деле, или предоставить исходник.... ? задача: получить 4 байта(AnsiString из C++) с COM и записать их в массив тоесть что-то типа такого char b[10]; b[0]=RxD1; b[1]=RxD2; b[2]=RxD3; b[3]=RxD4; Используй прерывания по приёму и передаче. При возникновении прерывания записй данные в массив. Это дело КодеВижен сам генерит. Там в генераторе кода укажи только размер массива и дело в шляпе!!!!!!!!! :) я уже с месяц парюсь ничего придумать не могу.... помогите пожалуста :maniac: <{POST_SNAPBACK}> Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andk 0 14 июня, 2005 Опубликовано 14 июня, 2005 · Жалоба Какой исходник нужен - Асм или С ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Laksus 0 14 июня, 2005 Опубликовано 14 июня, 2005 · Жалоба вопрос такой, кто-нибудь сталкивался с проблемой получния даннах с компа по RS-232? Идея в том, что отсылка вроде понятно как осуществить, то есть когда сам захочешь.... а вот принять не понятно.... надо постоянно сканировать RxD? может кто-нибудь помочь в этом деле, или предоставить исходник.... ? :maniac: <{POST_SNAPBACK}> Я так понял, что тебе надо исходник C. А каким компилятором пользуешся. Если CodeVisionAVR DEMO, то он не создает код с прерываниями по приему UART. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yung 0 14 июня, 2005 Опубликовано 14 июня, 2005 · Жалоба Я пользуюсь компилятором от 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... } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
phantom 0 14 июня, 2005 Опубликовано 14 июня, 2005 · Жалоба Фраза "//uart has received a character in UDR", очевидно, означает, что принятый байт находится в регирстре UDR. Следовательно, в подпрограмме обработки прерывания нужно вставить что-то вроде void uart0_rx_isr(void) { b[i++]=UDR; // записываем полученный байт в следующий //элемент массива } а в главной программе что-то вроде i=0; // переходим на начало массива while(i<4); // ждем пока примутся 4 байта // (только если точно знаем, что в данный момент они будут передаваться, иначе тут и зависнем) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 14 июня, 2005 Опубликовано 14 июня, 2005 · Жалоба Если пока не получишь 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 байта приняты } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yung 0 14 июня, 2005 Опубликовано 14 июня, 2005 · Жалоба А какой смысл висеть в ожидании четырех принятых байт, что, заняться больше нечем? Обычно я делал проверку в самой процедуре прерывания от приема, и когда дождался всего, чего хотел, то уходил куда надо (не подумайте плохого) прямо оттуда (не лучший вариант) , либо вывешиваешь флаг готовности, а этот флаг в основном теле и анализируется. А тот код, который привел - это болванка, вся сгенерированная ICC. UDR читать в ней обязательно, иначе не сбросится флаг прерывания со всеми последующими удовольствиями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yung 0 14 июня, 2005 Опубликовано 14 июня, 2005 · Жалоба И еще одна мысль. Чем заниматься длительными рассуждениями, дай четкую постановку - чего хочешь. Если только того, что написал, то укажи параметры UART - скорость, число бит, сколько старт-стоп и частоту твоего кварца. Проще написать готовую прогу,остальное вставишь, чем заниматься демагогией (особо веселые товарищи последнее слово могут поправить) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mejia 0 14 июня, 2005 Опубликовано 14 июня, 2005 · Жалоба И еще одна мысль. Чем заниматься длительными рассуждениями, дай четкую постановку - чего хочешь. Если только того, что написал, то укажи параметры UART - скорость, число бит, сколько старт-стоп и частоту твоего кварца. Проще написать готовую прогу,остальное вставишь, чем заниматься демагогией (особо веселые товарищи последнее слово могут поправить) <{POST_SNAPBACK}> // 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 } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mejia 0 14 июня, 2005 Опубликовано 14 июня, 2005 · Жалоба а вот сам код, но у меня какая-то странная проблема, он при виде этой прагмы интерупт пишет мне такие ошибки: 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(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mejia 0 14 июня, 2005 Опубликовано 14 июня, 2005 · Жалоба а может кто-нибудь выложить кряк к Image Craft?( у меня DEMO Evaluation)... или ее невозможно крякнуть, так как она дема? тогда чем пользоваться простым смертным? :blink: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yung 0 14 июня, 2005 Опубликовано 14 июня, 2005 · Жалоба Сначала о кряке. Он в прицепе(если прицепится).Работает с версиями 6.хх. С седьмой не хочет, сам просил в форуме, никто не дал. Насчет программы буду смотреть. Что касается указанных ошибок, то тут ничего страшного. Выбираешь закладку проект-опции-устройство и устанавливаешь нужный девайс. Все получится. А вот так я пользовался кряком. 1. Устанавливается демо-версии ICC 2. Запускается reg_iccavr.bat. 3. Запускается ICC и вперед. 4. После этого reg_iccavr.bat закрываеися и больше про него не вспоминаем до апгрейда ICC. Iccreg.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yung 0 14 июня, 2005 Опубликовано 14 июня, 2005 · Жалоба И что это у тебя за версия ICC, что русских комментариев не понимает? Найди посвежее, наверняка на аргуссофтовском сайте шестая версия осталась, или на фирменный сайт сходи. В крайнем случае на мыло брошу (хотя это не один метр) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yung 0 14 июня, 2005 Опубликовано 14 июня, 2005 · Жалоба Там почему-то в двух кусках разные требования. Сделано по первому варианту, т.е. два байта: четыре бита ракорда, 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться