CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

Take a look ...weird problem

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Guest








Take a look ...weird problem
PostPosted: Wed Jan 14, 2009 8:38 am     Reply with quote

Hello guys !

I'm encountering a strange problem with a otherwise straight forward program. If i'm no mistaken, when 10 ms have passed, pin B0 should go high. Right ?? .... NOPE....NOT HAPPENING !!

Why is that ? Any ideas ?

I'm using CCS C version 4.057.

Here is the code :

Code:


#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)


char gc_TEST_timer;
#define TEST_TIMER_TICKS   1
#define RTCC_PRELOAD 217


#INT_RTCC
void rtcc_isr(void)

    {
         set_rtcc(RTCC_PRELOAD);

           if (gc_TEST_timer)
              gc_TEST_timer--;
     }

void check_TIMER(void)

     {
           if (gc_TEST_timer)
                 return;
           else
     
            gc_TEST_timer= TEST_TIMER_TICKS;
            output_high(pin_b0);
     
     }


void main()
{
  gc_TEST_TIMER=TEST_TIMER_TICKS;
  setup_counters(RTCC_INTERNAL, RTCC_DIV_256);
  set_rtcc(RTCC_PRELOAD);

  enable_interrupts(INT_RTCC);
  enable_interrupts(GLOBAL);

while(1)

 {
check_timer();
 }

}



Cheers !!
Vasi
Ttelmah
Guest







PostPosted: Wed Jan 14, 2009 9:18 am     Reply with quote

Timer0.
Clocking off 4000000/(256*4) = 3906.25Hz
Max count 65535 wrapping back to 0 - total 65536 - remember default is 16bit mode.
Total count time = 16.7 seconds.....

Best Wishes
Guest








PostPosted: Wed Jan 14, 2009 9:55 am     Reply with quote

Ahhhhh...thank you Ttelmah ...yes, the timer0 is 16 bit default.

Sorry about this stupid question! I wasn't paying atention ! Embarassed
Guest








PostPosted: Wed Jan 14, 2009 10:14 am     Reply with quote

Here is the CORRECT code ( thank you again Ttelmah) !

The folowing code applyes in relation to PCM Programer's multitasking program (tank you also, PCM Programer):

Code:


#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)


char gc_TEST_timer;
#define TEST_TIMER_TICKS   1
#define RTCC_PRELOAD 217


#INT_RTCC
void rtcc_isr(void)

{
set_rtcc(RTCC_PRELOAD);

 if (gc_TEST_timer)
     gc_TEST_timer--;
}

void check_TIMER(void)

 {
   if (gc_TEST_timer)
      return;
   else
     
      gc_TEST_timer= TEST_TIMER_TICKS;
      output_high(pin_b0);
     
 }


void main()
{
  gc_TEST_TIMER=TEST_TIMER_TICKS;
  setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_BIT);
  set_timer0(RTCC_PRELOAD);

  enable_interrupts(INT_RTCC);
  enable_interrupts(GLOBAL);

while(1)

 {
check_timer();
 }

}
[/code]
Ttelmah
Guest







PostPosted: Wed Jan 14, 2009 10:23 am     Reply with quote

Anyone here, who 'claims' never to have had a moment like this, is lying....
Smile
This particular one, is common for people who are used to the 16 chips, where timer0, is only 8bit.

Best Wishes
Guest








Same program - different problem
PostPosted: Thu Jan 15, 2009 12:32 am     Reply with quote

Hello Ttelmah !

I've got another issue with this code.

One of my tasks is to receive a character over serial and transform it into binary form.

However, the function that returns the character, bgetc(), isn't used properly in the check_SERIAL() function.
If my C knowledge is correct, is should have worked !! Rolling Eyes

Here is the code in question:

Code:


#int_rda
void serial_isr() {
   int t;
   output_toggle(pin_b1);   //debug
   buffer[next_in]=getc();
   t=next_in;
   next_in=(next_in+1) % BUFFER_SIZE;
   if(next_in==next_out)
     next_in=t;           // Buffer full !!
}

BYTE bgetc() {
   BYTE c;

   output_toggle(pin_b2); // debug
   while(!bkbhit) ;
   c=buffer[next_out];
   next_out=(next_out+1) % BUFFER_SIZE;
   return(c);
}

void check_SERIAL( void)
{
char i,d;

if(gc_IRTRANSMIT_timer)
   {
   output_toggle(pin_b3);
   return;
   }
else
 
   {
   
   gc_IRTRANSMIT_timer  = IRTRANSMIT_TIMER_TICKS;
   output_toggle(pin_b4);  //debug
    for(i = 0; i < 8; i++)
            {
             output_toggle(pin_b5); //debug
             if( bgetc() & 0x80)
               d='1';
             else
               d='0';
              bgetc() <<= 1;
               cmd[i]=d;
             }
        cmd[8]=0;
       output_toggle(pin_b6); //debug 

            printf("%s",cmd);
   }
}


Any ideas/hints ??
Guest








PostPosted: Thu Jan 15, 2009 12:33 am     Reply with quote

P.S.: I'm using PIC18f452 @ 10 MHZ and CCS C version 4.057

Thank You !!
Guest








PostPosted: Thu Jan 15, 2009 12:37 am     Reply with quote

I've tried another solution.

In the original post, PCM Programmer said the following things :

Quote:


// Check the interrupt-driven software fifo here,
// to see if any characters are in the buffer.
// If so, handle them. See EX_SISR.C for
// an example of how to do the software fifo.
// Make the size of the fifo be large enough,
// so that it doesn't overflow between the
// times that you come into this task to check it.
// Or, set the gc_IRTRANSMIT_timer value to a lower
// value, so that you check the fifo sufficiently often.

// Once you've read the characters, then put
// code here to act on them. If it's a command
// sent through the serial port, then set a global
// flag. Then, one of the other tasks can read
// the flag and it can do something -- perhaps
// it could start a complex sequence of LED blinking.
// (It would also clear the global flag).


So...i've tried the code in the following way :

Code:


void check_IRTRANSMIT( void)
{
char c,i,d;

if(gc_IRTRANSMIT_timer)
   {
   output_toggle(pin_b3);
   return;
   }
else
 
   {
   
   gc_IRTRANSMIT_timer  = IRTRANSMIT_TIMER_TICKS;
   output_toggle(pin_b4);
   while(!bkbhit) ;
   c=buffer[next_out];
   next_out=(next_out+1) % BUFFER_SIZE;
   
    for(i = 0; i < 8; i++)
            {
             output_toggle(pin_b5); //debug
             if( c & 0x80)
               d='1';
             else
               d='0';
              c <<= 1;
               cmd[i]=d;
             }
        cmd[8]=0;
       output_toggle(pin_b6); //debug 

            printf("%s",cmd);
   }



Still no succes ...... HMMMM

Please help me !!!!!!!!
Wayne_



Joined: 10 Oct 2007
Posts: 681

View user's profile Send private message

PostPosted: Thu Jan 15, 2009 3:21 am     Reply with quote

You were close

Code:

void check_IRTRANSMIT( void)
{
char c,i,d;

if(gc_IRTRANSMIT_timer)
   {
   output_toggle(pin_b3);
   return;
   }
else
 
   {
   // Does it definately get here ?
   gc_IRTRANSMIT_timer  = IRTRANSMIT_TIMER_TICKS;
   output_toggle(pin_b4);

   c = bgetc();  // Need to get 1 8bit value, use bgetc

    for(i = 0; i < 8; i++)
            {
             output_toggle(pin_b5); //debug
             if( c & 0x80)
               d='1';
             else
               d='0';
              c <<= 1;
               cmd[i]=d;
             }
        cmd[8]=0;  // I assume cmd is defined as char cmd[9];
       output_toggle(pin_b6); //debug

            printf("%s",cmd);  // What DOES it output ?
   }



If you read my comments you will notice you have missed a few vital bits of info to help us debug this.


Change c = bgetc(); to c = 0xAA; and see if you get 10101010
Chage to different values and see if you get the correct value.

If bgetc does not work but c=n; does then the problem lies with your serial routines/interface.
Try
c = bgetc();
printf("%c", c);

to see exactly what it is.
Also put printf("Start\r\n");
at the start of your code to make sure your serial output works.
Guest








PostPosted: Thu Jan 15, 2009 4:15 am     Reply with quote

Hello Wayne_ !

HUH ....A stupid mistake was the cause of this error. I've forgotten to enable the RDA interrupt.

Ufffffffffffffffffff..... Thank you Wayne_ ! I've noticed this when i was trying to copy the program to post it here. Laughing
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group