Hallo allemaal,

ik ben code aan het schrijven in AVRstudio om op commando een byte (LED'jes) te laten knipperen, alleen de compiler geeft een error: "../Blink.c:32: error: expected ')' before numeric constant". Dit is dus de regel met het IF-statement.

Dit is mijn code;


#define LED1 PORTC.0
#define LED2 PORTC.1
#define LED3 PORTC.2
#define LED4 PORTC.3
#define LED5 PORTC.4
#define LED6 PORTC.5
#define LED7 PORTC.6
#define LED8 PORTC.7
#define LEDS PORTC

#define button1 PINA.2
#define button2 PINA.3
#define button3 PINA.4
#define button4 PINA.5

#include <avr/io.h>
#include <util/delay.h>

void flash_leds(void);

int main(void)
{
	// Set input/output configuration
  	DDRA = 0b11000011;
  	DDRB = 0xff;
  	DDRC = 0xff;
  	DDRD = 0xff;

	while(1)
	{
		// button1: flash LED's
		if (button1)
			flash_leds();
	}


  return 1;
}

void flash_leds(void)
{
  	// values
	char value1 = 0b01010101;
	char value2 = 0b10101010;
	char i;

	for(i=0 ; i<5 ; i++)
	{
		// Set all LEDs to specific value
		LEDS = value1;

		// Wait some time
		_delay_ms(500);

		// Set all LEDs to specific value
		LEDS = value2;

		// Wait some time
		_delay_ms(500);
	}

	return;
}

Ziet iemand wat hier fout gaat, en hoe dit op te lossen?

Hij compileert namelijk wél als ik dit doe:

if(PINA & (0x1 << PA2))

Ik ben benieuwd waarom mijn originele code het niet doet...

PINA.2 is geen register of constante in AVRGCC. Dat is de reden dat het niet werkt.

if(PINA & (1 << PA2)) is inderdaad de juiste methode.
if(bit_is_set(PINA, PA2)) mag ook, maar daar ben ik zelf niet zo'n voorstander van omdat het AVR libc specifiek is en niet 1:1 porteerbaar naar ander AVR C compilers.

Aha, weet ik dat ook weer.

Maar hoe zou ik dit dan toch toe kunnen passen i.c.m. mijn defines?

Waarom zou je dat willen? Je wijkt dan nml. af van de gebruikelijke AVR standaard. Zoals o.a. te zien in datasheets en application notes.

Ik heb op AVRfreaks wel eens voorbeelden gezien hoe je dat kan doen. Maar ik zou je het niet aanraden wegens bovenstaande.