Hallo
Ein komplettes Programm sieht etwa so aus:
Und noch meine ersten Versuche, eine Tastenabfrage: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 eine Einschaltverzögerung: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); }Dann wurde mein RP6 geliefert und der asuro eingemottet...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); }
Gruß
mic







Zitieren
Lesezeichen