mejia 0 17 июня, 2005 Опубликовано 17 июня, 2005 · Жалоба Представим 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 } //////////////////////////////////////////////////////////////////////////////// Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 17 июня, 2005 Опубликовано 17 июня, 2005 · Жалоба Хотелось бы глянуть на соответствующий кусок итогового ассемблерного кода (это в файле с расширением .S) в обоих случаях. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maxim 0 17 июня, 2005 Опубликовано 17 июня, 2005 · Жалоба Чего заморачиваться? Надо писать проще. Я понял так, что надо вывести строку символов p длиной len. Пишем: void putstringus(char *p,int len) { //13-8=5 for (len -= 8; len; len--) putchar(*p++); } И небудет никаких багов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mejia 0 17 июня, 2005 Опубликовано 17 июня, 2005 · Жалоба Чего заморачиваться? Надо писать проще. Я понял так, что надо вывести строку символов p длиной len. Пишем: void putstringus(char *p,int len) { //13-8=5 for (len -= 8; len; len--) putchar(*p++); } И небудет никаких багов. <{POST_SNAPBACK}> зверь :) как это читать ? :) почему -=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]); ; ; } ; } ; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maxim 0 17 июня, 2005 Опубликовано 17 июня, 2005 · Жалоба зверь :) как это читать ? :) почему -=8? <{POST_SNAPBACK}> // 13-8=5 это было в твоем примере len -= 8 надо читать так: len = len-8; и зачем *p? идея в том что приходит char *p и его длина len длинна сообщения колеблится от 1 до х.з. байт нужно начиная от начала массива( с 0 элемента и доконца) побайтно(почарно) вывести на экран(в компорт) <{POST_SNAPBACK}> Я и написал, что ты берешь символ из указателя и отправляеш его putchar-ом куда надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maxim 0 17 июня, 2005 Опубликовано 17 июня, 2005 · Жалоба длинна сообщения колеблится от 1 до х.з. байт <{POST_SNAPBACK}> тогда функция будет еще проще: void putstringus(char *p,int len) { while(len--) putchar(*p++); } И ЭТО ВСЕ!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 17 июня, 2005 Опубликовано 17 июня, 2005 · Жалоба вот вроде кусок .s <{POST_SNAPBACK}> вроде ассемблерный код сгенерирован корректно; возможно, есть ошибка в функции putchar, которая выражается в том, что портятся регистры r10,r11 или R20-R23. Неплохо бы также проверить прерывания на предмет сохранения/восстановления регистров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maxim 0 17 июня, 2005 Опубликовано 17 июня, 2005 · Жалоба .dbfunc e putstringus _putstringus fV ; b -> R22,R23 ; a -> R22,R23 ; ipp -> R22,R23 ; len -> R22,R23 ; p -> R20,R21 <{POST_SNAPBACK}> А в компилаторе и точно баг. Все переменные располагаются в одних и техже регистрах R22 и R23, кроме указателя p! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mejia 0 17 июня, 2005 Опубликовано 17 июня, 2005 · Жалоба в итоге не прокатывает, сойдемся на глючности putchara, хотя для меня это и загадка когда по байтно посылать в путчар все работает, это не главное главное что все что хотел сделать на микрочипе работает так что если у кого есть микросхемка AT90S2313 и порт B подключенный к 8 светодиодам то www.ourarsenal.narod.ru/coding/nemesis.txt - C++ www.ourarsenal.narod.ru/coding/1.txt - HEX надо будет потом его урезать а то аш 80% от device получилось, там емо можно вполне урезать до 50-60% Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 17 июня, 2005 Опубликовано 17 июня, 2005 · Жалоба .dbfunc e putstringus _putstringus fV ; b -> R22,R23 ; a -> R22,R23 ; ipp -> R22,R23 ; len -> R22,R23 ; p -> R20,R21 <{POST_SNAPBACK}> А в компилаторе и точно баг. Все переменные располагаются в одних и техже регистрах R22 и R23, кроме указателя p! <{POST_SNAPBACK}> А это не баг, переменные a,b,len компилятор выкинул за ненадобностью. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться