Sida 1 av 1

nybörjar fråga avr-gcc

Postat: 21 december 2004, 15:50:28
av sven
¨har suttit och pillat meden avr å avr gcc ett tag nu..
har fått leds att lysa osv, menhur gör jag om jag vill att en led ska tändas när jag trycker på en knapp? får inte till det =/

har ledsen på porta och knapparna på portc

nån som kan ge ett snabbt och enkelt exempel?

Postat: 21 december 2004, 21:56:39
av gille
Nu ska jag inte svära på att du missat det här men..
hur ser din kod ut?

typ såhär:
while(1) {
if(PORTC)
PORTA=0;
else
PORTA=0XFF;
}

? Om den är så kommer du få knappstudsar och blinka i rask takt med en hyfsad sannolikhet för att sluta med släkta dioder.

Postat: 21 december 2004, 22:37:50
av Xyzzy
Och ska du LÄSA från en port (dvs en ingång) ska du skriva typ:

if(PINC)
...

och innan naturligtvis definera PINc som ingångar

Postat: 21 december 2004, 23:41:43
av cykze
Enklast tycker jag är att koppla knappen till någon INTn-pinne. Då kan du välja att få en interrupt när pinnen går från hög till låg eller tvärtom. Sätter du dessutom en konding över knappen till jord och kör med det inbyggda pullup:et så slipper du tänka på mjukvaruavstudsning.

Så här kan du göra om du har en knapp kopplad mellan jord och INT0 (PD2 på Mega48) och en lysdiod på PD4:

Kod: Markera allt

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

INTERRUPT (SIG_INTERRUPT0)
{
	PORTD ^= _BV(PD4);
}

int main()
{
	DDRD = _BV(PD4); // Sätter PD4 som utgång
	PORTD = _BV(PD2); // Aktiverar pullup på PD2

	// Aktiverar INT0 att trigga på fallande flank
	// (lite beroende på vilken AVR du har)
	EICRA = _BV(ISC01);
	EIMSK = _BV(INT0);

	sei();

	while (1)
	{
	}

	return 1;
}