64
Atelier de Formação Iniciação à robótica móvel Bases de Programação Associação Nacional de Professores de Electrotecnia e Electrónica DEAR Robot

Atelier de Formação DEAR Iniciação à robótica móvel · Estrutura de um microcontrolador C periféricos periféricos. Arquitectura interna de um microprocessador UCP Memória

Embed Size (px)

Citation preview

Atelier de Formação

Iniciação à robótica móvel

Bases de Programação

Associação Nacional de Professores de

Electrotecnia e Electrónica

DEAR

Robot

Microcontrolador

Circuito integrado em alta escala (VLSI) que

incorpora a maior parte dos elementos que

constituem um controlador e se destina a

uma determinada tarefa.

Costuma estar incorporado no dispositivo

que controla (controlador embebido -

embedded controller).

indústria informática

(periféricos: rato, teclado,...)

electrodomésticos (fornos,

máq. lavar, vídeos, etc)

sistemas AVACs

telecomunicações

indústria automóvel

Aplicações

Um microcontrolador dispõe normalmente

dos seguintes elementos:

processador ou CPU

memória de dados (RAM)

memória de programa

(ROM/PROM/EPROM/EEPROM)

linhas de entrada/saída (E/S) programáveis

Constituição

módulos de controlo de periféricos (portos

série, paralelo,USB,I2C,etc.)

gerador de impulsos de relógio

temporizadores

cão-de-guarda (watchdog)

conversores A/D e D/A

comparadores analógicos

Constituição

microprocessador vs.

microcontrolador

o microprocessador é um sistema aberto

constrói-se um computador com as

características desejadas juntando os

módulos necessários

o microcontrolador é um sistema fechado

contem um computador completo e as

suas prestações limitadas não se podem

modificar

Estrutura de um

microprocessador

bus de controle

P

Memória controlador 2controlador 1

bus de endereços

bus de dados

periféricos periféricos

Estrutura de um

microcontrolador

Cperiféricos periféricos

Arquitectura interna de

um microprocessador

UCP

Memória

Instruções

+

dadosbus de dados

e instruções

bus comum

de endereços

8

Arquitectura “von Neumann” ou “Princeton”

Arquitectura interna de

um microcontrolador

Arquitectura “Harvard”

UCPMemória

de

dados

bus de dados

bus de

endereços de

dados

8

Memória

de

Instruções

9

bus de

endereços de

instruções10

14

bus de

instruções

Arquitectura interna de

um microcontrolador

RISC - Reduced Instruction Set Computer

(35 no 16F84)

versus

CISC - Complex Instruction Set Computer

(+150 no 8086)

Arquitectura interna de

um microcontrolador

Memória de Programa

Tipologia

PROM (Programmable Read Only Memory)

EPROM (Electrically PROM)

OTP (One Time Programmable)

EEPROM (Electrically Erasable PROM)

FLASH

Arquitectura interna de

um microcontrolador

Memória de Dados

SRAM (Static RAM)

EEPROM

Arquitectura interna de

um microcontrolador

Programação

linguagem assembly

linguagens HLL (High Level Language):

Pascal, Basic, JAL, C

Compiladores vs. Interpretadores

Picaxe 28X

Características:

600 linhas código

21 pinos E/S

9-17 saídas

0-12 entradas

0-4 entradas A/D

2 saídas PWM

Picaxe 28X

Pinos de

Entrada/Saída

configuráveis

Pinos de

Entrada/Saída

configuráveis

Entradas

Analógicas

ou Digitais Pinos de

Saída

Picaxe 28X

Pinos de Saída

PWM

Entradas

Analógicas

A/D

Linguagens de programação

PBasic (compatível com Basic Stamp).

Ambiente integrado de desenvolvimento com suporte para programação gráfica por fluxogramas.

Editor, compilador, programador,debugger e simulador incorporados.

Lógica de Programação

O paradigma “tradicional”:

Pressupõe um modelo do mundo

SensoresInterpretação

dos sensores

Modelo

do Mundo

PlaneamentoExecuçãoActuadores

Lógica de Programação

O paradigma das interacções prioritárias de Rodney Brooks

Utiliza uma estratégia em que só os sensores são os iniciadores dos comportamentos.

Os comportamentos são sistemas em camadas de controlo que funcionam em paralelo, cada vez que os sensores apropriados são activados.

Um sistema de arbitragem de prioridades é utilizado para activar o comportamento dominante.

Todos os comportamentos funcionam em paralelo, com os de mais alto nível a suprimirem o funcionamento dos de nível inferior.

Lógica de Programação

O paradigma das interacções prioritárias de Rodney Brooks

Exemplo:

Sensor Pista MotoresSeguirPista S

Sensor Cor Detectar_Cor S

Bumpers Escapar

Sensor Procedimento Actuador

BASIC

Programa = dados + instruções

Elementos da Linguagem de Programação BASIC

Símbolos

Variáveis

Constantes

Instruções

BASIC

LABELS

As labels (etiquetas) são usadas como marcadores em todo o programa. As labels são usadas para marcar uma posição para onde “saltar” no programa através de uma instrução goto, gosub ou outra instrução.

Uma label pode ser qualquer palavra (não reservada) e pode conter dígitos e o carácter underscore ( _ ). As labels devem ter como carácter inicial uma letra (não um dígito), e são definidas com o sinal dois-pontos (:) a seguir ao nome. O sinal não é necessário quando a label faz parte integrante de instruções.

BASIC

O compilador não é case-sensitive (sensível a maiúsculas), pelo que podem ser usadas indiscriminadamente maiúsculas e minúsculas.

Exemplo:ciclo:

high 1 ; liga a saída 1

pause 500 ; espera de 5 segundos

low 1 ; desliga a saída 1

PAUSE 500 ; espera de 5 segundos

goto Ciclo ; salto para o início

BASIC

Espaços em branco e Sintaxe

Whitespace (espaço em branco) é o termo utilizado pelos programadores para definirem a área branca na impressão de um programa. Nela se incluem os espaços, as tabulações e as linhas vazias. Qualquer uma delas pode ser utilizada no programa para o tornar mais compreensível e facilitar a leitura.

Convencionou-se colocar as labels encostadas à esquerda. Todas as outras instruções devem ser espaçadas através da tecla de tabulação. Esta convenção torna o programa mais fácil de ler e de seguir.

BASIC

COMENTÁRIOS

Os comentários começam por um apóstrofe („) ou ponto e vírgula (;) e continuam até ao fim da linha. A instrução REM pode também ser utilizada para inserir comentários.

Exemplos:

high 0 „coloca pin0 alto

high 2 ;coloca pin2 alto

REM coloca pin3 alto

BASIC

CONSTANTES

As constantes podem ser declaradas de quatro modos diferentes:decimais, hexadecimais, binárias e ASCII.

Os números decimais são escritos directamente sem qualquer prefixo.

Os números hexadecimais (hex) são precedidos pelo sinal dólar ($).

Os números binários são precedidos pelo sinal de percentagem (%).

Os valores ASCII são colocados entre plicas (“).

BASIC

Exemplos:

100 „ 100 em decimal

$64 „ 64 hex

%01100100 „ 01100100 binário

“A” „ “A” ascii (65)

“Hello” „ “Hello” – equivalente a “H”, “e”, “l”, “l”, “o”.

B1 = B0 ^ $AA „ ou exclusivo da „variável B0 com AA hex

BASIC

SÍMBOLOS

Os símbolos podem ser associados a valores constantes, nomes alias (alternativos) para variáveis e endereços de programa. Os valores constantes e os nomes alias de variáveis são atribuídos fazendo seguir ao nome do símbolo o sinal de igual (=), seguido da variável ou constante.

Os símbolos podem utilizar qualquer palavra que não seja reservada (instruções).

Os símbolos podem conter letras e números, mas o primeiro carácter é obrigatoriamente uma letra. O uso dos símbolos não aumenta a dimensão do programa e torna-o mais legível.

BASIC Os endereços de programa são atribuídos fazendo seguir o

símbolo pelo sinal dois pontos (:).

Exemplo:

symbol LED_E = 7 „ define um pino de saída

symbol CONTA = B0 „ define o símbolo de uma variável

let CONTA = 200 „ carrega a variável com o valor „ 200

CICLO: „ define endereço de programa

high LED_E „ liga a saída 7

pause CONTA „ espera 0,2 segundos (200 milisegundos)

low LED_E „ desliga a saída 7

pause CONTA „ espera 0,2 segundos

goto CICLO „salta para o início CICLO

BASIC

Compreendendo a memória do PICAXE

A memória do PICAXE é constituída por três áreas diferentes. A quantidade de memória varia conforme o tipo de PICAXE.

Memória de Programa

A memória de programa é onde o programa é guardado após uma transferência (download). Trata-se de uma memória rápida tipo FLASH, que se pode reprogramar até cerca de 100 000 vezes. O programa não se perde quando se desliga a alimentação, pelo que é executado assim que esta é ligada de novo. Não é normalmente necessário apagar um programa, pois cada novo downloadreprograma toda a memória.

BASIC

Num PICAXE28X pode carregar cerca de 600 linhas de programa. Este valor é aproximado, pois cada instrução ocupa espaços diferentes em memória.

Para verificar a memória livre basta seleccionar o menu PICAXE>Check Syntax.

Memória de Dados

A memória de dados é um espaço adicional de memória do microcontrolador. Os dados também não são perdidos quando se desliga a alimentação. Em cada transferência de dados (download) esta memória é posta a 0.

BASIC

RAM (Variáveis)

A memória RAM é usada para guardar dados

temporários em variáveis durante a execução do

programa. Esta memória perde toda a informação

quando se desliga a alimentação. Existem três tipos

de variáveis – usos gerais, armazenamento e

funções especiais.

BASIC

Variáveis de Usos Gerais (GPR – General Purpose Registers)

Existem 14 variáveis de usos gerais tipo byte. Estas variáveis byte são designadas b0 a b13. As variáveis tipo byte (8 bits) podem guardar números inteiros entre 0 e 255.

Para números maiores podem combinar-se duas variáveis byte de modo a criar uma variável word, que é capaz de guardar números inteiros entre 0 e

65535.

BASIC

Estas variáveis word são designadas w0 a w6, e são

construídas do seguinte modo:

w0 = b1 : b0

w1 = b3 : b2

w2 = b5 : b4

w3 = b7 : b6

w4 = b9 : b8

w5 = b11 : b10

w6 = b13 : b12

BASIC

Para além disso os bytes b0 e b1 (w0) podem ser divididos em variáveis bit.

As variáveis bit podem ser utilizadas onde for necessário guardar um único bit (0 ou 1) numa variável

b0 = bit7: bit6: bit5: bit4: bit3: bit2: bit1: bit0

b1 = bit15: bit14: bit13: bit12: bit11: bit10: bit9: bit8

Pode utilizar qualquer variável word, byte ou bitnuma expressão matemática ou instrução que utilize variáveis.

BASIC

Variáveis para Funções Especiais (SFR)

As variáveis disponíveis para funções especiais dependem do tipo de PICAXE.

pins = representa o dado lido no porto de entrada

pins = representa o porto de saída na escrita

Note que pins é uma „pseudo‟ variável que se pode aplicar tanto a portos de entrada como de saída.

Quando usado à esquerda de uma expressão de atribuição de pinos aplica-se ao porto de saída.

BASIC

Por exemplo,let pins = %11000011

vai colocar as saídas 7,6,1,0 altas e as

restantes baixas.

O sinal % indica ao compilador que se está a trabalhar em binário, em vez de decimal.

Quando usado à direita de uma expressão de atribuição de pinos aplica-se ao porto de entrada (porto C no PICAXE28X).

Por exemplo,let b1 = pins

vai guardar em b1 o estado actual do porto de entrada.

BASIC

A variável pins está separada em variáveis bit

individuais para leitura de entradas bit individuais

através da instrução if...then.

pins = pin7 : pin6 : pin5 : pin4 : pin3 : pin2 : pin1 : pin0

Programming Editor

Instalação e password (picaxebegin)

Configuração (Menu View/Options)

Mode PICAXE-28X

Options: 4MHz

Serial Port

Language

Programming Editor

Programação em BASIC

Programação por Fluxograma

Programming Editor

Programação por Fluxograma

Simbologia

Início/Fim

Processo: acção a ser realizada

E/S define entradas e saídas

Decisão a tomar

Conector

Subrotina

Programming Editor-exemplo

start

low 4

pin0=1Y

N high 4

pin0=0Y

N

pin6=1Y

N

pin7=1Y

N gosub blue gosub red

red blue

high 7

high 6

pause 3000

low 7

low 6

return

return

let b0= 0

let b0=b0+ 1

let pins = 96

let pins = 160

pause 2000

pause 2000

let pins = 16

high 0

low 0

let pins = 32

pause 3000

Green LED off

Green LED on

Door open again!

Check

door switch

Test red & blue switches

Lock solenoid

Do motor

sequence

Unlock door

Program for Washing Machine Model

b0> 10

Y

N

main:

label_6: low 4

label_D: if pin0=1 then label_19

goto label_D

label_19: high 4

label_20: if pin0=0 then label_6

if pin6=1 then label_4D

if pin7=1 then label_44

goto label_20

label_44: gosub blue

goto label_6

label_4D: gosub red

goto label_6

Programming Editor-exemplo

start

avancar esquerda direita

forward left right

pwmout 1,10,40

pwmout 2,10,40

returnreturn

pwmout 2,10,40

pwmout 1,10,40 pwmout 1,10,40

pwmout 2,10,40

return return

pwmout 2,10,40

pwmout 1,10,40

let b0=pins& 224

b0= 0

Y

N b0= 32

Y

N b0= 64

Y

N b0= 96

Y

N b0= 128

Y

N b0= 224

Y

Nb0= 160

Y

N b0= 192

Y

N

gosub avancar gosub esquerda gosub avancar gosub esquerda gosub direita gosub avancar gosub esquerda gosub parar

000001 010 011 100 101 110 111

halt

parar

gosub ler_cor

alarmeler_cor

readadc 0,b1sound 0,(50,50)

pause 1000

return

b1> 20

Y

N

b1< 70

Y

N

b1> 132

Y

N

b1< 150

Y

N

gosub alarme

return

As coisas complicam-se

BASIC

Instruções BASIC essenciais

Controlo de pinos de Saída– high 1

– low 2

– pins=%00000110

– high portc 1

Leitura de pinos de entrada– b0=pins

– if pin0=1…

BASIC

Saídas PWM– Instrução pwmout

– Sintaxe:PWMOUT pino, período, dutycycle

Pino é uma variável/constante que especifica o pino E/S

a usar (1 ou 2).

Período é uma variável/constante (0-255) que estabelece

o período do sinal de PWM.

Duty cycle é uma variável/constante (valor de 10 bits,

logo, de 0-1024) que define o ciclo de trabalho (tempo

em que o sinal está alto em cada período).

BASIC

Esta instrução difere de todas as outras pelo facto de ser executada continuamente (independente do resto do programa) até que outra instrução pwmout seja enviada.

Para parar o sinal pwmout, basta enviar uma instrução pwmoutcom o período 0.

Período PWM = (período + 1) x 4 x (1/4000000) = (período + 1) us

Ciclo Trabalho = (dutycyle) x (1/4000000) = (dutycycle)/4 us

BASIC

Exemplo: Controlo de um motor

Programa

Inicio:

high 7

low 6

pwmout 1,100,300

end

BASIC

Salto incondicional

– goto label

Controlo de fluxo

– If condição then label

start

pin0=1Y

N

Aqui Ali

BASIC

inicio:

if pin6 = 0 then direita

goto esquerda

„**************************

esquerda:

low 7

low 6

high 5

low 4

pwmout 1,10,25

pwmout 2,10,25

goto inicio

„***************************

direita:

high 7

low 6

low 5

low 4

pwmout 1,10,25

pwmout 2,10,25

goto inicio

„*****************************

BASIC

if … then

if … and … then

if … or … then

Sintaxe:

IF variável ?? valor (AND/OR variável ?? valor ...) THEN endereço

Variável (s) é comparada com o valor(s).

Valor é uma variável/constante.

Endereço é uma label (etiqueta) que especifica

o endereço para onde saltar se a condição

se verificar (for verdadeira).

BASIC

?? pode ser qualquer uma das seguintes condições

= igual a

<> não igual a (diferente)

!= não igual a (diferente)

> maior que

>= maior que ou igual a

< menor que

<= menor que ou igual a

BASIC

Seguimento de pista

– Com 1 sensor

– Com 2 sensores

– Com 3 sensores

– Com 3 sensores e flags

Esquema de ligações

M2 M1

9V

9,6V

Alimentação

dos sensores

Ligação

ao cabo

série para

programar

Sensor

de pista

(3inputs)

Sensor de

obstáculos

(2outputs)

Sensor

de cor

Bezouro

Led

BASIC

Subrotinas

Os procedimentos ou subrotinas, são largamente

utilizados na programação para reduzir o tamanho

dos programas, usando secções de código que se

repetem num único procedimento. A passagem de

valores para o procedimento, por variáveis, permite

repetir a mesma secção de código a partir de várias

localizações do programa.

BASIC

GOSUB endereço Return

Endereço é uma label (etiqueta) que especifica o endereço.

Função:

Salta para a subrotina (procedimento) localizado no endereço, regressando quando encontra a instrução return. São permitidas até 16 GOSUBs (ou 256 no Picaxe 28X), podendo ser aninhadas até 4 níveis.

BASIC

GOSUB endereço Return

Informação:

A instrução gosub (ir para um procedimento), é um salto temporário para uma secção separada do código, de onde regressará, através da instrução return.

Cada instrução gosub, deve ter uma instrução returncorrespondente.

Não deve confundir esta instrução com a instrução goto, que é um salto incondicional para uma nova localização no programa.

BASIC

start

pin0=1Y

N

gosub Esquerda gosub Direita

Esquerda Direita

return return

Vantagens face ao “spagheti” dos

gotos.

Programa:

If pin0=1 then…

BASIC

Ciclos repetidos

for … next

Sintaxe:

FOR variável = inicio TO fim {STEP {-} incremento}

NEXT {variável}

Variável vai ser usada como um contador

Início é o valor inicial da variável

Fim é o valor final da variável

Incremento é um valor opcional que se sobrepõe ao valor de incremento normal do contador (+1). Se o incremento for precedido de um „-„, será considerado que Fim é menor que Inicio e, portanto, o valor de incremento é subtraído cada vez que o ciclo se realiza.

BASIC

Informação:

Os ciclos for… next são utilizados para repetir secções de código um certo número de vezes. Quando se usa uma variável byte, o ciclo repete-se até 255 vezes. Cada vez que a linha next é encontrada, o valor da variável ´eincrementado (ou decrementado) do valor definido por step (+1 por omissão). Quando o valor final é ultrapassado o ciclo pára e o fluxo do programa continua a partir da linha seguinte à instrução next.

Os ciclos for…next podem ser encadeados até 8 níveis de profundidade.

BASIC

Exemplo:ciclo:

for b0 = 1 to 20 „ define um ciclo de 20 vezes

high 1 „ liga a saída 1

pause 500 „ espera 0,5 segundos

low 1 „ desliga a saída 1

pause 500 „ espera 0,5 segundos

next b0 „ salta para o início, incrementando b0 de +1,

„ até que b0 = 20

pause 2000 „ espera 2 segundos

goto ciclo „ salto para o início

BASIC

Leituras de tensões analógicas

Instrução readadc10

Sintaxe:

READADC10 canal, variávelword

Canal é uma variável/constante especificando um endereço (0-3) – pinos 2,3,4 e 5.

Variávelword é uma variável word que recebe os dados lidos (0-1024).

Função:

Lê um canal ADC (conversão analógico-digital) de 10 bits de resolução para uma variável de dimensão word (0-1024).

BASIC

Exemplo: sensor de corsymbol leitura = w0

inicio:

readadc10 0,leitura

if leitura < 200 then alarme

goto inicio

alarme:

sound 0,(50,50)

sound 0,(100,50)

sound 0,(120,50)

pause 300

goto inicio

BASIC

Outras instruções:

PAUSE milisegundosMilisegundos é uma variável/constante (0-65535)

que especifica quantos milisegundos dura a pausa.

SOUND pino, (nota, duração, nota, duração, …)Pino é uma variável/constante (0-7) que especifica o pino

E/S a usar.

Nota(s) são variáveis/constantes (0-255) que especificam

o tipo e a frequência.

Nota 0 é silêncio. Notas 1-127 são tons crescentes. Notas

128-255 são ruídos brancos crescentes.

Duração(s) são variáveis/constantes (0-255) que especificam

a duração múltiplos aproximados de 10ms).