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:
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.
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
Post a Comment