Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Keil Microvision-pomoc

[es] :: Elektronika :: Mikrokontroleri :: Keil Microvision-pomoc

[ Pregleda: 2917 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Brelak
Nis

Član broj: 131174
Poruke: 227
*.ptt.rs.



+3 Profil

icon Keil Microvision-pomoc16.10.2009. u 11:40 - pre 176 meseci
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]
 
Odgovor na temu

stameni
Ivan Stamenković

Član broj: 6739
Poruke: 538



+9 Profil

icon Re: Keil Microvision-pomoc17.10.2009. u 13:33 - pre 176 meseci
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);.
 
Odgovor na temu

Brelak
Nis

Član broj: 131174
Poruke: 227
*.ptt.rs.



+3 Profil

icon Re: Keil Microvision-pomoc17.10.2009. u 13:49 - pre 176 meseci
while(1)
{
PCON=0x01;
}

ovako radi

[Ovu poruku je menjao Brelak dana 17.10.2009. u 16:25 GMT+1]
 
Odgovor na temu

sinisa_s
Bremen

Član broj: 98726
Poruke: 55
*.adsl.alicedsl.de.



+3 Profil

icon Re: Keil Microvision-pomoc17.10.2009. u 15:26 - pre 176 meseci
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 ();
}

Sinisa
 
Odgovor na temu

Brelak
Nis

Član broj: 131174
Poruke: 227
*.ptt.rs.



+3 Profil

icon Re: Keil Microvision-pomoc17.10.2009. u 17:52 - pre 176 meseci
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;
}
 
Odgovor na temu

Brelak
Nis

Član broj: 131174
Poruke: 227
*.ptt.rs.



+3 Profil

icon Re: Keil Microvision-pomoc22.10.2009. u 17:04 - pre 176 meseci
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
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: Keil Microvision-pomoc

[ Pregleda: 2917 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.