CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

Help with making a 16F628A (or other chip) metronome!

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
FunkyLabRat



Joined: 13 Feb 2012
Posts: 10

View user's profile Send private message

Help with making a 16F628A (or other chip) metronome!
PostPosted: Thu Mar 21, 2013 12:42 pm     Reply with quote

Hi all,

I'm trying to make a metronome using the internal oscillator of a 16F628A. I have the option of using an external crystal if I should need one, but to keep things simple I'm trying it this way first.

After experimenting a lot with the timers on the 16f628a and their overflow rates and pre-scalers, I've had no success. I've succeeded in getting a steady 'second' (60 BPM) though, but found no working way to divide it to get other BPM rates.

I'm sure there's a working way, but after months of experimenting I really hope someone can push me in the right direction. I won't give up easily, but this is starting to drive me crazy... Smile


So, here's my latest try which should work but doesn't:

Instead of using the setup_timer_1 and timer interrupts, I've wrote the program below, which is using #use timer instead.

I've discarded of formulas to check the ticks for the BPM, and now just try to count every 500ms (= 120 BPM). When I try it, the flickering LED is not even close to 120 BPM; it's way too slow.

Code:
#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

#use delay(int=4000000)
#use timer(timer=1, tick=1ms, bits=16, ISR)    // TICK Time is: 1,024 ms. Precise enough?

int16 ticks;

void main()
{

   enable_interrupts(GLOBAL);
   
   while(TRUE)
   {
      ticks = get_ticks();
     
      if (ticks >= 500) {              // 120bpm = 500ms per beat count
         output_toggle(PIN_A1);        // toggle LED on pin A1
         set_ticks(0);                 // reset ticks counter
         // set_timer1(0);          //necessary?
      }
   }

}



Any suggestions, or a working metronome code? Thanks in advance! I'm really trying.
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Thu Mar 21, 2013 1:26 pm     Reply with quote

Google ? As the first resource in code searches ?

Search Google for:
Quote:
metronome "#use delay" "#fuses"
FunkyLabRat



Joined: 13 Feb 2012
Posts: 10

View user's profile Send private message

PostPosted: Thu Mar 21, 2013 2:11 pm     Reply with quote

Thank you, but I've tried for many months to accomplish this, and of course I've used Google for searching and reading documents for a lot of hours on the subject.

There was one search result I haven't read with your search terms. I'll check that one out.

I want to make a steady, very accurate metronome. Most of the code I've found is not useful.


Edit: That specific search result seems to be useful. I'm going to study it. Thanks ;)
temtronic



Joined: 01 Jul 2010
Posts: 9163
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Thu Mar 21, 2013 3:08 pm     Reply with quote

You'll have to use an external crystal or oscillator if you want accuracy. The internal oscillator may not be good enough for you, though a metronome shouldn't need .001% timing !!



I did Google using PCM programmer's keywords and found several articles, including one with CCS C code, in a PDF. Seemed reasonably useful....

hth
jay
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Fri Mar 22, 2013 3:49 am     Reply with quote

I can't start to answer your question, it's too open ended.

I think you need to sit down and work out a specification. :-

1) School/hobby/commercial project / professional music studio?
2) Accuracy, stability.
3) Range.
4) Resolution.
5) User input.
6) Rate indication.

I can make a guesses at the above, but will waste my time and yours offering solutions.
Code:

1) Should be self-explanatory.

2) It's your project. Look up the internal R/C time & temperature stabilities in the data sheet.
   Then decide if you need to go to a ceramic resonator or crystal.

3) What are minimum and maximum BPM required?

4) Are you wanting to go in steps of 0.5, 1, 2BPM, 1% steps, dunno?

5) How will the user change the BPM?
   (keypad, single/multi-turn pot, rotary switches, up/down buttons.

6) How will user know what BPM setting is?
   (depends to some extent on 5, big dial, LCD, don't care)

Or, as has been suggested, try google.

Mike
Ttelmah



Joined: 11 Mar 2010
Posts: 19333

View user's profile Send private message

PostPosted: Fri Mar 22, 2013 4:41 am     Reply with quote

It's worth perhaps saying, that _modern_ metronomes generally will all use crystals, and be many times more accurate than is really needed.
Historical 'mechanical' metronomes were considered 'good', if they offered +/-1% accuracy, and the internal oscillator of the 628A, can easily achieve this, _if the supply rail is good_. The quoted accuracy is just on +/-1%, if the supply is regulated at 3.5v. However if the supply is (say) 5v, the warranted accuracy is only +/-2%, which is in the 'fair' level for a traditional metronome.
Most chips will be well inside this range, but you are bound to get some that are on the limits.

Then separately, re-consider the approach a little. The standard beat rates normally wanted from a metronome, are:
40,42,44,46,48,50,52,54,56,58,60,63,66,69,72,76,80,84,88,92,96,
100,104,108,112,116,120,126,132,138,144,152,160,168,176,184,200,208
Now if going electronic, you might also want offer options to accent on the second, third, and fourth tick. Now, these are beats/minute, so you can count with a high frequency tick, and get very precise levels easily, but take advantage of an interrupt to do this, and use a look-up table to give the counts wanted. Look at the example RTC:

<http://www.ccsinfo.com/forum/viewtopic.php?t=26177&start=0>

Now, note how this works by subtracting a 'count', and triggering the 'event' (seconds here), when the ticker is less than the count. The same exact approach can be used with a look up table of count values (load these into a variable in the main when the new beat rate is selected, don't access the array in the interrupt), Then have the interrupt just fire the output 'beep' (ideally setup hardware so the noise is something like a NE555, triggered by a mono-stable multivibrator, so a single pulse on an output wire generates the 'tick' sound - or something like a 12F675 doing this).
The key point is that this algorithm gives precise long term accuracy, even if the individual 'ticks' can drift by up to one interrupt interval, and the tick rate can be constant, yet give you the variability needed in the output. Have a second output triggering a different duration on another monostable, and you can trigger this instead of the first monostable on every 'n' beats to give the accenting.

Best Wishes
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Fri Mar 22, 2013 5:29 am     Reply with quote

That's two of us asking you to produce a detailed spec.

And you've been given a good steer.

Mike
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group