MPLAB: PIC programmering med C-compiler??
Jeg har programmeret i MPLAB med assembler. Jeg vil nu prøve at programmer i C. Jeg har fået C-compileren installeret, (Det er kun en demo udgave), og det ser ud til at virke fint.Det jeg ønsker, er hjælp til at lave et lille program der ved at aktivere en indgang på en PIC 16f84 giver respons på en udgang. Sådan lige for at komme i gang.
Jeg har lavet et program i assembler, som jeg kunde tænke mig lavet i C. (Programmet har godt nok pral funktion på RA2, det han jeg jo springe over i første omgang).
Jeg har startet på et lille program i C men har brug for MEGET hjælp
Assembler
;*******************************************************************************
;Demo fil test_2.
;
;On/Off med dilay på RA2. Skriver 1 og 2 på display. (binær, RB4 - RB7)
;On/Off på RA3. Skriver 3 og 4 på display (binær, RB4 - RB7)
;
;Dato: 25.03.01
;*******************************************************************************
LIST P = 16F84, R=DEC ;radix gruntalsystem
#include <p16f84.inc>
;#define praloff
;-----------------------------------------------------------------------------------------------
; Variables
;-----------------------------------------------------------------------------------------------
Byte1 EQU .12 ;
Byte2 EQU .13 ;Korntrol for kontakt off, RA2.
Byte3 EQU .14 ;Korntrol for kontakt off, RA3.
Byte10 EQU .15 ;
Byte11 EQU .16 ;1 / 2.
Byte12 EQU .17 ;3 / 4.
DByte1 EQU .18 ;Dilay for kontaktpral
DByte2 EQU .19 ;Dilay for kontaktpral
;-----------------------------------------------------------------------------------------------
; Program Code
;-----------------------------------------------------------------------------------------------
ORG 0
Bsf STATUS,RP0 ;Skift RAM bank. status bit der bruges for
inst. Bcf, Bsf, Movwf.
Movlw B\'00000000\' ;b = binæt værdi. 0 = output 1 = indput (tab.
5-2).
Movwf TRISB ;Sætter alle PORTB ben som udgange.
Bcf STATUS,RP0
Clrf Byte1 ;Cleare for starter.
Clrf Byte2 ;
Clrf Byte3 ;
Clrf Byte10 ;
Clrf Byte11 ;
; Incf Byte1,f ;Tæller register byte1 op med 1.
; Incf Byte4,f ;Tæller register byte1 op med 1.
;-----------------------------------------------------------------------------------------------
; Main Program
;-----------------------------------------------------------------------------------------------
Start
;-RA2--------------------------------------------------------------------------------------------
Btfsc Byte2,0 ;Hopper hvis kontakt ikke har været on.
Goto Lin1
Btfsc PORTA,2 ;Pin RA3
Call Loop1
Lin1
Btfss Byte2,0 ;Hopper hvis kontakt har været on.
Goto Lin2
Btfsc PORTA,2 ;Pin RA3
Goto Lin2
ifndef praloff
IncD7
Incfsz DByte1,f ;Delay rutine for kontaktprall.
Goto IncD7
Incfsz DByte2,f
Movf DByte2,W
Xorlw .200 ;Indsætte et tal.
Btfss STATUS,Z
Goto IncD7
Clrf DByte2 ;------
endif
Incf Byte2,f ;Tæller register byte2 op med 1.
Lin2
;-RA3-------------------------------------------------------------------------------------------
Btfsc Byte3,0 ;Hopper hvis kontakt ikke har været on.
Goto Lin3
Btfsc PORTA,3 ;Pin RA3
Call Loop2
Lin3
Btfss Byte3,0 ;Hopper hvis kontakt har været on.
Goto Lin4
Btfss PORTA,3 ;Pin RA3
Incf Byte3,f ;Tæller register byte3 op med 1.
Lin4
Goto Start
;-----------------------------------------------------------------------------------------------
;-RA2.1--------------------------------------------------------------------------------------------
Loop1
Bcf PORTB,0
Bcf PORTB,1
Bcf PORTB,2
Btfsc Byte10,0 ;Hopper hvis bit0 er cleret.
Goto Line10
Bsf PORTB,4
Bcf PORTB,5
Bcf PORTB,6
Bcf PORTB,7
Goto Slut1
Line10
Bcf PORTB,4
Bsf PORTB,5
Bcf PORTB,6
Bcf PORTB,7
Slut1
Incf Byte10,f ;
ifndef praloff
IncD8
Incfsz DByte1,f ;Delay rutine for kontaktprall.
Goto IncD8
Incfsz DByte2,f
Movf DByte2,W
Xorlw .200 ;Indsætte et tal.
Btfss STATUS,Z
Goto IncD8
Clrf DByte2 ;------
endif
Incf Byte2,f ;Tæller register byte2 op med 1.
Return
;---------------------------------------------------------------------------------------------
;-RA3.1-------------------------------------------------------------------------------------------
Loop2
Bcf PORTB,0
Bcf PORTB,1
Bcf PORTB,2
Btfsc Byte11,0 ;Hopper hvis bit0 er cleret.
Goto Line11
Bsf PORTB,4
Bsf PORTB,5
Bcf PORTB,6
Bcf PORTB,7
Goto Slut2
Line11
Bcf PORTB,4
Bcf PORTB,5
Bsf PORTB,6
Bcf PORTB,7
Slut2
Incf Byte11,f ;
Incf Byte3,f ;Tæller register byte3 op med 1.
Return
;--------------------------------------------------------------------------------------------
END
C-program:
//Jeg ønsker her at lave et lille program, der ved at aktiver en indgang,
//kan give respons på en udgang!
#include <pic1684.h>
/********************************************************************
* Modulnavn : Test for c compiler.
* Input :
* Funktion :
* Output :
* Versionsbeskrivelse :
*
********************************************************************/
unsigned char PortRB;
#define InRA1 0x02
void main (void)
{
TRISB = 0x00; // Alle PORTB som output
// if (InRA1)
// do
{
PortRB = PORTB;
PortRB &= 0xf0; //RB4 - RB7 er hige
PortRB |= 0x0f; //RB0 - RB8 er low
PORTB = PortRB;
}
// while ()
}
