# PIC mikrokontrolleri >  Cilpa PIC programmā

## kvaris

Sveiki, ļaudis!

Arvien esmu PICa iesācējs, bet šādas tādas lietiņas, kā arī vairākas instrukcijas esmu izpratis. Lieta tāda, ka esmu no Interneta nokopējis programmu PIC16F628, bet pārveidojis to tā, lai derētu PIC16F676, tādēļ komentārus varbūt reizēm var neņemt vērā. Es gribu 50 reizes izsūtīt uz viena no PORTC piniem ārā augsta un zema līmeņa signālu pāri, t.i., augsts-zems, augsts-zems,....,augsts-zems, pavisam 50 reizes tātad. It kā strādā, bet man vajag, lai tādu, kā lai saka moderni, signālu paketi   ::  , viņš izsūtītu ārā tikai vienu reizi un tad paliktu zemajā līmenī. PIc programma turpretim to dara nepārtraukti, kas man galīgi nav vajadzīgs. Programma ir šeit uzrakstīta, lūdzu, paskatieties ar profesionālu aci, kas tur ir nepareizs. Lūdzu, nesist mani, ja esmu tur viskautko lieku rakstījis. Vēl pievienoju osciloskopa bildes. Paldies jau iepriekš! Ceru, ka mani sapratīsiet!  ::  

;************************************************************ 
; Processor: PIC16F676 at 20 MHz using external HS oscillator 
; Function:  Flash a LED connected to RC3 
; Hardware:  Testboard K4 
; Filename:  676.asm 
; Author:    Lars Petersen, oz1bxm@qsl.net 
; Website:   http://www.qsl.net/oz1bxm/PIC/pic.htm 
; Credit:    Tony Nixon's LED flasher 
;************************************************************ 

        LIST P=16F676, R=DEC    ; Use the PIC16F628 and decimal system 

        #include "P16F676.INC"  ; Include header file 

        __CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_OFF & _HS_OSC

        CBLOCK 0x20             ; Declare variable addresses starting at 0x20
          Loop1 
        ENDC 
; 
; ----------- 
; INITIALIZE 
; ----------- 

        ORG    0x000           ; Program starts at 0x000 

        CLRF   PORTC          ; Initialize port C 


        BSF    STATUS,RP0      ; RAM bank 1 

        CLRF   TRISC           ; All pins port C output



        BCF    STATUS,RP0      ; RAM bank 0 
; 
; ------------------------ 
; FUNCTION OF PORT C PINS 
; ------------------------ 
; 
        MOVLW    7 
        MOVWF    CMCON         ; Comparators off, all pins digital I/O 

; ---------- 
; MAIN LOOP 
; ---------- 
;

	movlw	 50
	movwf	 Loop1

Main  	
cilpa	DECFSZ	Loop1,F
	goto	$+2
	call	beigt
	call	flash
	goto	cilpa

beigt	movlw	0x00
	movwf	PORTC
	goto	stop

flash	movlw       0xFF        	; Turn on LED connected to RC2
	movwf	PORTC
	movlw	0x00
	movwf	PORTC
	return

stop	movlw      0x00       	; Turn on LED connected to RC2
	movwf	PORTC

	END

[img]1.JPG[/img]
[img]2.JPG[/img]

----------


## Delfins

Mh.. neesmu pic/asm specs, bet C pseidokodā:



```
for (i=50; i>0; i--)
{
    send();
}

reset();
```

 Nokompilē jebkurā IDE-ē un apskaties ASM rezultātu.
Ja tev ir bezgalīga cilpa, tad tev countera stāvoklis netiek ņemts vērā... standart PC asmā tas ir `jz` (JumpIfZero)

----------


## abergs

Tā kā prograsmmai ir visu laiku jāizpildās, jāorganizē vēl viena cilpa kas neļautu programmai nokļūt
uz "END", piemēram:

stop movlw 0x00 ; Turn on LED connected to RC2
movwf PORTC
goto   stop

END

----------


## kvaris

Aha, bet programma tiesi tagad sez kaut kada cilpa, bet man vajag, lai ta visa siganlu buķete iznāk ārā tikai 1 (!!) reizi. Man tieši vajag, lai nokļūst līdz END    ::

----------


## Delfins

Nu tad tā ir cikla skipošana, kas ir visai neefektīvs darba uzdevums (katr reizi čekot esi vai nē izgājis)



```
startup();
mans_startup(); // signālu buķete

// standarta  bezgalīga cilpa
while (1)
{
}
```

----------


## abergs

Kā nonāk līdz "END", tā "sākas viss no gala", kā otrajā oscilogrammā.

----------


## karloslv

"END" nenozīmē visa beigas. Tā ir tikai instrukcija asembleram, kura vispār programmā (mikrokontrolierim) neparādās un neko neizsaka. Šajā gadījumā procesors turpina izpildīt neierakstīto programmas daļu (iet uz priekšu pa adresēm), līdz kamēr sasniedz programmas atmiņas beigas. Tad viss sākas no nulles. Tāpēc, ja beigās mākslīgi neapturēsi procesoru, tad tava programma izpildīsies atkal un atkal no sākuma. Viens veids, kā to izdarīt, ir mūžīgais cikls (uz vietas, kā Tev abergs ieteica, nevis kā Tu viņu pārprati). Otrs veids - aizmidzināt procesoru (to gan es nezinu, kā PIC dara) tā, lai nemostas. END pilnīgi neko tur nepalīdz.

----------


## kvaris

Jā, atvainojos Abergam. Es sapratu. Paldies par padomiem, izmēģināšu.   ::

----------


## Delfins

Aizmidzināt vienmēr var ar vēl vienu mūžīgo ciklu iekšā bez izejas iespējas  :: 
Tas ir kā galējs variants.

/ja vien kompilators nenobļausies/

----------


## karloslv

Jā, bet es domāju kādu no Powerdown režīmiem, vismaz AVR var aizmidzināt tā, ka pamostas tikai no ārējiem pārtraukumiem, ja tādi ir atļauti un rodas. Prastā tukšā cilpā CPU tomēr patērē tieši tikpat strāvas, cik aktīvi ar kaut ko derīgu nodarbojoties.

----------


## abergs

> Jā, atvainojos Abergam


 Nevajag atvainoties  ::  
Cik reizes pats neesu "kāpis uz grābekļa" kamēr apguvu!  ::

----------


## kvaris

Paldies, draugi! Viss notiek!   ::   ::   ::

----------

