|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:18 am
Проблем при USART комуникация между два PIC18F6585
| Автор |
Съобщение |
|
ykornx
Ранг: Минаващ
Регистриран на: Съб Юли 24, 2010 5:23 pm Мнения: 11
|
 Проблем при USART комуникация между два PIC18F6585
Здравейте!
Опитвам се да направя проста master-slave комуникация между два PIC18F6585 по USART контролерите им, свързани чрез МАХ485, или по-просто казано комуникация master-slave по RS485.
Идеята е следната: Единият PIC изпраща съобщение, другият РIC го прочита и съответно връща отговор.
Действие: Изпращам съобщението от PIC1, PIC2 го прочита и го разпечатва на свързаният към него LCD дисплей (това работи). В отговор връща прочетеното съобщение към PIC1, като искам PIC1 също да го разпечата на екрана си. Проблема обаче изниква при приемането на върнатото съобщение от PIC2. Тоест PIC1 не го прочита (USART-а му не сработва както трябва - така мисля аз). Немога да разбера обаче къде точно е проблема и защо не прочита изпратеното от PIC2.
Нов съм в програмирането на PIC и съм сигурен, че проблема е в моя код и недостатъчните ми познания.
За симулирането на схемата използвам Proteus.
Работя с MPLAB и C18 компилатор.
На снимката можете да видите схемата, 4-те терминала съм ги сложил за да мога да наблюдавам какво се случва.
От PIC2 се изпраща защото излиза в терминала за приемане на PIC1 - тоест преди да влезе в USART-a му.
Надявам се, че съм успял да разясня какъв точно е проблема!
Ако има нещо допълнително което искате да видите отностно функциите на USART-a и LCD-то мога да прикача и останалите файлове от проекта!
Поздрави!
Сорс код master:
Сорс код на slave:
|
| Съб Юли 24, 2010 5:56 pm |
|
 |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
гледай сегааа... нали се сещаш че 485 е халф-дуплекс? ще трябва след като изпратиш съобщението от мастър към слейв (който е бил в режим на приемане), да обърнеш слейва в режим на предаване, а мастъра в режим на приемане. ако искаш да си сигурен провери си пина дето ти клати посоката на 485 трансийвъра. щом от едното към другото работи, значи и на обратно ще иска стига да си го инициализирал правилно - има някакви функции които не им вдявам какво правят, ти си знаеш. и що просто не опиташ да пратиш нещо от слейв към мастър и да видиш дали го приема? така ще знаеш, че по принцип имаш двупосочна комуникация, после си търси бъговете из кода къде не суичва посоките.
|
| Съб Юли 24, 2010 7:05 pm |
|
 |
|
ykornx
Ранг: Минаващ
Регистриран на: Съб Юли 24, 2010 5:23 pm Мнения: 11
|
Ами аз точно това правя - тези функции USART_activa_tx() и USART_activa_rx() обръщат режима на приемане и предаване. Ако беше прочел малко по-внимателно щеше да видиш, че слейва изпраща към мастъра и това което изпраща преминава през двата MAX485 и излиза от втория (този който е до PIC1 вляво), но явно първия PIС не го приема. Затова и пиша тук, понеже кода съм го гледал доста, може би да пропускам нещо, но по пътя на логиката би трябвало да работи.
Та поради тази причина се нуждая от съвет къде може да е проблема или по-точно защо PIC1 не приема по USART в конкретния случай при конкретните условия - ясно е, че има нещо не както трябва..... помогнете да го открия 
|
| Съб Юли 24, 2010 8:54 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Не че тук е проблемът, но имам няколко забележки по стила:
if(receive[0]==WhatAmI&receive[1]==WhoAmI) не е ли по-читав така
if ( (receive[0]==WhatAmI) && (receive[1]==WhoAmI) )
липсва текстът на много от интересните функции, напр. USART_activa_tx, USART_activa_rx, putsUSART. Някои от параметрите на OpenUSART също са ми неясни. Без тях ми е трудно да ти кажа какво се е объркало.
Все пак да не е хардуерен проблем? Нещо около RX на мастъра?
Опитай да видиш нивото на приемния изход на 485 на мастъра, може нивата да са такива, че контролният приемник да ги поеме, а MCU - не. Най-лесно става като дадеш предаване на слейва и "ръчно" предаваш само 1 и после само 0.
На схемата на виждам начертани кварцове. Ако караш на вътрешен RC генератор и честотата на мастъра е малко ( 2-3 % ) по-висока от честотата на слейва, така ще бъде. Опитай с размяна на местата M <> S.
В софтуера на мастъра - изчисти битовете за грешки на USART мастъра преди да започнеш приемането.
Изобщо - идеи много ... Пиши после какво се е случило.
|
| Нед Юли 25, 2010 1:28 pm |
|
 |
|
ykornx
Ранг: Минаващ
Регистриран на: Съб Юли 24, 2010 5:23 pm Мнения: 11
|
 |  |  |  | bateAz написа: Не че тук е проблемът, но имам няколко забележки по стила: if(receive[0]==WhatAmI&receive[1]==WhoAmI) не е ли по-читав така if ( (receive[0]==WhatAmI) && (receive[1]==WhoAmI) ) липсва текстът на много от интересните функции, напр. USART_activa_tx, USART_activa_rx, putsUSART. Някои от параметрите на OpenUSART също са ми неясни. Без тях ми е трудно да ти кажа какво се е объркало. Все пак да не е хардуерен проблем? Нещо около RX на мастъра? Опитай да видиш нивото на приемния изход на 485 на мастъра, може нивата да са такива, че контролният приемник да ги поеме, а MCU - не. Най-лесно става като дадеш предаване на слейва и "ръчно" предаваш само 1 и после само 0. На схемата на виждам начертани кварцове. Ако караш на вътрешен RC генератор и честотата на мастъра е малко ( 2-3 % ) по-висока от честотата на слейва, така ще бъде. Опитай с размяна на местата M <> S. В софтуера на мастъра - изчисти битовете за грешки на USART мастъра преди да започнеш приемането. Изобщо - идеи много ... Пиши после какво се е случило. |  |  |  |  |
Благодая, че се отзова!
Значи първо да кажа само, че задачата ми по принцип е да направя симулацията на Proteus. Това ми е дипломната работа от части.... та честно казано до хардуер не съм се и докосвал  колкото и странно да звучи. На менсе падна късмета да разучавам Протеуса и възможностите му. Така, че засега работя само със симулацията. Може би другата седмица ще имам и някакъв хардуер и и тогава съвсем ще се замотам ми се струва.
Та по темата:
За if-овете не се получава - по твоя начин даже не сработва, незнам дали има нещо общо със C18 или Протеус-а.
Това е съдържанието на тези функции които ми служат да превключвам MAX485 в режим приемане или предаване, нищо повече не вършат.
putsUSART() - тази функция си е вградена в C18 тоест само я ползвам и служи за изпращане на стринг по USART-а За кварцовете общо взето стигнах до извода, че с тях или без тях в Протеуса е все същото, та затова и не ги чертая. Все пак да кажа, че имам малък напредък - смених OpenUSART() със следната функция:
Тоест друг вид инициализация и работата потръгна малко, вече получавам и отговора от слейва, малко бъгав все още, не ми изписва всичко което трябва да изпише на екрана, но определено има двупосочна комуникация въпреки, че не на 100% работеща съвсем правилно, все още нещо куца.
А това с изчистването на битовете за грешки на USART-a ще прочета понеже досега не съм го правил да видим дали ще има някакъв резултат.....въпреки, че може би това е по-скоро към хардуерното изпълнение...aко имаш желание да се занимаваш мога да ти пратя проекта да го погледнеш като цяло...може пък да видиш проблема....
Поздрави!
|
| Нед Юли 25, 2010 4:04 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Хм.
Не знаех, че става дума за симулация. Да дебъгваш фърмуер върху симулатор е като да правих секс с дясната си ръка. Не че не се стига до оргазъм, ама има разлика, вЕрвай ми.
Та по въпроса:
Според мен ти наистина не управляваш коректно МАХ485. Ти променяш TRIS бита на порта, а той трябва постоянно да е сетнат като изход. Битът, който трябва да се променя е в изходния регистър. Не познавам добре PIC, за да ти кажа точно как се казва, нещо като LATCH май беше.
|
| Нед Юли 25, 2010 4:27 pm |
|
 |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
май там някъде горе още споменах да си погледнеш превключването на приемане-предаване на макса? щото точно TRISx е да кажеш каква е посоката на пина - вход/изход, но ако искаш да му дадеш стойност позлваш приомерно PORTx ( май и с LATx ставаше, позабравил съм ги тия пикове, ама като не се ползва така е, нека някой по вещ се изкаже по това, има хора дето ги знаят кат дясната си ръка  И заржи тая симулация - то да не се окаже че протеуса ти бута в резултата повече грешки от тия дето ги имаш в кода.
|
| Пон Юли 26, 2010 10:36 am |
|
 |
|
the_electronic_m@n
Ранг: Минаващ
Регистриран на: Пет Окт 05, 2007 8:34 pm Мнения: 76 Местоположение: Русе
|
С TRISx задаваш предназначението на пина. При 1 извода е вход, а при 0- изход. PORTx и LATx са почти едно и също. Разликата е съвсем малко и можеш да видиш в чаршафите на PIC-ка за какво иде реч. PORTx регистъра, с който "извеждаш" на съответния извод 1 или 0, или "четеш". Моя съвет е като колегите по-горе. Зарежи го този симулатор. Той по принцип е за да придобиеш долу-горе предствава за естеството на материята, но най-добре си е да ковнеш една платчица с хардуера. Нищо чудно да се окаже, че физически всичко е ток и жица. Това го знам от личен опит при контакта ми със симулаторите. Имал съм случаи на симулатора всичко е 6, а в действителност не работи и обратно!
Другото което забелязвам е това:
void USART_activa_tx(void){ TX_485_ENABLE = 1; }
void USART_activa_rx(void){ TX_485_ENABLE = 0; }
#define TX_485_ENABLE TRISCbits.TRISC5 - това ми е дефиницията на бита който използвам за превключването
Според мен този код ще работи ако е записан така
void USART_activa_tx(void){
TX_485_ENABLE = 1;
}
void USART_activa_rx(void){
TX_485_ENABLE = 0;
}
#define TX_485_ENABLE PORTCbits.PORTC5 - това ми е дефиницията на бита който използвам за превключването
,а TRISC5 го остави изход, TRISC5=0;
Изводите за управление посоката на данни на МАХ-а е ВХОД! Като зададеш и на пика вход и става манджа с грозде.
Надявам се да съм бил полезен, пиши докъде си стигнал със задачката.
|
| Пон Юли 26, 2010 11:31 am |
|
 |
|
ykornx
Ранг: Минаващ
Регистриран на: Съб Юли 24, 2010 5:23 pm Мнения: 11
|
Здравейте отново, ще пробвам да настроя битовете както the_electronic_m@n ми казва, да видя какво че се получи със симулалтора.
А иначе вече имам хардуера, така, че ще започна вече да се мъча да видя какво ще излезе в реална среда.
Лошото е, че нямам обаче допълнителните преобразуватели от rs232 към rs485, което засега ще ми попрече да тествам rs485-цата, та засега оставам на симулатора.
Затова започвам с rs232 и инфраред.
Опасявам се, че ще имам проблеми, но ще ви държа в течение какво става......
Благодаря!
ПП. Малко по късно ще сложа снимки на платките да добиете представа за какво става въпрос.
А темата ми по принцип е "Комуникация по RS232, RS485, IrDA и LIN", която трябва да се осъществи между двете платки.
|
| Пон Юли 26, 2010 4:16 pm |
|
 |
|
ykornx
Ранг: Минаващ
Регистриран на: Съб Юли 24, 2010 5:23 pm Мнения: 11
|
Здравейте, малко се позагубих, но ме налегнаха много задължения.
Ето снимка на платките както обещах.
Естествено симулацията не тръгна в реална среда, и сега общо взето може да се каже, че почти започнах отначало.
И се боря с RS232 комуникацията. Комуникацията работи, като натискам клавишите на едната платка ми излизат на екрана на другата. Това което искам да направя обаче е да е двупосочна комуникация. Тоест в даден момент когато реша (примерно при натискане на бутон '*' на клавиатурата) да се превключват функциите или нещо такова и платката която е получавала до този момент да започне да изпраща, а тази която е изпращала да започне да получава. В крайа сметка не ми се получава. Аз мисля, че трябва да стане с прекъсвания - така ли е? Ако да как точно трябва да се осъществи?
Аз направих някакви опити, но не се получава.
Слагам кода на главните функции за да добиете представа какво се опитвам да направя...
main1 e платка 1 която изпраща в моемента към main2 която получава успешно.
|
| Съб Юли 31, 2010 7:27 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
Ти нещо ли не обясняваш като хората, аз ли не разбирам. У(С)АРТ модула на пика е сравнително прост. Ако ще работиш на ниско ниво имаш в общи линии да настроиш режима (8 - 9 бита црц-та и др поддобни дето за начало може и без тях), да настроиш честотата (там е малка гимнастика), и вече да пращаш. Сега... модула генерира няколко прекъсвания. В общи линии теб силно те интересува едно - за приет байт, тъй като буфера е само три байта, ако не си четеш своевременно входящия, ще получиш три байта. Пращането пък е съвсем елементарно пишеш си в тхбуф и пускаш - тука "евентуално" трябва да изчакаш изпращането, дали ще полваш флага или ще чакаш прекъсване си е твоя работа.
А пък за пред хората скришно съединяваш RX и TX жиците и имаш готово "ехо" 
|
| Съб Юли 31, 2010 8:15 pm |
|
 |
|
ykornx
Ранг: Минаващ
Регистриран на: Съб Юли 24, 2010 5:23 pm Мнения: 11
|
Aми начинаещ съм и може би немога да обясня както трябва, незнам. Но по принцип тя комуникацията работи.......по-конкретно ме интересуваше как да направя това оето съм описал в горния ми пост.
|
| Нед Авг 01, 2010 11:10 am |
|
 |
|
plameniv
Ранг: Форумен бог
Регистриран на: Нед Окт 10, 2004 9:55 am Мнения: 1718
|
Правиш следното:
1. Когато нямаш комуникация ги направи всеки да е Slave (RX).
2. Когато предаваш превклчваш от Slave => Master (TX) .
3. След като спре комуникацията Master => Slave.
Така който и да започне да предава ще заеме линията докато свърши да предава. След като спре и да започне другия ще заеме пак линията докато спре да предава. Ще ги направиш с някаква команда за край на предаването да има флаг за другия че се освобождава линията за да предава, ако имаш вече данни за обратната посока да се включи.
Едва ли ще отнеме кой знае колко да предава за сметка на изчакване.
_________________ Избийте баламите и тарикатите сами ще умрат!
Няма невъзможни работи - има много трудни работи!
----------------------------------------------------------------------------------
"Я в Москве с киркой уран найду, при такой повышенной зарплате" !
|
| Нед Авг 01, 2010 11:56 am |
|
 |
|
ykornx
Ранг: Минаващ
Регистриран на: Съб Юли 24, 2010 5:23 pm Мнения: 11
|
 |  |  |  | plameniv написа: Правиш следното: 1. Когато нямаш комуникация ги направи всеки да е Slave (RX). 2. Когато предаваш превклчваш от Slave => Master (TX) . 3. След като спре комуникацията Master => Slave. Така който и да започне да предава ще заеме линията докато свърши да предава. След като спре и да започне другия ще заеме пак линията докато спре да предава. Ще ги направиш с някаква команда за край на предаването да има флаг за другия че се освобождава линията за да предава, ако имаш вече данни за обратната посока да се включи. Едва ли ще отнеме кой знае колко да предава за сметка на изчакване. |  |  |  |  |
Като пращам някакво фиксирано съобщение примерно си работи двупосочната комуникация, и по начина по който ти ми казваш (правя го със сетване битовете за разрешаване/забрана на приемането и предаването на USART-а) предполагам това си имал в предвид, и по другия начин директно с готовите функции на C18 за USART-a. Обаче немога да реша проблема с клавиатурите. Пиша на едната платка и получавам на другата, обаче обратния процес нещо не ми се получава. Опитах да го направя примерно като натисна '*' на тази която предава да излезе от функцията на предаване и да мине в режим на приемане, и съответно другата от режим на приемане да мине в режим на предаване, ама......
Ако някой има време и желание да погледне кода да каже, ще го постна...
|
| Нед Авг 01, 2010 7:41 pm |
|
 |
|
optron
Ранг: Ориентиран
Регистриран на: Чет Ное 20, 2008 1:49 pm Мнения: 276 Местоположение: Бургас
|
Не съм ти чел кода, ще говоря принципно.
Обособи си две основни програми - приемаща и предаваща.
Приемащата инициира порта за режим приемане и почва да чака и да го чете. Прочетеното пише на дисплея. Всеки приет символ проверява дали е звездичка. Ако да, преминава към предаващата програма.
Предаващата инициира порта за предаване и почва да чака и чете клавиатурата. Всеки прочетен символ предава по порта. После го проверява дали е звездичка. Ако да, преминава към приемащата програма.
По този начин се разграничава във всеки контролер кое е източника на звездичката - порта или клавиатурата. Като допълнителна опция може да накараш приемащата програма да проверява клавиша звездичка и ако го натиснеш, да превключи на предаване, да предаде звездичка и след това да превключи на приемане отново. Така ще можеш да стартираш комуникация ако се случи и двата контролера да преминат в режим на приемане.
Още една опция е при инициацията на всяка програма да изписва на дисплея в какъв режим минава - предаване или приемане. Така ще знаеш коя клавиатура да натискаш.
_________________ Digitally yours: Optron
|
| Чет Авг 05, 2010 6:25 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 3 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|