Jump to content
JTeixeira

Problema no Arduino (C)

Recommended Posts

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?

Edited by Rui Carlos

Share this post


Link to post
Share on other sites
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.

Edited by bubulindo

include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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 () {

}

Share this post


Link to post
Share on other sites
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?

Share this post


Link to post
Share on other sites
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 () {

}

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

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