38 Replies Latest reply on Dec 29, 2012 6:27 PM by Columbo

    Error in sketch code

    Columbo

      I am trying to learn to write some code for my BCD clock project.  Before doing the actual clock code I wired up 7 LEDs on my breadboard with 7 resistors.

      Then I ran wires from each LED to a digital pin on the Arduino UNO. Specifically pins 7 to 13.

       

      Then I wrote some code and tried to upload it but it is flagging 3 errors and I can't see where it is wrong. Probably something that I am missing as a newbie. The errors are as follows:

       

      BoardTest:57: error: expected `;' before '{' token

      BoardTest:64: error: expected `;' before '{' token

      BoardTest:68: error: expected `;' before '{' token

       

      The code is as follows:

       

       

      // Short sketch to see if breadboard and UNO is properly wired.

       

      int led1=7;

      int led2=8;

      int led3=9;

      int led4=10;

      int led5=11;

      int led6=12;

      int led7=13;

       

      int seconds=0

       

      void setup(){

        ledMode(led1, OUTPUT);

        ledMode(led2, OUTPUT);

        ledMode(led3, OUTPUT);

        ledMode(led4, OUTPUT);

        ledMode(led5, OUTPUT);

        ledMode(led6, OUTPUT);

        ledMode(led7 OUTPUT);

      }

       

      void loop(){

        seconds++;

          If(seconds == 1){

            digitalWrite(led1, HIGH);

            delay(1000);

          }

          If(seconds == 2){

            digitalWrite(led2, HIGH);

            digitalWrite(led1, LOW);

            delay(1000);

          }

        If(seconds == 3){

            digitalWrite(led1, HIGH);

            delay(1000);

          }

          If(seconds == 4){

            digitalWrite(led3, HIGH);

            digitalWrite(led2, LOW);

            digitalWrite(led1, LOW);

            delay(1000);

          }

          If(seconds == 5){

            digitalWrite(led1, HIGH);

            delay(1000);

          }

          If(seconds == 6){

            digitalWrite(led2, HIGH);

            digitalWrite(led1, LOW);

            delay(1000);

          }

          If(seconds == 7){

            digitalWrite(led1, HIGH);

            delay(1000);

          }

          If(seconds == 8){

            digitalWrite(led4, HIGH);

            digitalWrite(led3, LOW);

            digitalWrite(led2, LOW);

            digitalWrite(led1, LOW);

            delay(1000);

          }

          If(seconds == 9){

            digitalWrite(led1, HIGH);

            delay(1000);

          }

          If(seconds == 10){

            digitalWrite(led2, HIGH);

            digitalWrite(led1, LOW);

            delay(1000);

            digitalWrite(led1, LOW);

            digitalWrite(led2, LOW);

            digitalWrite(led3, LOW);

            digitalWrite(led4, LOW);

        seconds=0;

          }

      }

       

       

       

      Any help appreciated.

       

      Thanks

        • Re: Error in sketch code
          billabott

          Hi JohnC.  Good attempt.  In respect to the current limits of each I/O pin,  I would suggest the need to multiplex the LEDs (only one on at a time.)  As a more correct example:

          void setup(){

          ledMode(led1, OUTPUT);

          ledMode(led2, INPUT);   // look up about writing a 1 to the input pin to put it in high impedance mode.

          ledMode(led3, INPUT);

          ledMode(led4, INPUT);   // it was stated that pinMode is preferred;  I don't know

          ledMode(led5, INPUT);   // and don't want to look it up right now.  sorry. 

          ledMode(led6, INPUT);

          ledMode(led7, OUTPUT);   //  this is the source of one of your errors  led7,

          }

           

          void loop(){

          seconds++;

           

          while(1){

             if (seconds == 1){

                digitalWrite(led1, HIGH);

                digitalWrite(led7, LOW);

                delay(10);

                digitalWrite(led7, HIGH);    //  in theory this will probably work

                                                           // use at your own risk since it is being adapted from PIC techniques

                delay(10);

                }  // fi     * really?  I am the first to note/share this technique

                   //                  of marking what this closing brace matches  !?!

          ...

          if (timeToUpdateDisplay) break;

          }  // elihw     * ditto

           

          }  // pool       * ICNBI

            • Re: Error in sketch code
              Columbo

              Thanks billabott,

               

              When it comes to the actual BCD clock code it will have to have more than 1 led on at a time so I'm not sure how that would work with multiplexing. 

              You say that ledMode(led7, OUTPUT); is the problem but I don't see what the problem is?  It is writen the same as all of the other ledMode statements.

              Should I be using pinMode() rather than ledMode()?

               

               

              I was also wondering if it would be better to use the switch statement rather than multiple if statements?

                • Re: Error in sketch code

                  John,

                    Yes, it's almost always better to use a switch statement than a long

                  list of if statements that test consecutive values like you have.

                    • Re: Error in sketch code
                      Columbo

                      Ok,  that's great!  I'll change them to the switch statement and see how that works.

                       

                      In my code, should I have used the pinMode() statement rather than ledMode() statement?

                       

                      Thanks for your help and patience.

                        • Re: Error in sketch code

                          John,

                            Yes, I believe pinMode() is what you want.

                          (also be sure to remember the break statement in each branch

                          of the switch statement).

                           

                          I would also note that sometimes there is a better way than

                          a switch statement.  If all the branches of a switch statement

                          are similar, or if they are all computing the value of the same

                          variable, it may be better to use a table lookup rather than a

                          switch statement.  This doesn't seem to apply in your example,

                          but it may be helpful in the future.

                            • Re: Error in sketch code
                              Columbo

                              Thanks Coder27,

                               

                              I have fixed all errors, converted to a switch statement and added more code so it will run from 0 seconds up to 1 minute. It compiles with no problems now.  All LEDs are working in the proper sequence and turns on the 1 minute LED when it hits 60 seconds.  Then the seconds counter drops back to zero and it starts over counting up to the next minute.

                               

                              This part of the project was done using the UNO because I was just trying to get some idea of coding in 'C'.

                              Now that I have fugured out how to get that part of the code working I will start using my ArduinoMega2560 because it has more pins and more memory as well.

                               

                              Writing the code to handle the seconds, minutes and hours all the way up to 24 hours would make that switch statement quite long so I would be very interested in learning more about this table lookup that you mentioned. Where would I find a tutorial on how to code such a lookup table?

                               

                              Thanks.  You have been very helpful.

                                • Re: Error in sketch code

                                  John,

                                    A table is just a fancy name for array, although in

                                  some languages it might be a fancy type of array such

                                  as an associative array.

                                    If you have 10 digits, each involving 4 led settings,

                                  you might have a struct that contains 4 boolean values for

                                  those leds, and then an array of 10 of these structs.

                                  To find the led settings for digit n, you would use n to index

                                  the array to lookup the struct with the 4 led settings for n.

                                  This would take the place of the switch statement.

                                   

                                  Here are two tutorials:

                                  http://embeddedgurus.com/stack-overflow/2010/01/a-tutorial-on-lookup-tables-in-c/

                                  http://stackoverflow.com/questions/2641473/initialize-static-array-of-structs-in-c

                                   

                                  The reason a table lookup is preferable to a switch statement

                                  is that it makes your code simpler, so there are fewer things

                                  that can go wrong.  For example, you can't forget a break statement.

                                  It also makes it easier to check that all the values in the table are correct

                                  since they are in one place rather than scattered in the switch statement.

                                   

                                    • Re: Error in sketch code
                                      Columbo

                                      Thanks Coder27,

                                       

                                      When you mentioned a 'lookup table' the first thing that came to my mind was a 'lookup table' such as in dBase which is held in a database but of course that wouldn't be possible in Arduino so it got me wondering what it was.

                                       

                                      I will take a look at those tutorials that you rcommended and see what I can come up with.  Keeping the code as short as possible is always a good thing. 

                                       

                                      Thanks again, and have a very Merry Christmas and a Great New Year.

                                      • Re: Error in sketch code
                                        Columbo

                                        Hi Coder27,

                                         

                                        I am reading up a bit on those arrays and I have a question for you if you don't mind?

                                         

                                        Is it possible to use an array element in digitalWrite() like in the following example?

                                         

                                        digitalWrite(myArray[2], HIGH);  or   digitalWrite(myArray[2], myArray[3]);

                                         

                                        Or,... if a multi-dimensional array was used such as myArray[8][8] with, say, myArray[2] holding the pin number and the second dimension of the array [3] holding the HIGH or LOW, how would the syntax for that work?  I would think that the syntax would be incorrect to write it as

                                        digitalWrite(myArray[2], [3]);

                                         

                                        Don't know if my question is clear or not but,.... you might get the picture of what I am trying to do here.  I am looking at having separate arrays for seconds, minutes and hours.

                                         

                                         

                                        Thanks,

                                         

                                        John

                                          • Re: Error in sketch code

                                            John,

                                              Yes, you can use an array element in digitalWrite, either as the first

                                            or second parameter (or both), essentially anywhere you might otherwise

                                            use a simple number or variable or algebraic expression.

                                              As you seem to understand, you can either have more than one

                                            single-dimensional array, sometimes called parallel arrays, or you

                                            can have an array of structs, or an array of arrays.

                                               

                                            > digitalWrite(myArray[2], [3]);

                                             

                                            The "[3]" isn't right.  Each parameter to digitalWrite is treated separately,

                                            so the "[3]" needs to have the name of the array variable in front of it,

                                            like you have for myArray[2], except it would probably have a different array name,

                                            because the second parameter of digitalWrite is the LOW/HIGH setting,

                                            rather than the pin number.  Read up on arrays so you are clear how it works.

                                            • Re: Error in sketch code
                                              Columbo

                                              I think I am getting the idea of how to set up an array, or even a multi-dimensional array but I am struggling a bit with how to use it in the BCD clock.  If it was a matter of simply turning on or off one individual LED at a time I don't think I would have a problem but for displaying the seconds portion of the time, I am using 7 LEDs which will sometimes have  only one LED turned on while at other times it will have two and sometimes three LEDs turned on at the same time.

                                               

                                              It works fine using the switch statement but I can't figure out how to do the same thing using an array.

                                               

                                              The following is a portion of the code that I used in the switch statement showing the first 9 of the 60 seconds needed.

                                               

                                              void loop(){

                                                seconds++;

                                               

                                                switch(seconds){

                                                 case 1:

                                                    digitalWrite(led1, HIGH);  //led1 ON

                                                    delay(1000);

                                                    break;

                                                 case 2:

                                                    digitalWrite(led2, HIGH);  //led2 ON

                                                    digitalWrite(led1, LOW);  

                                                    delay(1000);

                                                    break;

                                                 case 3:

                                                   digitalWrite(led1, HIGH);  //led1 and led2 ON

                                                   delay(1000);

                                                   break;

                                                 case 4:

                                                   digitalWrite(led3, HIGH);  //led3 ON

                                                   digitalWrite(led2, LOW);

                                                   digitalWrite(led1, LOW);

                                                   delay(1000);

                                                   break;

                                                 case 5:

                                                   digitalWrite(led1, HIGH);  //led3 and led1 ON

                                                   delay(1000);

                                                   break;

                                                 case 6:

                                                   digitalWrite(led2, HIGH);  //led3 and led2 ON

                                                   digitalWrite(led1, LOW);

                                                   delay(1000);

                                                   break;

                                                 case 7:

                                                   digitalWrite(led1, HIGH);  //led3, led2 and led1 ON

                                                   delay(1000);

                                                   break;

                                                 case 8:

                                                   digitalWrite(led4, HIGH);  //led4 ON

                                                   digitalWrite(led3, LOW);

                                                   digitalWrite(led2, LOW);

                                                   digitalWrite(led1, LOW);

                                                   delay(1000);

                                                   break;

                                                 case 9:

                                                   digitalWrite(led1, HIGH);  //led4 and led1 ON

                                                    delay(1000);

                                                    break;

                                              )

                                               

                                              As you can see, with each increment of the seconds different pins are set HIGH and others are set LOW.  I can't seem to wrap my head around how to come up with a matrix that will do the same thing.  Any thoughts?

                                               

                                              Thanks,

                                               

                                              John

                                                • Re: Error in sketch code
                                                  mcb1

                                                  John

                                                  If you set up a single array (0-9) with the decimal number that matches the binary value of the leds you need to turn on. (ie 0 = none, while 127= all 7 leds)

                                                   

                                                  At each second you could read the array element matching the second, and then turn on the leds.

                                                   

                                                  You can use the port manipulation ( http://www.arduino.cc/en/Reference/PortManipulation ) to set multiple pins at once.

                                                  Decimal numbers also work, so direct reference to your array should work.

                                                   

                                                   

                                                  Does this make sense.??

                                                   

                                                   

                                                  Mark

                                                    • Re: Error in sketch code
                                                      Columbo

                                                      Hi Mark,

                                                       

                                                      As you can see, coding in 'C' and the Arduino are both new to me and I am in a learning process.  Coder27 suggested using arrays rather than the switch statement and that makes sense since the code for a 24 hour clock could get quite large and more difficult to read with the switch statement.  I looked at a couple of short tutorials on arrays and I think I get the general idea.

                                                       

                                                      Your suggestion certaiinly makes sense and is something that I would never have thought of. I will follow your link and read up on the port manipulation to see if I can get an understanding of how that works as well.

                                                       

                                                      Thank you very much for your help.  It is very much appreciated.

                                                       

                                                      Have a very Merry Christmas and all the best in the 2013.

                                                       

                                                      John

                                                      • Re: Error in sketch code
                                                        Columbo

                                                        Hi Mark,

                                                         

                                                        I have been looking at some info on the manipulation of the ports on the Arduino.  I don't have it all down pat yet but I am getting a better understanding of how it works. One thing that I am unsure of is whether I can use a variable in the port designation.  Since I will likely be using pins 1 to 13.

                                                         

                                                        Pins 1 to 7 is on PORTD and pins 8 to 13 is on PORTB,  so could I use a variable such as PORTx or PORTy?

                                                         

                                                        For example:

                                                         

                                                        char x='B'

                                                        char y='D'

                                                         

                                                        for( int i=1; i< 13; i++ ) {

                                                            if( i < 8) {

                                                               PORTx = pinArray[3];   // PORTD     

                                                             }

                                                        }

                                                        else {

                                                             PORTy = pinArray[9];    // PORTB

                                                            }

                                                        }

                                                         

                                                        I am practicing with the UNO but once I get to the point where I can get things working properly I will start using the Mega because it has more pins and of course more memory.

                                                         

                                                        Thanks

                                                         

                                                        John

                                                        • Re: Error in sketch code
                                                          Columbo

                                                          Ok, I tried to use a variable for the PORTD and PORTB and that won't work but I figured out another way to achieve what I needed.

                                                           

                                                          I re-wrote the code, eliminating the switch statement, and used  PORTD and PORTB which is controlled by the secsArray[], the minsArray[], and the hrsArray[].  I ran it using the Arduino Simulator and it is working fine so far.  I only have it coded to where it counts the seconds and minutes so I have to work on the hours now. If I can get that working properly in the simulator, I will upload it to the UNO and see how it runs there.  Using the arrays and the PORTS sure shortens up the code a lot.

                                                           

                                                          It has been quite a learning experience but I'm getting a handle on this 'Arduino C' coding now.

                                                           

                                                          Thanks to Coder27, billabott, and Mark Beckett.  You guys are great!

                                                           

                                                          John

                                                            • Re: Error in sketch code
                                                              mcb1

                                                              John

                                                              I was in the same boat as you just 12 months ago. No experience with c/c++, and its been a steep but enjoyable experience.

                                                               

                                                              Can I suggest you try picking up The Arduino Cookbook (by Michael Margolis) 2nd edition. It is well layed out and full of useful advise and solutions.

                                                               

                                                              You can manipulate some parts of the port using suggestions here ( http://www.arduino.cc/en/Reference/PortManipulation )

                                                              It has a link to The Bitmath Tutorial and note that you can read the port as well.

                                                               

                                                               

                                                              Re memory, the 328 has 30k of code space but only 2048 bytes of ram. Libraries can consume a lot, and you can help yourself by looking inside the library to see what variables they use, and pass the data using the same variable.

                                                              My last project I had to remove all the library parts I didn't need, as I ran out of ram.....

                                                               

                                                              You should also reduce the variable to the maximum size you need ie if you only have a number 0-255, then a byte variable saves ram.

                                                              Also if you have a lot of serial.print("this is text blah  ")  statements you can save ram by off loading them using this :- (Can't recall where I found it ...sorry to the original author)

                                                               

                                                              #include <avr/pgmspace.h>  // allows storing strings in Flash memory

                                                               

                                                              void showString (PGM_P s)

                                                              {

                                                                 char c;

                                                                  while ((c = pgm_read_byte(s++)) != 0)

                                                                     Serial.print(c);

                                                              }

                                                               

                                                              then in your code...

                                                              showString(PSTR("print this text\n"));    // the \n is a CR/LF

                                                               

                                                              You might not need the Mega after all.

                                                               

                                                              Cheers

                                                              Mark

                                                                • Re: Error in sketch code
                                                                  Columbo

                                                                  Thanks Mark,

                                                                   

                                                                  Interesting concept.  I think I will probably use the Mega anyway.  For my BCD clock project I need to control 20 LEDs and the Mega has 54 pins that can be used. I looked at maybe multi-plexing the UNO but to be honest, I haven't been able to figure out how to do it with 20 LEDs where 2 or more may be required to be turned on or off at once. I'm not really all that knowledgable about multi-plexing with the Arduino.

                                                                   

                                                                  I have to locate some info on the Mega's ports though.  On the UNO,  PORTD controls pins 1 - 7 and PORTB controls pins 8 - 13 however, I have not been able to find any info on which ports are on the Mega and which pins that they control. 

                                                                   

                                                                  Given that I only started learning the Arduino and 'Arduino C' two weeks ago, I feel that I have made reasonable progress but I still have a long way to go. The help that is available from users here in this forum certainly makes the learning process a lot easier.

                                                                   

                                                                  I just happened to stumbled upon that Arduino Simulator and I found it to be quite helpful for testing my code. 

                                                                   

                                                                  John

                                                                    • Re: Error in sketch code
                                                                      billabott

                                                                      I'll bet if you try to translate this PIC C code into 'Duino C you will learn a lot; you can even do it in the Simulator.  (Oh, oh, the source code I wrote for the hpLED chaser display in the video was over written. Sorry)  This one works in a similar fashion:

                                                                       

                                                                      This even points out an excellant method of handling the array implementation for super efficiency.

                                                                      This is the second version which is rewritten to take advantage of

                                                                        Arrays to reduce the amount of space required by the application.

                                                                       

                                                                      myke predko

                                                                      04.09.12

                                                                       

                                                                      */

                                                                       

                                                                      __CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & UNPROTECT \

                                                                        & UNPROTECT & BORDIS & IESODIS & FCMDIS);

                                                                       

                                                                       

                                                                      int i, j, n;

                                                                      int Value = 0;

                                                                      int Dlay = 65;                  //  LED Time on Delay Variable

                                                                      const char PORTAValue[8] = {0b010000, 0b100000, 0b010000, 0b000100,

                                                                                                  0b100000, 0b000100, 0b000100, 0b000010};

                                                                      const char TRISAValue[8] = {0b001111, 0b001111, 0b101011, 0b101011,

                                                                                                  0b011011, 0b011011, 0b111001, 0b111001};

                                                                                  // only two of the six bits will be 0 for output at a time

                                                                      const char NOTPORTA[8] = {0, 0, 0, 0, 0, 0, 0, 0};

                                                                       

                                                                      main()

                                                                      {

                                                                       

                                                                          PORTA = 0;

                                                                       

                                                                          CMCON0 = 7;                //  Turn off Comparators

                                                                          ANSEL = 0;                  //  Turn off ADC

                                                                                                             // details that the 'Duino IDE auto-magically handles for us

                                                                       

                                                                          j = 0;                      //  Reset the Display Counter

                                                                       

                                                                          while(1 == 1)               //  Loop Forever

                                                                          {

                                                                              for (i = 0; i < 8; i++ )

                                                                              {                       //  Loop through Each of the 8 LEDS

                                                                                  for (n = 0; n < Dlay; n++);

                                                                                  if ((Value & (1 << i)) == 0)

                                                                                      PORTA = NOTPORTA[i];

                                                                                  else

                                                                                      PORTA = PORTAValue[i];

                                                                                  TRISA = TRISAValue[i];

                                                                              }  //  rof

                                                                       

                                                                              j = j + 1;              //  Increment the Counter every 1/2s

                                                                              if (j >= 50)

                                                                              {

                                                                                  Value = Value + 1;  //  Increment Display Counter

                                                                                  j = 0;              //  Reset the Counter

                                                                              }  //  fi

                                                                          }  //  elihw

                                                                      }  //  End cLEDDisp

                                                                      Source: Myke Predko's "123 PIC Microcontroller Experiments for the Evil Genius"

                                                                       

                                                                      hpLEDsetup.jpg

                                                                      Example: If you were to try this using only 3 digital i/o pins, each pin has a current limiting Resistor whose value is R/2.  A good number for R is 10K, therefore R/2 = 5K.  Attached to the R/2s there are hetero-paired LEDs (1 anode and 1 cathode on each node) for a total of 6 LEDs.  The first hpLED is connected to R1-R2, the second hpLED is connected to R1-R3, and the third hpLED is connected to R2-R3.  Initialize by setting all 3 pins to INPUT (high impedance /.: not enough current flows to light up any LED).  We can select any two pins and make them OUTPUTs hence when one pin  is sourcing current (0 or LOW) and the other pin is sinking current (1 or HIGH) the direct conversion of electrical energy to a photonic emission will occur (... that means the LED will light UP).   Question: If P1 is High and P2 is Low; which P(out) should we toggle to make the LED blink and at what speed? Answer: Either one (it doesn't matter) and slower that 48 Hz.

                                                                       

                                                                       

                                                                      In this video you can see a PICKIT1 Flash Starter Kit running the code I wrote for hpLED_chaser.   If the wait loop time(s) were very much shorter, all the LEDs would appear to be ON simultaneously; and that, my friends, is Persistance Of Vision at work.  Check out some of these POV videos on YouTube.

                                                                       

                                                                      It is great that you are trying to get a better understanding of how to apply these concepts.  For more details please see:  http://en.wikipedia.org/wiki/Charlieplexing

                                                                      Warning: Hetero pairing leads to photonic emissions.

                                                                        • Re: Error in sketch code
                                                                          Columbo

                                                                          Thanks billabott,

                                                                           

                                                                          I will look at the code and the videos as well.

                                                                           

                                                                          John

                                                                            • Re: Error in sketch code
                                                                              billabott

                                                                              Hi, John.

                                                                              That's right you cannot reverse potential on a node connected to ground.  Ground is a source of electrons that flow to nodes with a positive potential.  The thing to think about is the an output pin that is set to 1 or High is more positive than an output pin that is set to 0 or Low.  The current will flow between those pins if a path exists.  Any output pin can be set to High or Low under the control of the software.  Whatever path for current flow that exists will activate. 

                                                                               

                                                                              P.S.  I have found a great book for you to learn C++ with: Simple C++: Featuring Robodog and the Profound Object-Oriented Programming Method 

                                                                               

                                                                              Oh, heck, Jose Pino has taken almost all the fun out of this project by documenting his PIC design at http://www.josepino.com/?anp-1224hr-led-clock1.

                                                                                • Re: Error in sketch code
                                                                                  Columbo

                                                                                  Thanks billabott,

                                                                                   

                                                                                  I am aware that electrons flow from negative to positive, (had to do some electronic stuff to get my ham radio license), but I wasn't thinking in terms of positive and negative when thinking about a pin being HIGH (positive), and a pin being LOW (less positive).  I generally think of negative as being ground as opposed to being "less positive". Since the Arduino has ground pins, that's what I was thinking was being used and could not understand how you could reverse that pin to be positive.

                                                                                   

                                                                                  As for books, as I mentioned prviously, I bought that book that you recommended by Simon Monk.  While it was helpful I found it to be lacking in a number of areas as far as learning 'C' goes.  I have since ordered another book called Beginning Arduino Programming. I am expecting it to arrive shortly.

                                                                                   

                                                                                  Thanks again.

                                                                                    • Re: Error in sketch code
                                                                                      billabott

                                                                                      Hi John.  Is it safe to say the you are also finding the learning curve a little steeper due to the choice to transition from the analog world into the digital world.  Did you do any digital modes with the HAM equipment?

                                                                                       

                                                                                      At your service.

                                                                                        • Re: Error in sketch code
                                                                                          Columbo

                                                                                          Yes, digital is quite different than analog but I am doing a lot of reading, testing, and of course, asking questions on this forum.  As I mentioned in a previous post, it is great to see that there are so many people who are both willing, and have the patience to help those who are new to Arduino and the 'C' language such as myself.

                                                                                           

                                                                                          I did very little in terms of digital with my ham exams.  Most of it is basic electronics, antenna theory, IC circuits, filters etc.

                                                                                           

                                                                                          My main hobby is designing and building antennas. My wife says I have so many antennas up that people will think we are terrorists or something.     She just doesn't understand Amateur Radio.  When she asks me why I like ham radio and I say I enjoy talking to people around the world, she says:  "Why don't you just use the telephone?"

                                                                                           

                                                                                          I have been reading up on this "Charleplexing" and I am finding that controlling 20 LEDs to sometimes have a single LED on and sometimes multiple LEDs on is quite complicated.  Not sure that I am getting my head wrapped around this at all.

                                                                                           

                                                                                          John

                                                                                            • Re: Error in sketch code
                                                                                              mcb1

                                                                                              Billabott

                                                                                              Thanks for your kindness re NZ.

                                                                                              Yes living just out of Chch,  we are all proably world experts in earthquakes/aftershocks after 13,000 of them.

                                                                                               

                                                                                               

                                                                                              You are quite correct about electron flow, and I do realise that about electron flow (learnt that wayyyyy back during training).

                                                                                               

                                                                                              I thought  that John might not, and asummed he was a beginner (mistakely....sorry and apologies) (and yes the extra e was a typo ..sorry).

                                                                                              For those struggling to comprehend electricity, electon flow isn't something that helps....

                                                                                               

                                                                                               

                                                                                              John

                                                                                              Years ago I did some multiple output work using latches, and I wonder if adding some latches for your hour and minute leds might not reduce your pin count.

                                                                                              There are also some I2C devices that might also reduce your pin count, and make the code a little easier for the leds that don't need to change often.

                                                                                               

                                                                                              Mark

                                                                                                • Re: Error in sketch code
                                                                                                  Columbo

                                                                                                  Hi Mark,

                                                                                                   

                                                                                                  Actually I never really thought about latches or flip-flops, (almost the same thing) or 12C devices.  I was really trying to find a way of doing it with a standard UNO.  As I mentioned before, I could use the Mega if I can find some PORT to Pin information. I could just test for them I guess but thought it would be far less time if I was able to find it on the internet.  I know PORTD controls pins 0-7 and PORTB handles pins 8-13 but I can't find anything like that for the Mega2560.  I think I will try a few more things with the bare UNO and if I can't come up with any ideas I'll look at maybe using a 12C device or perhaps latches.

                                                                                                   

                                                                                                  Appreciate the suggestions Mark.

                                                                                                   

                                                                                                  John

                                                                                      • Re: Error in sketch code
                                                                                        mcb1

                                                                                        John

                                                                                        Don't go to the dark side and borow someone elses work, stick with yours.

                                                                                        You will learn a lot more.

                                                                                        Keep your sketchs that you create along the way, they will serve you later.

                                                                                         

                                                                                        Billabot

                                                                                        billabott wrote:

                                                                                        when one pin  is sourcing current (0 or LOW) and the other pin is sinking current (1 or HIGH)

                                                                                         

                                                                                        I always find begineers get confused over true current flow.

                                                                                        I found that using terms such as "..the HIGH causes current to flow to the LOW..", which is not right but helps when they use the water comparison.

                                                                                         

                                                                                        I recall a NZ comedian (Fred Dagg) once describing the wind along the lines of "... the big Highs rush around trying to fill the Lows and make them all even....."

                                                                                         

                                                                                        Cheers

                                                                                        mark

                                                                                          • Re: Error in sketch code
                                                                                            billabott

                                                                                            Really?  I tried to be careful not start the silly waste of  keystrokes about which way current flows.  So you are saying the surplus electrons and the excess holes meet in the middle somewhere and cancel each other out?     No?  You said, "I always find begineers get confused over true current flow."  I am not sure what you are saying exactly.  No matter.  Aal izz well.  No worries, mate. 

                                                                                             

                                                                                            I know that the convention by historical error ( and 100 years later, they didn't want to correct the mistake when it was better understood ) is for "Current" to "Flow" from positive to negative, but, that is not what is really happening is it?  

                                                                                             

                                                                                            I declare myself to be a life long learner.  I am neither a begineer or a beginner.  Thank you.  I love New Zealand, except for the earthquakes and I thank all the people there for helping to make films such as The Lord of the Rings Trilogy and The Hobbit Trilogy.

                                                                                             

                                                                                            We must accept Atmel as the Authority on the issue in this case.  In the pertinent document(1) it states:

                                                                                             

                                                                                            Port D is an 8-bit bi-directional I/O port with internal pull-up resistors (selected for each bit).  The Port D output buffers have symmetrical drive characteristics with both high sink and source capability.  As inputs, Port D pins that are externally pulled low will source current if the pull-up resistors are activated.

                                                                                             

                                                                                            That clearly says that something, presumably holes because it cannot be electrons in my opinion, flows into the low/0/ground.  So Atmel adheres to the conventional view of current flow.  That's fine.   It's just not the way my brain understands the truth of electron flow. 

                                                                                             

                                                                                            The only visualization of conventional current flow I can think of is a film of a freshly opened 3 liter bottle of 7Up being played in reverse - then you can actually see the holes(bubbles) being filled up with electrons and disappearing from existance.  Silly, isn't it.

                                                                                             

                                                                                             

                                                                                            (1) http://www.atmel.com/Images/8271S.pdf

                                                                                            • Re: Error in sketch code
                                                                                              Columbo

                                                                                              Thanks Mark,

                                                                                               

                                                                                              I have some knowledge about electronics but little about the Arduino and the 'C' programming language although I think I am getting a bit of a handle on the 'C' now.  I keep all my code snippets to review periodically and also in the event that I can use them in future projects. The BCD clock that I am working on uses 20 LEDs that I am controlling with Port manipulation however, the UNO does not have enough pins so I am trying to figure out how this multiplexing, or Charlieplexing works to reduce the number of pins required

                                                                                               

                                                                                              Thanks..

                                                                    • Re: Error in sketch code
                                                                      billabott

                                                                      JohnC,

                                                                      Couple of things since you are not using a MAX7219EWGMAX7219EWG or the like, which is what most 'Duino projects will tell you to use.  I happen to have a bag of 10 of those ICs in front of me today.  To drive the LEDs the ATMEGA328 has to do all the work that the display driver chip would normally do.  You can do this without the driver chip or over heating the UNO due to excess current demands thanks to an effect called Persistance of Vision.  Have you seen those spinning LED sticks on a bicycle wheel spoke that make readable displays by turning the LEDs on and off in a controlled sequence?  Check on YouTube if you need to.

                                                                       

                                                                      You may want to familiarize yourself with the barGraph.pde example in the IDE and its tutorial on arduino.cc.

                                                                       

                                                                      The way I envision it is that the loop() does the following things:

                                                                      1. determine/acquire the digit values to be displayed,

                                                                      2. configures the pins that are required to be ON,

                                                                      3. go into a loop turning the I/O pins on and off in sequence to provide the appropriate display on the output.

                                                                      Item #3 is were a switch statements would be of use.   An interrupt (or conditional break;) upon new data available would allow the execution sequence to escape from the while(1) code block and the new digit values to be processed.  I assume you are going for a clock type output display  and that is what will cause multiple switch statements within the while(1) code block.  There are many choices to make about how best to arrange the process so it runs efficiently with the goal to minimize observable flicker.  If you don't like the nesting of code blocks then move the while(1) block into a new void DisplayDigits() function and call it.  Your choice.

                                                                       

                                                                      PS  When you want to make your project more permanent after the bugs are worked out, I recommend using strip board.

                                                                        • Re: Error in sketch code
                                                                          billabott

                                                                          FYI

                                                                           

                                                                          ArduinoX: IDE for Arduino

                                                                          ArduinoX (pending a better name) is an alternative IDE for Arduino. It focuses on having a better out of the box experience than the standard IDE. It is more attractive, easier to use, and has better support for 3rd party boards.

                                                                          ArduinoX is still very alpha, but it can edit, compile, and download to several standard boards already.

                                                                          Current features include:

                                                                          • new code editor with line numbers, better color scheme, anti-aliasing, and a better default font   
                                                                          • !!!  I can't wait until everyone is using it.

                                                                           

                                                                           

                                                                          -=SyntaxMatters=-     

                                                                          • Re: Error in sketch code
                                                                            Columbo

                                                                            Thanks billabott,

                                                                             

                                                                            I grabbed the code for that bargraph.pde and will take a look at it.  I did, in fact, notice the line counter at the bottom left and I have downloaded the ArduinoX IDE that you recommended.  I will install it tomorrow.  As I mentioned in my reply to Coder27, now that I have fugured out how to get these LEDs working in proper sequence, I am going to move it over to my ArduinoMega2560.

                                                                             

                                                                            Before going too far with it though, I am going to see if there is a way to shorten the code a bit. I'm sure that since I am just learning to coding in 'C', my sketch is probably larger than an experienced 'C' programmer would have.

                                                                             

                                                                            Thanks for all your help billabott, much appreciated.

                                                                              • Re: Error in sketch code
                                                                                billabott

                                                                                You are welcome.  You seem to be adapting and advancing quite quickly.  Feel free to read my blog  "BP 0x0004".

                                                                                  • Re: Error in sketch code
                                                                                    Columbo

                                                                                    Thanks billabott,

                                                                                     

                                                                                    I find that choosing a project and actually trying to get it to work is a lot easier for me to learn rather than just reading a book.  Books and tutorials are very helpful of course, but hands-on gets your mind working and understanding it better.  I'm going to make a number of errors along the way but that's part of the learning process,... as long as you learn from your mistakes.    Certainly having some experienced people here on Element14 who are so willing to take the time and patience to help others is priceless.

                                                                                     

                                                                                    Merry Christmas to you and yours from my house.

                                                                          • Re: Error in sketch code

                                                                            John,

                                                                              Are those the only errors you're seeing?

                                                                            It looks to me that on line 11, you are missing a semicolon

                                                                            at the end of the line:

                                                                               int seconds=0

                                                                             

                                                                            and on line 20, you are missing a comma after led7

                                                                                ledMode(led7 OUTPUT);

                                                                             

                                                                            and all your "if" statements should use lowercase "if"

                                                                            instead of "If".

                                                                              • Re: Error in sketch code
                                                                                Columbo

                                                                                Yes Coder27, you are correct.  I didn't notice the other errors because they had scrolled up and were not visible.

                                                                                This is my first attempt using the Arduino IDE and coding in 'C'.

                                                                                 

                                                                                I have added the semi colon after 'seconds=0' and the comma after the (led7, OUTPUT).  As well I have changed all of the If to if.

                                                                                 

                                                                                Thanks for pointing these out.