Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT90S2313-10PI(пробелема с получением данных по...
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
mejia
вопрос такой, кто-нибудь сталкивался с проблемой получния даннах с компа по RS-232?

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

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

задача: получить 4 байта(AnsiString из C++) с COM и записать их в
массив
тоесть что-то типа такого
char b[10];

b[0]=RxD1;
b[1]=RxD2;
b[2]=RxD3;

b[3]=RxD4;

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

maniac.gif
at90
Цитата(mejia @ Jun 12 2005, 16:57)
вопрос такой, кто-нибудь сталкивался с проблемой получния даннах с компа по RS-232?

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

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

задача: получить 4 байта(AnsiString из C++) с COM и записать их в
массив
тоесть что-то типа такого
char b[10];

b[0]=RxD1;
b[1]=RxD2;
b[2]=RxD3;

b[3]=RxD4;

Используй прерывания по приёму и передаче.
При возникновении прерывания записй данные в массив.
Это дело КодеВижен сам генерит. Там в генераторе кода укажи только размер массива и дело в шляпе!!!!!!!!! smile.gif
я уже с месяц парюсь ничего придумать не могу.... помогите пожалуста

maniac.gif
*
andk
Какой исходник нужен - Асм или С ?
Laksus
Цитата(mejia @ Jun 12 2005, 16:57)
вопрос такой, кто-нибудь сталкивался с проблемой получния даннах с компа по RS-232?

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

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

maniac.gif
*


Я так понял, что тебе надо исходник C. А каким компилятором пользуешся.
Если CodeVisionAVR DEMO, то он не создает код с прерываниями по приему UART.
yung
Я пользуюсь компилятором от 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
Фраза "//uart has received a character in UDR", очевидно, означает, что принятый байт находится в регирстре UDR. Следовательно, в подпрограмме обработки прерывания нужно вставить что-то вроде
void uart0_rx_isr(void)
{
b[i++]=UDR; // записываем полученный байт в следующий
//элемент массива
}
а в главной программе что-то вроде
i=0; // переходим на начало массива
while(i<4); // ждем пока примутся 4 байта
// (только если точно знаем, что в данный момент они будут передаваться, иначе тут и зависнем)
KRS
Если пока не получишь 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
А какой смысл висеть в ожидании четырех принятых байт, что, заняться больше нечем? Обычно я делал проверку в самой процедуре прерывания от приема, и когда дождался всего, чего хотел, то уходил куда надо (не подумайте плохого) прямо оттуда (не лучший вариант) , либо вывешиваешь флаг готовности, а этот флаг в основном теле и анализируется. А тот код, который привел - это болванка, вся сгенерированная ICC. UDR читать в ней обязательно, иначе не сбросится флаг прерывания со всеми последующими удовольствиями.
yung
И еще одна мысль. Чем заниматься длительными рассуждениями, дай четкую постановку - чего хочешь. Если только того, что написал, то укажи параметры UART - скорость, число бит, сколько старт-стоп и частоту твоего кварца. Проще написать готовую прогу,остальное вставишь, чем заниматься демагогией (особо веселые товарищи последнее слово могут поправить)
mejia
Цитата(yung @ Jun 14 2005, 10:49)
И еще одна мысль. Чем заниматься длительными рассуждениями, дай четкую постановку - чего хочешь. Если только того, что написал, то укажи параметры 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 smile.gif 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[i]);
if (b==0) svetodiodoff(nojkas[i]);
}

}
// 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 smile.gif
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
а вот сам код, но у меня какая-то странная проблема, он при виде этой прагмы интерупт пишет мне такие ошибки:
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
а может кто-нибудь выложить кряк к Image Craft?( у меня DEMO Evaluation)...
или ее невозможно крякнуть, так как она дема? тогда чем пользоваться простым смертным? blink.gif
yung
Сначала о кряке. Он в прицепе(если прицепится).Работает с версиями 6.хх.
С седьмой не хочет, сам просил в форуме, никто не дал. Насчет программы буду смотреть. Что касается указанных ошибок, то тут ничего страшного. Выбираешь закладку проект-опции-устройство и устанавливаешь нужный девайс. Все получится. А вот так я пользовался кряком.
1. Устанавливается демо-версии ICC
2. Запускается reg_iccavr.bat.
3. Запускается ICC и вперед.
4. После этого reg_iccavr.bat закрываеися и больше про него не вспоминаем
до апгрейда ICC.
yung
И что это у тебя за версия ICC, что русских комментариев не понимает? Найди посвежее, наверняка на аргуссофтовском сайте шестая версия осталась, или на фирменный сайт сходи. В крайнем случае на мыло брошу (хотя это не один метр)
yung
Там почему-то в двух кусках разные требования. Сделано по первому варианту, т.е. два байта: четыре бита ракорда, 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);
}
mejia
хорошо прогу написал и после урезания жрет 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 smile.gif 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 smile.gif
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[i]);
if (b==0) svetodiodoff(nojkas[i]);
}

}
// 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.gif

можете объяснить багу?
phantom
Цитата
осталась проблемка не касающаяся кодинга....

А что, это все работает? Не верю!! w00t.gif
Я, конечно, могу сильно проезжать (со мной это что-то часто в последнее время), но все же:
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.gif
В нормальном С строку в число преобразует 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[i]);
if (b==0) svetodiodoff(nojkas[i]);
}

huh.gif ohmy.gif mellow.gif
трудно даже проанализировать, когда выполняютя условия 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 sad.gif

Вопрос: почему бы не написать просто
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 smile.gif : будеть корректно работать только если компьютер будет посылать каждый раз строго 4 байта
mejia
Цитата(phantom @ Jun 16 2005, 11:42)
Цитата
осталась проблемка не касающаяся кодинга....

А что, это все работает? Не верю!! w00t.gif
Я, конечно, могу сильно проезжать (со мной это что-то часто в последнее время), но все же:
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.gif
В нормальном С строку в число преобразует 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[i]);
if (b==0) svetodiodoff(nojkas[i]);
}

huh.gif ohmy.gif mellow.gif
трудно даже проанализировать, когда выполняютя условия 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 sad.gif

Вопрос: почему бы не написать просто
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 smile.gif : будеть корректно работать только если компьютер будет посылать каждый раз строго 4 байта
*



smile3009.gif убил smile.gif полностью согласен, но для этого и хотел работать с VMLAB чтобы можно было протестировать, что когда случается..... в дебаггере...

в итоге я прогу сократил до
void main()
{
while (1);
}

всеравно бага... так что щас рыскаю по серверам чтобы найти реальное описание к VM лабу.... maniac.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.