# PIC mikrokontrolleri >  Kā pārtraukt funkcijas darbību?

## jamtnt

Nevaru izdomāt kā uzrakstīt programu labāk. Ja nospiežot Button1 ieslēdzas Led kuram jādeg 22 sekundes pēc kurām tā nodziest bet ir papildus nosacījums ka ar Button2 es varu šo laiku pārtraukt jebkurā brīdi kad programa izpilda šo darbību 22 sekundes. Strādāju ar CCS Compilatoru esmu iesācējs (C valoda) !

----------


## JDat

Ja iesācējs, tad mācies. Jāzin kaut ko no tā kā apmēra  MCU strādā. No sājuma uzraksti programmu datorā (GCC ja jau C valoda). Tev svarīgi izdomāt algoritmu. Grafika nav vajadzīga tavai programmai. Galvenais lai tu vari to uzkodēt un notestēt. Ta ka būs datoram programma uztaisīta, tad varēsi domāt kā to pašu algoritmu ielikt kontrolieri. Savādāk nav jēga, ja mēs tev iedosim gatavu kodu un tu ne ko neiemācīsies.

----------


## habitbraker

Nu vismaz ASM sitais būtu tirais nieks. Izmanto interrupt.   ::

----------


## JDat

Vispār es skatos uz 555 timer. Nav jēga tādam lietot kotrolieri. Ja vien tās 22 sekundes nav vajadzīgas ar ūberaugstu precizitāti...

----------


## ddff

Es, kaa vienkaarshibas cieniitaajs, panjemtu to otru pogu ar NC kontaktiem un ieliktu baroshanaa. Paatrauks ne tikai to procesu vien.

ddff

----------


## jamtnt

Krutie džekas Jūs ASM un mācies pats  ::  ... ja es varētu atrast kur to var iemācīties vai kādu paraugu no kā izlobīt kā to izdarīt nejautātu šajā forumā!
Esmu izprovējies ar delay sapratu ka delay nevar pārtraukt pa vidu ... tad nu paskatījos interrupt bet tas var pārtraukt bitus ja sūta uz piniem un atsākt no pārtrauktās vietās, bet man vajag lai sekundes pārtrauc.  Neesmu tik liels lūzeris vienkārši nevaru atrast to pareizāko ko tieši mācīties ... tu ar timer saistīts lai to izdarīt vai ar interrupt vienkārši nav jēgas mācītos to kas dotājā brīdi nav vajadzīgs. Piekrītu par vienkāršotu shēmu bet būs vēl papildus funkcijas un nosacījumi kurus jāizpilda šis ir tikai posms pie kā esmu atdūries un nevaru tikt tālāk lai sasniegtu ko esmu iecerējis tākā lūdzu mazliet vairāk atsaucības.

----------


## JDat

J labi grib tad var uztaisīt tādu delay, kuru var pārtraukt. Vai nu ar timer, vai ar irq. Ja esi nazis programmēšanā, tad noteikti ir veids kā apčakarēt iebūvēto ( nepartraucamo) delay, bet tur tik un tā prasās ASM zināšanas. Paskaties uz multitasking ideju. Uztaisi ar taimeri un miers. Ja uzskati, ka tas ir bezjēdzīgi, tad uztaisi savu delay, kuru var pārtraukt. Pēc būtības "nepārtraucamais delay ir parasts cikls. Rakstīsu ar basic, C nezinu:


```
delayconst=10000   ;uzliekam cik garu delay vajag
for i=0 to delayconst   ;ciklojam kamēr i=delayconst
next i
```

 Tagad pārtraucamais delay:


```
dim exitdelay        ;definējam karogu kas pārtrauc delay ciklu

mainloopbegin
exitdelay=0        ;nometam karogu, drošs paliek drošs
delayconst=10000   ;uzliekam cik garu delay vajag
for i=0 to delayconst   ;ciklojam kamēr i=delayconst
if exitdelay=1 then exit for
next i

goto mainloopbegin

interrupt:
if button2=1 then exitflag=1       ;ja poga nospiesta, tag uzstādām karogu lai delay cikls pārtrauktos
return
```

 ...un miers. Ne jau programmēšanas valodā ir tikums, bet gan domāšanā.

----------


## WildGun

Fui, kur nesmuki....*goto* mainloopbegin

----------


## habitbraker

Nu Jdat kautko lidzīgu iedeva
Pamēģini to 22s aizturi salikt no daudzām mazām aizturēm piemēram 0,5s. Aiz katras mazās aiztures parbaudi portu

if button1=1
RD0=1;
22s_aizture();

void 22s_aizture(){
int i=1;
for(i=1;i<=seit pats izdomā;i++)
{
delayms(500);
if  (button2=1)
RD0=0;
iet kautkur citur utt
}}
Protams sitais nestrādā, bet doma tāda
Protams tie IF noēd us. ASM vieglāk kontrolēt un izreķināt patieso laiku. UZ ASM es nevis parbaudītu aiz katras aiztures ieejas, bet gan visp nozīmes registru. Uz interruptu uzstādītos bits, kuru tad es parbaudītu. Ja ''1'' tad goto tur un tur.

----------


## marizo

Vai tiešām ASM pārtraukt delay ir vienkāršāk?
Tur delay ir kā cikls iekš cikla iekš cikla, kur iekšējais cikls pildās visātrāk, bet katrs nākamais pilda skaitītāju n reizes lēnāk.
Tad arī tajā atrākajā ieliekam pārbaudīt otrās pogas stāvokli un turpināt/iziet no cikla.

Vienkāršākais (tomēr neiet pie sirds vēl vienkāršākā ddff ideja) šķiet ir kā habitbraker iesaka. Tikai ja uztaisīsi pogas spiedienu zem 0,5s, tad tas variants var nenostrādāt, jo kontrollers var ietrāpīt porta pārbaudi tieši pirms un tūlīt pēc pogas nospiešanas.

----------


## JDat

> Fui, kur nesmuki....*goto* mainloopbegin


 Ko tu čivini?
ASM instrukcijās ir GOTO nevis JMP komanda.

----------


## next

> Neesmu tik liels lūzeris vienkārši nevaru atrast to pareizāko ko tieši mācīties ... tu ar timer saistīts lai to izdarīt vai ar interrupt vienkārši nav jēgas mācītos to kas dotājā brīdi nav vajadzīgs.


 Pirmaas programmas jaaraksta ASMaa taapeec lai saprastu kaa dzelzis straadaa, ko tas var dariit atri un vienkaarshi, kam vajadziigs laiks un atminjas resursi.
Dotajaa briidii tev vispaar nekas nav jaadomaa - pievieno to pogu pie reset un viss straadaas.

----------


## marizo

> Dotajaa briidii tev vispaar nekas nav jaadomaa - pievieno to pogu pie reset un viss straadaas.


 Bingo! Bet man  - 5diena.  ::

----------


## JDat

> Dotajaa briidii tev vispaar nekas nav jaadomaa - pievieno to pogu pie reset un viss straadaas.


 Jomajo!. Geniāli. Pats esmu tādu triku taisījis aiz PIN trūkuma, bet šai situācijai neiedomājos. Laikam tiešam piektdiena klāt.

Ja nopietni...



> ...bet būs vēl papildus funkcijas un nosacījumi kurus jāizpilda šis ir tikai posms pie kā esmu atdūries un nevaru tikt tālāk lai sasniegtu ko esmu iecerējis


 Ņemot vērā šo biedrīša apgalvojumu, reset tomēr var nederēt konkrētajā situācijā.

Kas attiecas uz Autora palīdzību. Ja kaut prasīji par šito mazo posmiņu, tad dabūji attiecīgu atbildi: 555 timer, PSU OFF,reset, timer, irq utt.
Ja pastāstītu visu, tad jau mēs jau saknē zinātu kur esi sabridies. A tu pa gabaliņam baksti, te poga, te divas pogas. Var redzēt ka tikai mācies. Mācies nevis uz konkrētu inženierbrīnumu, bet uz pamatiem. Izlasi grāmatiņu un izmēģini visu, kas tur rakstīts. Tā arī iemācīsies.




> tākā lūdzu mazliet vairāk atsaucības.


 Kas attiecas uz atsaucību... Gribu palīdzu, negribu nepalīdzu. Tā, ka, lūdzu, lūguma nevis pavēles formā!   ::

----------


## next

> Ja nopietni...
> 
> 
> 
> 
> 
> 
> 
> ...bet būs vēl papildus funkcijas un nosacījumi kurus jāizpilda šis ir tikai posms pie kā esmu atdūries un nevaru tikt tālāk lai sasniegtu ko esmu iecerējis
> ...


 Skaidrs ka neder.
Jebkura no vajadziigajaam lietaam var tikt realizeeta miljons dazhaados veidos.
Bet tikai tad ja citu vajadziibu nav.
Ja citas funkcijas buus tad jaazina kaadas un kaa taas darbosies un tad var domaat kaa optimaali visu kopaa salikt.

----------


## WildGun

Eu, kur var dabūt tādu ASMu, kurš 1:1 izskatās, kā BASIC? Es arī tādu gribu !!!!

----------


## abergs

> pie kā esmu atdūries un nevaru tikt tālāk


 Bez delay_xx:
organizē skaitītāju (piem. "counter"),
palaiž fonā kādu taimeri, 
pie int_timer_overflow:  counter+1, 
kamēr sasiegts vajadzīgais laiks.
Ceru ka ideju pietiekami aprakstīju...

----------


## JDat

> Eu, kur var dabūt tādu ASMu, kurš 1:1 izskatās, kā BASIC? Es arī tādu gribu !!!!


 Tāds asm saucas Microchip MPLAB ASM.  ::  Attiecīgi basic saucas GCBASIC. Nav jau ne kāds C, bet IF vai FOR vieglāk uzrakstīt nekā ar ASM. Novelc un čakarējies laimīgs. Ir arī GUI priekš Epja: liec algoritma taisnstūrus un rombus gluži kā padomju grāmatās par programmēšanas pamatiem.  ::

----------


## WildGun

Skaidrs. Paldies, bet man nederēs. Esmu uzsēdies uz ATMEL, konkrētāk - Arduino, tā, ka nāksies vien cīnīties ar to C-veidīgo....

Katrā ziņā Tavs algoritms ir pareizs un vienkāršs. Autoram - ņem to par piemēru.

----------


## JDat

govju beisiks der arī AVR. Kas attiecas uz goto, ar ko goto atšķiras no jmp? Arduino viena lieta, C cita, ASM vēl cita. Attāla līdzība ir, bet nejaukt visu vienā maisā!
Kas attiecas uz algoritmu, laikam esmu gudrāks par Epi.  ::

----------

