LusoRobótica - Robótica em Português

Sistemas específicos => Arduino / AVR => Tópico iniciado por: senso em 10 de Março de 2010, 16:53

Título: Utilizar porto de saida em vez de pino a pino
Enviado por: senso em 10 de Março de 2010, 16:53
Olá a todos, bem sei que o nome do tópico não é o mais claro, mas como comprei agora um arduino quero brincar com aquilo e ao usar a linguagem de programação do mesmo deparei-me com uma duvida que gostava de resolver, aqui vai:
Tenho 8 led's ligados no arduino, por exemplo do digital 2 até ao digital 9 e queria basicamente meter o arduino a contar até 255 em binário, mas não estou a ver como fazer isso, quer dizer sem ser PORTC |= count, penso que seja assim usando os registos.
Alguém pode ajudar?
Título: Re: Utilizar porto de saida em vez de pino a pino
Enviado por: p0wd3r em 10 de Março de 2010, 19:00
Que confusão aí vai ãh  ???

Primeiro falas em portos, depois em contagens! Pelo que percebi tens 8 LED's ligados a um porto e queres contar até 255 para depois fazer alguma coisa. Para fazeres isso podes recorrer ao timer/counter do microcontrolador. Facilmente vais perceber isso se leres um bocadinho  :P
Título: Re: Utilizar porto de saida em vez de pino a pino
Enviado por: microbyte em 10 de Março de 2010, 19:12
Que confusão aí vai ãh  ???

Primeiro falas em portos, depois em contagens! Pelo que percebi tens 8 LED's ligados a um porto e queres contar até 255 para depois fazer alguma coisa. Para fazeres isso podes recorrer ao timer/counter do microcontrolador. Facilmente vais perceber isso se leres um bocadinho  :P
Não vai confusão nenhuma. Quer fazer uma contagem em binário com 8 LEDs.

Vê lá se consegues fazer alguma coisa com este exemplo que encontrei:
Código: [Seleccione]
unsigned char count;

void setup (void) {
  pinMode (8, OUTPUT);
  pinMode (9, OUTPUT);
  pinMode (10, OUTPUT);
  pinMode (11, OUTPUT);
  pinMode (12, OUTPUT);
}

void loop (void) {
  PORTB = count++;
  delay (500);
}
Título: Re: Utilizar porto de saida em vez de pino a pino
Enviado por: senso em 10 de Março de 2010, 19:34
Ainda ontem fiz precisamente isso numa aula prática de uma cadeira minha, mas usando um 80186(bem antigo eheh), e em asm é bem simples, este programa começa em 00000000 e vai incrementando o valor de 1 em 1 bit e sempre que um bit está a um o led referente fica ligado, é uma coisa muito simples e básica mesmo:
Código: [Seleccione]
start:
mov ax, cs
mov ds, ax
nop
call main
int 0x10                        ;Código de inicialização e coloca ds=cs
;
ADDR EQU 0x7800 ;Endereço da minha placa usa o IO7
Dig1 EQU 0x7F
;

main:
mov dx,ADDR
mov al, Dig1
L1: out dx, al                        ;Loop L2 faz a escrita sucessiva do valor de al
mov cx, 20000
L2: dec cx                             ;Loop L2 implementa um delay para que se possa ver os led's a mudar de estado
jnz L2
jmp L1
ret

Sei que usando c para avr teria de configurar o registo DDR referente a um porto á minha escolha, mas como já me disseram, só o porto D é que está completamente acessível e mesmo assim o bit 0 e o bit 1 do porto estão "reservados" para os sinais Rx e Tx, logo quanto muito fazia um contador com 6 led's.
Mas poderia haver algo para simplificar a escrita num porto inteiro já que os digitalWrites são criados a partir de bitmasking em cada porto, mas parece que só mesmo programando os registos directamente
Título: Re: Utilizar porto de saida em vez de pino a pino
Enviado por: p0wd3r em 10 de Março de 2010, 22:51
Não vai confusão nenhuma. Quer fazer uma contagem em binário com 8 LEDs.

xiii então não tem nada a ver com aquilo que percebi  :o Agr sim, entendi o que ele quer  ;D
Título: Re: Utilizar porto de saida em vez de pino a pino
Enviado por: Njay em 11 de Março de 2010, 00:09
Só faltam aí uns bits, micro.

Código: [Seleccione]
void setup (void) {
    DDRB = 0xff;
}

void loop (void) {
    PORTB++;
    delay (1000);
}
Título: Re: Utilizar porto de saida em vez de pino a pino
Enviado por: senso em 11 de Março de 2010, 19:44
Obrigado :D