bin gerade damit fertig geworden 3 Stunden zu googlen und zu verzweifeln. Habe ein Poti an dem ADC eines ATMEGA 8 und einen Taster am ATMEGA. Nur wie schreib ich das jetzt in C das wenn der Taster gedrückt wurde er den ADC Wert (1023 = 1200 sec) ausliest und solange ein Relais am Atmega umschaltet wie es der ADC Wert vorgibt??? Irgendwie ist das alles sehr kompliziert in C
:
Verschoben durch Admin
> bin gerade damit fertig geworden 3 Stunden zu googlen und zu > verzweifeln. Was hast denn alles gefunden? Suchen allein Hilft da leider nicht. Wirst nicht drumherum kommen C zu lernen. Gibt genug Bücher und Tutorials darüber. Eins davon ist gar nicht weit entfernt und befindet sich am linken Rand dieser Webseite.
Taste einlesen heißt, Du brauchst ne zuverlässige Entprell- und Flankenerkennungsroutine, dann ist alle ganz easy. Es gibt unter C nicht für jede Sache nen extra Befehl. Es gibt nur wenige Ausdrücke und daraus bastelt man sich dann kompliziertere zusammen. C ist also kein Chinesisch, wo es für jedes Wort einen extra Buchstaben gibt und Du erst über 3000 Buchstaben lernen mußt, um die meisten Bücher lesen zu können. Hier im Forum gibt es schon ne Menge Codebeispiele (z.B. Artikelsammlung), einfach mal schmökern. Peter
1 | /* Einfache Funktion zum Entprellen eines Tasters */
|
2 | inline uint8_t debounce(volatile uint8_t *port, uint8_t pin) |
3 | {
|
4 | if ( ! (*port & (1 << pin)) ) |
5 | {
|
6 | /* Pin wurde auf Masse gezogen, 100ms warten */
|
7 | _delay_ms(65; // max. 262.1 ms / F_CPU in MHz |
8 | _delay_ms(65; |
9 | if ( *port & (1 << pin) ) |
10 | {
|
11 | /* Anwender Zeit zum Loslassen des Tasters geben */
|
12 | _delay_ms(65); |
13 | _delay_ms(65); |
14 | return 1; |
15 | }
|
16 | }
|
17 | return 0; |
18 | }
|
19 | |
20 | int main(void) |
21 | {
|
22 | DDRB &= ~( 1 << PB0 ); /* PIN PB0 auf Eingang (Taster) */ |
23 | PORTB |= ( 1 << PB0 ); /* Pullup-Widerstand aktivieren */ |
24 | ...
|
25 | if (debounce(&PINB, PB0)) /* Falls Taster an PIN PB0 gedrueckt.. */ |
26 | PORTD = PIND ^ ( 1 << PD7 ); /* ..LED an Port PD7 an- |
27 | bzw. ausschalten */
|
28 | ...
|
29 | }
|
nur das ist sehr Fehler bahaftet weil er troz der eingebundenden Datei _delay_ms nicht kennt
>ur das ist sehr Fehler bahaftet weil er troz der eingebundenden Datei >delay_ms nicht kennt Dann schau mal unterm Stuhl wo die fehlenden Klammern geblieben sind ;)
Jetzt hab ich nur nach das Problem 14: warning: '_delay_ms' is static but used in inline function 'debounce' which is not static
1 | inline uint8_t debounce(volatile uint8_t *port, uint8_t pin) |
nimm da mal das inline weg.
Hi, ich interpretiere dein Vorhaben einmal so : Ziel : Durch Drücken eines Tasters soll ein Relais geschaltet werden. Die Haltezeit soll über ein Poti mittels AD-Wert bestimmt werden ? IST DAS SO RICHTIG ??? Wenn ja, dann es völlig egal mit welchen µC du es zu tun hast bzw. in welcher Sprache du in Programmieren möchtest. Du musst dir zuerst überlegen, wie du vorgehst und welche Funktionen du brauchst : 1.) Taster drücken soll erkannt werden => Funktion : Taster erfassen 2.) Taster prellt => Funktion : Taster entprellen 3.) AD-Wert des Poti´s einlesen => Funktion : AD-Wert lesen 4.) AD-Wert in einen Zeitwert umwandeln => Funktion : ADC_to_Time 5.) Relais für Zeit X schalten => Funktion : SET_RELAIS_FOR_TIME_X Dies stellt ganz grob die benötigten Funktionen dar. Mach dir jetzt gedanken darüber die der Inhalt dieser Funktionen aussehen könnte und reihe sie dann "richtig" zu deinem Programm zusammen. Auch wenn ein Profis diese Problem innerhalb einer Stunde lösen kann, denke ich (vermute, dass du Anfänger bist), dass du das ganze Wochenende dran tüfteln wirst. Doch die Erfahrung, welche du damit machst rechtfertigt den Aufwand. Lass dich also nicht abschrecken :-)
Ziel : Durch Drücken eines Tasters soll ein Relais geschaltet werden. Die Haltezeit soll über ein Poti mittels AD-Wert bestimmt werden ? Daumen hoch GENAU das
dazu kommen noch 2 Taster zum manuellen umschalten die die wait funktion "Breaken" soll Also per Interrupt
allerdings mit wait adc_wert waitet er auch die vorgegebene Zeit, ist aber unbreakable
Wozu entprellen? Wenn ich die Aufgabe richtig verstanden habe, soll ein nicht nachtriggerbarer Monoflop realisiert werden. Also reicht's, beim ersten Preller zu starten. Was der Taster danach macht, ist für eine ziemliche Zeitspanne (die viel, viel länger als jedes Prellen ist) danach piepegal. "Entprellen" ist nicht für alle Fragen, die einen Taster betreffen, automatisch eine passende Antwort.
Hazeh Zimmerer schrieb: > "Entprellen" ist nicht für alle Fragen, die einen Taster betreffen, > automatisch eine passende Antwort. Doch schon. Entprellen bewirkt implizit auch eine Störunterdrückung. Das Gerät soll ja nicht einschalten, nur weil jemand in der Nähe den Staubsauger einschaltet oder mit dem Handy telefoniert. Sondern erst, wenn wirklich ne Taste gedrückt wird. Man kann das zwar durch externe Maßnahmen erreichen (Kodensator, kleinerer Pullup). Aber jede zusätzliche Hardware ist teurer als wenige Zeilen Code. Und Hardware muß jedesmal eingelötet werden, ne Entprellroutine muß nur ein einziges mal entwickelt werden (oder einfach nur kopiert werden). Peter
Schaltet trotzdem nicht um #include <avr/io.h> #include <inttypes.h> #ifndef F_CPU #define F_CPU 4000000UL #endif #include <util/delay.h> /* 2_2 Alias Portd.7 Auto Alias Pind.6 1_1 Alias Portd.5 Relais Alias Portb.1 */ /* Einfache Funktion zum Entprellen eines Tasters */ uint8_t debounce(volatile uint8_t *port, uint8_t pin) { if ( ! (*port & (1 << pin)) ) { /* Pin wurde auf Masse gezogen, 100ms warten */ _delay_ms(65); // max. 262.1 ms / F_CPU in MHz _delay_ms(65); if ( *port & (1 << pin) ) { /* Anwender Zeit zum Loslassen des Tasters geben */ _delay_ms(65); _delay_ms(65); return 1; } } return 0; } int main(void) { DDRD &= ~( 1 << PD6 ); PORTD |= ( 1 << PD6 ); /* Pullup-Widerstand aktivieren */ if (debounce(&PIND, PD6)) /* Falls Taster an gedrueckt.. */ PORTB = PINB ^ ( 1 << PB1 ); /* ..- bzw. ausschalten */ }
Die Taste schaltet das Relais ein, zusätzlich blinkt ne LED. Das Poti schaltet aus oder die Taste nochmal drücken. Solange an ist, kann die Zeit noch verstellt werden. Das Programm würde auch bequem in nen ATtiny13 passen. Peter
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.