[ Brelak @ 16.10.2009. 11:40 ] @
Postovana gospodo treba mi pomoc oko jednog problema. Napisao sam program u C-u i on na prvi pogled radi odlicno medjutim po startovanju programa se posle odredjenog vremena ukljuci disasembler i poruka *** error 65: access violation at C:0xFF00 : no 'execute/read' permission .U cemu je fora, trazio sam razna objasnjenja na netu ali bez mnogo uspeha.
Evo i koda:

#include <REG2051.H>

// po startovanju programa P1_4, P1_6 i P1_7 treba da se postavi na "0"

#define SL P1_4 // ulaz - detektor otvorene kapije
#define SR P1_5 // ulaz - detektor zatvorene kapije

#define A P1_6 // izlaz - biranje smera obrtanja motora
#define EN P1_7 // izlaz - pokretanje motora

unsigned char F = 0x00;
unsigned char PF = 0;

void Go_To_Sleep (void)
{
PCON = 0x01;
}

void main (void)
{
IT0 = 0; // Configure interrupt 0 for rising edge on /INT0 (P3.2)
EX0 = 1; // Enable EX0 Interrupt
EA = 1; // Enable Global Interrupt Flag
Go_To_Sleep ();
}

void Ext_Int (void) interrupt 0

{
F=~F;
if(F==0x00) // provera polozaja kapije
{
A=0; // biranje smera obrtanja motora
}
else
{
A=1; // biranje smera obrtanja motora
}
while(PF==0) // vrti dok kapija ne dodje u krajnji desni(zatvoreni) ili levi(otvoreni) polozaj
{
EN=1; // paljenje motora
if(A==0) // provera smera obrtanja motora
{
if(SR==1) // proverava se da li je kapija dosla u krajnji desni(zatvoreni) polozaj
{
PF=1; // postavlja pomocni fleg na 1 za prekida rada motora
}
}
else
{
if(SL==1) // proverava se da li je kapija dosla u krajnji levi(otvoreni) polozaj
{
PF=1; // postavlja pomocni fleg na 1 za prekid rada motora
}
}
}
EN=0; // gasenje motora
PF=0;
}

[Ovu poruku je menjao Brelak dana 17.10.2009. u 11:17 GMT+1]
[ stameni @ 17.10.2009. 13:33 ] @
Malo sam zaboravio registre, a i ti si loše formatirao kod, ali da probam na prvu loptu: u funkciji main() izgleda da nedostaje nešto tipa while(1);.
[ Brelak @ 17.10.2009. 13:49 ] @
while(1)
{
PCON=0x01;
}

ovako radi

[Ovu poruku je menjao Brelak dana 17.10.2009. u 16:25 GMT+1]
[ sinisa_s @ 17.10.2009. 15:26 ] @
Pa sta se desi kada nastupi prekid (interrupt). Izvrsi interrupt rutinu a gde izadje potom.
Tj, kada izvrsis PCON=0x01 ulazis u sleep mod (ne znam bas registre za kontroler ali po strukturi tvog programa zakljucujem). Kada naidje inerrupt izvrsava se interrupt rutina i vracas se na liniju ispod PCON=0x01. Ako razumem dobro. Potom program izlazi iz Go_To_Sleep funkcije i zatim i iz main-a. Treba da imas negde beskonacku petlju.

while (1)
{
Go_To_Sleep ();
}
[ Brelak @ 17.10.2009. 17:52 ] @
Promena je izvrsena,zar ne vidis? u okviru mein-a se nalazi beskonacna while petlja.evo ovako izgleda krajnji kod. Prva ideja je bila da u while petlji stoji Go_To_Sleep funkcija ali se javlja problem,da ne duzim,ovako je sasvim ok.

#include <REG2051.H> // po startovanju programa P1_4, P1_6 i P1_7 treba da se postavi na "0"
#define SL P1_4 // ulaz - detektor otvorene kapije
#define SR P1_5 // ulaz - detektor zatvorene kapije
#define A P1_6 // izlaz - biranje smera obrtanja motora
#define EN P1_7 // izlaz - pokretanje motora

unsigned char F = 0x00;
unsigned char PF = 0;

void main (void)
{
IT0 = 0; // Configure interrupt 0 for rising edge on /INT0 (P3.2)
EX0 = 1; // Enable EX0 Interrupt
EA = 1; // Enable Global Interrupt Flag

while(1)
{
PCON=0x01;
}
}

void Ext_Int (void) interrupt 0

{
F=~F;
if(F==0x00) // provera polozaja kapije
{
A=0; // biranje smera obrtanja motora
}
else
{
A=1; // biranje smera obrtanja motora
}
while(PF==0) // vrti dok kapija ne dodje u krajnji desni(zatvoreni) ili levi(otvoreni) polozaj
{
EN=1; // paljenje motora
if(A==0) // provera smera obrtanja motora
{
if(SR==1) // proverava se da li je kapija dosla u krajnji desni(zatvoreni) polozaj
{
PF=1; // postavlja pomocni fleg na 1 za prekida rada motora
}
}
else
{
if(SL==1) // proverava se da li je kapija dosla u krajnji levi(otvoreni) polozaj
{
PF=1; // postavlja pomocni fleg na 1 za prekid rada motora
}
}
}
EN=0; // gasenje motora
PF=0;
}
[ Brelak @ 22.10.2009. 17:04 ] @
Ej program radi i sve je ok,ali imam jos jedan j****i problem. Ne mogu hardverski da izazovem interapt, ja pokusavam ali se apsolutno nista ne desava. Ako nekome pada nesto na pamet neka javi, poslacu semu.
Pozdrav