www.mikrocontroller.net

Forum: Compiler & IDEs AVR GCC Poti wait


Autor: Verwirrter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Verwirrter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
/* 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(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)
{
    DDRB &= ~( 1 << PB0 );                 /* PIN PB0 auf Eingang (Taster)            */
    PORTB |= ( 1 << PB0 );                 /* Pullup-Widerstand aktivieren            */
    ...
    if (debounce(&PINB, PB0))             /* Falls Taster an PIN PB0 gedrueckt..    */
        PORTD = PIND ^ ( 1 << PD7 );  /* ..LED an Port PD7 an-
                                   bzw. ausschalten */
    ...
} 

nur das ist sehr Fehler bahaftet weil er troz der eingebundenden Datei 
_delay_ms nicht kennt

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Verwirrter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also fehlen nur ein paar ( ) und  { } ? sehr beruhigend

Autor: Verwirrter (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
inline uint8_t debounce(volatile uint8_t *port, uint8_t pin)

nimm da mal das inline weg.

Autor: Verwirrter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn es jetzt noch funktioniere würde...

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Verwirrter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Verwirrter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1 - 4 ist in Bascom kein Problem 5 da haperts deswegen C

Autor: Verwirrter (Gast)
Datum:

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

Autor: Verwirrter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
allerdings mit


wait adc_wert

waitet er auch die vorgegebene Zeit, ist aber unbreakable

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Verwirrter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 */

}

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil PB1 gar kein Ausgang ist.

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.