mejia 0 15 июня, 2005 Опубликовано 15 июня, 2005 · Жалоба хорошо прогу написал и после урезания жрет 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: можете объяснить багу? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
phantom 0 16 июня, 2005 Опубликовано 16 июня, 2005 · Жалоба осталась проблемка не касающаяся кодинга.... А что, это все работает? Не верю!! :w00t: Я, конечно, могу сильно проезжать (со мной это что-то часто в последнее время), но все же: 1) что-то не могу уловить, где вызываются функции sort() и work(); 2) short int temp; itoa(&x[0],temp,10); // v a xranitsa maska bitov komanda=temp; всегда думал, что 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) for (i=0;i<8;i++) { b=prinataya_stroka; b<<=i; b>>=i; if (b==1) svetodiodon(nojkas); if (b==0) svetodiodoff(nojkas); } :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) void svetodiodon(char nojka) { PORTB &=~BIT (nojka); } кажется, выключает, а не включает void svetodiodoff(char nojka) { PORTB ^= BIT (nojka); } ^ - операция "исключающее ИЛИ", т.е. светодиод не выключается, а меняет состояние на противоположное 5) Кстати, а нельзя сразу с компьютера посылать 1 байт, кодирующий, чего включить и выключить, вместо того чтобы посылать 3, а потом их разгребать? 6) void get_result() { x[cou]=UDR;cou++; if (cou==4) {cou=0;} } warning :) : будеть корректно работать только если компьютер будет посылать каждый раз строго 4 байта Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mejia 0 16 июня, 2005 Опубликовано 16 июня, 2005 · Жалоба осталась проблемка не касающаяся кодинга.... А что, это все работает? Не верю!! :w00t: Я, конечно, могу сильно проезжать (со мной это что-то часто в последнее время), но все же: 1) что-то не могу уловить, где вызываются функции sort() и work(); 2) short int temp; itoa(&x[0],temp,10); // v a xranitsa maska bitov komanda=temp; всегда думал, что 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) for (i=0;i<8;i++) { b=prinataya_stroka; b<<=i; b>>=i; if (b==1) svetodiodon(nojkas); if (b==0) svetodiodoff(nojkas); } :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) void svetodiodon(char nojka) { PORTB &=~BIT (nojka); } кажется, выключает, а не включает void svetodiodoff(char nojka) { PORTB ^= BIT (nojka); } ^ - операция "исключающее ИЛИ", т.е. светодиод не выключается, а меняет состояние на противоположное 5) Кстати, а нельзя сразу с компьютера посылать 1 байт, кодирующий, чего включить и выключить, вместо того чтобы посылать 3, а потом их разгребать? 6) void get_result() { x[cou]=UDR;cou++; if (cou==4) {cou=0;} } warning :) : будеть корректно работать только если компьютер будет посылать каждый раз строго 4 байта <{POST_SNAPBACK}> :smile3009: убил :) полностью согласен, но для этого и хотел работать с VMLAB чтобы можно было протестировать, что когда случается..... в дебаггере... в итоге я прогу сократил до void main() { while (1); } всеравно бага... так что щас рыскаю по серверам чтобы найти реальное описание к VM лабу.... :maniac: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться