Jump to content
Sign in to follow this  
mitrax

programação em C de um robot

Recommended Posts

mitrax

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

Share this post


Link to post
Share on other sites
nDray

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

Share this post


Link to post
Share on other sites
TheDark

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.


Desaparecido.

Share this post


Link to post
Share on other sites
TheDark

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


Desaparecido.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.