| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Проблем при USART комуникация между два PIC18F6585 http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=8007 |
Страница 1 от 2 |
| Автор: | head_up [ Съб Юли 24, 2010 7:05 pm ] |
| Заглавие: | |
гледай сегааа... нали се сещаш че 485 е халф-дуплекс? ще трябва след като изпратиш съобщението от мастър към слейв (който е бил в режим на приемане), да обърнеш слейва в режим на предаване, а мастъра в режим на приемане. ако искаш да си сигурен провери си пина дето ти клати посоката на 485 трансийвъра. щом от едното към другото работи, значи и на обратно ще иска стига да си го инициализирал правилно - има някакви функции които не им вдявам какво правят, ти си знаеш. и що просто не опиташ да пратиш нещо от слейв към мастър и да видиш дали го приема? така ще знаеш, че по принцип имаш двупосочна комуникация, после си търси бъговете из кода къде не суичва посоките. |
|
| Автор: | ykornx [ Съб Юли 24, 2010 8:54 pm ] | |||||||||
| Заглавие: | ||||||||||
Ами аз точно това правя - тези функции USART_activa_tx() и USART_activa_rx() обръщат режима на приемане и предаване. Ако беше прочел малко по-внимателно щеше да видиш, че слейва изпраща към мастъра и това което изпраща преминава през двата MAX485 и излиза от втория (този който е до PIC1 вляво), но явно първия PIС не го приема. Затова и пиша тук, понеже кода съм го гледал доста, може би да пропускам нещо, но по пътя на логиката би трябвало да работи. Та поради тази причина се нуждая от съвет къде може да е проблема или по-точно защо PIC1 не приема по USART в конкретния случай при конкретните условия - ясно е, че има нещо не както трябва..... помогнете да го открия |
||||||||||
| Автор: | bateAz [ Нед Юли 25, 2010 1:28 pm ] |
| Заглавие: | |
Не че тук е проблемът, но имам няколко забележки по стила: 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 мастъра преди да започнеш приемането. Изобщо - идеи много ... Пиши после какво се е случило. |
|
| Автор: | ykornx [ Нед Юли 25, 2010 4:04 pm ] | |||||||||||||||||||||||||||
| Заглавие: | ||||||||||||||||||||||||||||
Благодая, че се отзова! Значи първо да кажа само, че задачата ми по принцип е да направя симулацията на Proteus. Това ми е дипломната работа от части.... та честно казано до хардуер не съм се и докосвал Та по темата: За if-овете не се получава - по твоя начин даже не сработва, незнам дали има нещо общо със C18 или Протеус-а. Това е съдържанието на тези функции които ми служат да превключвам MAX485 в режим приемане или предаване, нищо повече не вършат.
putsUSART() - тази функция си е вградена в C18 тоест само я ползвам и служи за изпращане на стринг по USART-а За кварцовете общо взето стигнах до извода, че с тях или без тях в Протеуса е все същото, та затова и не ги чертая. Все пак да кажа, че имам малък напредък - смених OpenUSART() със следната функция:
Тоест друг вид инициализация и работата потръгна малко, вече получавам и отговора от слейва, малко бъгав все още, не ми изписва всичко което трябва да изпише на екрана, но определено има двупосочна комуникация въпреки, че не на 100% работеща съвсем правилно, все още нещо куца. А това с изчистването на битовете за грешки на USART-a ще прочета понеже досега не съм го правил да видим дали ще има някакъв резултат.....въпреки, че може би това е по-скоро към хардуерното изпълнение...aко имаш желание да се занимаваш мога да ти пратя проекта да го погледнеш като цяло...може пък да видиш проблема.... Поздрави! |
||||||||||||||||||||||||||||
| Автор: | bateAz [ Нед Юли 25, 2010 4:27 pm ] |
| Заглавие: | |
Хм. Не знаех, че става дума за симулация. Да дебъгваш фърмуер върху симулатор е като да правих секс с дясната си ръка. Не че не се стига до оргазъм, ама има разлика, вЕрвай ми. Та по въпроса: Според мен ти наистина не управляваш коректно МАХ485. Ти променяш TRIS бита на порта, а той трябва постоянно да е сетнат като изход. Битът, който трябва да се променя е в изходния регистър. Не познавам добре PIC, за да ти кажа точно как се казва, нещо като LATCH май беше. |
|
| Автор: | head_up [ Пон Юли 26, 2010 10:36 am ] |
| Заглавие: | |
май там някъде горе още споменах да си погледнеш превключването на приемане-предаване на макса? щото точно TRISx е да кажеш каква е посоката на пина - вход/изход, но ако искаш да му дадеш стойност позлваш приомерно PORTx ( май и с LATx ставаше, позабравил съм ги тия пикове, ама като не се ползва така е, нека някой по вещ се изкаже по това, има хора дето ги знаят кат дясната си ръка |
|
| Автор: | the_electronic_m@n [ Пон Юли 26, 2010 11:31 am ] |
| Заглавие: | |
С 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; Изводите за управление посоката на данни на МАХ-а е ВХОД! Като зададеш и на пика вход и става манджа с грозде. Надявам се да съм бил полезен, пиши докъде си стигнал със задачката. |
|
| Автор: | ykornx [ Пон Юли 26, 2010 4:16 pm ] |
| Заглавие: | |
Здравейте отново, ще пробвам да настроя битовете както the_electronic_m@n ми казва, да видя какво че се получи със симулалтора. А иначе вече имам хардуера, така, че ще започна вече да се мъча да видя какво ще излезе в реална среда. Лошото е, че нямам обаче допълнителните преобразуватели от rs232 към rs485, което засега ще ми попрече да тествам rs485-цата, та засега оставам на симулатора. Затова започвам с rs232 и инфраред. Опасявам се, че ще имам проблеми, но ще ви държа в течение какво става...... Благодаря! ПП. Малко по късно ще сложа снимки на платките да добиете представа за какво става въпрос. А темата ми по принцип е "Комуникация по RS232, RS485, IrDA и LIN", която трябва да се осъществи между двете платки. |
|
| Автор: | ykornx [ Съб Юли 31, 2010 7:27 pm ] | ||||
| Заглавие: | |||||
Здравейте, малко се позагубих, но ме налегнаха много задължения. Ето снимка на платките както обещах. Естествено симулацията не тръгна в реална среда, и сега общо взето може да се каже, че почти започнах отначало. И се боря с RS232 комуникацията. Комуникацията работи, като натискам клавишите на едната платка ми излизат на екрана на другата. Това което искам да направя обаче е да е двупосочна комуникация. Тоест в даден момент когато реша (примерно при натискане на бутон '*' на клавиатурата) да се превключват функциите или нещо такова и платката която е получавала до този момент да започне да изпраща, а тази която е изпращала да започне да получава. В крайа сметка не ми се получава. Аз мисля, че трябва да стане с прекъсвания - така ли е? Ако да как точно трябва да се осъществи? Аз направих някакви опити, но не се получава. Слагам кода на главните функции за да добиете представа какво се опитвам да направя... main1 e платка 1 която изпраща в моемента към main2 която получава успешно.
|
|||||
| Автор: | Cekins [ Съб Юли 31, 2010 8:15 pm ] |
| Заглавие: | |
Ти нещо ли не обясняваш като хората, аз ли не разбирам. У(С)АРТ модула на пика е сравнително прост. Ако ще работиш на ниско ниво имаш в общи линии да настроиш режима (8 - 9 бита црц-та и др поддобни дето за начало може и без тях), да настроиш честотата (там е малка гимнастика), и вече да пращаш. Сега... модула генерира няколко прекъсвания. В общи линии теб силно те интересува едно - за приет байт, тъй като буфера е само три байта, ако не си четеш своевременно входящия, ще получиш три байта. Пращането пък е съвсем елементарно пишеш си в тхбуф и пускаш - тука "евентуално" трябва да изчакаш изпращането, дали ще полваш флага или ще чакаш прекъсване си е твоя работа. А пък за пред хората скришно съединяваш RX и TX жиците и имаш готово "ехо" |
|
| Автор: | ykornx [ Нед Авг 01, 2010 11:10 am ] | |||||||||
| Заглавие: | ||||||||||
Aми начинаещ съм и може би немога да обясня както трябва, незнам. Но по принцип тя комуникацията работи.......по-конкретно ме интересуваше как да направя това оето съм описал в горния ми пост. |
||||||||||
| Автор: | plameniv [ Нед Авг 01, 2010 11:56 am ] | |||||||||
| Заглавие: | ||||||||||
Правиш следното: 1. Когато нямаш комуникация ги направи всеки да е Slave (RX). 2. Когато предаваш превклчваш от Slave => Master (TX) . 3. След като спре комуникацията Master => Slave. Така който и да започне да предава ще заеме линията докато свърши да предава. След като спре и да започне другия ще заеме пак линията докато спре да предава. Ще ги направиш с някаква команда за край на предаването да има флаг за другия че се освобождава линията за да предава, ако имаш вече данни за обратната посока да се включи. Едва ли ще отнеме кой знае колко да предава за сметка на изчакване. |
||||||||||
| Автор: | ykornx [ Нед Авг 01, 2010 7:41 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Като пращам някакво фиксирано съобщение примерно си работи двупосочната комуникация, и по начина по който ти ми казваш (правя го със сетване битовете за разрешаване/забрана на приемането и предаването на USART-а) предполагам това си имал в предвид, и по другия начин директно с готовите функции на C18 за USART-a. Обаче немога да реша проблема с клавиатурите. Пиша на едната платка и получавам на другата, обаче обратния процес нещо не ми се получава. Опитах да го направя примерно като натисна '*' на тази която предава да излезе от функцията на предаване и да мине в режим на приемане, и съответно другата от режим на приемане да мине в режим на предаване, ама...... Ако някой има време и желание да погледне кода да каже, ще го постна... |
|||||||||||||||||||
| Автор: | optron [ Чет Авг 05, 2010 6:25 pm ] |
| Заглавие: | |
Не съм ти чел кода, ще говоря принципно. Обособи си две основни програми - приемаща и предаваща. Приемащата инициира порта за режим приемане и почва да чака и да го чете. Прочетеното пише на дисплея. Всеки приет символ проверява дали е звездичка. Ако да, преминава към предаващата програма. Предаващата инициира порта за предаване и почва да чака и чете клавиатурата. Всеки прочетен символ предава по порта. После го проверява дали е звездичка. Ако да, преминава към приемащата програма. По този начин се разграничава във всеки контролер кое е източника на звездичката - порта или клавиатурата. Като допълнителна опция може да накараш приемащата програма да проверява клавиша звездичка и ако го натиснеш, да превключи на предаване, да предаде звездичка и след това да превключи на приемане отново. Така ще можеш да стартираш комуникация ако се случи и двата контролера да преминат в режим на приемане. Още една опция е при инициацията на всяка програма да изписва на дисплея в какъв режим минава - предаване или приемане. Така ще знаеш коя клавиатура да натискаш. |
|
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|