Eingänge auslesen
-
Ich bin ein totaler C Neuling und habe vorher nur etwas in Assambler programmiert.
Ich habe mit den wissen aus diversen Internet tutorials geschafft das mein Lauflicht läuft.
Jetzt wollte ich eig nur das es erst startet wenn ich einen Taster betätigt habe.
womit ich dann weiter Programmiern wollte das ich mich mit dem taster durch verschiedene "Programme" tasten kann. so nach dem Motto erst Lauflicht dann Blinken dann dauerhaft an und so weiter.int main( void ) { DDRC = 0x00; DDRD = 0xff; // Port D als Ausgang setzen int Zahl1=0x01; int Zahl2=0x0; if (PORTC!=Zahl2) { while( 1 ) { // Endlosschleife PORTD = Zahl1 ; // _delay_ms(50) ; // 50 ms Warten Zahl1 = Zahl1*2 ; // Ausgang einen weiter if (Zahl1>0x90) // wenn die Ausgänge alle durch sind starte wieder bei LED 1 { Zahl1=0x01; } } } return 0; }
das ist der einzige Programm code der schonmal ohne Fehlermeldungen rauf gespielt hat. Der Funktioniert nur leider nicht.
noch ein Paar infos Ich habe einen Atmega8a verwendet und an Port D 8 LED´s und den Taster zwischen 5V und PortC 0.
Ich habe schon versucht ein paar infos aus tutorials oder Foren zu suchen aber da die meisten nicht auf Mikrocontroller ausgelegt sind ist das schwierig und das tutorial auf www.mikrocontroller.net hat mir auch nicht helfen können.
Ich hoffe ich hab alles wichtige hinnein geschrieben wenn ihr eine Idee habt oder noch irgendwelche Infos braucht schreibt ich versuche mein bestes meinen teil dazu bei zutragen.
Hoffe irgendjemand kann mir helfen...
und Entschuldigung für alle Rechtschreib fehler und Ausdruck und sonst noch alles Deutsch war in der Schule nie meine Stärke meist lag mir Mathe besser
-
Du solltest in der Endlosschleife überprüfen ob der Taster gedrückt ist.
Im Augenblick prüfst du einmal am Programmanfang.
Wenn die Taste da nicht gedrückt ist, ist das Programm auch schon zu Ende.
Was dann auf einem µC passiert, weiß ich auch nicht. Darum ja die Endlosschleife.
-
Das Funktioniert leider auch nicht
Ich weiß nicht ich habe das Gefühl das ich das mit der Taster Abfrage nich richtig gemacht habe.
-
"Das funktioniert nicht" ist keine sehr hilfreiche Beschreibung.
Was passiert, was erwartest du?
-
Und zeige am besten noch mal aktuellen Source.
-
der jetzt aktualisierte code
int main( void ) { DDRC = 0x00; DDRD = 0xff; // Port D als Ausgang setzen int Zahl1=0x01; int Zahl2=0x0; while (2) { if (PORTC!=Zahl2) { while( 1 ) { // Endlosschleife PORTD = Zahl1 ; // _delay_ms(50) ; // 50 ms Warten Zahl1 = Zahl1*2 ; // Ausgang einen weiter if (Zahl1>0x90) // wenn die Ausgänge alle durch sind starte wieder bei LED 1 { Zahl1=0x01; } } } } return 0; }
und funktioniert nicht ist so gemeint
.
er überspielt es ohne Probleme aber egal was ich mache mit dem taster nix passiert.
und erreichen wollte ich das das Lauflicht startet.noch zur Info das lauflicht hat soweit funktioniert bevor ich den Taster mit eingebunden habe.
-
Dann wäre noch die Frage, wie der Taster angeschlossen ist: Vcc oder Masse? Pullup-Widerstand wohin?
-
An Vcc
-
Der Taster ist an Port C und dafür hast Du eine zusätzliche äussere Schleife
eingerichtet. Wenn der Prozessor aber aus der inneren Endlosschleife nicht
mehr rauskommt ist das nicht so sinnig, oder ?
-
Neben der Schleifenkiste muust du für den Taster PINC abfragen, nicht PORTC.
Aber da stellen sich noch mehr Fragen - wenn jemand kürzer als 50ms braucht, um den Taster zu drücken, hast du ein Problem. Wenn (wahrscheinlicher) jemand länger als 100ms braucht, auch. Eigentlich willst du nur auf der steigenden Flanke auslösen, und da der Taster vermutlich nicht entprellt ist (das macht man aus Kostengründen meistens in Software) bedeutet das, den Button häufig, am besten über einen Timer, zu pollen.
Was hängt da für ein Quartz dran? Ich rechne mal mit 8MHz.
Ich stelle mir das (völlig ungetestet)
#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #define TASTER_DDR DDRC #define TASTER_PORT PORTC #define TASTER_PIN PINC #define LED_DDR DDRD #define LED_PORT PORTD uint8_t taster_event(uint8_t event) { static uint8_t taster_wurde_gedrueckt = 0; uint8_t tmp; // Hier Race-Condition, daher kurzzeitig Interrupts ausschalten. cli(); tmp = taster_wurde_gedrueckt; taster_wurde_gedrueckt = event; sei(); return tmp; } ISR(TIMER0_OVF_vect) { // 4 * 8,192ms = 32,768ms; das dürfte für die meisten Taster ausreichen. static uint8_t const required = 4; static uint8_t counter = 0; static uint8_t taster_status = 0; if(TASTER_PIN == 0) { counter = 0; taster_status = 0; } else if(counter == required) { // Wenn viermal hintereinander der Taster gedrückt aussah, sollte die // Prellphase vorbei sein, und jemand hat da den Finger drauf. if(!taster_status) { // Taster war vorher nicht gedrückt, jetzt ist er gedrückt -> steigende Flanke. taster_event(1); } taster_status = 1; } else { ++counter; } } void taster_init(void) { // Alle Pins Input-Low. TASTER_DDR = 0; TASTER_PORT = 0; // Prescaler = 256. Bei 8MHz bedeutet das, // dass der Timer alle 8,192ms überläuft. TCCR0 = _BV(CS02); TIMSK = _BV(TOIE0); sei(); } int main(void) { taster_init(); LED_DDR = 0xff; for(uint8_t led_mask = 1; ; led_mask = led_mask ? led_mask << 1 : 1) { LED_PORT = led_mask; while(!taster_event(0)) { // Alle 50ms mal nach dem Taster kucken. _delay_ms(50); } } return 0; }