Transcript
/********************************************/,,,,
/* ANDR LUIZ ZIMMERMANN NUSP:5437692 */,,,,
/* JULIANA COSTA DE OLIVEIRA NUSP:5432220 */,,,,
/* */,,,,
/* TURMA:04 PROF:JUN OKAMOTO */,,,,
/* DATA: 13/06/07 */,,,,
/********************************************/,,,,
,,,,
"#include ""\mc85\8085io.h
#include ""\mc85\8085int.h",,,,
,,,,
"#define ADD 0xe // base dos endere os usados do display ""ADDress
#define ADD82C55 0xc3 // endere o para carregar a palavra de controle do 82C55
#define ADDPULSE 0xc2 // endere o para ""carregar o n vel l gico"" do bit 2 - produzir PWM
#define BUSY 1 // constante que indica que o display est ocupado
#define COHERENT 7 // flag para movimento cont nuo e concordante dos motores
#define CONFIG 0x3c // comando de configura o do modo do display
#define CONFMODE 1 // modo de configura o (utilizado no flag )
#define CONTRMODE 0 // modo de controle (utilizado no flag )
#define CLEAN 0x01 // comando que limpa a mem ria e o contador do display
#define CW 0xc7 // endere o de envio da palavra de controle dos timers
#define CW0 0x36 // programa o timer 0 para o modo 3, contagem bin ria
#define CW1 0x74 // programa o timer 1 para o modo 2, contagem bin ria
#define CWPI 0x90 // programa o 82C55 para operar no modo 0 com as portas B e C output e a input
#define DEZ 10 // constante de valor dez
#define FIVE 5 // constante de valor 5
#define FLAG 0x80 // m scara usada na consulta do flag de busy
#define IMPROVE 0x06 // comando de incremento do contador do display
#define INFDEFAULT 1 // inicializa o do limite inferior
#define KEYS 0xe8 // constante que armazena o endere o das chaves
#define KEY0 0x01 // m scara para a leitura da chave 0
#define KEY1 0x02 // m scara para a leitura da chave 1
#define KEY2 0x04 // mascara para a leitura da chave 2
#define KEY3 0x08 // mascara para a leitura da chave 3
#define KEY4 0x10 // m scara para a leitura da chave 4
#define KEY5 0x20 // m scara para a leitura da chave 5
#define KEY6 0x40 // m scara para a leitura da chave 6
#define KEY7 0x80 // m scara para a leitura da chave 7
#define LEDS 0xe4 // constante que armazena o endere eo dos LEDS
#define LEVELUP1 0x04 // eleva o n vel l gico da sa da para o servo 1
#define LEVELUP2 0x08 // eleva o n vel l gico da sa da para o servo 2
#define LEVELDOWN 0x00 // muda o n vel l gico da sa da dos servos para 0
#define LIMIT 100 // limite de contagem da fun o STOP na fun o INITLCD
#define LIMITTWO 350 // limite de contagem da fun o STOP
#define LINEONE 0x80 // endere o da primeira linha do display
#define LINETWO 0xc0 // endere o da segunda linha do display
#define LSBT0 0x14 // programa o byte menos significativo de contagem do timer 0
#define LSBT1 0x00 // programa o byte menos significativo de contagem do timer 1
#define MASK 0x01 // m scara utilizada para leitura das teclas (no main)
#define MAX 17 // tamanho do vetor ""s"" que armazena os strings
#define MIDDLE 10 // inicializa o da largura do pulso
#define MSBT0 0x00 // programa o byte mais significativo de contagem do timer 0
#define MSBT1 0x0c // programa o byte mais significativo de contagem do timer 1
#define NINE 9 // constante de valor 9
#define OFF 0x88 // comando para desligar o programa
#define ONDISP 0x0f // comando para ligar o display
#define ONE 1 // constante de valor um
#define OPPOSITE 8 // flag para movimento cont nuo e discordante dos motores
#define POSIMODE 3 // modo de posicionamento (utilizado no flag )
#define RESET 0x10 // comando que zera o cron metro
#define SIX 6 // constante de valor 6
#define SIXTY 60 // constante de valor 60
#define START 0x01 // comando que inicia a contagem do cron metro
#define STOP 0x01 // comando que interrompe a contagem do cron metro
#define SPDDEFAULT 300 // inicializa o da velocidade
#define SUPDEFAULT 16 // inicializa o do limite superior
#define TEN 0x10 // constante de valor 16
#define TIMER0 0xc4 // endere o do timer 0
#define TIMER1 0xc5 // endere o do timer 1
#define TWO 0x02 // constante de valor dois
#define ZERO 0x00 // constante de valor zero
int width1; //vari vel global - largura do pulso para o primeiro servo
int width2; //vari vel global - largura do pulso para o segundo servo
/**************************************/
/* Fun o STOP: pausa temporariamente */
/* a execu o de comandos inserindo */
/* um loop vazio no programa. */
/* */
/* AUTORES: ANDR LUIZ ZIMMERMANN */
/* JULIANA COSTA DE OLIVEIRA */
/* */
/* DATA:03/04/2007 */
/**************************************/
void stop (int limit){
int i;
for(i=ZERO;i<=limit;i++);
}
/***************************************************************************/
/* Fun o CONFIGTIMER: configura o circuito integrado 82C54 programando */
/* o timer0 para o modo 3 e contagem bin ria com constante de valor 100d e */
/* o timer1 para o modo 2 e contagem bin ria com constante de valor 3072d. */
/* gerando pulsos peri dicos com freq encia de 10Hz usados na interrup o */
/* */
/* AUTORES: ANDR LUIZ ZIMMERMANN */
/* JULIANA COSTA DE OLIVEIRA */
/* */
/* DATA:12/04/2007 */
/***************************************************************************/
void configTimer (){
out(CW,CW0);
out(TIMER0,LSBT0);
out(TIMER0,MSBT0);
out(CW,CW1);
out(TIMER1,LSBT1);
out(TIMER1,MSBT1);
}
/***************************************************************************/
/* Fun o CONFIG82C55: configura o 82C55 no modo 0 sendo que a porta A */
/* esta configurada para operar como input e as portas B e C como output */
/* */
/* AUTORES: ANDR LUIZ ZIMMERMANN */
/* JULIANA COSTA DE OLIVEIRA */
/* */
/* DATA:10/05/2007 */
/***************************************************************************/
void config82C55 (){
out(ADD82C55,CWPI);
}
/************************************************************************************/
/* Fun o MAKEPULSE: gera interrup es no processador com freq encia predeterminada */
/* pelo timer e executa uma rotina de interrup o que incrementa o contador global. */
/* */
/* AUTORES: ANDR LUIZ ZIMMERMANN */
/* JULIANA COSTA DE OLIVEIRA */
/* */
/* DATA:11/04/2007 */
/************************************************************************************/
INTERRUPT (32820) makePulse (){
int i;
out(ADDPULSE,LEVELUP1);
for(i=ZERO;iZERO)){,,,,
position1--;//decremento da vari vel que armazena a posi o do servo motor,,,,
width1--;//decremento da largura de pulso,,,,
stop(speed);,,,,
},,,,
,,,,
if((keys&KEY7)!=ZERO)//caso a chave 7 tenha sido pressionada o pr ximo modo de opera o ativado,,,,
flag=CONFMODE;,,,,
},,,,
,,,,
while(flag==CONFMODE){//modo de configura o do servo motor,,,,
keys=in(KEYS);//leitura de chaves,,,,
stop(LIMITTWO);,,,,
,,,,
sprintf(s,"Configuracao "");//tela inicial do LCD para o respectivo modo de opera o
setCursorLCD(ADD, ONE, ONE);
putStrLCD(ADD,s);
//mostra a velocidade, o limite inferior do PWM e o limite superior do PMW para os quais o servo est operando
sprintf(s,""v:%04d i:%02d s:%02d",speed, infLimit, supLimit);
setCursorLCD(ADD, TWO, ONE);,,
putStrLCD(ADD,s);,,,
,,,,
if(((keys&KEY0)!=ZERO)&&(supLimit>infLimit)){,,,,
supLimit--;//decremento do limite superior,,,,
width1=supLimit;//atualiza o da largura do PWM,,,,
width2=supLimit;,,,,
position1=DEZ;//servo se movimenta para a posi o 10,,,,
position2=DEZ;,,,,
},,,,
if((keys&KEY4)!=ZERO){,,,,
supLimit++;//incremento do limite superior do PWM,,,,
width1=supLimit;,,,,
width2=supLimit;,,,,
position1=DEZ;,,,,
position2=DEZ;,,,,
},,,,
if(((keys&KEY1)!=ZERO)&&(infLimit>ZERO)){,,,,
infLimit--;//decremento do limite inferior do PWM,,,,
width1=infLimit;//atualiza o da largura do PWM,,,,
width2=infLimit;,,,,
position1=ZERO;//servo se movimenta para a posi o 0,,,,
position2=ZERO;,,,,
},,,,
if(((keys&KEY5)!=ZERO)&&(infLimitZERO)),,,,
speed--;//decremento da velocidade do servo(tempo de resposta),,,,
,,,,
if((keys&KEY6)!=ZERO),,,,
speed++;//incremento da velocidade do servo(tempo de resposta),,,,
,,,,
if((keys&KEY7)!=ZERO),,,,
flag=POSIMODE;//caso a chave 7 tenha sido pressionada o pr ximo modo de opera o ativado,,,,
},,,,
while(flag==POSIMODE){//modo de posicionamento dos motores,,,,
keys=in(KEYS);//leitura de chaves,,,,
stop(LIMITTWO);,,,,
,,,,
sprintf(s,"Posicionamento "");//tela inicial do LCD para o respectivo modo de opera o
setCursorLCD(ADD, ONE, ONE);
putStrLCD(ADD,s);
//mostra a posi o de cada um dos motores
sprintf(s,"" x:%02d y:%02d", position2, position1);,
setCursorLCD(ADD, TWO, ONE);,,
putStrLCD(ADD,s);,,,
,,,,
if(((keys&KEY0)!=ZERO)&&(position1>ZERO)){//decrementa a posi o do motor 1,,,,
position1--;,,,,
temp1--;//guarda temporariamente a nova largura do PWM do motor 1,,,,
},,,,
if(((keys&KEY4)!=ZERO)&&(position1ZERO)){//decrementa a posi o do motor 2,,,,
position2--;,,,,
temp2--;//guarda temporariamente a nova largura do PWM do motor 2,,,,
},,,,
if(((keys&KEY5)!=ZERO)&&(position2infLimit){//deslocamento decremental simult neo dos motores,,,,
width1--;,,,,
width2--;,,,,
stop(speed);,,,,
},,,,
,,,,
if((keys&KEY2)!=ZERO)// chaveia para modo de movimento contr rio,,,,
flag2=OPPOSITE;,,,,
,,,,
if((keys&KEY3)!=ZERO)// p ra o movimento dos motores,,,,
flag2=ZERO;,,,,
,,,,
if((keys&KEY6)!=ZERO){// chaveia para modo de posicionamento,,,,
flag2=ZERO;,,,,
keys=KEY6;,,,,
},,,,
,,,,
if((keys&KEY7)!=ZERO){// chaveia para modo de controle,,,,
flag=CONTRMODE;,,,,
flag2=ZERO;,,,,
keys=KEY6;,,,,
},,,,
},,,,
,,,,
while(((keys&KEY3)==ZERO)&&(flag2==OPPOSITE)){//movimento cont nuo divergente,,,,
keys=in(KEYS);//leitura de chaves,,,,
stop(LIMITTWO);,,,,
,,,,
//configura o para que os motores se movimentem em sentido contr rio,,,,
width1=infLimit;,,,,
width2=supLimit;,,,,
stop(speed);//tempo necess rio para o posicionamento do motor,,,,
,,,,
while(width1infLimit){//deslocamento reverso sincronizado dos motores,,,,
width1--;,,,,
width2++;,,,,
stop(speed);,,,,
},,,,
,,,,
if((keys&KEY2)!=ZERO)// chaveia para modo de movimento contr rio,,,,
flag2=COHERENT;,,,,
,,,,
if((keys&KEY3)!=ZERO)// p ra o movimento dos motores,,,,
flag2=ZERO;,,,,
,,,,
if((keys&KEY6)!=ZERO){// chaveia para modo de posicionamento,,,,
flag2=ZERO;,,,,
keys=KEY6;,,,,
},,,,
,,,,
if((keys&KEY7)!=ZERO){// chaveia para modo de controle,,,,
flag=CONTRMODE;,,,,
flag2=ZERO;,,,,
keys=KEY6;,,,,
},,,,
},,,,
},,,,
},,,,
},,,,
},,,,
disable();,,,,
},,,,