Отговори на тема  [ 41 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща
LED isn`t Blinking! 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: LED isn`t Blinking!
Cekins написа:
Е то дори и на 115kb има достатъчно време да се обработи един символ, преди да е пристигнал следващия.

с тоя delay ...


Нед Авг 17, 2014 8:22 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: LED isn`t Blinking!
Аз говоря по принцип. Ако се обработва в прекъсване и всичко се вкарва в буфер. Така за времето в което следващия символ се "точи" има достатъчно време за прекъсването да се изчете и да се вкара в буфера.


Нед Авг 17, 2014 8:38 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Авг 17, 2014 11:43 am
Мнения: 26
Мнение Re: LED isn`t Blinking!
ToHu написа:
Ами ... я кажи това на какво го пишеш, тия функции не ги виждам декларирани та явно са от компилатора, ама не ще да е CCS, поне аз не помня да изглеждат така.
Та от там ще зависи. Принципно най-добре бибило да си направиш твой флаг за приет байт, а да не говорим че е и добре да имаш ФИФО в което да мушкаш каквото дойде пък после да го обработваш, това за експериментите ти не е от занчение но в релания свят може да се окаже доста полезно.
След това, ти подаваш А но проверката ти е за 1, т.е. няма как да стане, А = 0х41 а 1 = 0х31 ... а да не забравяме че А и а не са един код едното е 0х41 а другото 0х61 .... и последно което писах и по горе, така както е написано не следва да имаш терминатори от сорта /r /n


Средата е MPLAB IDE
Компилаторът е C18 compiler,но това което съм прикачил е копирано чрез DEV C++ .Беше ми по лесно чрез него да го публикувам,но за съжаление стана по-неразбрано.Аз подавам 'Á'.Бях правил разни експерименти и съм публикувал този с 1 -цата.


Нед Авг 17, 2014 8:50 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Авг 17, 2014 11:43 am
Мнения: 26
Мнение Re: LED isn`t Blinking!
Stoimen написа:
Пробвай с тази 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();                                                   
      }               
                              
   }

}

Пробвах кода с hex произведен от MPLAB върху реално устройство и на Proteus sim.Не работи!Аз подавам 1 -ца от RealTerm!Надявам се, да не греша?!


Нед Авг 17, 2014 9:21 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: LED isn`t Blinking!
Идея нямам какви са уарт функциите в мплаба, това cUART_char е някъде дефинирано като Rx буфера или що ? Въпроса е по скоро към колегата дал кода.


Нед Авг 17, 2014 11:01 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пет Юни 25, 2010 3:18 pm
Мнения: 363
Местоположение: Varna
Мнение Re: LED isn`t Blinking!
Проблемния код е
Код:
#pragma interrupt InterruptHandlerLow


Трябва да стане
Код:
#pragma interruptlow InterruptHandlerLow


За повече информация http://ww1.microchip.com/downloads/en/devicedoc/51288f.pdf

Така при мен работи ( поне в протеус :) ).


Код:
// Serial communications example with MAX232R.
// using serial receive interrupt.

/* Задачата е да се изпрати от SerialPort Terminal през USART,някакъв предварително избран символ,
   като например 'a'. Този символ да се присвои на PORTB и това да се индикира от LED1, който е
   прикрепен към RB1.Задачката е проста за разбиращите,но аз съм начинаещ и нещо не ми се получава!
   Използувам MPLAB IDE и C18 compiler.Кодът се компилира,минава през MPLAP SIM,но диодът не светва.
   Опитвам да симулирам и чрез Proteus,но и там е същото.Вероятно имам проблем в кода,не не мога
   да се справя сам!*/
//*****************************************************************************************************
   
#include <p18f2550.h>
#include <delays.h>
#include <usart.h>

/** CONFIGURATION ********************************************************************************************************/

#if defined(PIC18F2550_USB)                 // Configuration bits
        #pragma config PLLDIV   = 5         // (20 MHz crystal)
        #pragma config CPUDIV   = OSC1_PLL2   
        #pragma config USBDIV   = 2         // Clock source from 96MHz PLL/2
        #pragma config FOSC     = HSPLL_HS
        #pragma config FCMEN    = OFF
        #pragma config IESO     = OFF
        #pragma config PWRT     = OFF
        #pragma config BOR      = ON
        #pragma config BORV     = 3
        #pragma config VREGEN   = ON        // USB Voltage Regulator
        #pragma config WDT      = OFF
        #pragma config WDTPS = 32768
        #pragma config MCLRE    = ON
        #pragma config LPT1OSC  = OFF
        #pragma config PBADEN   = OFF
//      #pragma config CCP2MX   = ON
        #pragma config STVREN   = ON
        #pragma config LVP      = OFF
//      #pragma config ICPRT    = OFF       // Dedicated In-Circuit Debug/Programming
        #pragma config XINST    = OFF       // Extended Instruction Set
        #pragma config CP0      = OFF
        #pragma config CP1      = OFF
//      #pragma config CP2      = OFF
//      #pragma config CP3      = OFF
        #pragma config CPB      = OFF
//      #pragma config CPD      = OFF
        #pragma config WRT0     = OFF
        #pragma config WRT1     = OFF
//      #pragma config WRT2     = OFF
//      #pragma config WRT3     = OFF
        #pragma config WRTB     = OFF       // Boot Block Write Protection
        #pragma config WRTC     = OFF
//      #pragma config WRTD     = OFF
        #pragma config EBTR0    = OFF
        #pragma config EBTR1    = OFF
//      #pragma config EBTR2    = OFF
//      #pragma config EBTR3    = OFF
        #pragma config EBTRB    = OFF
#endif





//******************************DECLARATION OF GLOBAL VARIABLES**************************************************************
char data;
volatile unsigned char cUART_data_flg, cUART_char;
//******************************Declaration of Function Prototype************************************************************


char ReadUSART( void );
void init_uart(void);
void UART_putc(unsigned char c);
void InterruptHandlerLow ();
void WriteUSART( char data );

//*************************************************************************************************************************** 
// LED Setings:
#define setpin() TRISB = 0;                // Set all pins to output
#define LED1 LATBbits.LATB1                // RB1
#define LED1_on()LED1 = 1;                 // Set pin to High
#define LED1_off()LED1 = 0;                // Set pin to Low           

               
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();                                                   
      }               
                              
   }

}

//***************************************************************************************************************************



#pragma code InterruptVectorLow = 0x18
void IntLow (void)
{
  _asm
    goto InterruptHandlerLow               // jump to interrupt routine
  _endasm
}

//**************************************************************************************************************************
// Low priority interrupt routine

#pragma code
#pragma interruptlow InterruptHandlerLow

void InterruptHandlerLow()
{
 
  if (PIR1bits.RCIF==1)                   // Is interrupt occured by EUSART receive?,
                                    // Then RCREG is full we have new data (cleared when RCREG is read)
  { 
   if(RCSTA&0x06)                        // More efficient way than following commented method to check for reception error
   //if(RCSTAbits.FERR==1 || RCSTAbits.OERR==1 )
    {
      RCSTAbits.CREN=0;                    // Overrun error (can be cleared by clearing bit CREN)
      cUART_char=RCREG;                     // Clear Framing error
      RCSTAbits.CREN=1;
    }
    else
    {
      cUART_char = RCREG;                // Read new data into variable
      cUART_data_flg = 1;                // New data received. so enable flg
    }
  }
}

//***************************************************************************************************************************


void init_uart(void)                 // Init UART module for 9600bps boud, start bit 1, stopbit 1, parity NONE
{
   cUART_data_flg=0;                // Init data receive flag to zero (no data)
   TRISCbits.TRISC7=1;              // Make UART RX pin input
   TRISCbits.TRISC6=0;              // Make UART TX pin output
    SPBRGH  = 0x02;                  // 9600bps 20MHz Osc
    SPBRG   = 0x08;      

    RCSTAbits.CREN=1;                // 1 = Enables receiver
    RCSTAbits.SPEN=1;                // 1 = Serial port enabled (configures RX/DT and TX/CK pins as serial port pins)
    BAUDCONbits.BRG16=1;             // 1 = 16-bit Baud Rate Generator – SPBRGH and SPBRG

     TXSTAbits.SYNC=0;                // 0 = Asynchronous mode
     TXSTAbits.BRGH=1;                // 1 = High speed
     TXSTAbits.TXEN=1;                // 1 = Transmit enabled

   RCONbits.IPEN = 1;               // Enable Interrupt priority levels
     IPR1bits.RCIP=0;                 // EUSART Receive Interrupt Priority 0 = Low priority
     PIE1bits.RCIE=1;                 // 1 = Enables the EUSART receive interrupt
   INTCONbits.GIEL = 1;             // Enable interrupts
   INTCONbits.GIEH = 1;     
}

//****************************************************************************************************************************


void UART_putc(unsigned char c)
{
  TXSTAbits.TXEN=0;                 // Disable transmission
  TXREG=data;                     // Load txreg with data
  TXSTAbits.TXEN=1;                   // Enable transmission
  while(TXSTAbits.TRMT==0)          // Wait here till transmit complete
  {
   Nop();
  }
}



Пон Авг 18, 2014 1:28 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: LED isn`t Blinking!
То аз виждам и друг потенциален проблем - в Low Priority нямаш запазване на STATUS, WREG и BSR. Ако в хендъла се ползва някой от тези регистри, после всичко може да се омаже. А особено WREG и STATUS в 99.9999% от случаите се ползват.


Пон Авг 18, 2014 8:49 am
Профил ICQ
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пет Юни 25, 2010 3:18 pm
Мнения: 363
Местоположение: Varna
Мнение Re: LED isn`t Blinking!
Cekins написа:
То аз виждам и друг потенциален проблем - в Low Priority нямаш запазване на STATUS, WREG и BSR. Ако в хендъла се ползва някой от тези регистри, после всичко може да се омаже. А особено WREG и STATUS в 99.9999% от случаите се ползват.


Това компилатора си го прави
Код:
    71  000018                     _InterruptHandlerLow:
    72                               opt stack 28
    73  000018  CFD8 F001            movff   status,??_InterruptHandlerLow
    74  00001C  CFE8 F002             movff   wreg,??_InterruptHandlerLow+1
    75  000020  CFE0 F003             movff   bsr,??_InterruptHandlerLow+2
    76  000024                     


Съответно при излизане си ги възстановява

А аз само подкарах дадения код. Вече dsp300 да си го преправя/изчиства.


Пон Авг 18, 2014 10:27 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Авг 17, 2014 11:43 am
Мнения: 26
Мнение Re: LED isn`t Blinking!
:)


Последна промяна dsp300 на Сря Авг 20, 2014 5:04 pm, променена общо 2 пъти



Вто Авг 19, 2014 3:06 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пет Юни 25, 2010 3:18 pm
Мнения: 363
Местоположение: Varna
Мнение Re: LED isn`t Blinking!
dsp300 написа:
Искам да благодаря на всички отзовали се за оказаната помощ! За съжаление не бях погледнал,че има и втора страница с коментари! Довечера ще пробвам коригирания код и ще пиша. Междувременно аз се опитах да поизменя кода,но и той се компилира,симулира,но не включва диода.С виртуалния осцилоскоп на Proteus до MCU идва импулс от виртуалния терминал,след подаване на '1', но на извод RB1,няма никой! :
Прикачам и последната ми модификация:


Ето ти постнатия от мен код и симулацията на протеус. Прoтеус-а е 7.5 SP3 нямам по нов.


Прикачени файлове:
test_mcubg.zip [129.31 KiB]
215 пъти
Вто Авг 19, 2014 3:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Ное 27, 2012 9:27 pm
Мнения: 2011
Мнение Re: LED isn`t Blinking!
Работи много добре!


Вто Авг 19, 2014 11:42 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Авг 17, 2014 11:43 am
Мнения: 26
Мнение Re: LED isn`t Blinking!
Stoimen написа:
dsp300 написа:
Искам да благодаря на всички отзовали се за оказаната помощ! За съжаление не бях погледнал,че има и втора страница с коментари! Довечера ще пробвам коригирания код и ще пиша. Междувременно аз се опитах да поизменя кода,но и той се компилира,симулира,но не включва диода.С виртуалния осцилоскоп на Proteus до MCU идва импулс от виртуалния терминал,след подаване на '1', но на извод RB1,няма никой! :
Прикачам и последната ми модификация:


Ето ти постнатия от мен код и симулацията на протеус. Прoтеус-а е 7.5 SP3 нямам по нов.


Сега изпробвах кода върху Proteus sim.Аз съм с Windows 7 32bit. При подаване на '1' от RealTerm , диода светва,но не гасне.При мен симулацията е през MAX232 и COMPIM.Компилирах кода с MPLAB IDE и заредих хекса в Demo Board.Тук пък диода въобще не светва!Вчера изпробвах кода върху комп с XP,но ползувах Вашата симулация в Proteus.Тук кода работи и диода се управлява нормално,като 1-цата я въвеждам директно от клавиатурата.Не разбирам какво се случва след като има функция за гасене на диода ,зададено време на изчакване също има,но диода не гасне.В реален pic18f2550,пък въобще не работи! Ако имате някаква идея,моля да я споделите.


Сря Авг 20, 2014 5:22 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Re: LED isn`t Blinking!
Я сега да пробваме без прекъсвания:

Код:
#define TIME_BLINK  0x3FFFFUL        /* Колко време ще свети диода, ще си го настроиш */

void main(void)
{
    static unsigned long   blinkTimer = 0;

    setpin();                                  // Init LED
    init_uart();                               // Init UART module
   
    while (1)                                  // Create Loop
    {
        /* Приехме ли байт? */
        if (0 != PIR1bits.RCIF)
        {
            /* Да, а някакви грешки имаме ли? */
            if (0 != (RCSTA & 0x06))
            {
                /* Да, изчистваме ги, но нямаме валиден байт */
                RCSTAbits.CREN = 0;
                (void) RCREG;
                (void) RCREG;
                RCSTAbits.CREN = 1;
            }
            else
            {
                /* Няма грешки, приетия байт е валиден */
                unsigned char data = RCREG;

                if ('a' == data)
                {
                    PORTB = data;
                    LED1_on();
                    blinkTimer = TIME_BLINK;
                }
            }
        }

        if (1 < blinkTimer)
        {
            blinkTimer--;
        }
        else
        {
            if (1 == blinkTimer)
            {
                /* Таймера е изтекъл, гасим диода и спираме таймера. */
                LED1_off();
                blinkTimer = 0;
            }
        }
    }
}


Код:
void InterruptHandlerLow ()
{
}


Код:
void init_uart(void)                 // Init UART module for 9600bps boud, start bit 1, stopbit 1, parity NONE
{
   cUART_data_flg=0;                // Init data receive flag to zero (no data)
   TRISCbits.TRISC7=1;              // Make UART RX pin input
   TRISCbits.TRISC6=0;              // Make UART TX pin output
    SPBRGH  = 0x02;                  // 9600bps 20MHz Osc
    SPBRG   = 0x08;      

    RCSTAbits.CREN=1;                // 1 = Enables receiver
    RCSTAbits.SPEN=1;                // 1 = Serial port enabled (configures RX/DT and TX/CK pins as serial port pins)
    BAUDCONbits.BRG16=1;             // 1 = 16-bit Baud Rate Generator – SPBRGH and SPBRG

     TXSTAbits.SYNC=0;                // 0 = Asynchronous mode
     TXSTAbits.BRGH=1;                // 1 = High speed
     TXSTAbits.TXEN=1;                // 1 = Transmit enabled

   RCONbits.IPEN = 1;               // Enable Interrupt priority levels
     IPR1bits.RCIP=0;                 // EUSART Receive Interrupt Priority 0 = Low priority
     
    //PIE1bits.RCIE=1;                 // 1 = Enables the EUSART receive interrupt
    //INTCONbits.GIEL = 0;             // Enable interrupts
    //INTCONbits.GIEH = 0;     
}


Сря Авг 20, 2014 9:30 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Нед Авг 17, 2014 11:43 am
Мнения: 26
Мнение Re: LED isn`t Blinking!
Сега пробвах последния предложен код,но LED1 въобще не светва.pin RB1 is Low!


Пет Авг 22, 2014 12:13 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Re: LED isn`t Blinking!
Пробва ли да закоментираш
Код:
if ('a' == data)
?


Пет Авг 22, 2014 4:44 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 41 мнения ]  Отиди на страница Предишна  1, 2, 3  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни