AVR GCC Poti wait

Gast #1449083
Lesenswert?

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
Gast #1449087
Lesenswert?

> 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.
#1449105
Lesenswert?

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
Gast #1449165
Lesenswert?

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
Gast #1449421
Lesenswert?

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 :-)
#1449563
Lesenswert?

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.
#1449727
Lesenswert?

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
Gast #1449769
Lesenswert?

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 */

}
#1450067
Lesenswert?

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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren