Hey Leute!
Wünsch euch erstmal `n schönes Wochenende an dieser Stelle.
Das doofe ist nur bei mir fiel es bisher noch nciht wirklich gut aus
Ich habe bis heute Nacht um 02:00Uhr daran gesessen und bekomme es einfach nicht zum laufen.
Warscheinlich wird es irgendwo nur ein denkfehler sein aber ich komm einfach nicht drauf.
Wir, also unsere Gruppe, haben an einem (selbstgebauten) Controllerboard folgende Taster:
-> PC 4 bis PC 7
Diese haben wir mit Masse angeschlossen, bedeutet wenn man einen Taster drückt, kommt Masse an dem einzelnen PIN an.
Für eine simple Tasterabfrage muss man ja nun also die PULL-UP Widerstände einschalten und natürlich auf EINGANG schalten.
Vielleicht ist es relevant, vielleicht nicht ich weiß es nicht
Wir nutzen den ATMega644P und betreiben das ganze mit einem 16Mhz Quarz.
Code:
#include <avr/io.h>
#include <inttypes.h>
#define F_CPU = 16000000UL
#include <util/delay.h> // Benutzen eine aktuelle AVR-LIB
/* Einfache Funktion zum Entprellen eines Tasters */
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)
{
if ( ! (*port & (1 << pin)) )
{
/* Pin wurde auf Masse gezogen, 100ms warten */
_delay_ms(50); // max. 262.1 ms / F_CPU in MHz
_delay_ms(50);
if ( *port & (1 << pin) )
{
/* Anwender Zeit zum Loslassen des Tasters geben */
_delay_ms(50);
_delay_ms(50);
return 1;
}
}
return 0;
}
int main(void)
{
DDRB = (1 << DDB0); // Für die LED's die beim drücken eigentlich angehen sollten
DDRC &= ~( 1 << PC4 ); /* PIN PB0 auf Eingang (Taster) */
PORTC |= ( 1 << PC4 ); /* Pullup-Widerstand aktivieren */
if (debounce(&PINC, PC4))fe
{
PORTB |= (1 << 0); // Schaltet 2 LED's ein...
}
}
Wir hatten eigentlich vor das ganze per Interrupt zu machen.
Wenn also der Taster gedrückt wurde soll im Hauptprogramm eigentlich nur noch geprüft werden...
if(taster==1){...}else if{...}
Das Hauptprogramm soll ja zügig weiterlaufen...
aber wenn wir daran schon scheitern?
Vielleicht hat ja wer ein Beispiel parat, bin für jede Hilfe dankbar!
Grüße aus Bookholzberg
Lesezeichen