Millis() returns 0 - Need Help!


hello,

i have library got off internet. allows me control rgb led modules. library makes use of timer 1 send data.

my problem can't millis() work in loop(). assigning millis() long int , printing value , 0! think has library's timer , interrupt routines. can't figure out though.

i have arduino pro mini , outputting 2 strands of 100 leds each.

please help!

this in library using:
code: [select]
// globals used interrupt code.
char  sendmode=0;   // used in interrupt 0=start,1=header,2=data,3=data done
char  bitcount=0;   // used in interrupt
char  ledindex=0;   // used in interrupt - led sending.
char  blankcounter=0;  //used in interrupt.
unsigned int bitmask;   //used in interrupt.

ledpixels lp1;              //preinstatiate

isr(timer1_ovf_vect)        // interrupt service routine wraps user defined function supplied attachinterrupt
{
 lp1.dooutput();
}

void ledpixels::show()
{
 // interrupt routine see re-send led color data.
 sendmode = 0;
}

void ledpixels::initialize(long microseconds, int * displayaddress,unsigned int ledcount , char clkpin, char dpin, char dpin2 )  //mrw - 2nd data pin (the last argument)
{

 byte counter;

 clockpin = clkpin;
 datapin = dpin;
     datapin2 = dpin2; //mrw - 2nd data ping
 display = displayaddress;
 noofleds = ledcount;

 pinmode(clockpin, output);
 pinmode(datapin, output);

                                       // adjust please. slow makes leds flicker.
                                       // fast , interrupt may chew processing speed!
   //timer1.attachinterrupt( ledout ) ;  // attaches routine drive leds
   show();                             // kick off display.


 tccr1a = 0;                 // clear control register
 tccr1b = _bv(wgm13);        // set mode phase , frequency correct pwm, stop timer

  if(microseconds > 0) setperiod(microseconds);
 //isrcallback = isr;                                       // register user's callback real isr
 timsk1 = _bv(toie1);                                     // sets timer overflow interrupt enable bit
 sei();                                                   // ensures interrupts globally enabled
 start();
}


void ledpixels::setperiod(long microseconds)
{
 long cycles = (f_cpu * microseconds) / 2000000;                                // counter runs backwards after top, interrupt @ bottom divide microseconds 2
 if(cycles < resolution)              clockselectbits = _bv(cs10);              // no prescale, full xtal
 else if((cycles >>= 3) < resolution) clockselectbits = _bv(cs11);              // prescale /8
 else if((cycles >>= 3) < resolution) clockselectbits = _bv(cs11) | _bv(cs10);  // prescale /64
 else if((cycles >>= 2) < resolution) clockselectbits = _bv(cs12);              // prescale /256
 else if((cycles >>= 2) < resolution) clockselectbits = _bv(cs12) | _bv(cs10);  // prescale /1024
 else        cycles = resolution - 1, clockselectbits = _bv(cs12) | _bv(cs10);  // request out of bounds, set maximum
 icr1 = pwmperiod = cycles;                                                     // icr1 top in p & f correct pwm mode
 tccr1b &= ~(_bv(cs10) | _bv(cs11) | _bv(cs12));
 tccr1b |= clockselectbits;                                                     // reset clock select register
}


void ledpixels::dooutput()
{
switch(sendmode)
 {
   
   case 3:                        //done..just send clocks 0 data
     digitalwrite(datapin, 0);    //you'll need 255 clocks led diplsay 1 color pwm.
     digitalwrite(datapin2, 0);    //mrw - 2nd data pin
     digitalwrite(clockpin, high);
     digitalwrite(clockpin, low);
     break;
   case 2:               //sending data
     if (bitcount==0)    //first bit 1 followed 15 bits of led color.
       {  
                 digitalwrite(datapin, 1);
                 digitalwrite(datapin2, 1); //mrw - 2nd data pin
           bitmask=0x8000;//init bit mask
       }
     else
       {
             if(bitmask & display[ledindex])  //if not first bit output next bits (starting msb bit 15 down.)
             {
                   digitalwrite(datapin, 1);
             }else
             {
                   digitalwrite(datapin, 0);
                   
                   //mrw - entire if-else block 2nd data pin
                   if(bitmask & display[ledindex+100])  //if not first bit output next bits (starting msb bit 15 down.)
                   {
                                             digitalwrite(datapin2, 1);
                   }else
                   {
                                             digitalwrite(datapin2, 0);
                   }
                   //end of new code
             }
             

       }
     
     bitmask>>=1;
     bitcount++;
     
     if(bitcount == 16)    //last bit?
     {
       ledindex++;        //move next led
       if (ledindex < noofleds) //still more leds go or done?
       {
         bitcount=0;      //start fist bit of next led            
       }
       else
         sendmode=3;  //no more leds go, done!
     }
     // clock out data.
     digitalwrite(clockpin, high);
     digitalwrite(clockpin, low);
     break;      
   case 1:            //header
       if (bitcount < 32)              
       {
       digitalwrite(datapin, 0);
       digitalwrite(datapin2, 0); //mrw - 2nd data pin
       bitcount++;
       if(bitcount==32)
         {
           sendmode++;      //if last bit of header move on data.
           ledindex=0;
           bitcount=0;
         }
       }
     digitalwrite(clockpin, high);
     digitalwrite(clockpin, low);
     
     break;
   case 0:            //start
     if(!blankcounter)    //as current pwm done. blankcounter
     {
       bitcount=0;
       ledindex=0;
       sendmode=1;
     }  
     digitalwrite(clockpin, high);
     digitalwrite(clockpin, low);
     
     break;  
 }
 //keep track of leds @ in pwm cycle.
 blankcounter++;
}

void ledpixels::start()
{
 tccr1b |= clockselectbits;
}

having little experience in "lower" level programming.

according - http://www.arduino.cc/cgi-bin/yabb2/yabb.pl?num=1200662708 (reply #2) - millis uses timer 0 . context arduino 2009.   on pro mini may differ.

can post code of application too? optional stripped version still shows problem.


Arduino Forum > Forum 2005-2010 (read only) > Software > Syntax & Programs > Millis() returns 0 - Need Help!


arduino

Comments

Popular posts from this blog

CAN'T INSTALL MAMBELFISH 1.5 FROM DIRECTORY - Joomla! Forum - community, help and support

error: expected initializer before 'void'

CPU load monitoring using GPIO and leds - Raspberry Pi Forums