Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

JTeixeira

Problema no Arduino (C)

Mensagens Recomendadas

JTeixeira    0
JTeixeira

Boas,

Tenho um Arduino Mega 2560, que estou a começar a aprender a programar usando o atmel studio 7.0.

Criei a "External Tool" para fazer a compilação e o upload do programa para o arduino.

Para começar, fiz um funcionamento simples, que consiste em três switchs de pressão e um display de 7 segmentos, em que pressionando cada switch é apresentado no display o seu respectivo numero (1,2 ou 3) durante 1 segundo.

aqui está o codigo:

#define F_CPU 16000000L
#include <avr/io.h
#include <util/delay.h>
volatile unsigned char digito;

const unsigned char tabela[]={0xc0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xFF, 0x86};

void inicio (void)
{
DDRB=0b00000000;
PORTB=0b00000000;
DDRA=0xFF;
PORTA=0xFF;

}

void display(void)
{
PORTA=tabela[digito];
_delay_ms(1000);
PORTA=0xFF;
}

int main(void)
{
inicio();

while (1)
{
if(PINB & (1 << PINB0)==1) //If switch 1 is pressed
{
digito=1;  // 1 Display
display();
}

if(PINB & (1 << PINB1)==1) //If switch 2 is pressed
{
digito=2;	// 2 Display
display();
}

if(PINB & (1 << PINB2)==1) //If switch 3 is pressed
{
digito=3;   // 3 Display
display();
}

}
}

Acontece que quando pressiono o switch 2 e 3 não acontece nada, apenas funciona com o switch 1. Já tentei alterar para outro PORT, mas em todos apenas está a ler o PIN0 de cada PORT.

Alguém me pode ajudar a resolver isto?

Editado por Rui Carlos

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bubulindo    108
bubulindo

Tanto quanto vejo, a variavel digito nao precisa de ser volatile e deve ser iniciallizada com alguma coisa... Mas isso nao explica o que estas a ver.

Para tirares a limpo se o hardware esta bom, podes fazer algo como:

digito = PINB & 0b111; //Assim com a combinacao das teclas podes correr os digitos todos. Isto garante que o hardware esta bom.

Eu ha ja algum tempo que nao faco isto, e o codigo para verificar o bit parece esquisito... Logo, podes tentar isto:

if( (PINB & (1 << PINB2)) ==1) //If switch 3 is pressed

A diferenca sao os parentesis para garantir o que vai ser comparado e de facto o que se quer comparar. Isto pode ou nao ser a causa do problema, mas eu por norma programo assim para evitar problemas com as precedencias e definir eu mesmo como o calculo e feito.

Ou entao, definir estas macros:

#define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))
#define FLIPBIT(ADDRESS,BIT) (ADDRESS ^= (1<<BIT))
#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))

Quando programava directamente com o AVR-GCC, ou quando preciso de fazer algo de forma eficiente com os pinos num Arduino, ainda defino essas macros para nao andar para tras e para a frente a calcular mascaras.

Dei agora uma vista de olhos no esquema do Arduino mega e o porto B (pinos 1,2 e 3) sao os pinos da comunicacao SPI. Como estas a usar o AVR Studio, fiquei a pensar se estas a programar com um programador externo ou se porventura estas a usar o arduino com o bootloader...

Outra coisa que pode afectar isto e se tens um shield ligado que faca uso desses 3 pinos.

No entanto, como dizes que so esses tres pinos e o hardware e o mesmo, fiquei a pensar que muito provavelmente e isso que se esta a passar.

Editado por bubulindo

include <ai se te avio>

Mãe () {

}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
JTeixeira    0
JTeixeira

Obrigado pela resposta, mais tarde já vou experimentar.

O arduino apenas está ligado aos switch e ao display, não tem nenhuma shield ligada.

Para fazer a programação usei a "external tool" e passei alguns comandos que surgem na consola do software arduino ao compilar e o avrdude.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bubulindo    108
bubulindo

Ok... entao nao tens mais hardware la ligado... Eu tive um projecto em que tinha sempre esse problema quando queria programar o controlador e tinha um periferico nos pinos SPI, dai ter pensado nisso.

Se nao tens mais nada la ligado... parece-me estranho. Experimenta o que meti em cima para testares o hardware e tambem a logica no que toca a precedencia dos operadores.

Outra coisa... mas ai o sistema ia dar em doido e se nao tiveres pull ups nos botoes. Tambem pode ser que tenhas uma ligacao mal feita na breadboard ou mau contacto... depois deixa aqui o resultado da experiencia.


include <ai se te avio>

Mãe () {

}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
JTeixeira    0
JTeixeira

boas,

Só tive oportunidade de testar hoje o código, porém continua a não funcionar.

Para confirmar se o hardware estava funcional, fiz o mesmo programa no software do arduino, e funciona correctamente.

Penso que o problema seja talvez na associação, das bibliotecas, que o Atmel faz para os PORT's e PIN's, porque também acontece o mesmo nos outros PORT's, ou seja, apenas funciona o PIN0 de cada um.

Alguém me pode indicar outra forma de programar o arduino em C, como no Atmel Studio?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
bubulindo    108
bubulindo

Ja experimentaste nao usar PINB2 e PINB1, por exemplo? Usares 1 e 2...

Podes instalar o WinAVR...


include <ai se te avio>

Mãe () {

}

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.