Forum: Compiler & IDEs AVR GCC Poti wait


von Verwirrter (Gast)


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

: Verschoben durch Admin
von Gast (Gast)


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.

von Peter D. (peda)


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

von Verwirrter (Gast)


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

von holger (Gast)


Lesenswert?

>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 ;)

von Verwirrter (Gast)


Lesenswert?

also fehlen nur ein paar ( ) und  { } ? sehr beruhigend

von Verwirrter (Gast)


Lesenswert?

Jetzt hab ich nur nach das Problem
14: warning: '_delay_ms' is static but used in inline function 
'debounce' which is not static

von Karl H. (kbuchegg)


Lesenswert?

1
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)

nimm da mal das inline weg.

von Verwirrter (Gast)


Lesenswert?

wenn es jetzt noch funktioniere würde...

von Gast (Gast)


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 :-)

von Verwirrter (Gast)


Lesenswert?

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

von Verwirrter (Gast)


Lesenswert?

1 - 4 ist in Bascom kein Problem 5 da haperts deswegen C

von Verwirrter (Gast)


Lesenswert?

dazu kommen noch 2 Taster zum manuellen umschalten die die wait funktion 
"Breaken" soll Also per Interrupt

von Verwirrter (Gast)


Lesenswert?

allerdings mit


wait adc_wert

waitet er auch die vorgegebene Zeit, ist aber unbreakable

von Hc Z. (mizch)


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.

von Peter D. (peda)


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

von Verwirrter (Gast)


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

}

von Stefan E. (sternst)


Lesenswert?

Weil PB1 gar kein Ausgang ist.

von Peter D. (peda)


Angehängte Dateien:

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

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
Noch kein Account? Hier anmelden.