|
resinba
|
 |
« em: Abril 13, 2008, 23:17:27 » |
|
Eis então o programa em C
#pragma chip PIC16F84A //#define CP_off |= 0x3F32 #pragma config |=0B11111111110010 //#pragma config WDTE=off, FOSC=HS //#pragma config PWRTE=on
#include "int16cxx.h" /*#include "math16m.h"*/ /* VARIAVEIS */ uns8 var_0, var_1, var_2, var_3, flag,temp_asm, count;
#pragma bit signal_in@PORTB.3 /*na realidade é o RB4*/ /*#pragma bit bat_test@PORTB.5*/ #pragma bit power_out@PORTA.2 /*na realidade éo pino RB6*/ //#pragma bit brake_out@PORTB.7 #pragma bit flag_int@flag.0 #pragma bit flag_count@flag.1 #pragma bit flag_asm@flag.2 /* PROGRAMA */
/*************/ /* INTERRUPT */ /*************/ #pragma origin 4 interrupt int_server(void) { int_save_registers; flag_asm=1; /* if (flag_count!=0) { var_0=0; count =4; }*/ if (flag_int ==0) { TMR0=255-var_1; power_out=1; flag_int=1; } else { TMR0=var_1; power_out=0; flag_int=0; } T0IF = 0; GIE = 1; int_restore_registers }
/******************/ /*Função de delay */ /******************/ void delay (uns8 temp) { while (temp !=0) { temp--; }
}
/*****************/ /*Função de teste*/ /*****************/
void teste() { var_0 = 0; while (signal_in !=0) { nop(); } while (signal_in == 0) { var_0++; delay(2); } }
/*****************************/ /*Função que testa o arranque*/ /*****************************/
void arranque() { while (signal_in != 1) { nop(); } while (signal_in != 0) { nop(); } LOOP_0:
teste(); if (var_0 >= 43 && var_0 <=30) { goto LOOP_0; }
LOOP_1: teste();
if (var_0 <= 43) { power_out = 0; // brake_out = 0; return; } goto LOOP_1; }
/****************************/ /*Função de paragem do motor*/ /****************************/
void stop_motor() { power_out=0; // brake_out=1; var_0=0; var_1=0; GIE = 0; }
/*************/ /*Função Main*/ /*************/ void main (void) { uns8 temp; PORTA=0; TRISA= 0B11111011; PORTB =0; TRISB= 0b11111111; OPTION=0b01000000; INTCON=0b00100000; var_0 = 0; var_1 = 0; var_2 = 0; flag = 0; flag_int=1; count=0;
stop_motor(); arranque(); var_0=0; LOOP_04: while (signal_in ==0)/*antes era signal_in==1*/ { flag_count=1; var_0++; delay(1); flag_count=0; } if (var_0>=43 && var_0<=88) /*Atenção a partir deste ponto*/ { // brake_out=0; if (var_0>=69 && var_0<=88) { var_0=75; } var_1=var_0-25; #asm movlw 4 movwf temp_asm movf var_1,w LOOP_ASM addwf var_1,f decfsz temp_asm,f goto LOOP_ASM bsf INTCON,7 btfss flag,2 bsf INTCON,2 #endasm var_0=0; count=5; } /*Até este ponto*/
else { if (var_0 > 25 && var_0<50) { stop_motor(); } else { count--; } if (count ==0) { stop_motor(); } var_0=0; var_1=0; var_2=0; } while (signal_in==1)/*Antes era signal_in==0*/ { /* if (bat_test !=1) { stop_motor(); } */ for (var_2=25; var_2>0; var_2--) { for (var_3=70; var_3>0; var_3--) { delay(2); if (signal_in !=1) { var_2=1; var_3=1; } } } if (signal_in ==1) { stop_motor(); } } goto LOOP_04; }
em Assembler é o seguinte
; CC5X Version 3.3A, Copyright (c) B Knudsen Data ; C compiler for the PICmicro family ; ************ 20. Aug 2007 1:48 *************
processor 16F84A radix DEC
__config 0x3FF2
TMR0 EQU 0x01 STATUS EQU 0x03 PORTA EQU 0x05 TRISA EQU 0x85 PORTB EQU 0x06 TRISB EQU 0x86 INTCON EQU 0x0B Carry EQU 0 Zero_ EQU 2 RP0 EQU 5 T0IF EQU 2 GIE EQU 7 OPTION_REG EQU 0x81 var_0 EQU 0x10 var_1 EQU 0x11 var_2 EQU 0x12 var_3 EQU 0x13 flag EQU 0x14 temp_asm EQU 0x15 count EQU 0x16 signal_in EQU 3 power_out EQU 2 flag_int EQU 0 flag_count EQU 1 flag_asm EQU 2 svrWREG EQU 0x0C svrSTATUS EQU 0x0D temp EQU 0x0F
GOTO main
; FILE teste_Speed_control.c ;#pragma chip PIC16F84A ;//#define CP_off |= 0x3F32 ;#pragma config |=0B11111111110010 ;//#pragma config WDTE=off, FOSC=HS ;//#pragma config PWRTE=on ; ;#include "int16cxx.h" ;/*#include "math16m.h"*/ ;/* VARIAVEIS */ ;uns8 var_0, var_1, var_2, var_3, flag,temp_asm, count; ; ; ;#pragma bit signal_in@PORTB.3 /*na realidade é o RB4*/ ;/*#pragma bit bat_test@PORTB.5*/ ;#pragma bit power_out@PORTA.2 /*na realidade éo pino RB6*/ ;//#pragma bit brake_out@PORTB.7 ;#pragma bit flag_int@flag.0 ;#pragma bit flag_count@flag.1 ;#pragma bit flag_asm@flag.2 ;/* PROGRAMA */ ; ;/*************/ ;/* INTERRUPT */ ;/*************/ ;#pragma origin 4 ORG 0x0004 ;interrupt int_server(void) ;{ int_server ; int_save_registers; MOVWF svrWREG SWAPF STATUS,W MOVWF svrSTATUS ;flag_asm=1; BSF 0x14,flag_asm ;/* if (flag_count!=0) ; { ; var_0=0; ; count =4; ; ; }*/ ; if (flag_int ==0) BTFSC 0x14,flag_int GOTO m001 ; { ; TMR0=255-var_1; COMF var_1,W BCF 0x03,RP0 MOVWF TMR0 ; power_out=1; BSF 0x05,power_out ; flag_int=1; BSF 0x14,flag_int ; } ; else GOTO m002 ; { ; TMR0=var_1; m001 MOVF var_1,W BCF 0x03,RP0 MOVWF TMR0 ; power_out=0; BCF 0x05,power_out ; flag_int=0; BCF 0x14,flag_int ; } ; T0IF = 0; m002 BCF 0x0B,T0IF ; GIE = 1; BSF 0x0B,GIE ;int_restore_registers SWAPF svrSTATUS,W MOVWF STATUS SWAPF svrWREG,1 SWAPF svrWREG,W ;} RETFIE ; ;/******************/ ;/*Função de delay */ ;/******************/ ;void delay (uns8 temp) ;{ delay MOVWF temp ; ; while (temp !=0) m003 MOVF temp,1 BTFSC 0x03,Zero_ GOTO m004 ; { ; temp--; DECF temp,1 ; } GOTO m003 ; ;} m004 RETURN ; ;/*****************/ ;/*Função de teste*/ ;/*****************/ ; ;void teste() ;{ teste ; var_0 = 0; CLRF var_0 ; while (signal_in !=0) m005 BCF 0x03,RP0 BTFSS 0x06,signal_in GOTO m006 ; { ; nop(); NOP ; } GOTO m005 ; while (signal_in == 0) m006 BCF 0x03,RP0 BTFSC 0x06,signal_in GOTO m007 ; { ; var_0++; INCF var_0,1 ; delay(2); MOVLW .2 CALL delay ; } GOTO m006 ;} m007 RETURN ; ;/*****************************/ ;/*Função que testa o arranque*/ ;/*****************************/ ; ;void arranque() ; { arranque ; while (signal_in != 1) m008 BCF 0x03,RP0 BTFSC 0x06,signal_in GOTO m009 ; { ; nop(); NOP ; } GOTO m008 ; while (signal_in != 0) m009 BCF 0x03,RP0 BTFSS 0x06,signal_in GOTO m010 ; { ; nop(); NOP ; } GOTO m009 ;LOOP_0: ; ;teste(); m010 CALL teste ; ; if (var_0 >= 43 && var_0 <=30) MOVLW .43 SUBWF var_0,W BTFSS 0x03,Carry GOTO m011 MOVLW .31 SUBWF var_0,W BTFSS 0x03,Carry ; { ; goto LOOP_0; GOTO m010 ; } ; ;LOOP_1: ;teste(); m011 CALL teste ; ; if (var_0 <= 43) MOVLW .44 SUBWF var_0,W BTFSC 0x03,Carry GOTO m011 ; { ; power_out = 0; BCF 0x03,RP0 BCF 0x05,power_out ; // brake_out = 0; ; return; RETURN ; } ; goto LOOP_1; ;} ; ;/****************************/ ;/*Função de paragem do motor*/ ;/****************************/ ; ;void stop_motor() ;{ stop_motor ; power_out=0; BCF 0x03,RP0 BCF 0x05,power_out ;// brake_out=1; ; var_0=0; CLRF var_0 ; var_1=0; CLRF var_1 ; GIE = 0; BCF 0x0B,GIE ;} RETURN ; ;/*************/ ;/*Função Main*/ ;/*************/ ;void main (void) ;{ main ;uns8 temp; ; PORTA=0; BCF 0x03,RP0 CLRF PORTA ; TRISA= 0B11111011; MOVLW .251 BSF 0x03,RP0 MOVWF TRISA ; PORTB =0; BCF 0x03,RP0 CLRF PORTB ; TRISB= 0b11111111; MOVLW .255 BSF 0x03,RP0 MOVWF TRISB ; OPTION=0b01000000; MOVLW .64 MOVWF OPTION_REG ; INTCON=0b00100000; MOVLW .32 MOVWF INTCON ; ; var_0 = 0; CLRF var_0 ; var_1 = 0; CLRF var_1 ; var_2 = 0; CLRF var_2 ; flag = 0; CLRF flag ; flag_int=1; BSF 0x14,flag_int ; count=0; CLRF count ; ; ; stop_motor(); CALL stop_motor ; arranque(); CALL arranque ; var_0=0; CLRF var_0 ;LOOP_04: ; while (signal_in ==0)/*antes era signal_in==1*/ m012 BCF 0x03,RP0 BTFSC 0x06,signal_in GOTO m013 ; { ; flag_count=1; BSF 0x14,flag_count ; var_0++; INCF var_0,1 ; delay(1); MOVLW .1 CALL delay ; flag_count=0; BCF 0x14,flag_count ; } GOTO m012 ; ; if (var_0>=43 && var_0<=88) /*Atenção a partir deste ponto*/ m013 MOVLW .43 SUBWF var_0,W BTFSS 0x03,Carry GOTO m016 MOVLW .89 SUBWF var_0,W BTFSC 0x03,Carry GOTO m016 ; { ; // brake_out=0; ; if (var_0>=69 && var_0<=88) MOVLW .69 SUBWF var_0,W BTFSS 0x03,Carry GOTO m014 MOVLW .89 SUBWF var_0,W BTFSC 0x03,Carry GOTO m014 ; { ; var_0=75; MOVLW .75 MOVWF var_0 ; } ; var_1=var_0-25; m014 MOVLW .25 SUBWF var_0,W MOVWF var_1 ; #asm ; movlw 4 MOVLW .4 ; movwf temp_asm MOVWF temp_asm ; movf var_1,w MOVF var_1,W ; ; LOOP_ASM ; addwf var_1,f m015 ADDWF var_1,1 ; decfsz temp_asm,f DECFSZ temp_asm,1 ; goto LOOP_ASM GOTO m015 ; bsf INTCON,7 BSF INTCON,7 ; btfss flag,2 BTFSS flag,2 ; bsf INTCON,2 BSF INTCON,2 ; #endasm ; var_0=0; CLRF var_0 ; count=5; MOVLW .5 MOVWF count ; ; } /*Até este ponto*/ ; ; ; else GOTO m019 ; { ; if (var_0 > 25 && var_0<50) m016 MOVLW .26 SUBWF var_0,W BTFSS 0x03,Carry GOTO m017 MOVLW .50 SUBWF var_0,W BTFSC 0x03,Carry GOTO m017 ; { ; stop_motor(); CALL stop_motor ; } ; else GOTO m018 ; { ; count--; m017 DECF count,1 ; } ; if (count ==0) m018 MOVF count,1 BTFSC 0x03,Zero_ ; { ; stop_motor(); CALL stop_motor ; } ; var_0=0; CLRF var_0 ; var_1=0; CLRF var_1 ; var_2=0; CLRF var_2 ; ; ; } ; ; while (signal_in==1)/*Antes era signal_in==0*/ m019 BCF 0x03,RP0 BTFSS 0x06,signal_in GOTO m012 ; { ; ; /* if (bat_test !=1) ; { ; stop_motor(); ; ; } */ ; for (var_2=25; var_2>0; var_2--) MOVLW .25 MOVWF var_2 m020 MOVF var_2,1 BTFSC 0x03,Zero_ GOTO m024 ; { ; for (var_3=70; var_3>0; var_3--) MOVLW .70 MOVWF var_3 m021 MOVF var_3,1 BTFSC 0x03,Zero_ GOTO m023 ; { ; delay(2); MOVLW .2 CALL delay ; if (signal_in !=1) BCF 0x03,RP0 BTFSC 0x06,signal_in GOTO m022 ; { ; var_2=1; MOVLW .1 MOVWF var_2 ; var_3=1; MOVLW .1 MOVWF var_3 ; } ; ; ; } m022 DECF var_3,1 GOTO m021 ; } m023 DECF var_2,1 GOTO m020 ; if (signal_in ==1) m024 BCF 0x03,RP0 BTFSS 0x06,signal_in GOTO m019 ; { ; stop_motor(); CALL stop_motor ; } ; ; } GOTO m019 ; goto LOOP_04;
END
; *** KEY INFO ***
; 0x0004 24 word(s) 2 % : int_server ; 0x001C 7 word(s) 0 % : delay ; 0x0023 14 word(s) 1 % : teste ; 0x0031 27 word(s) 2 % : arranque ; 0x004C 6 word(s) 0 % : stop_motor ; 0x0052 114 word(s) 11 % : main
; RAM usage: 11 bytes (4 local), 57 bytes free ; Maximum call level: 3 (+1 for interrupt) ; Total of 193 code words (18 %)
O código HEX para o PIC é o seguinte...
:02000000522884 :100008008C00030E8D001415141810281109831282 :100018008100051514141528110883128100051193 :1000280014100B118B170D0E83008C0E0C0E09008B :100038008F008F08031922288F031D2808009001BC :100048008312861D29280000242883128619302847 :10005800900A02301C2029280800831286193628A5 :10006800000031288312861D3B28000036282320F3 :100078002B301002031C44281F301002031C3B289D :1000880023202C301002031844288312051108007D :1000980083120511900191018B13080083128501C9 :1000A800FB308316850083128601FF308316860095 :1000B8004030810020308B00900191019201940121 :1000C800141496014C20312090018312861972284D :1000D8009414900A01301C20941069282B301002C7 :1000E800031C942859301002031894284530100234 :1000F800031C842859301002031884284B309000C0 :100108001930100291000430950011089107950BE1 :100118008A288B17141D0B15900105309600A52809 :100128001A301002031C9E283230100203189E2831 :100138004C209F289603960803194C2090019101A2 :1001480092018312861D69281930920092080319BA :10015800BF284630930093080319BD2802301C209D :1001680083128619BB280130920001309300930353 :10017800AF289203AA288312861DA5284C20A528FB :02400E00F23F7F :00000001FF
Não esquecer os fuses, não protejam o PIC (para o caso de terem de o reprogramar), e escolher o cristal em HS ou XT.
|