Форум за електроника Форуми Форум за електроника
Български форум за електроника, ремонти, схеми, документация
 
 Въпроси/ОтговориВъпроси/Отговори   ТърсенеТърсене   ПотребителиПотребители   ГрупиГрупи   Регистрирайте сеРегистрирайте се 
 ПрофилПрофил   Влезте, за да видите съобщенията сиВлезте, за да видите съобщенията си   ВходВход 

Помощ PIC и RS232
Иди на страница Предишна  1, 2
 
Създайте нова тема   Напишете отговор    Форум за електроника Форуми -> Обща електроника - General Electronics



Предишната тема :: Следващата тема  
Автор Съобщение
ToНи
Гост





МнениеПуснато на: Сря Ное 09, 2005 11:56    Заглавие: Отговорете с цитат

To това няма общо с С-то.
Значи ак идеята е единия д ае нещо като клавиатура, другия ще муе мастера. На определен интервал от време мастера ще инициира комуникация, т.е. предава към слейва байт, слейва като получи байта знае че трябва да отговори. Ако няма много бутони ги предавай като флагове, т.е. предаваш един байт, и в зависимост от състоянито на всеки бит занеш дали съотвтниа бутон е натиснат или не. Бих ти препоръчал и някаква защита, примерно два пути да предаваш едини същ байт. Обратно потвърждение не ти трябва, ако искаш да ндицираш приеманет на байта, мастера може да ти връща байт който са флагове на светодиодите които искаш да мигнат. тук вече идва и друго, като предаваш повее от един байт е добре да си измислиш структура на данните за да е всичко наред, примерно 01 ти е старт на пакет 02 край на пакет. Край на пакет може и да нямаш ако предаваш дължина, и цялата работа става нео такова
байт 1 - стартов
байт 2 - дължина на паета
байт 3 - информационен
байт 4 - защита на данните, примерно сума на байт 2 и байт 3

ако са ти фиксирани пакетие може да отпадне дължина
тъй като ползваш 01 за старт навсякъде в кода трябва да го замениш с друго число, примерно 01 FF. После при приемането като видиш 01 знаесх це това ти е или стартов байт ил байт за 01, ако пакета е започнал не може да е стартов, но ако след него не следва FF това значи че или имаш нов пакет с този байт, или грешка при предаане, но тъй като не може да си сигурен дали е в 01 или е в FF отхвърляш пакта и чакаш следващият. и това е в общи линии, няколко реда е особенно ако е с фиксирана дължина
Върнете се в началото
XXXXXXXXXX
Гост





МнениеПуснато на: Сря Ное 09, 2005 16:03    Заглавие: Отговорете с цитат

С други думи трябва сам да си напиша протокол. Не ми върши работа готов(стандартен). Rolling Eyes
Върнете се в началото
Predator_MF
Опитен потребител
Опитен потребител


Регистриран на: 29 Юли 2004
Мнения: 272
Местожителство: Русе

МнениеПуснато на: Сря Ное 09, 2005 17:42    Заглавие: Отговорете с цитат

Задачка закачка като за начинаещ Very Happy
_________________
Форум за микроконтролери - www.mcu-bg.com
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Изпрати мейла Yahoo Messenger MSN Messenger
suxfan
Опитен потребител
Опитен потребител


Регистриран на: 29 Окт 2004
Мнения: 174

МнениеПуснато на: Сря Ное 09, 2005 20:01    Заглавие: Hm Отговорете с цитат

XXXXXXXXXX написа:
С други думи трябва сам да си напиша протокол. Не ми върши работа готов(стандартен). Rolling Eyes

Защо не ползваш I2C протокол, много е удобен за такива неща .
Има готови примери в нета асемблерски кодове само копираш и деистваш , а вече има и контролери на които само им пускаш адреса и данните и е много по елементарно с тях Smile
Например 16F819,16F88 имат вградено и опростено управление на I2C и много лесно се прави комуникация между 2 устроиства по такава шина с тях.





А ако си мераклия може да ползваш PWM в твоя RS232 метод .
Така е по сигурно че няма да се прецакат данните , но не знам дали ще смогнат за 9600 , вдигни им честотата ако е нужно . Rolling Eyes
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
ToНи
Гост





МнениеПуснато на: Сря Ное 09, 2005 22:14    Заглавие: Отговорете с цитат

Ами I2C в никакъв случай не е по един проводник, а и ще реализира еднопроводен сериен доста по лесно отколкот I2C, освен ако няма хардуерна поддръжка, ама и тогава не е сигурно.
Няма нищо сложно в цялата работа.
Относно твоя въпрос, да готови протоколи общо взето няма, и I2c да позлваш пак не те оправя на 100 %, пак трябва да менажираш предаване и приемане.
Значи ето как трябва да стани в общи линии :

void Send (int* packet_ptr,int package_lenght_t)
{
int *ptr;
int16 CRC;
int i,temp;
ptr=packet_ptr;
CRC=0;
for(i=0;i<package_lenght_t;i++) // èç÷èñëÿâà CRC
{
CRC=CRC+packet_ptr[i];
}
packet_ptr[package_lenght_t]=make8(CRC,0);
package_lenght_t++;
packet_ptr[package_lenght_t]=make8(CRC,1);
//--------------------------------------------- îïàêîâàíå íà äàííèòå
temp=package_lenght_t;
for(i=1;i<temp;i++) // ïðåáðîÿâà äàííèòå ñúñ ñòîéíîñò FF è îïðåäåëÿ äúëæèíàòà íà ïàêåòà
{
if(packet_ptr[i]==255)
{
package_lenght_t++;
}
}
package_lenght_t=package_lenght_t+2;
putc(255); // èçïðàùà ïúðâèÿ ñòàðòîâ áàéò FF
putc(0); // èçïðàùà âòîðèÿ ñòàðòîâ áàéò 00
putc(package_lenght_t); // èçïðàùà äúëæèíà íà ïàêåòà
for (i=0;i<=temp;i++) // ïðåîáðàçóâà äàííèòå, äîáàâÿ 01 ñëåä âñåêè FF
{
if (packet_ptr[i]!=255) // àêî áàéò 0 å ðàçëè÷åí îò 255
{
putc(packet_ptr[i]); // ãî çàïèñâà êàòî 255
}
else // àêî íå å , ò.å. å = 255
{
putc(packet_ptr[i]); // çàïèñâà ãî êàòî 255
putc(01); // äîáàâÿ áàéò 01
}
}
}

като тук проверката не е CRC а е обикновенно събиране на всички данни от пакета. FF 00 ти е старт на пакета а FF 01 ти е съдържание FF. Както казах ако имаш фиксирана дължина на паета нещата доста могат да се опростят.

Приемането, тъй като това горе ми е разновиност на тов акоето ползва принципно, нямам реализация като за pIC от другата страна на тоа е PC ..... ето приемането на един малко по ралзичен протокол, с мног сходна структура :

#int_RDA
RDA_isr()
{
rx_data=getch();
//---------------------------------------------- èçâëè÷à äàííèòå êàòî äîïúëíèòåëíèòå áèòîâå
if(FF_bit) //àêî ïðåäíèÿò áèò å áèë F
{
switch (rx_data) // ïðîâåðÿâà ïðèåòèÿ áàéò
{
case 0: init_all(); // àêî áàéòà å FF
new_package=1; // èíèöèàëèçàöèÿ è íà÷àëî íà íîâ ïàêåò FF 00
package_available=0; // àíóëèðà ïðåäíèÿ ïàêåò
Return;
break;
case 1: FF_bit=0; // ïðè áàéò 01 /äàííè FF/ íóëèðà FF_bit
recive_byte++;
Return;
break;
default : init_all(); // íåâàëèäíè äàííè, àíóëèðà ïàêåòà
Return;
break;
}
}
else
{ //àêî íÿìà ïðèåò áèò FF
if (rx_data==255)
{
FF_bit=1; // ïðèåòèÿò áèò å FF
}
}
//---------------------------------------------------------------------------------------------
if(new_package)
{
in_data[byte_number]=rx_data; // çàðåæäà ïðèÿòèÿò áàéò â ìàñèâà
if (byte_number==0) // àêî å ïúðâèÿ ïðèåò áàéò
{
package_lenght=rx_data; // èçâëè÷à äúëæèíà íà ïàêåòà
}
if(recive_byte==package_lenght) // àêî å äîñòèãíàòà äúëæèíàòà íà ïàêåòà
{
package_available=1; // îêàçâà ïàêåòà êàòî âàëèäåí
new_package=0; // çàòâàðÿ ïàêåòà
}
else // àêî íå å äîñòèãíàòà äúëæèíàòà íà ïàêåòà
{
byte_number++; // èíêðåìåíòèðà byte_number è recive_byte
recive_byte++;
}
}
}

точно тия двата не са пример за перфектно написан код но ще ти стигнат да разбереш как работи,а може и да ги ползваш, като гледам те май са еднакво структурирани, мислех че има ралика в мястото за дължина на пакета но и на двата май тя е веднага след стартовия бит.
Върнете се в началото
XXXXXXXXXX
Гост





МнениеПуснато на: Чет Ное 10, 2005 8:51    Заглавие: Отговорете с цитат

Благодаря за всичко ТоНи . На теория ми е ясно как се реализират вариантите за комуникация(тези диаграми ги имам). И се оказвам прав ИМА ЗНАЧЕНИЕ КОЛКО ДОБРЕ ЗНАЕШ "С"!!!! Почно това ми е проблема- незнаех как да го напиша. Задавам межи би последен и може би тъп въпрос, но независимо да ли е I2C, rs232 или нещо друго основните думичи за последователно предаване и приемане getc(); и putc(); ли са, защото от ръководството на С останах с впечатлението, че те се използват само за rs232???????????
Върнете се в началото
suxfan
Опитен потребител
Опитен потребител


Регистриран на: 29 Окт 2004
Мнения: 174

МнениеПуснато на: Чет Ное 10, 2005 9:08    Заглавие: Hm Отговорете с цитат

XXXXXXXXXX написа:
Благодаря за всичко ТоНи . На теория ми е ясно как се реализират вариантите за комуникация(тези диаграми ги имам). И се оказвам прав ИМА ЗНАЧЕНИЕ КОЛКО ДОБРЕ ЗНАЕШ "С"!!!! Почно това ми е проблема- незнаех как да го напиша. Задавам межи би последен и може би тъп въпрос, но независимо да ли е I2C, rs232 или нещо друго основните думичи за последователно предаване и приемане getc(); и putc(); ли са, защото от ръководството на С останах с впечатлението, че те се използват само за rs232???????????

Не е ли по добре да си изтеглиш един MPLAB от саита на http://www.microchip.com/ и да работиш директно на асемблер , поддържа всички видове контролери, и наи важното има трасиране на asm кода, като си извадиш отстрани "Special function registers" , "File register" и ако ползваш EEprom и него, така виждаш какво върши кода и кои битове как се променят и къде имаш грешки при трасиране даже и ти съобщава къде си объркал нещо.
Не си мисли че времето което ще отделиш да го направиш на C е по малко от това да го пишеш директно в ASM .
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
ToНи
Гост





МнениеПуснато на: Чет Ное 10, 2005 9:34    Заглавие: Отговорете с цитат

Оооо за времето можем да поспорим, опитай да реализираш горния протокол да видим колко време ти трябва на асм, дори и за много неща д аимаш готови функции. За време въпрос не може да става, С-то си има всчко което си има и MPLAB, всъщност то работи заедно с него, или пък с Proteus, а после и с хардуерен дебъгер.
Относно асемблера аз съм на мнение че трябва да се почва с него, С без асемблер не е много полезно.
Относно за знаенето на С, аме не, ажна е идеята, както колегато по горе го е казал и на асемблер става.
putc и getc са точно за rs в случая, за i2c, spi и др в това C си има отделни функции. Важното е идеята да схаванеш, но не е лошо да почетеш повечко.
Върнете се в началото
suxfan
Опитен потребител
Опитен потребител


Регистриран на: 29 Окт 2004
Мнения: 174

МнениеПуснато на: Чет Ное 10, 2005 10:41    Заглавие: Mda Отговорете с цитат

ToНи написа:
Оооо за времето можем да поспорим, опитай да реализираш горния протокол да видим колко време ти трябва на асм, дори и за много неща д аимаш готови функции. За време въпрос не може да става, С-то си има всчко което си има и MPLAB, всъщност то работи заедно с него, или пък с Proteus, а после и с хардуерен дебъгер.
Относно асемблера аз съм на мнение че трябва да се почва с него, С без асемблер не е много полезно.
Относно за знаенето на С, аме не, ажна е идеята, както колегато по горе го е казал и на асемблер става.
putc и getc са точно за rs в случая, за i2c, spi и др в това C си има отделни функции. Важното е идеята да схаванеш, но не е лошо да почетеш повечко.

Така е за четенето спор няма , но наистина наи добре е да се почне с асмблер , особенно за малки проекти е много добре.
Аз преди време като правих един проект за четене от външна EEPRОМ и същевремнно работа с Дисплеи, доста нещо изрових из нета , при положение че топлата вода е измислена , в интернет има много готови неща при това добре направени.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
ToНи
Гост





МнениеПуснато на: Чет Ное 10, 2005 10:52    Заглавие: Отговорете с цитат

Е това за мен не е решение, поствам сорсове на много места, но нямам навика да позлвам чужди, ако някога се слуи да гледам нео то е само да видя идеята. По съм склонен да ползвам функциие на компилаора, и неговите драйвери, но и там се налагат преработки доста често, в драйверите най-вече. Това кото са ми плащали е било винаги достатъчно за да се напрегна мозъка да го измисля, не ми се рискува с чужд софт, то и без това и бе зд ае чужд някоигреши трудно се откриват,а и с тия PIC-ве ....

p.s. много от грешките в една програма са логичеси, не е лошо начинаещите да се научат да си рисуват алгоритми и да си проверяват логиката на работа, защото таква глупости съм правил от недоглеждане че няма на къде ......
Върнете се в началото
Покажи мнения от преди:   
Създайте нова тема   Напишете отговор    Форум за електроника Форуми -> Обща електроника - General Electronics Часовете са според зоната GMT + 2 Часа
Иди на страница Предишна  1, 2
Страница 2 от 2

 
Към:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети


Powered by phpBB © 2001, 2005 phpBB Group
Translation by: Boby Dimitrov
Where to Find Free Service Manuals