why I can not stop the alarm?????

Thread Starter

eric_s88

Joined Apr 20, 2011
157
Hi everyone
I have written a program for an alarm clock, everything is Ok,and the alarm stop after ringing fot 1min but I decided to put a push button for operator in order to stop alarm manually..
but while the alarm is ringing and I push the button, the alarm does not stop.. whats the problem?? I put here the schematic and the code. whats the problem??
I use the code like this >> PORTC.0=1; //the alarm starts

if(PIND.0==0) PORTC.0=0; // the alarm must stop!

Rich (BB code):
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 
Version : 
Date    : 13-Jan-2012
Author  : NeVaDa
Company : 
Comments: 


Chip type               : ATmega16
Program type            : Application
AVR Core Clock frequency: 1.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*****************************************************/
#include <stdlib.h>
#include <mega16.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#include <alcd.h>
int s=0,m=0,h=0,mo=0,ho=12,x=0,i=0;
unsigned char xd[4],sd[4],md[4],hd[4],mod[4],hod[4];
void key_clock()
{
    if(PINB.0==0)
    {m++;
    delay_ms(1);
        if(m==60) m=0;
    }
    while(PINB.0==0);
    if(PINB.1==0)
    {h++;
    delay_ms(1);
        if(h==24) h=0;
    }
    while(PINB.1==0);
}
void key_alarm()
{
    if(PINB.5==0)
    {mo++;
    delay_ms(1);
        if(mo==60) mo=0;
    }
    while(PINB.5==0);
    if(PINB.6==0)
    {ho++;
    delay_ms(1);
        if(ho==24) ho=0;
    }
    while(PINB.6==0);
}

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=P State5=P State4=T State3=T State2=T State1=P State0=P 
PORTB=0x63;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTC=0x00;
DDRC=0xFF;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
PORTD=0x01;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTA Bit 0
// RD - PORTA Bit 1
// EN - PORTA Bit 2
// D4 - PORTA Bit 4
// D5 - PORTA Bit 5
// D6 - PORTA Bit 6
// D7 - PORTA Bit 7
// Characters/line: 16
lcd_init(16); 
lcd_gotoxy(0,1);
lcd_putsf("Alarm T ");
h=11;
m=59;
s=58;
while (1)
      {
      x++;
      if(x==99)
      {x=0;
      s++;
        if(s==60)
            {s=0;
            m++;
            PORTC.0=0;
                if(m==60)
                {m=0;
                h++;
                    if(h==24) h=0;
                }
            }
      }
      if(h==ho&&m==mo) PORTC.0=1;
      if(PIND.0==0) PORTC.0=0;
      key_clock();
      key_alarm();
      itoa(x,xd);      
      itoa(s,sd);
      itoa(m,md);
      itoa(h,hd);
      itoa(mo,mod);
      itoa(ho,hod);
      lcd_gotoxy(8,1);
      if(ho<10) lcd_putchar('0');
      lcd_puts(hod);
      lcd_puts(":");
      if(mo<10) lcd_putchar('0');
      lcd_puts(mod);
      lcd_gotoxy(0,0);
      if(h<10) lcd_putchar('0');
      lcd_puts(hd);
      lcd_putsf(":");
      if(m<10) lcd_putchar('0');
      lcd_puts(md);
      lcd_putsf(":");
      if(s<10) lcd_putchar('0');
      lcd_puts(sd);
      lcd_putsf("   ");
      //if(x<10) lcd_putchar('0');
      //lcd_puts(xd);
      delay_us(4480);       

      }
}
 

kubeek

Joined Sep 20, 2005
5,622
if(PIND.0==0) PORTC.0=0; // the alarm must stop!
Wouldn´t that work only as long as you hold that button?
Otherwise the code is terribly spaghetti like, placing a comment here and there and dividing it into more functions with names that actually say what the function does wouldn´t hurt.
 

Thread Starter

eric_s88

Joined Apr 20, 2011
157
no it has no action but add a sound (like noise) to the alarm sound.. the alarm stops when 1minute in passed, and I cant stop it manually... I'm really confused.. :(
 

kubeek

Joined Sep 20, 2005
5,622
Ok, what do key_clock(); and key_alarm() do?
Do you realize at all what how your code works? It goes in a loop, and when alarm is on and reset button is on it sets the portc.0 to 1 and immediately after that to 0.

You want it to remember that the button was once set and stop activating the portc.0 after that.
 

ifixit

Joined Nov 20, 2008
650
  • You need to declare an alarm_cancel variable. Set this flag when the alarm cancel PB is pressed. This way the program remembers that state.
  • Now use that flag as an extra condition in your IF statement that puts the alarm on.
  • e.g. if(h==ho && m==mo && alarm_cancel==0) PORTC.0=1;
  • The alarm is only on if the alarm_cancel flag is false.
  • Also; where you set PORTC.0=0 in the IF statement, set the alarm_cancel flag to 0 as well.
Regards,
Ifixit
 

Thread Starter

eric_s88

Joined Apr 20, 2011
157
Ok, what do key_clock(); and key_alarm() do?
Do you realize at all what how your code works? It goes in a loop, and when alarm is on and reset button is on it sets the portc.0 to 1 and immediately after that to 0.

You want it to remember that the button was once set and stop activating the portc.0 after that.

key_clock(); << this is the function that controls the keys to adjust the time.
key_alarm(); << this is the function that controls the keys to adjust the alarm time.

yes I written it myself and I know how it works, yes I put the deactivation code right after the activation, but look there.. it is in a condition .. if(PIND.0==0)...
 

Thread Starter

eric_s88

Joined Apr 20, 2011
157
  • You need to declare an alarm_cancel variable. Set this flag when the alarm cancel PB is pressed. This way the program remembers that state.
  • Now use that flag as an extra condition in your IF statement that puts the alarm on.
  • e.g. if(h==ho && m==mo && alarm_cancel==0) PORTC.0=1;
  • The alarm is only on if the alarm_cancel flag is false.
  • Also; where you set PORTC.0=0 in the IF statement, set the alarm_cancel flag to 0 as well.
Regards,
Ifixit

thank you, I will try it and tell the result
 

Thread Starter

eric_s88

Joined Apr 20, 2011
157
yes!!!!!! that was the problem, when I pressed the key the alarm went off but after key is opened the time of clock and alarm time was still the same so the ring continue to ring!!
the idea of ifixit worked, and now I have the problem, solved..

thank you
 
Top