|
[ stameni @ 18.05.2025. 14:50 ] @
| 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... |
[ stameni @ 18.05.2025. 17:47 ] @
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.
[ samuki @ 18.05.2025. 19:56 ] @
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.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|