# PIC mikrokontrolleri >  Visvienkāršākā PIC16F84A programma ASM

## marizo

Vajag mazliet HELP:
4 MHz kvarcs (HS), 18 pF kondensatori pie kvarca uz GND
LED caur 1kOm pie A4
Programma:

clrf	5
movlw 	0
BSF 	3,5
MOVWF 	5
BCF 	3,5
movlw	b'10000'
movwf	5
end

bet nedarbojas.  :: 
Ar barošanu viss OK, bez PIC savienojot +5 ar A4 LED iedegas.
Kompilēju MPLAB, programmēju ar ICPROG

----------


## 0xDEAD BEEF

un kas tad sitajai programai butu jadara? jamirkskina leds?  ::  ne ne!  :: 
kur cikls? kur inicializacija? Kur delays?

Tev ir LOOTI slikts stils!

Un nav jauki rakstit bsf 3,5
tas neko neizsaka!
Ludzu izmanto mainigos un defines!

raksti include <pic16... . inc> un ieklauj visas defines.

kope initializaciju portiem no pdfa!

Beefs

----------


## 0xDEAD BEEF

paskaties, ka saja koda tiek izmantots labais stils.
un ne tikai komentaros! redzi, cik svarigi ir, ja 3 vieta ir portb vai apmeram ta!

;****************************************************************
;* Blinking LED on RB1     "led_seqa.asm"  
;* LED on Port B line 1 flashes at arround 1Hz                            
;* Illustrates the use of a Subroutine for the time delay       
;****************************************************************
 list   p=16F84       ;PIC 16F84 is the target processor
;
 #include <p16F84A.inc>    ;processor specific variable definitions
 __config _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
;Configuration bits set as:  Oscillator  XT
;                         Watchdog Timer OFF
;        Power-up Timer ON
;                         Code Protect OFF
;============================================================
; 4.00 MHz Resonator 
; INSTRUCTION CLOCK     1.00 MHz,   T= 1uS 
;
;*********CPU Equates (File Registers)***********************
count1  equ  0x0C   ;location for count1 value (1st free File Register)
count2  equ  0x0D   ;location for count2 value

   org  0x000                       ;program code start address (fixed)
        goto start
;----initialise Port I/O lines-------------------------------
start   bsf status,rp0             ;switch to File Register Bank 1
        movlw   b'00000000'     ;set all 8 Port B lines as O/Ps
        movwf   trisb              ;
        movlw b'11111'           ;set all 5 Port A lines as I/Ps
        movwf trisa              ;(Port A not used here)
        bcf  status,rp0           ;revert back to File Register Bank 0

; program loop
loop movlw   b'00000010'     ;load pattern to be o/p to LEDs
     movwf   portb             ;RB1 LED ON
     call    delay                ;call delay subroutine
     movlw   b'00000000'     ;load pattern to be o/p to LEDs
     movwf   portb             ;RB1 LED OFF
     call    delay                ;call delay subroutine
     goto    loop                ;loop continuously

delay   movlw   d'255'          ;load loop counters with 255 (dec)
         movwf   count1          ;load outer loop counter
lp1      movwf   count2          ;load inner loop counter
lp2      nop                         ;
        nop                          ;pad out delay time
        nop                          ;
        decf    count2,f          ;decrement inner loop counter
        btfss   status,z           ;is count2 zero yet?
        goto    lp2                 ;if not, repeat inner loop
        decf    count1,f          ;if zero, decrement outer loop counter
        btfss   status,z          ;is count1 zero yet?
        goto    lp1                 ;if not, repeat outer loop
        return                      ;return to main program
 end

----------


## marizo

> un kas tad sitajai programai butu jadara? jamirkskina leds?  ne ne! 
> kur cikls? kur inicializacija? Kur delays?
> 
> Tev ir LOOTI slikts stils!
> 
> Un nav jauki rakstit bsf 3,5
> tas neko neizsaka!
> Ludzu izmanto mainigos un defines!
> 
> ...


 Programmai nebūtu jādara gandrīz nekas - tikai jāieslēdz LEDs pie RA4.
Šajā gadījumā ciklu nemaz nevajag. Jebšu nevar tā likt mikrokontrolleram - izpildīt programmu un "pakaarties" kaut kur?!
bsf3,5 neko neizsaka Tev un man, vai arī MPLAB un PICam?

----------


## marizo

nja.. kaut kas nav īsti.. Tavs kods arī negrib strādāt. Nomainīju porta<->portb, trisa<->trisb, sarakstīju visus equ (nez kādēļ man tie bija jāraksta - vai tad status equ 3 utt nav ierakstīti tajā include?), izmainīju mirgošanu uz RA4.
Kompilējas bez kļūdām, bet  nedarbojas.. Es vairs nesaprotu, ko es nesaprotu!   ::

----------


## karloslv

nezinu, kā iekš PIC tas notiek, bet nav tā, ka Tu varbūt maini porta stāvokli no Z uz 1, un tad LED, kurš pievilkts pie +5, nespīdēs ne vienā, ne otrā gadījumā?

----------


## 0xDEAD BEEF

nevajag rakstit status equ 3. tas piemers ir sava zina sudigs, jo visam tam ir jabut rakstitam inc faila.
Programma nevar beigties. ta vienmer darbojas.
Es saktu ar to, ka parbauditu, vai darbojas ar internal oscilator ta programa un pec tam meginatu ar kvarcu.
vajag to pinu nodefinet piem led4 equ 4 (tipa 4turtais bits)
un tad rakstit bsf porta,led4.
Ja config registrs nav pareizs, tad ari joki gadas!
Vai pec ieprogramesanas verify ir ok? tipa kodu vari nolasit? Esmu ari redzejis picus nobeidzamies - tas notiek atri un klusi!  :: 
prieks bankiem izmanto defini bank1, bank2 utt. tas ir labais stils!  :: 
par nesaprasanu - nesaprotu es un tu. PIC, protams, saprot!  :: 
Parbaudi mclrf konfiguraciju. Tur ir viens pins, kuram vajag 5V sakuma, ja sitas konfig bits nav pielikts!
Ar ledu uzmanigi - nepareizi pievienojot ledu pikam tu to vari nodedzinat (varbut).
Nu... partaisi un sataisi kodu, pamegini ar citu pic un ja neiet, tad iemet to savu kodu, lai var apskatit!
BTW, ja gribi prosta iedegt ledu, tad tasii goto $-1 vai kaut ka ta (nu tipa neloop
goto neloop
)
Beefs

----------


## karloslv

vismaz AVR cilpu beigās liek vienmēr. manuprāt citādi adrešu skaitītājs skaita uz riņķi un programmu zpilda atkārtoti, varbūt pat resetojot procesoru.

----------


## 0xDEAD BEEF

vins skaita uz rinki, bet man liekas, ka ne no end. Nezinu, ka end nokompilejas, bet pieljauju, ka nekadi (tikai kompilatora sintaxe). Un ja ta, tad procesors draga visas intrukcijas (4kb vai vairak) un tad sak atkal no 0les, bet tas nav resets!
Beefs

----------


## Epis

A simulātorā kad debaggo caur kodu tas pins tur aktivizējās??? 
ja neiet sumulātorā tad neies nekur! 

kādu pus gadu jau PIC kodu nebīju redzējis tākā saptast grūti kas tur īsti notiek
tādu kodu uz atmegas8 var ar pāris rindām uztaisīt (kas vismaz simulātorā strādās
apaksā atrais koda uzmetums  :: 



```
#include "m8def.inc"

 rjmp	Starts
; proga sākās šeit
Starts:
	ldi		r16,0b11111111  ; Visi B porti ir outputi
	ldi		r17,0b11111111  ; Visi B porti ir Logic Hi 
	out		DDRB,r16     ; uzstāda porta B virzienu kā OUT
	out		PORTB,r17   ; ieliek portiem 1
    ; ja vaig Bportos uztaisīt 0 tad 
ldi     r16,0b00000000  
out    PORTB,R16       ; ieliek prortiem 0

;pieliekam klāt End loopu kas neko nedara un lieta darīta
END: 
     nop
    rjmp END
```

 Pa vidu tam visam var uzstādīt taimeri tad būs tev lampa kas mirgo  ::

----------


## marizo

Paldies par idejām.
Ir +5V uz 4.tā pin - mrclr., to es saprotu.
Kodu varu nolasīt, nav nekādu problēmu programmējot, arī nolasot vēlāk.
16F84A ir arī kaut kāds internal oscilator? Cik es saprotu, var lietot RC ķēdi, kvarcu, keramikas rezonātoru. Un tie kvarci vēl iedalās augstfrekvences un mazas jaudas.
Nu bet to visu varu icprog sastellēt (man ir 4MHz kvarcs - uzliku HS)
Es tikai domāju- kādus tos kondensatorus vajag pie kvarca? Man ir 18pF pret zemi. Tas ir OK?
Kaut kad vēl paprogrammēšu to PICu, tad iemetīšu kodu, ja neies!

----------


## 0xDEAD BEEF

18pf ir ok prieksh 4Mhz kvarca!

Man likas, ka visiem piciem ir iekshejais oscilators ~ 4mhz, bet nesmu 100% parliecinats. Palasi pdf saldalja pie procesora konfiguresanas.

Ja tev nestav konfiga words par to mclr tad tev jatur mclr +5v, lai procesors darbotos.

Beefs
edit: 16 serijas pikus es spraudu taja macibu plate un tur visam bija jaiet! Tev ir macibu plate? Ja nav, tad noperc!  ::  kaut ari.. es tev varesu savu pardot! man vinu vairs nevajag!

----------


## marizo

Paldies par palīdzību, bet ar tiem 2viem PICiem bija noticis kaut kas nelāgs - tā izeja nobeigusies. Sāku čekot tā paša porta citas izejas (uz visām padevu 1), pārējās darbojās, pieslēdzu to pašu LED un viss OK.
Par to mācību plati - paldies, laikam nevajadzēs.. Man jau pašam top tāda no gabaliem - uz vienas platītes PIC, uz otras 7segmentu LED indikators, uz trešās ULN2803 draiveris.. utt.. Varbūt nav tas labākais variants, bet man liekas ērtāks.  ::

----------


## 0xDEAD BEEF

tu trisa un trisb un parejos registrus pareizi iekonfigureji prieks outputa un izsledzi parejo situ uz tiem piniem?

----------


## marizo

Jā, visu PORTA nokonfigurēju kā Output, un izvadīju uz visa porta A b'11111'. Tikai tā viena izeja negāja. 
Kā jau teicu - PICam bija mirusi tā izeja. Tagad viss ir OK! Sapratu problēmu.   ::

----------


## 0xDEAD BEEF

tipa panemi citu picu un tam iet, ja?
Beefs

----------


## marizo

Jā.

----------

