Srodne teme
Kliknite za generisanje liste srodnih tema...
Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

PIC16F84A: Problem sa kompajliranjem jednostavnog projekta

[es] :: Elektronika :: Mikrokontroleri :: PIC16F84A: Problem sa kompajliranjem jednostavnog projekta

[ Pregleda: 112 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

stameni
Ivan Stamenković

Član broj: 6739
Poruke: 555



+9 Profil

icon PIC16F84A: Problem sa kompajliranjem jednostavnog projekta18.05.2025. u 14:50 - pre 9h 23min
Duže vreme nisam programirao PIC-ove. Probao sam da se malo prisetim gradiva, pa pokušah ovim jednostavnim programom.

(Naravno, nije baš 16F84A ono što mi treba, ali bi trebalo da je dovoljno jednostavan da proradi "hello, world" program.)

Code:

    list      p=16F84A
    #include <PIC16F84A.inc>

    __CONFIG    0x3FF2

D1    EQU    0X20    
D2    EQU    0X21
D3    EQU    0X22
    
        ORG     0x000
          goto    main
main:
    
; initialize of your PIC, setting the general I/O in TRIS
    
   
        BSF        STATUS,5                ;SWITCH TO BANK1; BIT 5 OF STATUS REGISTER IS SET TO 1
        CLRF        TRISB                    ;SET PORTB AS OUTPUT ;PORTB = B'00000000'
        BSF        TRISA,2                    ;SET RA2 AS INPUT ;RA2=1
        BSF        TRISA,3                    ;SET RA3 AS INPUT ;RA3=1
        BSF        TRISA,4                    ;SET RA4 AS INPUT ;RA4=1
        BCF        STATUS,5                ;SWITCH TO BANK0; BIT 5 OF STATUS REGISTER IS SET TO 0

        MOVLW        0xFF                
        MOVWF        PORTB                    ;SET ALL 8 PIN IN PORTB TO HIGH(1)


; The main program begin here

START:
        BTFSS        PORTA,2                ;check signal at pushbutton1, if press then goto following line, else skip the following line
        CALL        RED                    ;button1 pressed, program execute the operation in subroutine RED    
        BTFSS        PORTA,3                ;check signal at pushbutton2, if press then goto following line, else skip the following line
        CALL        GREEN                ;button2 pressed, program execute the operation in subroutine GREEN
        BTFSS        PORTA,4                ;check signal at pushbutton3, if press then goto following line, else skip the following line
        CALL        YELLOW                ;button3 pressed, program execute the operation in subroutine YELLOW
        GOTO        START                ;no any button being pressed, program keep looping to check the pushbuttons' signal 

RED:    
        BSF             PORTB,4                ;ON YELLOW LED
        BSF            PORTB,5                ;ON GREEN LED
        BSF            PORTB,6                ;ON RED LED
        BCF            PORTB,6                ;OFF RED LED
        RETURN

GREEN:
        BSF            PORTB,4                ;ON YELLOW LED
        BSF            PORTB,5                ;ON GREEN LED
        BSF            PORTB,6                ;ON RED LED
        BCF            PORTB,5                ;OFF GREEN LED
        RETURN

YELLOW:
        BSF            PORTB,4                ;ON YELLOW LED            
        BSF            PORTB,5                ;ON GREEN LED
        BSF            PORTB,6                ;ON RED LED
        BCF            PORTB,4                ;OFF YELLOW LED
        RETURN


;========================================================================================
; DELAY SUBROUTINE
;========================================================================================

DELAY:
            MOVLW    D'200'            ;PAUSE FOR ABOUT 500mS (u can change the 200, 3, 1 value to obtain different delay timing)
            MOVWF    D3                            
            MOVLW    D'3'            
            MOVWF    D2            
            MOVLW    D'1'            
            MOVWF    D1            
            DECFSZ    D1                ;DECREASE THE VALUE OF D1 AND SKIP THE NEXT LINE WHEN IT REACH ZERO
            GOTO    $-1                ;IF NOT ZERO, IT WILL LEAD THE PROGRAM TO 1 LINE ABOVE
            DECFSZ    D2                ;DECREASE THE VALUE OF D2 AND SKIP THE NEXT LINE WHEN IT REACH ZERO
            GOTO    $-5                ;IF NOT ZERO, IT WILL LEAD THE PROGRAM TO 5 LINE ABOVE
            DECFSZ    D3                ;DECREASE THE VALUE OF D3 AND SKIP THE NEST LINE WHEN IT REACH ZERO
            GOTO    $-9                ;IF NOT ZERO, IT WILL LEAD THE PROGRAM TO 9 LINE ABOVE
            RETURN                    ;RETURN FROM SUBROUTINE

            END                     ; directive 'end of program'


Prvi put radim sa MPLAB X IDE v6.20, pa imam i ove probleme.

Konkretno, okruženje izbacuje sintaksne greške u redovima 4, 66, 68, 70. Ove poslednje tri su verovatno posledica korišćenja pogrešnog formata dekadnih konstanti, ali o tome ću -- potom. Pored toga, imam i gomilu "phase error" u redovima 11, 17, 18, 19, 20...

Mislim da grešim nešto sitno, ali...
 
Odgovor na temu

stameni
Ivan Stamenković

Član broj: 6739
Poruke: 555



+9 Profil

icon Re: PIC16F84A: Problem sa kompajliranjem jednostavnog projekta18.05.2025. u 17:47 - pre 6h 26min
U međuvremenu, suzio sam problem sledećim kodom:

Code:

    list p=16F84A
    #include <pic16F84A.inc>
    
    __CONFIG 0x3FF2

    org 0x000
    
petlja:
    ; neki kod
    clrw
    
    goto petlja
    
    end


Sada asembliranje puca na onom __CONFIG ; kuka da je sintaksna greška.
 
Odgovor na temu

samuki
💻🇧🇦
🅱🅰
BiH Sarajevo🇧🇦

Član broj: 322399
Poruke: 1628
*.dynamic.telemach.ba.



+100 Profil

icon Re: PIC16F84A: Problem sa kompajliranjem jednostavnog projekta18.05.2025. u 19:56 - pre 4h 17min
Kaze Gpt ovako .

Da, sa stanovišta sintakse asemblerskog jezika za PIC16F84A, ovaj kod je u redu za asembler (ili kompajler asemblera). Ne sadrži očite sintaksne greške koje bi spriječile asembliranje.

Međutim, važno je napomenuti sljedeće:

Beskonačna petlja: Ovaj kod će stvoriti beskonačnu petlju. Mikrokontroler će neprestano izvršavati instrukcije clrw i goto petlja. Ovo je često namjerno ugrađeno u glavnu petlju mikrokontrolerskog programa, ali mora postojati neki drugi mehanizam (unutar "neki kod" dijela koji nedostaje) da bi se postigla korisna funkcionalnost. Bez tog dodatnog koda, mikrokontroler će samo besciljno postavljati W registar na nulu i skakati nazad.
Nedostatak korisnog koda: Dio označen sa ; neki kod je prazan. Da bi ovaj program radio nešto korisno, tu bi trebale biti dodane instrukcije koje manipuliraju registrima, ulazno/izlaznim pinovima, ili obavljaju druge operacije.
Dakle, sa sintaksne strane, kod je ispravan za asembler. Međutim, sa funkcionalne strane, ovakav kakav jeste (bez "nekog koda"), on ne radi ništa korisno osim što stvara beskonačnu petlju.

Ako imate specifičan cilj za ovaj kod, slobodno ga podijelite, pa vam mogu pomoći s konkretnijim savjetima!


 #include <PIC16F84A.inc>

    __CONFIG    0x3FF2

D1    EQU    0X20    
D2    EQU    0X21
D3    EQU    0X22
    
        ORG     0x000
          goto    main
main:
    
; initialize of your PIC, setting the general I/O in TRIS
    
   
        BSF        STATUS,5                ;SWITCH TO BANK1; BIT 5 OF STATUS REGISTER IS SET TO 1
        CLRF        TRISB                    ;SET PORTB AS OUTPUT ;PORTB = B'00000000'
        BSF        TRISA,2                    ;SET RA2 AS INPUT ;RA2=1
        BSF        TRISA,3                    ;SET RA3 AS INPUT ;RA3=1
        BSF        TRISA,4                    ;SET RA4 AS INPUT ;RA4=1
        BCF        STATUS,5                ;SWITCH TO BANK0; BIT 5 OF STATUS REGISTER IS SET TO 0

        MOVLW        0xFF                
        MOVWF        PORTB                    ;SET ALL 8 PIN IN PORTB TO HIGH(1)


; The main program begin here

START:
        BTFSS        PORTA,2                ;check signal at pushbutton1, if press then goto following line, else skip the following line
        CALL        RED                    ;button1 pressed, program execute the operation in subroutine RED    
        BTFSS        PORTA,3                ;check signal at pushbutton2, if press then goto following line, else skip the following line
        CALL        GREEN                ;button2 pressed, program execute the operation in subroutine GREEN
        BTFSS        PORTA,4                ;check signal at pushbutton3, if press then goto following line, else skip the following line
        CALL        YELLOW                ;button3 pressed, program execute the operation in subroutine YELLOW
        GOTO        START                ;no any button being pressed, program keep looping to check the pushbuttons' signal 

RED:    
        BSF             PORTB,4                ;ON YELLOW LED
        BSF            PORTB,5                ;ON GREEN LED
        BSF            PORTB,6                ;ON RED LED
        BCF            PORTB,6                ;OFF RED LED
        RETURN

GREEN:
        BSF            PORTB,4                ;ON YELLOW LED
        BSF            PORTB,5                ;ON GREEN LED
        BSF            PORTB,6                ;ON RED LED
        BCF            PORTB,5                ;OFF GREEN LED
        RETURN

YELLOW:
        BSF            PORTB,4                ;ON YELLOW LED            
        BSF            PORTB,5                ;ON GREEN LED
        BSF            PORTB,6                ;ON RED LED
        BCF            PORTB,4                ;OFF YELLOW LED
        RETURN


;========================================================================================
; DELAY SUBROUTINE
;========================================================================================

DELAY:
            MOVLW    D'200'            ;PAUSE FOR ABOUT 500mS (u can change the 200, 3, 1 value to obtain different delay timing)
            MOVWF    D3                            
            MOVLW    D'3'            
            MOVWF    D2            
            MOVLW    D'1'            
            MOVWF    D1            
            DECFSZ    D1                ;DECREASE THE VALUE OF D1 AND SKIP THE NEXT LINE WHEN IT REACH ZERO
            GOTO    $-1                ;IF NOT ZERO, IT WILL LEAD THE PROGRAM TO 1 LINE ABOVE
            DECFSZ    D2                ;DECREASE THE VALUE OF D2 AND SKIP THE NEXT LINE WHEN IT REACH ZERO
            GOTO    $-5                ;IF NOT ZERO, IT WILL LEAD THE PROGRAM TO 5 LINE ABOVE
            DECFSZ    D3                ;DECREASE THE VALUE OF D3 AND SKIP THE NEST LINE WHEN IT REACH ZERO
            GOTO    $-9                ;IF NOT ZERO, IT WILL LEAD THE PROGRAM TO 9 LINE ABOVE
            RETURN                    ;RETURN FROM SUBROUTINE

            END

Ovaj kod je sada mnogo konkretniji i izgleda kao program koji reaguje na pritiske tri tastera (spojena na RA2, RA3 i RA4) i pali/gasi LED diode povezane na PortB.

Analiza koda:

#include <PIC16F84A.inc> i __CONFIG 0x3FF2: Kao i ranije, uključuje definicije za PIC16F84A i postavlja konfiguracijske bitove.
D1 EQU 0X20, D2 EQU 0X21, D3 EQU 0X22: Definišu simbolička imena D1, D2 i D3 za memorijske lokacije 0x20, 0x21 i 0x22. Ove lokacije će se koristiti za varijable u potprogramu DELAY.
ORG 0x000 i goto main: Postavlja početnu adresu na 0x000 i odmah skače na labelu main. Ovo je standardna praksa za početak izvršavanja programa.
main:: Glavna rutina programa.
Inicijalizacija I/O portova (Bank 1):
BSF STATUS,5: Prebacuje se u Bank 1 (bit 5 STATUS registra postavljen na 1).
CLRF TRISB: Postavlja sve pinove porta B kao izlaze (upisuje 0 u TRISB).
BSF TRISA,2, BSF TRISA,3, BSF TRISA,4: Postavlja pinove RA2, RA3 i RA4 kao ulaze (upisuje 1 u odgovarajuće bitove TRISA). Ovo se obično koristi za tastere.
BCF STATUS,5: Vraća se u Bank 0 (bit 5 STATUS registra postavljen na 0).
MOVLW 0xFF i MOVWF PORTB: Postavlja sve izlazne pinove porta B na logičku jedinicu (HIGH). Ovo vjerovatno služi da se ugase LED diode ako su one aktivne na LOW nivou.
START:: Glavna petlja programa.
Provjera tastera i pozivanje potprograma:
BTFSS PORTA,2: Provjerava da li je bit 2 porta A (RA2) postavljen (što bi značilo da taster nije pritisnut ako je spojen na masu preko otpornika). Ako je bit 2 setovan (nije pritisnut), preskače sljedeću liniju. Ako je clearovan (pritisnut), poziva potprogram RED.
CALL RED: Poziva potprogram RED ako je taster na RA2 pritisnut.
Slično se provjeravaju tasteri na RA3 i RA4 i pozivaju potprogrami GREEN i YELLOW.
GOTO START: Bez obzira na to da li je neki taster pritisnut ili ne, program se vraća na početak petlje START i ponovo provjerava tastere.
RED:, GREEN:, YELLOW:: Potprogrami koji bi trebali kontrolirati LED diode. Međutim, trenutno rade sljedeće:
U sva tri potprograma se postavljaju (pale) bitovi 4, 5 i 6 porta B.
Zatim se u svakom potprogramu odmah gasi jedan od tih bitova:
RED: Gasi bit 6 porta B.
GREEN: Gasi bit 5 porta B.
YELLOW: Gasi bit 4 porta B.
RETURN: Vraća se iz potprograma. Ovo znači da će se, kada se pritisne bilo koji od tastera, na kratko upaliti tri LED diode (ako su spojene na bitove 4, 5 i 6 porta B), a zatim će se odmah ugasiti jedna od njih, ovisno o pritisnutom tasteru.
DELAY:: Potprogram za generiranje vremenske pauze. Koristi tri varijable (D1, D2, D3) za implementaciju ugniježđenih petlji brojača. Vrijednosti učitane u ove varijable (D'200', D'3', D'1') određuju dužinu kašnjenja.
END: Označava kraj asemblerskog koda.


Da, ovaj kod je sintaksno ispravan za PIC16F84A asembler. Ne bi trebalo biti problema prilikom asembliranja.

Moguća poboljšanja i razmatranja:

Povezivanje LED dioda: Pretpostavlja se da su LED diode povezane na bitove 4, 5 i 6 porta B. Trebalo bi provjeriti da li su spojene na odgovarajući način (anoda/katoda i eventualno preko otpornika).
Logika tastera: Kod pretpostavlja da tasteri daju logičku nulu (niski nivo) kada su pritisnuti i logičku jedinicu (visoki nivo) kada nisu. Ako je povezivanje drugačije, uslov u BTFSS instrukcijama bi trebalo promijeniti u BTFSC.
Funkcionalnost LED dioda: Trenutna logika u potprogramima RED, GREEN i YELLOW pali tri LED diode i odmah gasi jednu. Vjerovatno je namjera bila da se pali samo jedna određena LED dioda za svaki taster. Ako je to cilj, potprograme bi trebalo izmijeniti da pale samo jednu željenu LED diodu i eventualno ugase ostale. Također bi bilo dobro dodati neki delay nakon paljenja LED diode kako bi se mogla vidjeti.
Debouncing tastera: Ovaj kod ne uzima u obzir "debouncing" tastera. Mehanički tasteri mogu kratko oscilirati između uključenog i isključenog stanja prilikom pritiska ili otpuštanja. Ovo može dovesti do višestrukih neželjenih poziva potprograma. Obično se dodaje kratka pauza (korištenjem DELAY potprograma) nakon detekcije pritiska tastera kako bi se ignorirali ovi oscilacije.
Sve u svemu, ovaj kod predstavlja dobar početak za interakciju s tasterima i LED diodama na PIC16F84A. Uz nekoliko manjih izmjena u logici potprograma za LED diode i eventualno dodavanje "debouncinga" za tastere, može postati funkcionalan program.
Imam multimetar i lemilicu ! 🇧🇦
 
Odgovor na temu

stameni
Ivan Stamenković

Član broj: 6739
Poruke: 555



+9 Profil

icon Re: PIC16F84A: Problem sa kompajliranjem jednostavnog projekta18.05.2025. u 21:19 - pre 2h 54min
Ma, ja sam pametniji od te inteligencije Evo koda koji prolazi kompajliranje; navešću posle koje sam izmene napravio:

Code:

    list p=16F84A
    #include <xc.inc>
    #include <pic16F84A.inc>

    CONFIG FOSC = EXTRC
    CONFIG WDTE = OFF
    CONFIG PWRTE = OFF
    CONFIG CP = OFF

D1  EQU    0X20
D2  EQU    0X21
D3  EQU    0X22

    org 0x000

petlja:
    clrw
    call delay
    goto petlja

delay:
    movlw 200
    movwf D3
    movlw 3
    movwf D2
    movlw 1
    movwf D1
    decfsz D1
    goto $-1
    decfsz D2
    goto $-5
    decfsz D3
    goto $-9
    return

    end


Elem, ključno je dodavanje ovog #include <xc.inc> na početku sourcea, a potom i ovo "razlaganje" konfiguracije PIC-a na četiri komponente. Mora da to može i lepše, ali za sada je OK.

Dakle, ovakav kod prolazi asembliranje, ali nikako da nateram debugger da radi. Izgleda da uopšte rezultujući HEX ne bude upisan u memoriju za kod.
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: PIC16F84A: Problem sa kompajliranjem jednostavnog projekta

[ Pregleda: 112 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Srodne teme
Kliknite za generisanje liste srodnih tema...
Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.