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

mejia

Участник
  • Постов

    12
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Контакты

  • ICQ
    Array
  1. бага в компиляторе?

    в итоге не прокатывает, сойдемся на глючности putchara, хотя для меня это и загадка когда по байтно посылать в путчар все работает, это не главное главное что все что хотел сделать на микрочипе работает так что если у кого есть микросхемка AT90S2313 и порт B подключенный к 8 светодиодам то www.ourarsenal.narod.ru/coding/nemesis.txt - C++ www.ourarsenal.narod.ru/coding/1.txt - HEX надо будет потом его урезать а то аш 80% от device получилось, там емо можно вполне урезать до 50-60%
  2. бага в компиляторе?

    зверь :) как это читать ? :) почему -=8? и зачем *p? идея в том что приходит char *p и его длина len нужно начиная от начала массива( с 0 элемента и доконца) побайтно(почарно) вывести на экран(в компорт) длинна сообщения колеблится от 1 до х.з. байт вот вроде кусок .s ; ////////////////////////////////////////////////////////////// ; void main(void) ; { .dbline 62 ; ; init_devices(); rcall _init_devices .dbline 63 ; svetomusic_onstart_start(); rcall _svetomusic_onstart_start L2: .dbline 64 L3: .dbline 64 rjmp L2 X0: .dbline -2 L1: .dbline 0 ; func end ret .dbend .dbfunc e putstringus _putstringus fV ; b -> R22,R23 ; a -> R22,R23 ; ipp -> R22,R23 ; len -> R22,R23 ; p -> R20,R21 .even _putstringus:: rcall push_gset2 mov R22,R18 mov R23,R19 mov R20,R16 mov R21,R17 .dbline -1 .dbline 73 ; while(1); ; ; ; } ; ; ; ; // getting byte from COM PORT ; void putstringus(char *p,int len) ; { .dbline 77 ; //13-8=5 ; int a,b; ; int ipp; ; a=len-8; subi R22,8 sbci R23,0 .dbline 78 ; b=5; ldi R22,5 ldi R23,0 .dbline 79 ; for (ipp=0;ipp<5;ipp++) clr R22 L6: .dbline 80 .dbline 81 mov R30,R22 mov R31,R23 add R30,R20 adc R31,R21 ldd R16,z+0 rcall _putchar .dbline 83 L7: .dbline 79 subi R22,255 ; offset = 1 sbci R23,255 .dbline 79 cpi R22,5 ldi R30,0 cpc R23,R30 brlt L6 .dbline -2 L5: rcall pop_gset2 .dbline 0 ; func end ret .dbsym r b 22 I .dbsym r a 22 I .dbsym r ipp 22 I .dbsym r len 22 I .dbsym r p 20 pc .dbend .dbfunc e putstringuss _putstringuss fV ; a -> R20,R21 ; b -> R20,R21 ; ipp -> R22,R23 ; len -> R20,R21 ; p -> R10,R11 .even _putstringuss:: rcall push_gset3 mov R20,R18 mov R21,R19 mov R10,R16 mov R11,R17 .dbline -1 .dbline 86 ; { ; putchar(p[ipp]); ; ; } ; } ; void putstringuss(char *p,int len) ; { .dbline 90 ; //13-8=5 ; int a,b; ; int ipp; ; a=len-8; subi R20,8 sbci R21,0 .dbline 91 ; b=5; ldi R20,5 ldi R21,0 .dbline 92 ; for (ipp=0;ipp<b;ipp++) clr R22 clr R23 rjmp L14 L11: .dbline 93 .dbline 94 mov R30,R22 mov R31,R23 add R30,R10 adc R31,R11 ldd R16,z+0 rcall _putchar .dbline 96 L12: .dbline 92 subi R22,255 ; offset = 1 sbci R23,255 L14: .dbline 92 cp R22,R20 cpc R23,R21 brlt L11 .dbline -2 L10: rcall pop_gset3 .dbline 0 ; func end ret .dbsym r a 20 I .dbsym r b 20 I .dbsym r ipp 22 I .dbsym r len 20 I .dbsym r p 10 pc .dbend .area vector(rom, abs) .org 14 rjmp _get_result .area text(rom, con, rel) .dbfile C:\Programming\chip\nemesis.c .dbfunc e get_result _get_result fV ; te -> R20 .even _get_result:: rcall push_lset rcall push_gset1 .dbline -1 .dbline 101 ; { ; putchar(p[ipp]); ; ; } ; } ;
  3. бага в компиляторе?

    Представим 2 функции void putstringus(char *p,int len) { //13-8=5 int a,b; int ipp; a=len-8; b=5; for (ipp=0;ipp<b;ipp++) { putchar(p[ipp]); } } и void putstringus(char *p,int len) { //13-8=5 int a,b; int ipp; a=len-8; b=5; for (ipp=0;ipp<5;ipp++) { putchar(p[ipp]); } } Как вы думаете какая из них будет работать а какая нет? Скажете обе(различия в условии "for ipp<b в первой ipp<5 во второй")? Ответ неверный :) вторая функция работает правильно :) первая нет :) :smile3009: я серьезно :) при работе первой возникает ошибка: [PC = $027B, Time = 34.18 ms, {UND}]: SREG bit 1 (Z) = X (undetermined) при работе второй осуществляется вывод по компорту..... на всякий случай выдам блок инициализации, хотя я считаю что это чистая математика, и регистры тут не причем но все же: ///////////////////////// INITIALISATION OF DEVICES //////////////////////////// void port_init(void) { DDRB =0xFF; //init port B na vixod PORTB = 0x00; //vkl all PORTD = 0x7F; //port vkl DDRD = 0x00; //vse na vxod } //call this routine to initialise all peripherals void init_devices(void) { CLI(); port_init(); uart0_init(); SREG = 0xFF; MCUCR = 0x00; GIMSK = 0xF0; //obshii registr maski prerivanii GIFR = 0xF0; TIMSK = 0xFF; //0x00 TIFR=0xFF SEI(); } //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 // UBRR = 0x23; //set baud rate UCR = 0x99; //enable //bit 7 -prerivanie po okonc. priema //bit 4 -razr priema //bit 3 -razr peredatchika } ////////////////////////////////////////////////////////////////////////////////
  4. RS-232(проблема)

    какой трансмиттер :( , в документации по AT90S2313 про "трансмиттер" ничего не нашел void port_init(void) { DDRB =0xFF; //init port B na vixod PORTB = 0x00; //vkl all PORTD = 0x00; //port vkl DDRD = 0x00; //vse na vxod } //call this routine to initialise all peripherals void init_devices(void) { CLI(); port_init(); uart0_init(); SetBit (SREG,7); //bit maski prerivanii MCUCR = 0x00; GIMSK = 0xF0; //obshii registr maski prerivanii GIFR = 0xF0; TIMSK = 0xFF; //0x00 TIFR=0xFF SEI(); } //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 // UBRR = 0x23; //set baud rate UCR = 0x09; //enable }
  5. RS-232(проблема)

    :unsure: Идея: по прерыванию, запись в буфер и чисто для себя(для проверки) обратно посылается буква U, естествнно не работает.... перерыл документацию по AT90S2313 , вроде все регистры отвечающие за прерывания включены, и все равно не работает :huh: можете сами у себя проверить, кроме как мистикой я это описать не могу void main() { init_devices(); while(1); } // getting byte from COM PORT #pragma interrupt_handler get_result:8 void get_result() {//x.z no ne rabotaet x[cou]=UDR;cou++; if (cou==4) {cou=0;}//sort();} putchar('U'); //vivod obratno !!! } void port_init(void) { DDRB =0xFF; //init port B na vixod PORTB = 0x00; //vkl all PORTD = 0x00; //port vkl DDRD = 0x00; //vse na vxod } //call this routine to initialise all peripherals void init_devices(void) { CLI(); port_init(); uart0_init(); SetBit (SREG,7); //bit maski prerivanii MCUCR = 0x00; GIMSK = 0xF0; //obshii registr maski prerivanii GIFR = 0xF0; TIMSK = 0x00; //0x00 SEI(); } //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 // UBRR = 0x23; //set baud rate UCR = 0x09; //enable }
  6. А что, это все работает? Не верю!! :w00t: Я, конечно, могу сильно проезжать (со мной это что-то часто в последнее время), но все же: 1) что-то не могу уловить, где вызываются функции sort() и work(); 2) всегда думал, что itoa преобразует число в строку(Int TO Alpha)... или в ICC наоборот? тогда сорри! :blink: В нормальном С строку в число преобразует atoi (в CodeVision например есть int atoi(char *str), IСС сейчас не пользуюсь, было дело несколько лет назад, но кряка к trial-версии не нашлось, пришлось выкинуть) думаю, было бы что-то вроде x[4]=0; // чтоб atoi знал, где конец строки, объявлять надо char х[5] prinataya_stroka=atoi(x+1); // раскодируем начиная с х[1] а команда, если это тоже число в формате ASCII komanda=x[0]&0x0F; // стирает 3 из старшей тетрады см. также 5) 3) :huh: :ohmy: :mellow: трудно даже проанализировать, когда выполняютя условия b==1, b==0... Давайте на примере: представим, что "принятая строка"=11100001. і=0: после b<<=i; b>>=i; получаем b=11100001, ничего не происходит і=1: b=01100001, ничего не происходит i=2: b=00100001, ничего не происходит i=3: b=00000001, зажигается светодиод №3 i=4: b=00000001, зажигается светодиод №4 i=5: b=00000001, зажигается светодиод №5 i=6: b=00000001, зажигается светодиод №6 i=7: b=00000001, зажигается светодиод №7 итог: хотели зажечь 11100001, зажгли 00011111 :( Вопрос: почему бы не написать просто PORTB=prinataya_stroka ??? 4) кажется, выключает, а не включает ^ - операция "исключающее ИЛИ", т.е. светодиод не выключается, а меняет состояние на противоположное 5) Кстати, а нельзя сразу с компьютера посылать 1 байт, кодирующий, чего включить и выключить, вместо того чтобы посылать 3, а потом их разгребать? 6) warning :) : будеть корректно работать только если компьютер будет посылать каждый раз строго 4 байта <{POST_SNAPBACK}> :smile3009: убил :) полностью согласен, но для этого и хотел работать с VMLAB чтобы можно было протестировать, что когда случается..... в дебаггере... в итоге я прогу сократил до void main() { while (1); } всеравно бага... так что щас рыскаю по серверам чтобы найти реальное описание к VM лабу.... :maniac:
  7. работа с VM LAB

    есть система тестирования проги VMLAB называется, наверное ее все знают, вообщем я по совету документов создал такой файл: nemesis.prj: .MICRO "AT90S2313" .POWER VDD=5 VSS=0 .CLOCK 4meg .PROGRAM "nemesis.hex" D1 VDD PB0 D2 VDD PB1 D3 VDD PB2 D4 VDD PB3 D5 VDD PB4 D6 VDD PB5 D7 VDD PB6 D8 VDD PB7// диоды с 1 по 7 //// естествеено присобачиваю файл nemesis.hex нажимаю F9 пишет: Success! All ready to run в коде макере ... но при запуске программы (f5 или Traceinto(f7) пишет: Starting hardware-software co-simulation... [PC = $0013, Time = 0.51 ms, {MEM}]: Attempt to write in an forbidden position ... я так понимаю прога дохнет когда програмный счетчик доходит до 13-й команды , но че он хочет этим сказать не понимаю можете объяснить багу? код скомпилирован (=> ошибок нет :rolleyes: ) // Programm by G14 POWER aka Mejia // ICC-AVR application builder : 11.03.2002 20:01:52 // Target : 2313 // Crystal: 3.6864Mhz //poluchaem 4 char s kompa, analiziruem pervie 1 bait, zdes lejit kod komandi //2 bait - sotni //3 bait - desatki //4 bait - edinici //ZADACHA: ZASTAVIT SVETODIODI MORGAT s kompa konechno cherez //COM PORT // 8 svetodiodov s kompa formiruut (4 baita) komandu //naprimer vse svetodiodi zashisheni to eto 0255 //1 bait =0000 //2 bait=2 //3=2 //4=5 #include <io2313v.h> #include <macros.h> ////////////////////////// /// global peremennie unsigned int temp; // vsegda ponadobitsa char prinataya_stroka; // zdes xranitsa chislo SOTNI,DESATKI,EDINICI char counter; // schetchik bitov char komanda; //zdes xranitsa komanda char nojkas[]={0,1,2,3,4,5,6,7}; //zdes nomera nojek char x[4]; //ves massiv polucenii iz COM ////////////////////////// /// 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); void svetodiodon(char nojka); //vkluchaet svetodiod void svetodiodoff(char nojka); //vikluchaet svetodiod void main(void) { init_devices(); while(1); } char cou=0; // getting short int from COM PORT #pragma interrupt_handler get_result:8 void get_result() { x[cou]=UDR;cou++; if (cou==4) {cou=0;} } void sort() { //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 short int temprez; //zdes vremenie resultati short int temp; itoa(&x[0],temp,10); // v a xranitsa maska bitov komanda=temp; itoa(&x[1],temprez,10); // v a xranitsa maska bitov temprez=temprez*100; temp=temp+temprez; itoa(&x[2],temprez,10); // v a xranitsa maska bitov temprez=temprez*10; temp=temp+temprez; itoa(&x[3],temprez,10); // v a xranitsa maska bitov temp=temp+temprez; //krainie levie 4 razrada ne smogut zateretsa prinataya_stroka=temp;//zdes vixodnoya stroka work(); } // sama rabota void work() { // komanda =x[0]; char i; short int soderjimoe; // soderjimoe komandi //prinataya_stroka = chislo, naprimer (3 baita iz soobshenia) if (komanda==0) { char b; //vremenno xranitsa char chtob udobnee bilo for (i=0;i<8;i++) { b=prinataya_stroka; b<<=i; b>>=i; if (b==1) svetodiodon(nojkas); if (b==0) svetodiodoff(nojkas); } } // if (komanda==1) {dvigatel;} // if (komanda==2) {ventilator;} } //////////////////////////////////////////////// void svetodiodon(char nojka) { PORTB &=~BIT (nojka); } void svetodiodoff(char nojka) { PORTB ^= BIT (nojka); } ////////////////////////////////////////////////////////////// void port_init(void) { DDRB =0xFF; //init port B na vixod PORTB = 0xFF; //vkl all PORTD = 0x00; //port vkl DDRD = 0x00; //vse na vxod } //call this routine to initialise all peripherals void init_devices(void) { CLI(); port_init(); uart0_init(); MCUCR = 0x00; GIMSK = 0x00; TIMSK = 0x00; SEI(); } //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 }
  8. хорошо прогу написал и после урезания жрет 47% of DEVICE... вот код: // Programm by G14 POWER aka Mejia // ICC-AVR application builder : 11.03.2002 20:01:52 // Target : 2313 // Crystal: 3.6864Mhz //poluchaem 4 char s kompa, analiziruem pervie 1 bait, zdes lejit kod komandi //2 bait - sotni //3 bait - desatki //4 bait - edinici //ZADACHA: ZASTAVIT SVETODIODI MORGAT :) s kompa konechno cherez //COM PORT // 8 svetodiodov s kompa formiruut (4 baita) komandu //naprimer vse svetodiodi zashisheni to eto 0255 //1 bait =0000 //2 bait=2 //3=2 //4=5 #include <io2313v.h> #include <macros.h> ////////////////////////// /// global peremennie unsigned int temp; // vsegda ponadobitsa char prinataya_stroka; // zdes xranitsa chislo SOTNI,DESATKI,EDINICI char counter; // schetchik bitov char komanda; //zdes xranitsa komanda char nojkas[]={0,1,2,3,4,5,6,7}; //zdes nomera nojek char x[4]; //ves massiv polucenii iz COM ////////////////////////// /// 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); void svetodiodon(char nojka); //vkluchaet svetodiod void svetodiodoff(char nojka); //vikluchaet svetodiod void main(void) { init_devices(); while(1); } char cou=0; // getting short int from COM PORT #pragma interrupt_handler get_result:8 void get_result() { x[cou]=UDR;cou++; if (cou==4) {cou=0;} } void sort() { //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 short int temprez; //zdes vremenie resultati short int temp; itoa(&x[0],temp,10); // v a xranitsa maska bitov komanda=temp; itoa(&x[1],temprez,10); // v a xranitsa maska bitov temprez=temprez*100; temp=temp+temprez; itoa(&x[2],temprez,10); // v a xranitsa maska bitov temprez=temprez*10; temp=temp+temprez; itoa(&x[3],temprez,10); // v a xranitsa maska bitov temp=temp+temprez; //krainie levie 4 razrada ne smogut zateretsa :) prinataya_stroka=temp;//zdes vixodnoya stroka work(); } // sama rabota void work() { // komanda =x[0]; char i; short int soderjimoe; // soderjimoe komandi //prinataya_stroka = chislo, naprimer (3 baita iz soobshenia) if (komanda==0) { char b; //vremenno xranitsa char chtob udobnee bilo for (i=0;i<8;i++) { b=prinataya_stroka; b<<=i; b>>=i; if (b==1) svetodiodon(nojkas); if (b==0) svetodiodoff(nojkas); } } // if (komanda==1) {dvigatel;} // if (komanda==2) {ventilator;} } //////////////////////////////////////////////// void svetodiodon(char nojka) { PORTB &=~BIT (nojka); } void svetodiodoff(char nojka) { PORTB ^= BIT (nojka); } ////////////////////////////////////////////////////////////// void port_init(void) { DDRB =0xFF; //init port B na vixod PORTB = 0xFF; //vkl all PORTD = 0x00; //port vkl DDRD = 0x00; //vse na vxod } //call this routine to initialise all peripherals void init_devices(void) { CLI(); port_init(); uart0_init(); MCUCR = 0x00; GIMSK = 0x00; TIMSK = 0x00; SEI(); } //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 } ........................... так что спасибо, осталась проблемка не касающаяся кодинга.... есть система тестирования проги VMLAB называется, наверное ее все знают, вообщем я по совету документов создал такой файл: nemesis.prj: .MICRO "AT90S2313" .POWER VDD=5 VSS=0 .CLOCK 4meg .PROGRAM "nemesis.hex" D1 VDD PB0 D2 VDD PB1 D3 VDD PB2 D4 VDD PB3 D5 VDD PB4 D6 VDD PB5 D7 VDD PB6 D8 VDD PB7// диоды с 1 по 7 //// естествеено присобачиваю файл nemesis.hex нажимаю F9 пишет: Success! All ready to run в коде макере ... но при запуске программы (f5 или Traceinto(f7) пишет: Starting hardware-software co-simulation... [PC = $0013, Time = 0.51 ms, {MEM}]: Attempt to write in an forbidden position ... я так понимаю прога дохнет когда програмный счетчик доходит до 13-й команды , но че он хочет этим сказать не понимаю :smile3046: можете объяснить багу?
  9. а может кто-нибудь выложить кряк к Image Craft?( у меня DEMO Evaluation)... или ее невозможно крякнуть, так как она дема? тогда чем пользоваться простым смертным? :blink:
  10. а вот сам код, но у меня какая-то странная проблема, он при виде этой прагмы интерупт пишет мне такие ошибки: 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(); }
  11. // 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 }
  12. вопрос такой, кто-нибудь сталкивался с проблемой получния даннах с компа по RS-232? Идея в том, что отсылка вроде понятно как осуществить, то есть когда сам захочешь.... а вот принять не понятно.... надо постоянно сканировать RxD? может кто-нибудь помочь в этом деле, или предоставить исходник.... ? задача: получить 4 байта(AnsiString из C++) с COM и записать их в массив тоесть что-то типа такого char b[10]; b[0]=RxD1; b[1]=RxD2; b[2]=RxD3; b[3]=RxD4; я уже с месяц парюсь ничего придумать не могу.... помогите пожалуста :maniac:
×
×
  • Создать...