• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

mitrax

programação em C de um robot

5 mensagens neste tópico

boa tarde,

Estou a tentar desenvolver um robot, tipo AGV, com base num microcontrolador 8051. A programação do micro será feita atraves da linguagem C.

Facultaram-me um codigo, no qual estou a encontrar algumas dificuldades de interpretação. Será que alguem pode dar uma ajuda?  :D

Codigo:

#include d:\mc51\8051io.h
#include d:\mc51\8051reg.h
extern register unsigned char speedleft,speedright;
register unsigned char high,low,flag,time;

main()
{
  P1=0x40;
  P3=0xff;
  high = 80;
  low  = 30;
  flag = 0;
  time = 50;
  Start();
    while(1) {
              P3|= 0x0f;
              Run();
              }
}

Start()
{
  char exit,key;
  exit =1;
     while(exit)
      {
        key = P1;
        if((key & 0x40)==0) exit=0;
      }
}         

Run()
{
   char sensors;
   sensors = (P3 &=0x0f);

       if((sensors & 0x01)==0) {
        TurnRight();
        flag = 1;              }

else  if((sensors & 0x08)==0) {
         TurnLeft();
         flag = 2;             }
else  if(sensors == 0x09)    {
        Forward(high);
        flag = 0;              }

else  if(((sensors==0x0b)||(sensors==0x0d))&&(flag==0))
          Forward(low);

}

Forward(char speed)
{
  P1=0x64;
  speedright = speed+10;
  speedleft  = speed;
  delay(time);
}

TurnRight()
{
  P1=0x68;
  speedright = low+5;
  speedleft  = low;
  delay(time);
}

TurnLeft()
{
  P1=0x54;
  speedright = low+5;
  speedleft  = low;
  delay(time);
}

Reverse(char speed)
{
  P1=0x58;
  speedright = speed;
  speedleft  = speed+5;
  delay(time);
}

as minhas principais dificuldades encontram-se em linhas como:

- if((sensors & 0x01)==0)

- if((sensors & 0x08)==0)

- P1=0x64

segundo apurei tratam-se de mascaras, no entanto ainda n consegui perceber o seu funcionamento... :P

obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

deverias verificar a documentação do microcontrolador, ou das bibliotecas que estás a incluir.... lá deve haver explicação...

Também tem por aí um pouco de electronica que tens de saber. faz ands de sensores com 0001, 1000 e 1001 para decidir para que lado vira, e tal.....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Devias estudar operações bit a bit e conversão entre base numéricas. A explicação das linhas que escreveste são:

- if((sensors & 0x01)==0)

- if((sensors & 0x08)==0)

Como disseste, são máscaras. Neste caso são utilizadas com ands bit a bit.

O and bit a bit funciona assim: dados 2 valores A e B, no resultado são colocados a zero os índices onde em A ou em B exista pelo menos um zero, e são colocados a um os índices onde A e B sejam ambos 1. Por exemplo:

    00010110

  & 10110101

    00010100

    11111111

  & 10010110

    10010110

    11110000

  & 00001111

    00000000

Só onde ambos os valores têm 1 é que o resultado tem 1.

- P1=0x64

Suponho que saibas o que são os portos do 8051. A sua "representação" física são 8 pinos que tanto servem de input como de output. Queimei uns quantos microcontroladores à pala de não os colocar a 1 quando queria servir-me deles como input ::P  Para os leres ou modificares, utilizas as definições P0, P1, P2 e P3, isto no 8051 original.

Mas isto não tem nada que saber. A representação binária de 0x64 é 0110 0100, por isso ao fazeres P1 = 0x64 estás a colocar nos pinos a configuração:

P1.7    ...    P1.0

  | | | | | | | |

  0 1 1 0 0 1 0 0

onde o número à frente do ponto é o peso do pino do porto.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

obrigado theDark, já percebi o funcionamento.

mto obrigado  :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Incómodo nenhum :)

Esse código coloca em P3 o resultado do and bit a bit do valor actual de P3 com 0x0f, que é 00001111 em binário. Depois coloca em sensors o valor que está em P3, depois de alterado.

Tanto sensors com o porto P3 vão ficar com o valor que estiver nos 4 bits de menor peso do porto P3. É um and entre o valor que está no porto e o valor binário 00001111, ou seja, por exemplo, para os seguintes valores de P3, sensors terá:

  P3 = 11111111

0x0f = 00001111

      00001111

  P3 = 11110000

0x0f = 00001111

      00000000

  P3 = 10011010

0x0f = 00001111

      00001010

Desculpa se me estou a repetir, mas é a melhor forma que arranjei para me explicar...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora