| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Как да го направя с CCS !?! http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=542 |
Страница 1 от 1 |
| Автор: | forest_gump [ Пет Апр 01, 2005 8:51 pm ] | ||||||||||||||||||
| Заглавие: | Как да го направя с CCS !?! | ||||||||||||||||||
Въпросът е към корифеите на CSS, започнах проект със pic16f873@16Mhz, и компилатор CSS /версията от линка на Тони, благодарско за което/, хем да понауча т'ва Ц и аз де,... та имам поредица от 28 такта с честота 1Khz появяваща се през 30Hz, всеки заден фронт указва кога да се прочете друг сигнал по друга жица, пика трябва да прочете 28-те бита и да ги групира по 4 и ги покаже като 7 ASCII символа през rs-232 .. и т.н., аз го направих със прекъсване INT-RB0 към тактовия сигнал и в прекъсването сложих ... авеее ето кода :
това нещо работи дава си някакви данни, там е работата че незнам дали данните са верни , и няма как да ги проверя или сравня , на пръв поглед са логични ...но Хмм!!!!, въпросът е - има ли друг начин да се направи това със CCS-а ,
|
|||||||||||||||||||
| Автор: | ToHu [ Пет Апр 01, 2005 10:18 pm ] |
| Заглавие: | |
Хм .. не съм пробвал масив от int1 ..... може и да го приеме компилатора ..... но не схванах какво точно искаш да направиш ..... |
|
| Автор: | Predator_MF [ Съб Апр 02, 2005 10:00 am ] | |||||||||
| Заглавие: | ||||||||||
Aбе има няколко неща дето са ти в излишък...
Тия редове въобще не са ти нужни, компилатора си ги дроби сам. Превключване на банки също не е нужно да правиш. Определено не можеш да направиш масив от битове, ще трябва да се мъчиш с цели байтове... |
||||||||||
| Автор: | forest_gump [ Съб Апр 02, 2005 10:20 am ] |
| Заглавие: | |
Хищник, това със "#asm" в прекъсването го копнах от хелпа на CCS-а без да разсъждавам щото прочетох че, така било по правилата за ISR-функция, изглеждаше ми логично да се пази statusa в стек. ТоНи, искам да прочета поредица от 28 бита тактувани от тактов сигнал нещо като SPI само че само в една посока аз съм slave в случая, после тези 28 бита да ги групирам по четири и да ги покажа като ASCII през RS-а на пика! |
|
| Автор: | Predator_MF [ Съб Апр 02, 2005 10:34 am ] | ||||||||||||||||||||||||||||||||||||
| Заглавие: | |||||||||||||||||||||||||||||||||||||
Ами доста ме озадачаваш с това "копнах го от хелпа". Досега съм написал доста работещи неща на CCS, без да имам такива редове в прекъсванията, та ми е трудно да си обясня как въобще работят щом не пазя "жизнено важните" регистри.... Иначе ето тук ми се вижда малко оплескано:
В хелпа на CCS също пише за shift_left/right:
Значи ако ще shift-ваш нещо в променлива, пишеш:
В твоя случай lambda[bptr] ти е "pointer to memory", затова ти предлагам да го напишеш:
Цялата ти задачка се свежда до един масив Lambda[4] (4*8 = 32 бита, 4 от тях няма да ползваш). Прав ли съм? |
|||||||||||||||||||||||||||||||||||||
| Автор: | forest_gump [ Съб Апр 02, 2005 12:54 pm ] | |||||||||||||||||||||||||||||||||||||||||||||
| Заглавие: | ||||||||||||||||||||||||||||||||||||||||||||||
това го пробвах и не работи, затова го проверих и стана ясно че трябва да е
ето листинга на CCS-a
значи във първия ротацията е в lambda[0] а във втория случай прави ротация във INDF интересно защо не заби пика но нищо не излезе през RS-a, или аз греша нещо ....Хммм.?!? |
||||||||||||||||||||||||||||||||||||||||||||||
| Автор: | ToHu [ Съб Апр 02, 2005 2:13 pm ] |
| Заглавие: | |
Ами ... ето това ти е в прекъсването #INT_RB B0_IRS() { shift_right(&data,4,input(in)); } като data ти е масив или struct : struct { byte byte_0; byte byte_1; byte byte_2; byte byte_3; } data; естествено вече трябва да си предвидиш кога си нулираш данните, това е само шифтването на данните в масива или структурата. |
|
| Автор: | ¶ [ Съб Апр 02, 2005 6:44 pm ] |
| Заглавие: | |
Вектора на прекъсване при CCS по е по-тромав отколкото ако използвате стандартната конструкция на МикроЧип, а все пак прекъсванията трябва да заемат минимално процесорно време, затова от години използвам следната конструкция: [code] #RESERVE 0x7C,0x7D,0x7E,0x7F #RESERVE 0xFC,0xFD,0xFE,0xFF #BYTE Wtemp=0x7C #BYTE STATUStemp=0x7D #BYTE PCLATHtemp=0x7E #BYTE FSRtemp=0x7F #INLINE void PushOntoStack(void) { #asm movwf Wtemp swapf STATUS,W clrf STATUS movwf STATUStemp movf PCLATH,W movwf PCLATHtemp clrf PCLATH movf FSR,W movwf FSRtemp #endasm } #INLINE void PopFromStack(void) { #asm clrf STATUS movf FSRtemp,W movwf FSR movf PCLATHtemp,W movwf PCLATH swapf STATUStemp,W movwf STATUS swapf Wtemp,F swapf Wtemp,W // retfie тази инструкция е излишна, CCS си слага негова #endasm } void Tmr0Service(void); #INT_GLOBAL void InterruptHandler(void) { GIE = 0; PushOntoStack(); if( T0IF ) Tmr0Service(); PopFromStack(); } void Tmr0Service(void) { // някакъв код .... } [/code] |
|
| Автор: | Predator_MF [ Нед Апр 03, 2005 1:37 pm ] | |||||||||
| Заглавие: | ||||||||||
При мен е точно обратното, твоя вариант не работи (затова имах доста ядове върху тоя ред). В моя случай наистина върти INDF (след като променливата се помести там де) , но при мен само така тръгва... |
||||||||||
| Автор: | forest_gump [ Пон Апр 04, 2005 6:02 pm ] | |||||||||
| Заглавие: | ||||||||||
Днес си поиграх доста и го проверих на практика, направих едно пикче да подава поредица от 28 бита последователно и тактов сигнал , пуснах на изхода му стринга "1234567", оказа се че правилно чете само когато е
без '&' дава някакви маймуни, щом работи не пипам повече, ама ми е много чудно тоя компилатор CCS-a или хелпа му е объркан или аз него разбирам правилно. |
||||||||||
| Автор: | Predator_MF [ Пон Апр 04, 2005 6:04 pm ] |
| Заглавие: | |
Абе съмнителна работа, няма да споря щом работи |
|
| Автор: | forest_gump [ Пон Апр 04, 2005 8:09 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
ТоНи, това работи също, само съм добавил проверка за извикване на shift_left не повече от 28 пъти преди да прочета данните , става и със масив вместо struct:
|
|||||||||||||||||||
| Автор: | ToHu [ Пон Апр 04, 2005 9:41 pm ] |
| Заглавие: | |
Да това рабти със сигурност, така чета 1-Wire на далас, интересно като даваш по горе само един байт да ротейтва как работи, акто сложиш 4 то ги върти последователн ои така става истинското шифтване, а като пишеш 1, върти само първия .....а иначе да , работи и с масив |
|
| Автор: | forest_gump [ Вто Апр 05, 2005 9:34 pm ] | |||||||||
| Заглавие: | ||||||||||
ТоНи, със 4-ри байта за шифтване е същото като
Хмм ,.... голяма манджа стана |
||||||||||
| Страница 1 от 1 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|