Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

LED isn`t Blinking!
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=13146
Страница 1 от 3

Автор:  dsp300 [ Нед Авг 17, 2014 12:30 pm ]
Заглавие:  LED isn`t Blinking!

Здравейте!
Може ли да получа малко съдействие относно един прост код /за можещите/ и явно доста труден за начинаещите!
Прикачам кода.
Благодаря!

Прикачени файлове:
main1.cpp [7.36 KiB]
376 пъти

Автор:  ToHu [ Нед Авг 17, 2014 1:48 pm ]
Заглавие:  Re: LED isn`t Blinking!

Погледнах го съвсем отгоре, както точно не ти работи. Начина по който е направнео приемането е доста баламски, не знам от какво му пращаш данни но е възможно да изтърваш единицата ако се предава и още нещо.

Автор:  dsp300 [ Нед Авг 17, 2014 2:48 pm ]
Заглавие:  Re: LED isn`t Blinking!

ToHu написа:
Погледнах го съвсем отгоре, както точно не ти работи. Начина по който е направнео приемането е доста баламски, не знам от какво му пращаш данни но е възможно да изтърваш единицата ако се предава и още нещо.

Данни изпращам от RealTerm.Наистина е баламски направено приемането,но аз сега се уча и затова питам!

Автор:  ToHu [ Нед Авг 17, 2014 3:15 pm ]
Заглавие:  Re: LED isn`t Blinking!

това за да работи трябва да изпращаш само символи без терминиране в ASCI формат, т.е. без /CR /LF

Автор:  Stoimen [ Нед Авг 17, 2014 3:52 pm ]
Заглавие:  Re: LED isn`t Blinking!

Май има и друг проблем - "InterruptHandlerLow()" ще изчисти RCIF, а DataRdyUSART() проверява точно него и никога няма дa излезе от while(!DataRdyUSART());.

Автор:  Stoimen [ Нед Авг 17, 2014 3:56 pm ]
Заглавие:  Re: LED isn`t Blinking!

Още нещо - RCREG е двойно буфериран.

п.п Ако не съм сбъркал сметките Delay10KTCYx(25) ще ти даде 0,02 секунди.

Автор:  ToHu [ Нед Авг 17, 2014 4:03 pm ]
Заглавие:  Re: LED isn`t Blinking!

Абе както казах аз го гледах по отгоре, но като цяло ми се видя дървено организирано както прекъсването така и приемането, това ти ли си го писал или е взет пример от някъде ... ако е пример не е много полезен за начинаещи.

Автор:  dsp300 [ Нед Авг 17, 2014 5:35 pm ]
Заглавие:  Re: LED isn`t Blinking!

Ако използувам Ехо и връщам получените данни обратно в TXREG ,кодът работи идеално с терминала.Когато обаче се опитам да изпратя получените данни към PORTB и това да се индикира чрез мигане на LED,не става! Явно тука не мога да направя нещата както трябва. Относно Delay10KTCYx(25) сте прав,коригирах я.

Автор:  ToHu [ Нед Авг 17, 2014 6:04 pm ]
Заглавие:  Re: LED isn`t Blinking!

Значе сега ти гледам майн-а само, преимайки че другото работи :
Първото което ми прави впечатление е че имаш
if(ReadUSART()=='1') // If the received data is equal to the 'A'
В коментара си написал ако е А но това работи ако си изпрати 1, и говорим за ASCI 1, или това е 0x31 , та не знам дали подаваш А или 1.
След това имаш
while(!DataRdyUSART());
къде го чистиш тоя флаг който проверяваш, очевидно тази функция връща дали ти е превършило четенто, но никъде в майна не го обработваш, т.е. това като се вдигне кое ще го свали ?
и след това имаш
PORTB == data; // The receive data is send to PORTB

това не е оператор за присвояване а сравнение, следва да бъде
PORTB = data; // The receive data is send to PORTB

Да не говорим че отварящите и затварящите скоби след while не са много на място, какво отварят и затварят?
Същото и за If имаш го, но отварящи и затварящи не са на място, би следвало да е нещо такова :
if(ReadUSART()=='1'){ // If the received data is equal to the 'A'
LED1_on(); // LED blinking
Delay10KTCYx(25); // Dealay 250K cycles
LED1_off();}

Автор:  Cekins [ Нед Авг 17, 2014 6:20 pm ]
Заглавие:  Re: LED isn`t Blinking!

И лед-а свети постоянно :)

след LED1_off(); има няколко наносекунди докато дойде LED1_on();

Та така де - за да мига трябва да има още един delay след офф ...

едит - то имало break - сори не го видях...

Автор:  dsp300 [ Нед Авг 17, 2014 6:54 pm ]
Заглавие:  Re: LED isn`t Blinking!

ToHu написа:
Значе сега ти гледам майн-а само, преимайки че другото работи :
Първото което ми прави впечатление е че имаш
if(ReadUSART()=='1') // If the received data is equal to the 'A'
В коментара си написал ако е А но това работи ако си изпрати 1, и говорим за ASCI 1, или това е 0x31 , та не знам дали подаваш А или 1.
След това имаш
while(!DataRdyUSART());
къде го чистиш тоя флаг който проверяваш, очевидно тази функция връща дали ти е превършило четенто, но никъде в майна не го обработваш, т.е. това като се вдигне кое ще го свали ?
и след това имаш
PORTB == data; // The receive data is send to PORTB

това не е оператор за присвояване а сравнение, следва да бъде
PORTB = data; // The receive data is send to PORTB

Да не говорим че отварящите и затварящите скоби след while не са много на място, какво отварят и затварят?
Същото и за If имаш го, но отварящи и затварящи не са на място, би следвало да е нещо такова :
if(ReadUSART()=='1'){ // If the received data is equal to the 'A'
LED1_on(); // LED blinking
Delay10KTCYx(25); // Dealay 250K cycles
LED1_off();}

Уточнявам забележките:
1.Подавам А
2.PORTB = = data; //това е моя техническа грешка,коригирана е.
3.Относно скобите сте абсолютно прав за което благодаря.
4.За RCIF отново сте прав,но не знам как да го изчистя!
Ще съм благодарен за малко помощ!

Автор:  ToHu [ Нед Авг 17, 2014 7:02 pm ]
Заглавие:  Re: LED isn`t Blinking!

Ами ... я кажи това на какво го пишеш, тия функции не ги виждам декларирани та явно са от компилатора, ама не ще да е CCS, поне аз не помня да изглеждат така.
Та от там ще зависи. Принципно най-добре бибило да си направиш твой флаг за приет байт, а да не говорим че е и добре да имаш ФИФО в което да мушкаш каквото дойде пък после да го обработваш, това за експериментите ти не е от занчение но в релания свят може да се окаже доста полезно.
След това, ти подаваш А но проверката ти е за 1, т.е. няма как да стане, А = 0х41 а 1 = 0х31 ... а да не забравяме че А и а не са един код едното е 0х41 а другото 0х61 .... и последно което писах и по горе, така както е написано не следва да имаш терминатори от сорта /r /n

Автор:  Cekins [ Нед Авг 17, 2014 7:42 pm ]
Заглавие:  Re: LED isn`t Blinking!

RCIF се чисти автоматично при прочитане на RCREG. Ако във фифо буфера има други байтове, се изчиства при прочитане на последния. Това ще рече че ако се получат два байта един след друг преди да си изчел първия, ще има две прекъсвания едно след друго, тъй като RCIF ще остане сетнат след първото четене и при излизане ще влезе веднага пак в прекъсване.

Автор:  Stoimen [ Нед Авг 17, 2014 7:56 pm ]
Заглавие:  Re: LED isn`t Blinking!

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

Код:
void main(void)
{
   setpin();                                  // Init LED
   init_uart();                               // Init UART module
   while(1)                                   // Create Loop
   {
      while(!cUART_data_flg);                    // Wait for data              
      cUART_data_flg = 0;
      //data = ReadUSART();                        // Read data                   
      PORTB = cUART_char;                              // The receive data is send to PORTB
                  
      if(cUART_char=='1') {                        // If the received data is equal to the 'A'     
         LED1_on();                                 // LED  blinking
         Delay10KTCYx(250);                          // Dealay 250K cycles
         LED1_off();                                                   
      }               
                              
   }

}

Автор:  Cekins [ Нед Авг 17, 2014 8:16 pm ]
Заглавие:  Re: LED isn`t Blinking!

Е то дори и на 115kb има достатъчно време да се обработи един символ, преди да е пристигнал следващия.

Страница 1 от 3 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/