View previous topic :: View next topic |
Author |
Message |
eng/ IBRAHIM
Joined: 14 Aug 2007 Posts: 31
|
switch restart |
Posted: Tue Nov 20, 2007 8:14 am |
|
|
hi
i use 16f877 .how make that( when i push switch program is start .and when i push the same switch again program is restart) |
|
|
mrpicing
Joined: 22 Oct 2005 Posts: 20
|
|
Posted: Wed Nov 21, 2007 2:33 am |
|
|
aoa.
Check datasheet of the part. place a pullup at vpp and a button from pin1 to ground.
If its not the solution for u then explain your problem.
You can try it as this
if (button pressed)
#asm
goto 00 //or starting address of programm. you can see listing file for ////your start address
#endasm
But it may cause some errors.
Look it carefully. |
|
|
eng/ IBRAHIM
Joined: 14 Aug 2007 Posts: 31
|
|
Posted: Wed Nov 21, 2007 8:23 am |
|
|
thanks
i have start/stop switch when press it the program is start. and when press it again at any step for program .program go reset.
i know can make that by interrupt but i don't know code |
|
|
Ttelmah Guest
|
|
Posted: Wed Nov 21, 2007 9:41 am |
|
|
Unfortunately, what you have asked, is a bit like a person posting on a driving forum "how do I start a car".
The answers will vary, from 'turn the key', throuogh descriptions of how to push start the vehicle, via descriptions of how to use the clutch/gearlever etc...
You really need to learn soe basic programming first.
If though, I am reading what you want correctly, then the answer is probably not to use interrupts to restart. Instead write your code, so it runs something like:
Code: |
int1 toggle=false;
//Interrupt when button attached to pull RB0 to 0v is pressed
#int_ext
void key_interrupt(void) {
//This ensures the key is still pressed, providing a tiny amount
//of debounce
if (input(PIN_RB0) ==0) toggle^=1;
}
void main(void) {
//main program
port_b_pullups(TRUE);
ext_int_edge( H_TO_L );
//setup interrupt to trigger on falling edge
clear_interrupts(int_ext);
enable interrupts(int_ext);
enable_interrupts(global);
//and enable
while (TRUE) {
//Now the main 'code' loop
while (toggle==false) //Here the key has not been pressed
;
while (toggle) {
//Now the code you want to execute once the key is pressed
}
}
}
|
This lacks the other initialisations, and fuses needed for your chip, but shows how to arrange this.
Beware, of the jump to 0 approach. This will probably cause a stack overflow.
This is the problem of this type of approach, it leaves things 'dirty', which is not the solution for good reliability.
Best Wishes |
|
|
eng/ IBRAHIM
Joined: 14 Aug 2007 Posts: 31
|
|
Posted: Tue Dec 04, 2007 6:02 am |
|
|
thanls all
i try this code but the compailler send error
#int_EXT
void EXT_isr(void)
{
goto loop;
}
void main()
{
loop:output_d(0x00);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
delay_ms(30);
while(1)
{
output_d(0xff);
}
}
and when try
#int_EXT
void EXT_isr(void)
{
reset_cpu();
}
void main()
{
loop:output_d(0x00);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
delay_ms(30);
while(1)
{
output_d(0xff);
}
}
the program no good play by proteus |
|
|
Ttelmah Guest
|
|
Posted: Tue Dec 04, 2007 9:44 am |
|
|
Don't do a goto, from inside an interrupt. This will cause a stack overflow.
Use the 'toggle' handler I have already posted.
Do your main with:
Code: |
void main() {
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while (true) {
output_d(0x00);
delay_ms(30);
toggle=TRUE;
while(toggle) {
output_d(0xff);
}
}
}
|
Best Wishes |
|
|
eng/ IBRAHIM
Joined: 14 Aug 2007 Posts: 31
|
|
Posted: Wed Dec 05, 2007 4:29 am |
|
|
Ver thanks for all
I try this code and it play very good
int1 toggle=false;
#int_ext
void key_interrupt(void) {
if (input(PIN_B0) ==0)
toggle^=1;
}
void main(void) {
l:output_d(0x00);
port_b_pullups(TRUE);
ext_int_edge( H_TO_L );
enable_interrupts(int_ext);
enable_interrupts(global);
while (TRUE) {
while (toggle==false)
goto l;
while (toggle) {
output_d(0xff);
}
}
} |
|
|
Ttelmah Guest
|
|
Posted: Wed Dec 05, 2007 5:05 am |
|
|
Just a 'comment', use a while, rather than a goto for the loop back to the start.
In general, 'goto' statements, are consider 'poor form'. There are places where they may need to be used, but they make it more likely that code will get to places it is not expected to go, and in many newer languages, are not even present in the language!....
Best Wishes |
|
|
eng/ IBRAHIM
Joined: 14 Aug 2007 Posts: 31
|
|
Posted: Mon Dec 10, 2007 6:20 am |
|
|
I found new proplem when applay this code. when press B0 the main program is run and when press it again the progran don't reset and wait the while function finished .
i'm search for code make that(when press some switch the main program is run and when press it again at any time or any step the program go reset )
int1 toggle=false;
#int_ext
void key_interrupt(void)
{
if (input(PIN_B0) ==0)
toggle^=1;
}
///////////////////////////////////////
void V()
{
while(!input(pin_B6))
{
output_high(pin_D3);
}
output_low(pin_D3);
}
///////////////////////////////////
void main(void) {
int M;
M=0;
l:output_d(0x00);
ext_int_edge( H_TO_L );
enable_interrupts(int_ext);
enable_interrupts(global);
while (TRUE)
{
while (toggle==false)
goto l;
while (toggle)
{
toggle=TRUE;
output_high(pin_D1);
delay_ms(5000);
while(input(pin_B7))
{
output_high(pin_D0);
}
output_low(pin_D0);
v();
}
}
} |
|
|
timm02
Joined: 16 Jan 2008 Posts: 4 Location: Kuala Lumpur, Malaysia
|
set button |
Posted: Sat Jan 19, 2008 2:49 am |
|
|
hi..im using 16f877a and im currently develop a current generator that can produce current at 4 different frequencies.
i've chosen to have 2 button which for single frequency=50kHz and the other button for multifreq=5kHz,100kHz and 1MHz.
im a newbies and i wanna check is it my code for the button right or wrong.
i haven't write the main function as i dont know how (im still learning).
Code:
#include <16f877a.h>
#include <stdlib.h>
#include <math.h>
#fuses HS, NOPROTECT, NOWDT, NOLVP
#use delay (clock=20000000)
#include <Button.c> // Function parameters:
// button(pin, DownState, Delay, Rate, BVar, Action)
int8 A4 = 0; // For the button on pin A4
int8 A5 = 0; // For the button on pin A5
#byte PORTA = 5
#byte PORTB = 6
int8 A4_pressed = FALSE;
int8 A5_pressed = FALSE;
int16 freq_value;
float freq_1, freq_2, freq_3, freq_4;
void main()
{
set_tris_a(0xff); // Set PORT A as inputs
set_tris_b(0x00); // Set PORT B as outputs
PORTB=0; // Initialize all PORT B output to 0 volt
while(TRUE)
{
if(A4_pressed == TRUE)
{
A4_pressed = FALSE;
}
if(A5_pressed == TRUE)
{
A5_pressed = FALSE;
}
}
} |
|
|
|