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.)
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...
(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'
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...