Pages: [1] 2 3   Go Down
Author Topic: Timer2 Interrups REFUSE to work! :(  (Read 5370 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

So I am trying to build a small watch project, I cant really go so much into detail as I am just prototyping. I am not exactly "great" in C, but know my way around the basics.

However, timer interrupts or fuse settings continue to boggle me.
At this point I have gotten counting and LEDs to light up on my board, good signs. Once that went good, I moved onto timing the danged thing. I am basing my code heavily off of sparkfuns "bigTime" watch code (on their website if you need it). Basically the clock is running off of a 32.768kHz crystal, as sort of an RTC. This is timed by generating interrupts on the clock pins. Unfortunately, my code doesnt seem to work. I have LEDs that light up, and my button interrupts work, but I CANNOT get the external crystal to trigger the interrupt.

Here is my code:

Code:
9/8/12
 
#include <avr/sleep.h> //Needed for sleep_mode
#include <avr/power.h> //Needed for powering down perihperals such as the ADC/TWI and Timers

#define TRUE 1
#define FALSE 0

//Set this variable to change how long the time is shown on the watch face. In milliseconds so 1677 = 1.677 seconds
int show_time_length = 2000;
int show_the_time = FALSE;

//You can set always_on to true and the display will stay on all the time
//This will drain the battery in about 15 hours
int always_on = FALSE;

long seconds = 54;
int minutes = 24;
int hours = 3;


#define RED  1
int systemColor = RED;
int display_brightness = 15000; //A larger number makes the display more dim. This is set correctly below.

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//Pin definitions
int hour8 = A4; //Hour 8
int hour4 = A2; //Hour 4
int hour2 = 12; //Hour 2
int hour1 = 10; //Hour 1

int minute32 = A0; //Minute 32
int minute16 = A3; //Minute 16
int minute8 = A1; //Minute 8
int minute4 = 13; //Minute 4
int minute2 = 11; //Minute 2
int minute1 = 9; //Minute 1

int theButton = 2;
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

//The very important 32.686kHz interrupt handler
SIGNAL(TIMER2_OVF_vect){
  seconds += 8; //We sleep for 8 seconds instead of 1 to save more power
  //seconds++; //Use this if we are waking up every second

if(seconds > 59){
minutes++;
seconds = seconds - 59;
}

if(minutes > 59){
  hours++;
 minutes = minutes - 59;
}


/*
//Update the minutes and hours variables
  minutes += seconds / 60; //Example: seconds = 2317, minutes = 58 + 38 = 96
  seconds %= 60; //seconds = 37
  hours += minutes / 60; //12 + (96 / 60) = 13
  minutes %= 60; //minutes = 36
*/

 if(hours > 12) hours -= 12;
  
}
//The interrupt occurs when you push the button
SIGNAL(INT0_vect){
  //When you hit the button, we will need to display the time
  //if(show_the_time == FALSE)
  show_the_time = TRUE;

}

void setup() {                
  //To reduce power, setup all pins as inputs with no pullups
  for(int x = 1 ; x < 18 ; x++){
    pinMode(x, INPUT);
    digitalWrite(x, LOW);
  }

  pinMode(theButton, INPUT); //This is the main button, tied to INT0
  digitalWrite(theButton, HIGH); //Enable internal pull up on button

  //These pins are used to control the display
  pinMode(hour8, OUTPUT);
 .....
  pinMode(minute1, OUTPUT);
 

  //Power down various bits of hardware to lower power usage  
  set_sleep_mode(SLEEP_MODE_PWR_SAVE);
  sleep_enable();

  //Shut off ADC, TWI, SPI, Timer0, Timer1

  ADCSRA &= ~(1<<ADEN); //Disable ADC
  ACSR = (1<<ACD); //Disable the analog comparator
  DIDR0 = 0x3F; //Disable digital input buffers on all ADC0-ADC5 pins
  DIDR1 = (1<<AIN1D)|(1<<AIN0D); //Disable digital input buffer on AIN1/0

  power_twi_disable();
  power_spi_disable();
  power_usart0_disable();
  //power_timer0_disable(); //Needed for delay_ms
  power_timer1_disable();
  //power_timer2_disable(); //Needed for asynchronous 32kHz operation
  
  //Setup TIMER2
  TCCR2A = 0x00;
  TCCR2B = (1<<CS22)|(1<<CS20); //Set CLK/128 or overflow interrupt every 1s
 // TCCR2B = (1<<CS22)|(1<<CS21)|(1<<CS20); //Set CLK/1024 or overflow interrupt every 8s
  ASSR = (1<<AS2); //Enable asynchronous operation
  TIMSK2 = (1<<TOIE2); //Enable the timer 2 interrupt

  //Setup external INT0 interrupt
  EICRA = (1<<ISC01); //Interrupt on falling edge
  EIMSK = (1<<INT0); //Enable INT0 interrupt

  //System clock futzing
  //CLKPR = (1<<CLKPCE); //Enable clock writing
  //CLKPR = (1<<CLKPS3); //Divid the system clock by 256

 
  
  //Display brightness changes based on color
  if(systemColor == RED) {
    display_brightness = 4500; //The higher the number, the lower the brightness
  
  }
  else {
    display_brightness = 1;
    
  }


  showTime(); //Show the current time for a few seconds

  sei(); //Enable global interrupts
}

void loop() {
  if(always_on == FALSE)
    sleep_mode(); //Stop everything and go to sleep. Wake up if the Timer2 buffer overflows or if you hit the button

  if(show_the_time == TRUE || always_on == TRUE) {

  
    showTime(); //Show the current time for a few seconds

    //If you are STILL holding the button, then you must want to adjust the time
    if(digitalRead(theButton) == LOW){ setTime();
    }
    show_the_time = FALSE; //Reset the button variable
  }
}

void showTime() {

    //Now show the time for a certain length of time
  long startTime = millis();
  while( (millis() - startTime) < show_time_length) {
  
    lightLeds();

  
      if(display_brightness > 0){ //PWM only if brightness is not full
    delayMicroseconds(display_brightness);
      }
  }

}



//Holding the button down will increase the time (accelerates)

void setTime(void) {

  
 //Now show the time for a certain length of time
  long startTime = millis();
  while( (millis() - startTime) < show_time_length) {
  
    lightLeds();

  
      if(display_brightness > 0){ //PWM only if brightness is not full
    delayMicroseconds(display_brightness);
      }
  }
  
  int idleMiliseconds = 0;
  //This is the timeout counter. Once we get to ~2 seconds of inactivity, the watch
  //will exit the setTime function and return to normal operation

  int buttonHold = 0;
  //This counts the number of times you are holding the button down consecutively
  //Once we notice you're really holding the button down a lot, we will speed up the minute counter

  while(idleMiliseconds < 2000) {

    cli(); //We don't want the interrupt changing values at the same time we are!
if(seconds > 59){
minutes++;
seconds = seconds - 59;
}

if(minutes > 59){
  hours++;
  minutes = minutes - 59;
}


 if(hours > 12) hours -= 12;

    sei(); //Resume interrupts
    
 for(int x = 0 ; x < 20 ; x++) {
      lightLeds(); //Each call takes about 8ms, display the colon for about 100ms
      if(display_brightness > 0) {delayMicroseconds(display_brightness); //Wait before we paint the display again
    }
 }
  
  

    //If you're still hitting the button, then increase the time and reset the idleMili timeout variable
    if(digitalRead(theButton) == LOW) {
      idleMiliseconds = 0;

      buttonHold++;
      if(buttonHold < 10)
        minutes++; //Advance the minutes
      else {
        //Advance the minutes faster because you're holding the button for 10 seconds
        //Start advancing on the tens digit. Floor the single minute digit.
        minutes /= 10; //minutes = 46 / 10 = 4
        minutes *= 10; //minutes = 4 * 10 = 40
        minutes += 10;  //minutes = 40 + 10 = 50
      }
    }
    else
      buttonHold = 0;

    idleMiliseconds += 200;
  }
}







 
   void lightLeds() {
     //Turns correct outputs on
 
  
 switch(hours) {
    
   ...
  }
  
  
  switch(minutes){
  ...
  }
  
  
  if(display_brightness > 0){ //Only PWM if brightness is not full
    delayMicroseconds(display_brightness);
  
   digitalWrite(hour8, LOW); //write pins low to get "dimming" effect
 ....
  }
  
 }
 
 
 
 
 
 /*
 ARTHUR: What?
TIM: There he is!
ARTHUR: Where?
TIM: There!
ARTHUR: What, behind the rabbit?
TIM: It is the rabbit!

(\_/)
(o.O) ----Grrrrrrrrrrr.
(>< )
/_|_\

*/


Sorry its pretty long, but most of the stuff is in the top part. The rest is just variables smiley


Things i have tried: different crystal, random bits of the "same" code off of google searches, etc. Not much, but Ive been searching for a few days on this and come to nothing. Grr.

I am uploading using arduino 1.01 and an AVRISP MKII !CLONE! but that seems to work perfectly. Even in AVR studio! smiley-wink *shameless plug, cost me $12 for a kit to build it and it WORKS! happy dance*

THANKS so much for any help you can give. At this point its kind of exceeding my limits...


Stupid forum limits... had to take out half my code smiley-sad
Logged

Global Moderator
Melbourne, Australia
Offline Offline
Brattain Member
*****
Karma: 511
Posts: 19367
Lua rocks!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

You can attach files to posts you know. Like, your code.

And you should do an auto-format. Your indentation is all over the place.
Logged

http://www.gammon.com.au/electronics

Please post technical questions on the forum - not to me by personal message. Thanks a lot.

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 654
Posts: 50931
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
//The interrupt occurs when you push the button
SIGNAL(INT0_vect){
  //When you hit the button, we will need to display the time
  //if(show_the_time == FALSE)
  show_the_time = TRUE;
}
The button? What button?

Does your code work if you quit trying to sleep? What use is a sleeping watch?

Code:
  TCCR2B = (1<<CS22)|(1<<CS20); //Set CLK/128 or overflow interrupt every 1s
 // TCCR2B = (1<<CS22)|(1<<CS21)|(1<<CS20); //Set CLK/1024 or overflow interrupt every 8s
In the interrupt handler, you assume that 8 seconds have elapsed. I'm confused as to why?

Code:
  if(always_on == FALSE)
Explicit comparisons to true or false look silly.
Code:
  if(!always_on)
looks like someone who knew what they were doing wrote the code.

Code:
  if(show_the_time == TRUE || always_on == TRUE) {
likewise should be
Code:
  if(show_the_time || always_on)
  { // Down here, where it belongs

Code:
      if(display_brightness > 0){ //PWM only if brightness is not full
    delayMicroseconds(display_brightness);
      }
I fail to see how a delay will decrease brightness.

Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Auto-formatted code:
Code:
9/8/12

#include <avr/sleep.h> //Needed for sleep_mode
#include <avr/power.h> //Needed for powering down perihperals such as the ADC/TWI and Timers

#define TRUE 1
#define FALSE 0

//Set this variable to change how long the time is shown on the watch face. In milliseconds so 1677 = 1.677 seconds
int show_time_length = 2000;
int show_the_time = FALSE;

//You can set always_on to true and the display will stay on all the time
//This will drain the battery in about 15 hours
int always_on = FALSE;

long seconds = 54;
int minutes = 24;
int hours = 3;


#define RED  1
int systemColor = RED;
int display_brightness = 15000; //A larger number makes the display more dim. This is set correctly below.

//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//Pin definitions
int hour8 = A4; //Hour 8
int hour4 = A2; //Hour 4
int hour2 = 12; //Hour 2
int hour1 = 10; //Hour 1

int minute32 = A0; //Minute 32
int minute16 = A3; //Minute 16
int minute8 = A1; //Minute 8
int minute4 = 13; //Minute 4
int minute2 = 11; //Minute 2
int minute1 = 9; //Minute 1

int theButton = 2;
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

//The very important 32.686kHz interrupt handler
SIGNAL(TIMER2_OVF_vect){
  seconds += 8; //We sleep for 8 seconds instead of 1 to save more power
  //seconds++; //Use this if we are waking up every second

  if(seconds > 59){
    minutes++;
    seconds = seconds - 59;
  }

  if(minutes > 59){
    hours++;
    minutes = minutes - 59;
  }


  /*
//Update the minutes and hours variables
   minutes += seconds / 60; //Example: seconds = 2317, minutes = 58 + 38 = 96
   seconds %= 60; //seconds = 37
   hours += minutes / 60; //12 + (96 / 60) = 13
   minutes %= 60; //minutes = 36
   */

  if(hours > 12) hours -= 12;

}
//The interrupt occurs when you push the button
SIGNAL(INT0_vect){
  //When you hit the button, we will need to display the time
  //if(show_the_time == FALSE)
  show_the_time = TRUE;

}

void setup() {               
  //To reduce power, setup all pins as inputs with no pullups
  for(int x = 1 ; x < 18 ; x++){
    pinMode(x, INPUT);
    digitalWrite(x, LOW);
  }

  pinMode(theButton, INPUT); //This is the main button, tied to INT0
  digitalWrite(theButton, HIGH); //Enable internal pull up on button

  //These pins are used to control the display
  pinMode(hour8, OUTPUT);
  .....
    pinMode(minute1, OUTPUT);


  //Power down various bits of hardware to lower power usage 
  set_sleep_mode(SLEEP_MODE_PWR_SAVE);
  sleep_enable();

  //Shut off ADC, TWI, SPI, Timer0, Timer1

  ADCSRA &= ~(1<<ADEN); //Disable ADC
  ACSR = (1<<ACD); //Disable the analog comparator
  DIDR0 = 0x3F; //Disable digital input buffers on all ADC0-ADC5 pins
  DIDR1 = (1<<AIN1D)|(1<<AIN0D); //Disable digital input buffer on AIN1/0

  power_twi_disable();
  power_spi_disable();
  power_usart0_disable();
  //power_timer0_disable(); //Needed for delay_ms
  power_timer1_disable();
  //power_timer2_disable(); //Needed for asynchronous 32kHz operation

  //Setup TIMER2
  TCCR2A = 0x00;
 // TCCR2B = (1<<CS22)|(1<<CS20); //Set CLK/128 or overflow interrupt every 1s
   TCCR2B = (1<<CS22)|(1<<CS21)|(1<<CS20); //Set CLK/1024 or overflow interrupt every 8s
  ASSR = (1<<AS2); //Enable asynchronous operation
  TIMSK2 = (1<<TOIE2); //Enable the timer 2 interrupt

  //Setup external INT0 interrupt
  EICRA = (1<<ISC01); //Interrupt on falling edge
  EIMSK = (1<<INT0); //Enable INT0 interrupt

  //System clock futzing
  //CLKPR = (1<<CLKPCE); //Enable clock writing
  //CLKPR = (1<<CLKPS3); //Divid the system clock by 256



  //Display brightness changes based on color
  if(systemColor == RED) {
    display_brightness = 4500; //The higher the number, the lower the brightness

  }
  else {
    display_brightness = 1;

  }


  showTime(); //Show the current time for a few seconds

  sei(); //Enable global interrupts
}

void loop() {
  if(always_on == FALSE)
    sleep_mode(); //Stop everything and go to sleep. Wake up if the Timer2 buffer overflows or if you hit the button

  if(show_the_time == TRUE || always_on == TRUE) {


    showTime(); //Show the current time for a few seconds

    //If you are STILL holding the button, then you must want to adjust the time
    if(digitalRead(theButton) == LOW){
      setTime();
    }
    show_the_time = FALSE; //Reset the button variable
  }
}

void showTime() {

  //Now show the time for a certain length of time
  long startTime = millis();
  while( (millis() - startTime) < show_time_length) {

    lightLeds();


    if(display_brightness > 0){ //PWM only if brightness is not full
      delayMicroseconds(display_brightness);
    }
  }

}



//Holding the button down will increase the time (accelerates)

void setTime(void) {


  //Now show the time for a certain length of time
  long startTime = millis();
  while( (millis() - startTime) < show_time_length) {

    lightLeds();


    if(display_brightness > 0){ //PWM only if brightness is not full
      delayMicroseconds(display_brightness);
    }
  }

  int idleMiliseconds = 0;
  //This is the timeout counter. Once we get to ~2 seconds of inactivity, the watch
  //will exit the setTime function and return to normal operation

  int buttonHold = 0;
  //This counts the number of times you are holding the button down consecutively
  //Once we notice you're really holding the button down a lot, we will speed up the minute counter

  while(idleMiliseconds < 2000) {

    cli(); //We don't want the interrupt changing values at the same time we are!
    if(seconds > 59){
      minutes++;
      seconds = seconds - 59;
    }

    if(minutes > 59){
      hours++;
      minutes = minutes - 59;
    }


    if(hours > 12) hours -= 12;

    sei(); //Resume interrupts

    for(int x = 0 ; x < 20 ; x++) {
      lightLeds(); //Each call takes about 8ms, display the colon for about 100ms
      if(display_brightness > 0) {
        delayMicroseconds(display_brightness); //Wait before we paint the display again
      }
    }



    //If you're still hitting the button, then increase the time and reset the idleMili timeout variable
    if(digitalRead(theButton) == LOW) {
      idleMiliseconds = 0;

      buttonHold++;
      if(buttonHold < 10)
        minutes++; //Advance the minutes
      else {
        //Advance the minutes faster because you're holding the button for 10 seconds
        //Start advancing on the tens digit. Floor the single minute digit.
        minutes /= 10; //minutes = 46 / 10 = 4
        minutes *= 10; //minutes = 4 * 10 = 40
        minutes += 10;  //minutes = 40 + 10 = 50
      }
    }
    else
      buttonHold = 0;

    idleMiliseconds += 200;
  }
}








void lightLeds() {
  //Turns correct outputs on


  switch(hours) {

    ...
  }


  switch(minutes){
    ...
  }


  if(display_brightness > 0){ //Only PWM if brightness is not full
    delayMicroseconds(display_brightness);

    digitalWrite(hour8, LOW); //write pins low to get "dimming" effect
    ....
  }

}







Ok, as for this:
Code:

//The interrupt occurs when you push the button
SIGNAL(INT0_vect){
  //When you hit the button, we will need to display the time
  //if(show_the_time == FALSE)
  show_the_time = TRUE;
}
The button? What button? - there is a button interrupt attached to pin D2 i believe. This is used to wake the watch from sleep.

Does your code work if you quit trying to sleep? What use is a sleeping watch? - No and no, when I set always on to true, the timer2 interrupt is still running but never called, never incrementing the timer/clock variables. Watch is sleeping to save massive amounts of power.

Code:
  TCCR2B = (1<<CS22)|(1<<CS20); //Set CLK/128 or overflow interrupt every 1s
 // TCCR2B = (1<<CS22)|(1<<CS21)|(1<<CS20); //Set CLK/1024 or overflow interrupt every 8s
In the interrupt handler, you assume that 8 seconds have elapsed. I'm confused as to why?
Sorry, typo on my part. the two lines should be commented differently.

Code:
  if(always_on == FALSE)
Explicit comparisons to true or false look silly.
Keeping this because it is so much easier for a beginner to find this and know what to do with it. Its harder to spot the not ! in it.

Code:
  if(!always_on)
looks like someone who knew what they were doing wrote the code.
Yeah, well I don't sometimes so smiley-razz. Lol JK, just trying to keep the variable easier to spot.

Code:
      if(display_brightness > 0){ //PWM only if brightness is not full
    delayMicroseconds(display_brightness);
      }
I fail to see how a delay will decrease brightness.
More of a virtual PWM as I do not have 10 PWM pins for 10 LEDs. This is more of "bursting" the LEDs to appear not as bright.
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 654
Posts: 50931
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Watch is sleeping to save massive amounts of power.
Not working saves even more power? Just trying to eliminate possible areas of conflict.

Quote
there is a button interrupt attached to pin D2 i believe.
I'd check... I also don't see where you connect that ISR to that pin. The attachInterrupt() function is usually called to make an association.

I think, at this point, that we need to see all of your code.

Quote
This is timed by generating interrupts on the clock pins.
Which pins would that be? What code, of yours, is supposed to respond to those interrupts?
Logged

0
Offline Offline
Shannon Member
****
Karma: 222
Posts: 12725
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

We need to see your circuit to understand this, some of your code suggests you are clocking timer2's prescaler at 32768Hz, is this true and if so how?
Logged

[ I won't respond to messages, use the forum please ]

Offline Offline
Newbie
*
Karma: 1
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, here goes

Code is attached in arduino formatting (as INO file). Code also references a couple LIBs but they should be in arduino program by default. This is literally all the code i have on this, soo...

Also attached is the schematic and rough board layout in EAGLE.


Posted by: MarkT
Insert Quote
We need to see your circuit to understand this, some of your code suggests you are clocking timer2's prescaler at 32768Hz, is this true and if so how?

To be honest, I have no idea what you just said. I am just trying to get timer2 to inturrupt every 8s from a 32.768 crystal. Most of my code was copied from sparkfuns example, so it *should* work, but as I said, hardware and software level inturrupts are not exactly my strongpoint.


Posted by: PaulS
Not working saves even more power? Just trying to eliminate possible areas of conflict.

Yep smiley-grin, well at least at the moment...

I'd check... I also don't see where you connect that ISR to that pin. The attachInterrupt() function is usually called to make an association.
I think this deos it
Code:
//Setup external INT0 interrupt
  EICRA = (1<<ISC01); //Interrupt on falling edge
  EIMSK = (1<<INT0); //Enable INT0 interrupt

Which pins would that be? What code, of yours, is supposed to respond to those interrupts?
Pins TOSC1 & TOSC2 if I got the names right. Just XTAL1 and XTAL2 on the schematic. This code is what is supposed to be run when it interrupts.
Code:
SIGNAL(TIMER2_OVF_vect){
  seconds += 8; //We sleep for 8 seconds instead of 1 to save more power
  //seconds++; //Use this if we are waking up every second

  if(seconds > 59){
    minutes++;
    seconds = seconds - 59;
  }

  if(minutes > 59){
    hours++;
    minutes = minutes - 59;
  }

* BinaTime2.ino (28.39 KB - downloaded 20 times.)
* Watch-v13.brd (60.57 KB - downloaded 17 times.)
* Watch-v13.sch (164.2 KB - downloaded 19 times.)
Logged

0
Offline Offline
Shannon Member
****
Karma: 222
Posts: 12725
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Can't read those files, despite having Eagle, wrong version - if you export as image then its much more friendly to us (not everyone uses Eagle).  In general it helps to present all the relevant information (provide links, photos, etc)

Looking at the bigTime thing on sparkfun it seems all confused (comments about not using delay / delayMicroseconds, yet it does use them.  It seems to be using a non-standard fuse option on the ATmega, namely the internal RC oscillator (allowing TOSC1/2 to be used as timer clock).  Is your microcontroller suitable programmed with the right fuse options?  Note if using the internal oscillator you may have to use an ICMP programmer to upload sketches (I may be a bit rusty about this).

The quality control on sparkfun site is not the best I've seen BTW, so I wouldn't trust the online files to necessarily be up-to-date or even self-consistent (if not tell them so they notice and fix it for others).

Other comments on the sparkfun page imply a standard Arduino Mini 8MHz can be used, which obviously is not the case as the crystal is hard-wired on that board yet the sparkfun schematic shows a 32,768Hz xtal, not an 8MHz one.
« Last Edit: September 18, 2012, 05:37:37 pm by MarkT » Logged

[ I won't respond to messages, use the forum please ]

Offline Offline
Newbie
*
Karma: 1
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Images! smiley


* Watch.png (42.37 KB, 1950x1219 - viewed 40 times.)

* WatchBrd.png (57.31 KB, 616x506 - viewed 42 times.)
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I used an ICSP programmer to set the fuse settings accordingly. I think they are correct, AVR studio 4 says its using the internal oscillator. I will email sparkfun and see if that is the most recent version of the code and see what they are doing- anything specific i need to ask?
Logged

Global Moderator
Melbourne, Australia
Offline Offline
Brattain Member
*****
Karma: 511
Posts: 19367
Lua rocks!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

I'm a little curious about this bit:

Code:
  if(seconds > 59){
    minutes++;
    seconds = seconds - 59;
  }

  if(minutes > 59){
    hours++;
    minutes = minutes - 59;
  }

Aren't there 60 seconds to a minute, and 60 minutes to an hour?
Logged

http://www.gammon.com.au/electronics

Please post technical questions on the forum - not to me by personal message. Thanks a lot.

0
Offline Offline
Shannon Member
****
Karma: 222
Posts: 12725
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hmmm, have you proof that the 32768 xtal is actually oscillating?  Have you calculated load caps as per table 8-8 and associated text in the datasheet?  Have you read section 17.9 of the datasheet and checked the code is DTRT?
Logged

[ I won't respond to messages, use the forum please ]

Global Moderator
Melbourne, Australia
Offline Offline
Brattain Member
*****
Karma: 511
Posts: 19367
Lua rocks!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Why do you have 0.1 uF caps between the crystal and earth? That wasn't in the Sparkfun circuit.

Here, to save other people searching for it: https://www.sparkfun.com/products/10870
Logged

http://www.gammon.com.au/electronics

Please post technical questions on the forum - not to me by personal message. Thanks a lot.

Offline Offline
Newbie
*
Karma: 1
Posts: 28
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

They are not used at the moment, they are just places for xtal load caps but I havnt loaded the crystal at all.


*******
I'm a little curious about this bit:

Code:
  if(seconds > 59){
    minutes++;
    seconds = seconds - 59;
  }

  if(minutes > 59){
    hours++;
    minutes = minutes - 59;
  }

Aren't there 60 seconds to a minute, and 60 minutes to an hour?

Yes, but I am using > not >=. So anything greater than 59 (60), will go back down to 1. Course I need to add 0s to it but havnt yet.




*****
Hmmm, have you proof that the 32768 xtal is actually oscillating?  Have you calculated load caps as per table 8-8 and associated text in the datasheet?  Have you read section 17.9 of the datasheet and checked the code is DTRT?

I don't have an oscilloscope but I can check (earliest I could do it is tomorrow). I think somewhere else in the data sheet it says not to use load crystals for that slow of a crystal, I have not added them (but can).

Read through 17.9 and didnt undertand much of it smiley-sad , or rather, I understood most of it, just not how to create a practical example.



Thank you all so much with your help thus far, I really appreciate it and am eager to learn more. Sorry my coding is not up to par, but i really dont code that often so I never quite "learned" it. Mostly just taught myself...
Logged

Global Moderator
Melbourne, Australia
Offline Offline
Brattain Member
*****
Karma: 511
Posts: 19367
Lua rocks!
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

May I suggest you learn how to use the "quote" button above the posting box? Putting your comments and other people's all together looks confusing. eg.

Quote
Yes, but I am using > not >=. So anything greater than 59 (60), will go back down to 1. Course I need to add 0s to it but havnt yet.

60 is not the only thing greater than 59. For example, 61 is. And since you are adding 8 it is more likely you will get from 56 to 64.

Code:
  seconds += 8; //We sleep for 8 seconds instead of 1 to save more power
  //seconds++; //Use this if we are waking up every second

  if(seconds > 59){
    minutes++;
    seconds = seconds - 59;
  }

My point is that after adding 1 to the number of minutes, surely you need to subtract 60 from the number of seconds? Not 59?

Quote
They are not used at the moment, they are just places for xtal load caps but I havnt loaded the crystal at all.

So the circuit you posted is not the one you are using?
Logged

http://www.gammon.com.au/electronics

Please post technical questions on the forum - not to me by personal message. Thanks a lot.

Pages: [1] 2 3   Go Up
Jump to: