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
Lesezeichen