Jump to content

abecedarian

Members
  • Content Count

    1,711
  • Joined

  • Last visited

  • Days Won

    23

Reputation Activity

  1. Like
    abecedarian got a reaction from energia in Can't Connect to Fingerprint Scanner- MSP430G2553 w/ LP project   
    MSPG2 Launchpad uses P1.1 and P1.2 for the UART / serial interface to the PC through the back-channel / programmer.
     
    Maybe consider moving the sensor's connections to other pins.
  2. Like
    abecedarian reacted to spirilis in Why is UART BSL not RXD/TXD?   
    Most likely for schadenfreude purposes, as illustrated here :-D
  3. Like
    abecedarian reacted to cubeberg in Have feedback for TI? Please share here.   
    Tutorials about how to transition from Energia to Code Composer Studio. +1 to that!
  4. Like
    abecedarian reacted to spirilis in Best LP for WSN   
    what @@abecedarian said... The power consumption of the LCD entirely depends on how fancy an LCD you use.
     
    The other consideration is that, since you only need the LCD for occasional "configuration" purposes, the board housing that LCD can provide power for itself and/or power (or recharge) the WSN board.  Using level shifters in the bus interface the former option, i.e. the LCD board power itself, is easily doable.
  5. Like
    abecedarian reacted to Fmilburn in MSP 432 Analog pin 9 mapped to Analog pin 8   
    Hi @@zico
     
    The following is from the MSP432 quick start guide pin map...
     
    A8 is P4.5 and located on pin 27 of the LaunchPad
    A9 is P4.4 and located on pin 26 of the LaunchPad
     
    I think I got that right but haven't tried it yet but will do so when I get a moment.  You can either change pins_energia.h to the above or refer to pin 26 in Energia to get A9.  Pins are numbered like this on the LaunchPad (the starting and ending numbers are shown at the top and bottom of the headers):
     
    1    21              40  20
    2    22              39  19
    ....
    8    28              33  13
    9    29              32  12
    10  30              31  11
     
    I will file a github request if I can confirm the error and fix.
     
    Edit:  Confirmed that specifying pin 26 works.  But has pins_energia.h been moved (or removed) in V17?   Filed on github as issue #879
     
    Edit:  pins_energia.h is located in \hardware\emt\ti\runtime\wiring\msp432\variants\MSP_EXP432P401R.  Confirmed that pins_energia.h is wrong.  Change
    static const uint8_t A9 = 27 to
    static const uint8_t A9 = 26
  6. Like
    abecedarian reacted to spirilis in Best LP for WSN   
    On @@abecedarian 's note about LCDs, one interesting option would be to have the LCD interface a pluggable module that you attach only when you need it... and have the board designed to accept such "hot plugged" hardware.  I'm not 100% certain how the hot plug interface should work but I do know there are special "bus transceiver" ICs that can make this seamless/less prone to screw with the board's operation.
  7. Like
    abecedarian reacted to spirilis in Best LP for WSN   
    The "byte maximum" in Energia is BS and driven by the values inside boards.txt IIRC.  I haven't looked at Energia's FR6989 support internals yet though.
  8. Like
    abecedarian reacted to spirilis in Best LP for WSN   
    I'll take your word for it
     
    I like the FR5969 better overall anyway.  F5529 has plenty of cool stuff to talk about but FRAM is neat.  I have a lightning sensor project that uses the FRAM as its data storage device (and that whole concept should work well for WSN nodes when reliable communication links aren't guaranteed but the data should be reported).
     
    The thing I hate about the FR6989 is that since its 128KB FRAM lives mostly in the upper address space (requiring 20-bit addressing mode), the old msp430-gcc that ships with Energia doesn't support it, whereas the new msp430-elf-gcc that ships with CCS has had lots of issues to work out (though I haven't tried the very latest version, maybe it's stable now).  Great that it's there, just sucks that the software support requires finagling with linker scripts 'n stuff.  Give me a FRAM MSP432 already.
  9. Like
    abecedarian reacted to Fmilburn in Flow Chart Template   
    I have been working on a project lately where I need to fit a design into an enclosure and was fumbling through my drawer looking for a measuring scale when I came across an old flow charting template.  I acquired it almost 40 years ago when I was working on a hydrocarbon process simulator that we were programing in FORTRAN.  That project was the last time I wrote code until fairly recently, but anyway, here is the template:

    Pretty funny...  On the left side is a "card scale" that you could put next to a stack of IBM punched cards to estimate how many you had.  Over at top right are the main ways of getting something into the computer - punched card, magnetic tape, and punched tape.  I actually remember using punched paper tape on a computer once.  Down below is online storage, offline storage, and "drum".  Followed by document, display, terminal, and manual operation.
     
    I don't actually remember using it as we weren't required to document with flow charts.  But we did have extensive user documentation in the form of paper manuals and the code itself was heavily documented.
     
     
     
  10. Like
    abecedarian reacted to dubnet in Analog Devices RF Detector Kit offer for $5   
    I did order two, hesitated at the unknown shipping charges but proceeded thinking domestic ground shipping on less than a pound shouldn't be much. Bad assumption. The shipping weight was actually 2 pounds due to the marketing material included (at my expense) in each board's box. Long story short...the $5 boards ended up costing just under $14 each. I won't be using RichardsonRFPD again.
     
    You were wise to abort.
  11. Like
    abecedarian got a reaction from Adnan in Best LP for WSN   
    @@Adnan
    If you want built-in LCD, you only have two choices: FR4133 and FR6989. Your 64KB limit narrows things down to FR6989.
  12. Like
    abecedarian reacted to kassovik in Underwater clock OLED.   
    My first project. Underwater clock. Used msp430g2553.

  13. Like
    abecedarian reacted to JasonP in MSP432 digitalRead() / Interrupt not working?   
    @@abecedarian,  Ha ha I was just writing to say thank you to everyone that has pitched in and helped me, especially you!  Honestly I don't see a better workaround for the time being and things are actually working flawless.  Spitting the two interrupts into two is actually nice as each interrupt is much simpler.  Thanks again.
    ////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////// I N T E R R U P T //////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////// void risingA(){ // Must be a low-to-high on channel A Ahigh = true; // The pin must be high to get here. // check channel B to see which way encoder is turning if (!Bhigh) { encoder0Pos++; // CW direction = 1; } else { encoder0Pos--; // CCW direction = 2; } } ////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////// I N T E R R U P T //////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////// void fallingA(){ // must be a high-to-low edge on channel A Ahigh = false; // check channel B to see which way encoder is turning if (Bhigh) { encoder0Pos++; // CW direction = 1; } else { encoder0Pos--; // CCW direction = 2; } } ////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////// I N T E R R U P T //////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////// void risingB(){ // Must be a low-to-high on channel B Bhigh = true; // check channel A to see which way encoder is turning if (Ahigh) { encoder0Pos++; // CW direction = 1; } else { encoder0Pos--; // CCW direction = 2; } } ////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////// I N T E R R U P T //////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////// void fallingB(){ Bhigh = false; // must be a high-to-low on channel B sensblast = false; // check channel B to see which way encoder is turning if (!Ahigh) { encoder0Pos++; // CW direction = 1; } else { encoder0Pos--; // CCW direction = 2; } }
  14. Like
    abecedarian got a reaction from Fmilburn in MSP432 digitalRead() / Interrupt not working?   
    After waking up this morning, I put a blink sketch on a G2553 LP in order to emulate the signal a Hall effect sensor or similar might output to the system. I connected that to the 432 and the LED on the 432 toggles on only one edge.
     
    So I need to correct myself: "CHANGE" is not working in the sketch I posted above. Must've been an illusion.
     
    Anyhow, I tried the two-pin, two-interrupt thing, and kept the G2553LP as a "signal generator"-
     
    On the 432:

    const int encoder0PinA1 = 11; const int encoder0PinA2 = 12; volatile bool Aflag; /////////////////////////////////////////////////////////////////////////////////// ////////////////////////////// S E T U P ////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////// void setup(){ pinMode(78, OUTPUT); // RED single LED on board pinMode(encoder0PinA1,INPUT); pinMode(encoder0PinA2,INPUT); // set Aflag to whatever state the pin is in on start up // in case the interrupts don't trigger early enough Aflag = digitalRead(encoder0PinA1); attachInterrupt(encoder0PinA1, doRisingEncoderA, RISING); attachInterrupt(encoder0PinA2, doFallingEncoderA, FALLING); } /////////////////////////////////////////////////////////////////////////////////// //////////////////////////////// L O O P ////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////// void loop(){ digitalWrite(78, Aflag); } void doRisingEncoderA(){ Aflag = true; } void doFallingEncoderA(){ Aflag = false; }On the G2553LP:
    void setup() { pinMode(RED_LED,OUTPUT); digitalWrite(RED_LED,HIGH); } void loop() { delay(100); digitalWrite(RED_LED, LOW); delay(100); digitalWrite(RED_LED, HIGH); }On the G2553LP, I left the RED LED jumper on.I ran a jumper from the G2553LP pin 2(LED1) to a row on a breadboard, then ran two jumpers from that row to the 432's pins 11 and 12. Essentially:

    G2553 pin 2 ------+------ pin 11 432LP +------ pin 12 432LPThe RED LED's on both boards blink together, at the same rate, so the 432 is catching both the rising and falling edges of the single output from the G2553.
  15. Like
    abecedarian got a reaction from Fmilburn in MSP432 digitalRead() / Interrupt not working?   
    Okay... put something together... a little simplified, but using the EMT abilities... and "CHANGE". One part eschews using Serial for debugging and sets up the "Aflag" variable and configures pin 11 as in input with an interrupt handler using CHANGE, the handler does a "NOT" on the Aflag variable when called, and loop() sets the RED LED to the Aflag state. The other is a "thread" which sets up another pin (12) to automatically turn on and off every 1/10 second.
     
    So, create new sketch in Energia and put the following in it:

    const int encoder0PinA = 11; volatile bool Aflag; void setup(){ pinMode(encoder0PinA,INPUT); Aflag = digitalRead(encoder0PinA); attachInterrupt(encoder0PinA, doEncoderA, CHANGE); pinMode(78, OUTPUT); // RED single LED on board } void loop(){ digitalWrite(78, Aflag); } void doEncoderA(){ Aflag = !Aflag; }Then make a new tab, name it "blink", then paste the following code in:
    void setupBlink() { pinMode(12, OUTPUT); digitalWrite(12,HIGH); } void loopBlink() { delay(100); digitalWrite(12, LOW); delay(100); digitalWrite(12,HIGH); }Then, connect a jumper between pins 11 and 12 and upload the program. 
    "CHANGE" does in fact work... this way at least.
     
    Makes me wonder if using a physical switch without debouncing, or something with Serial might be culprit...?
     
    *edit: changed the value in the delay() in "blink" to a few different values and couldn't see any issues.
     
    *edit-2: tried to do digitalRead() in the interrupt and that still does not work.
  16. Like
    abecedarian got a reaction from JasonP in MSP432 digitalRead() / Interrupt not working?   
    Okay... put something together... a little simplified, but using the EMT abilities... and "CHANGE". One part eschews using Serial for debugging and sets up the "Aflag" variable and configures pin 11 as in input with an interrupt handler using CHANGE, the handler does a "NOT" on the Aflag variable when called, and loop() sets the RED LED to the Aflag state. The other is a "thread" which sets up another pin (12) to automatically turn on and off every 1/10 second.
     
    So, create new sketch in Energia and put the following in it:

    const int encoder0PinA = 11; volatile bool Aflag; void setup(){ pinMode(encoder0PinA,INPUT); Aflag = digitalRead(encoder0PinA); attachInterrupt(encoder0PinA, doEncoderA, CHANGE); pinMode(78, OUTPUT); // RED single LED on board } void loop(){ digitalWrite(78, Aflag); } void doEncoderA(){ Aflag = !Aflag; }Then make a new tab, name it "blink", then paste the following code in:
    void setupBlink() { pinMode(12, OUTPUT); digitalWrite(12,HIGH); } void loopBlink() { delay(100); digitalWrite(12, LOW); delay(100); digitalWrite(12,HIGH); }Then, connect a jumper between pins 11 and 12 and upload the program. 
    "CHANGE" does in fact work... this way at least.
     
    Makes me wonder if using a physical switch without debouncing, or something with Serial might be culprit...?
     
    *edit: changed the value in the delay() in "blink" to a few different values and couldn't see any issues.
     
    *edit-2: tried to do digitalRead() in the interrupt and that still does not work.
  17. Like
    abecedarian got a reaction from JasonP in MSP432 digitalRead() / Interrupt not working?   
    A little wasteful of GPIO and code space perhaps, but could you not send the encoder's signals to two pins each and attach rising and falling interrupt handlers / functions to those pins separately?
  18. Like
    abecedarian reacted to spirilis in My time with FreeRTOS on the TM4C   
    OK, brief rundown of the "analysis" process for getting started with uDMA.
     
    A cursory look at the uDMA chapter in the TM4C123GH6PM datasheet:
    Micro Direct Memory Access (?DMA)The TM4C123GH6PM microcontroller includes a Direct Memory Access (DMA) controller, knownas micro-DMA (?DMA). The ?DMA controller provides a way to offload data transfer tasks from theCortex

  19. Like
    abecedarian got a reaction from Derekspeegle in Putting a While Loop within a While Loops   
    @@Derekspeegle - maybe...:

    const int voltPin = P1_5; const int voltoutPin = P1_7; const int voltoutPin2 = P1_6; float voltage1; float voltage2; float voltage3; int fadeValue; int fadeValue2; // get voltages function void getVoltages() { //Obtain RAW voltage data voltage1 = analogRead(voltPin); voltage2 = (voltage1 / 1024) * 3.3; voltage3 = voltage2 * 5.65; } void setup() { // configure input and output pins as required: pinMode(voltPin, INPUT); pinMode(voltoutPin, OUTPUT); pinMode(voltoutPin2, OUTPUT); // configure analog/PWM output frequency: analogFrequency(10000); // get our voltages getVoltages(); // set initial fade values based on voltage3 priority // may need some work + additional math so initial values scale properly if (voltage3 >=12) { // high priority fadeValue = 0; // will start at 0 and count up fadeValue2 = 255; // will start at 255 and count down } else { // low priority fadeValue = 255; // will start at 255 and count down fadeValue2 = 0; // will start at 0 and count up } } void loop() { // When the sketch started running, voltage3, fadeValue and fadeValue2 were // initialized in setup() so we don't need to get them again, at the moment. // However, after the first pass through loop(), fadeValue and fadeValue2 // will have been re-calculated within loop(), so all we need to do is get // voltage3 before we loop() again, so fadeValue and fadeValue2 can be // re-calculated before the outputs are changed. // Decide what to do based on voltage3 priority: if (voltage3 >= 12) { // priority is high fadeValue += 10; // add 10 to fadeValue; store result in fadeValue fadeValue2 -= 10; // sub 10 from fadeValue2; store result in fadeValue2 // limit fadeValue and fadeValue2 to values from 0 to 255 fadeValue = constrain(fadeValue, 0, 255); fadeValue2 = constrain(fadeValue2, 0, 255); } else { // priority is low fadeValue -= 10; // sub 10 from fadeValue; store result in fadeValue fadeValue2 += 10; // add 10 to fadeValue2; store result in fadeValue2 // limit fadeValue and fadeValue2 to values from 0 to 255 fadeValue = constrain(fadeValue, 0, 255); fadeValue2 = constrain(fadeValue2, 0, 255); } // update voltout pins: analogWrite(voltoutPin, fadeValue); analogWrite(voltoutPin2, fadeValue2); // get our voltages for the next pass through loop() getVoltages(); }
  20. Like
    abecedarian reacted to roadrunner84 in Putting a While Loop within a While Loops   
    That is not my code, that's OP's code, but with nice indentation
    As I said directly below that code block:
    Eventually the values of OP's code would settle to 0 and 255 or mean out to anything that's a sum of those. Since I later optimize fadeValue2 away, the only thing undefined is fadeValue, but that's limited to the 0 to 255 range because of the constrain() call. This means the only thing undefined is where in the settling/oscillation loop the sketch begins, which is okay-ish.
     
    A little more speedy, based on my latest code example.
    As you know you can haul values to the other side of the equation
    a / b = c a = c * b You can do this too to the voltage variable, allowing for you to get rid of the float variable alltogether:
    void loop() { //Obtain RAW voltage data voltage = analogRead(voltPin); fadeValue += (voltage >= 12 * 55.0 ? 10 : -10); fadeValue = constrain(fadeValue, 0, 255); analogWrite(voltoutPin, fadeValue); analogWrite(voltoutPin2, 255 - fadeValue); } See how I moved the / 55.0 to the other side of the equation in the ternary operator.
    Now since voltage is always an integer value (analogRead gives us an integer value), we can know for sure that the float behaviour is not required:
    int voltage; void loop() { //Obtain RAW voltage data voltage = analogRead(voltPin); fadeValue += (voltage >= 12 * 55 ? 10 : -10); fadeValue = constrain(fadeValue, 0, 255); analogWrite(voltoutPin, fadeValue); analogWrite(voltoutPin2, 255 - fadeValue); } see how I changes 55.0 to 55, no float constants, so no float calculations.
    Now consider that 55 is a bit magic, (as is 12), consider moving those to constants.
    #define Threshold (12) #define VoltScale (55) /* 5.65 times the voltage at the analog pin ( 3.3 * 5.65 / 1024) */ int voltage; void loop() { //Obtain RAW voltage data voltage = analogRead(voltPin); fadeValue += (voltage >= Threshold * VoltScale ? 10 : -10); fadeValue = constrain(fadeValue, 0, 255); analogWrite(voltoutPin, fadeValue); analogWrite(voltoutPin2, 255 - fadeValue); } Well, now there is really no good use for the voltage temporary variable:
    #define Threshold (12) #define VoltScale (55) /* 5.65 times the voltage at the analog pin; 1/(3.3 * 5.65 / 1024) */ void loop() { fadeValue += (analogRead(voltPin) >= Threshold * VoltScale ? 10 : -10); fadeValue = constrain(fadeValue, 0, 255); analogWrite(voltoutPin, fadeValue); analogWrite(voltoutPin2, 255 - fadeValue); }
  21. Like
    abecedarian reacted to spirilis in Putting a While Loop within a While Loops   
    Well I don't see anything glaring wrong with the code (edit: other than using float's, although if it doesn't need blistering performance that might still be OK), but I should add if this is MSP430 there's a glitch in the way analogWrite() works where it will do short-cut updates to the PWM registers (without waiting for the period to reset) when you repeatedly analogWrite a port.  The result is glitchy garbage.  What chip (or launchpad) are you using?
  22. Like
    abecedarian reacted to zeke in The Marquee Clock   
    Here's a brief update.
     
    I've been working on the layout for the display board.
     

     
    I rearranged the LEDs so that they could be properly soldered by hand (if that is needed).
     

     
    Now, I must make some design decisions:
    - Should I include an on-board buck power supply on this Alpha design?
    - Should I include an on-board CPU on this Alpha design?
    - Should I include an off-board interface (set of pins) for an off-board CPU daughter board?
     
    To overcome my decision fatigue, I might have to include everything, test it, delete from the design all that doesn't make sense then create a Beta PCB design.
     
    Oh, also, it was a challenge but I managed to procure an adequate supply of LEDs for the prototypes that need to be assembled.

     
    How many do you see here?

     
     
  23. Like
    abecedarian reacted to Rei Vilo in [Energia Library] RTOS Libraries for MSP432 on Energia MT   
    I've submitted three projects at Hackters.io about Energia Multi-Tasking and the Galaxia library.
    Multi-Tasking with Energia MT with Galaxia Library   How to run multiple tasks on a LaunchPad? We're using two different solutions, one standard and another based on the Galaxia library. By Rei Vilo .   
    Manage Single Resource with Energia MT and Galaxia     How to manage a single resource across multiple tasks? Semaphores come to the rescue. By Rei Vilo .    Send Data Across Tasks with Energia and Galaxia     How to send data across tasks? Mailbox can help! By Rei Vilo .    Feel free to click on Respect Project!
  24. Like
    abecedarian got a reaction from energia in MSP430 F5529 ultrasonic sensor for servo control   
    Welcome!   First thing you should do is learn to use the code tag for wrapping code into a more readable block of text. The code tag can e accessed by clicking the button above marked "<>", then paste your code in.... like: #include <Servo.h> //Setup the variables for the HC-SR04 const int trigPin = 3; const int echoPin = 4; // create servo object to control a servo // a maximum of eight servo objects can be created Servo myservo; // variable to store the servo position int pos = 0; void setup() { // initialize serial communication: Serial.begin(9600); // attaches the servo on pin 9 to the servo object myservo.attach(2); } void loop(){ // establish variables for duration of the ping, // and the distance result in inches and centimeters: long duration, inches, cm; // The sensor is triggered by a HIGH pulse of 10 or // more microseconds. // Give a short LOW pulse beforehand to ensure a clean HIGH pulse: pinMode(trigPin, OUTPUT); digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Read the signal from the sensor: a HIGH pulse whose // duration is the time (in microseconds) from the sending // of the ping to the reception of its echo off of an object. pinMode(echoPin, INPUT); duration = pulseIn(echoPin, HIGH); // convert the time into a distance inches = microsecondsToInches(duration); cm = microsecondsToCentimeters(duration); //Tell the Arduino to print the measurement in the serial console Serial.print(inches); Serial.print(" in, "); Serial.print(cm); Serial.println(" cm"); // This if-else statement tells the Arduino at what distance // it should trigger the servo, what the servo should do, // and what it should do if the distance is too far away. if (inches <= 24) { sweep(3); } else if (inches >= 24) { myservo.write(pos); } // Tell the Arduino to wait 0.10 seconds before pinging the // Ultrasonic Sensor again. delay(100); } // Converts the microseconds reading to Inches long microsecondsToInches(long microseconds) { // According to Parallax's datasheet for the PING))), there are // 73.746 microseconds per inch (i.e. sound travels at 1130 feet per // second). This gives the distance travelled by the ping, outbound // and return, so we divide by 2 to get the distance of the obstacle. // See: www.parallax.com/.../28015-PING-v1.3.pdf return microseconds / 74 / 2; } //Converts the Microseconds Reading to Centimeters long microsecondsToCentimeters(long microseconds) { // The speed of sound is 340 m/s or 29 microseconds per centimeter. // The ping travels out and back, so to find the distance of the // object we take half of the distance travelled. return microseconds / 29 / 2; } //This sub-routein is what dictates the movement of the servo void sweep(int NUM_OF_CYCLES){ // Tells the Arduino to start this loop at 0 and incriment it by 1 // each time the loop completes. This is how the Arduino knows to // stop the loop when a specific number of the // Sweep routein has been ran. for (int j=0; j<NUM_OF_CYCLES; j++) { // goes from 0 degrees to 180 degrees for(pos = 0; pos < 180; pos += 1){ // in steps of 1 degree // tell servo to go to position in variable 'pos' myservo.write(pos); // waits 15ms for the servo to reach the position delay(10); } // goes from 180 degrees to 0 degrees for(pos = 180; pos>=1; pos-=1) { // tell servo to go to position in variable 'pos' myservo.write(pos); // waits 15ms for the servo to reach the position delay(10); } } } Next, I'd suggest moving some of the variables out of "loop()" and defining pin functions in "setup()".
     
    You define pos = 0 at the top. 
    In sweep(), you use pos to go from 0 to 180 in one loop. In the next loop you start pos at 180, with a conditional of "any number greater than or equal to 1", and decrement by 1. So, every time you enter sweep(), the servo will move to 180, then move maybe 1 degree backwards... and that is it.
    And in loop(), since pos will be either 180 or 179 depending on things, it won't move since it was left at that position in sweep().
     
    Or at least that's how I'm interpreting things based on
    for(pos = 180; pos>=1; pos-=1) {       // tell servo to go to position in variable 'pos'       myservo.write(pos);       // waits 15ms for the servo to reach the position       delay(10);     } which is the final loop executed before exiting the function sweep().
  25. Like
    abecedarian reacted to tripwire in MSP430FR5969 standby current 0.4uA is it possible.   
    That's setting all the GPIO ports to output low.
×
×
  • Create New...