Páginas: [1]   Ir para o fundo
  Imprimir  
Autor Tópico: Programa para o speed control  (Lida 442 vezes)
resinba
Moderador Global
Cristal
*****
Offline Offline

Mensagens: 449


« 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.
Registado

Por favor, alterem o meu email no msn pois tenho outro email dedicado aos foruns, e vou bloquear todos os que se encontram no antigo email.
José Flor
José António Flor de Sousa
Chip
*****
Offline Offline

Mensagens: 1 054


OzFlor - José Flor


WWW
« Responder #1 em: Abril 14, 2008, 01:13:57 »

Boa contribuição resinba.
Link ao hardware
José Flor
Registado

Páginas: [1]   Ir para o topo
  Imprimir  
 
Ir para: