Hallo

Ein komplettes Programm sieht etwa so aus:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>

int main(void)
{
	DDRB=0; // nicht benoetigte Ports auf Eingang setzen
	DDRC=0;
	DDRD=0b00000100; //rote StatusLED haengt an PD2(= Port D, Bit2)
	PORTD=0b00000100; // Ausgang setzen
	while(1);
	return(0);
}
Und noch meine ersten Versuche, eine Tastenabfrage:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>


int main(void)
{
	unsigned int i,j;

	for (i=0; i < 20; i++) { for (j=0; j < 65535; j++); }
	DDRB=0; // nicht benoetigte Ports auf Eingang setzen
	DDRC=0;
	DDRD=0b00000100; //rote StatusLED haengt an PD2(= Port D, Bit2)
	PORTD=0b00000100;
	while(1)
	{
/*
Die Tasten haengen an PortC Bit4. Wenn keine Taste gedrueckt ist,
wird ueber R23 VCC an diesen Pin gelegt. Das ergibt eine 1 beim Einlesen.

Wenn man dann eine Taste drueckt, ergibt sich ein Spannungsteiler,
bei dem der Pin dann deutlich, bei K6 1000K zu 68K, nach 0V gezogen wird.
Das ergibt eine 0 am Eingang.

Den C7 kann man ignorieren, R24 ebenfalls, weil PD3 als Eingang (ohne Pullup?)
geschaltet ist.
*/

		if (PINC & 0b00010000) // PortC Bit4 ist der Tasteneingang
		{
			PORTD=0b00000100; // StatusLED rot setzen
		}
		else
		{
			PORTD=0b00000000; // StatusLED ausschalten
		}

/*
Spätestens jetzt wird auch mir klar, dass die Bitschieberei effektiver ist:

   PORTD=((PINC & (1<<PC4))  >> 2);

*/
	}
	return(0);
}
..und noch eine Einschaltverzögerung:
Code:
#include <avr/io.h>
#include <avr/interrupt.h>

unsigned int timer_startwert=65536-7812; // 8MHz/1024=7812,5
int main(void)
{
	DDRB=0; // nicht benoetigte Ports auf Eingang setzen
	PORTB=0; // und die Pullups aus, sonst "glimmt" die StatusLED gruen
	DDRC=0;
	PORTC=0;
	DDRD=(1 << PD2); //rote StatusLED haengt an PD2(= Port D, Bit2)
	DDRD|=(1 << PD7); // Kathoden der BackLEDs haengen auf PD7
	PORTD=(1 << PD7); // high an PD7 schaltet die BackLEDs aus

/* Es folgt eine Einschaltverzögerung von ca. 1 Sekunde */
   TCNT1=timer_startwert; // 16-Bit auf einmal laden?
   TCCR1B |= 0b00000101; // Prescaller Timer1 auf 1024 setzen
   while(!(TIFR & (1 <<TOV1) )); //Warten bis Überlauf Timer1
   TCCR1B &= ~0b00000101; // Prescaller löschen bedeutet Timer1 stoppen
   TIFR = (1 << TOV1); // Flag setzen bedeutet Flag wieder löschen

	while(1) PORTD=(1 << PD7) | ((PINC & (1<<PC4))  >> 2); // eine Taste schaltet StatusLED aus

	return(0);
}
Dann wurde mein RP6 geliefert und der asuro eingemottet...

Gruß

mic