Go Down

Topic: How do I check the state of an output pin? (Read 1 time) previous topic - next topic

scswift

Let's say I've set an pin in OUTPUT mode either HIGH or LOW, and I don't want to have to keep track of what I've set it to myself, but I need to know later in my code what I've set it to so I don't try to turn it off over and over again.

Will a call to DigitalRead() return this state?  And is doing that fast?  IF not, is there some value in an array somewhere which I can read back the last state I set it to?


This is the code I'm having trouble with:
Code: [Select]

void updatearray() {

 int firstpin = 2;
 int dutycycle = 1785; // Dutycycle = 1000000 microseconds / 70hz update / groups.  1785 = 8 groups of 8 at 70hz.
 unsigned long delaystart;
 int timeelapsed;
 
 for (int x = 0; x < 64; x+=8) { // Simulate updating 64 leds.
   
   if (x < 8) {
   
     for (int y = 0; y < 8; y++) {
       if (array[x+y] > 0) {
         digitalWrite(firstpin + x + y, HIGH);
       }
     }        
         
     //delayMicroseconds(dutycycle);

     delaystart = micros();
     
     do {

       timeelapsed = micros()-delaystart;
       
       for (int y = 0; y < 8; y++) {          
         
         // Divide the brightness value in the array by 255 to produce a number between 0 and 1.  Multiply dutycycle by this value to determine how long we should wait before turning the led off.
         if (timeelapsed > (dutycycle*(array[x+y] / 255.0))) {
           digitalWrite(firstpin + x + y, LOW);
         }
         
       }
       
     } while (timeelapsed < dutycycle); // Regardless of whether all LED's are off, wait for duty cycle to complete.
     
     for (int y = 0; y < 8; y++) {
       digitalWrite(firstpin + x + y, LOW);
     }
     
   }
   else {
     delayMicroseconds(dutycycle); // Removing this delay would make the leds brighter when fewer are lit, and could burn them out if we are pulsing them at higher than their rated current.
   }  
   
 }
 
}


It's a little confusing because I'm simulating how bright an 8x8 array would be with just 8 leds, so it just delays after the first column is rendered.  But basically, the idea is that the values in my array should define brightness levels for each led, where a value of 255 should make the led light for the full 1785 microseconds, and a value of 1 would make it light for just 1 microsecond.  

The problem is, while the leds I've set to the lowest values are dimmer, they're only slightly dimmer.  A brightness of 1 isn't even CLOSE to being full off.  It's more like 50% off.  So I'm thinking maybe setting the ports off over and over again is a bad idea.

MarkT

I think reading will work - unless digitalRead changes the pinMode which I doubt.

If you look at the code for digitalRead and read the ATmega datasheet you'll find the answer (though much simpler to just try it - a truly definitive answer!)
[ I won't respond to messages, use the forum please ]

scswift

I did just try it, and I assume it's working, but I don't see any change in the brightness of my leds, so either it's always reading high, or reading is as slow as writing.

Go Up