-         

Ergebnis 1 bis 10 von 10

Thema: merken von Tatserzuständen

  1. #1
    Neuer Benutzer Öfters hier Avatar von Pinie
    Registriert seit
    10.12.2010
    Ort
    Ennepetal
    Beiträge
    22

    merken von Tatserzuständen

    Anzeige

    Hallo Forum,
    ich bin neu Hier und habe gleich eine frage
    Ich habe vor mir den Zustand zu von einem Taster zu merken also wie oft er gedrückt wurde und dementsprechend oft ein Programm durchzulaufen wenn das Programm durchläuft soll er sich weiterhin merken wenn der Taster gedrückt wird.
    Hat da vielleicht jemand einen Code den er mir geben könnte?
    Zu mir
    Ich bin kein gelernter Programmierer oder Elektroniker ich mache das nur Hobby mäßig
    Programmiersprache C
    Mikrocontroller ist ein ATmega 16

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.12.2010
    Ort
    Nähe Wien
    Alter
    27
    Beiträge
    108
    code hab ich keinen aber rein von der logik:

    lass dir einfach beim taster überprüfen eine variable hochzählen

    Code:
    zählvariable = 0;
    if(taster gedrückt)
    zählvariable++;
    und anschließend lasst du die methode die das programm ausführen soll per schleife (for oder while, was dir besser liegt) durchlaufen, zb so:

    Code:
    for(int i=0; i<zählvariable; i++)
    {
    //do something
    }
    oder mit while:
    Code:
    while(zählvariable > 0)
    {
    //do something
    zählvariable--;
    }
    im while fall ist zu beachten, das in diesem fall die zählvariable danach wieder auf 0 gesetzt wird
    kann jetzt gut gewünscht oder unerwünscht sein, je nach anwendungsfall

    der code is jetz zwar in c++, glaube aber kaum das er in c wirklich anders aussehen wird

    lg

  3. #3
    Neuer Benutzer Öfters hier Avatar von Pinie
    Registriert seit
    10.12.2010
    Ort
    Ennepetal
    Beiträge
    22
    Hallo,
    danke für deine Antwort ijjiij
    habe mir jetzt was programmiert allerdings kommt folgende Fehlermeldung:
    ../test.c:62: error: expected declaration or statement at end of input

    leider weis ich nicht was jetzt falsch daran ist kann sich das mal jemand anschauen?
    Code:
      // Einbinden der Headerdateien
    #include <avr/io.h>          // Für Kommunikation über Ports benötigt
    #include <util/delay.h>        // Für Wartezeiten benötigt
    #include <stdlib.h>
    #include <math.h>
    
     
    // LEDs sind high-active geschaltet
    #define LED_AN(LED)     (PORTD |=  (1<<(LED)))
    #define LED_AUS(LED)    (PORTD &= ~(1<<(LED)))
    #define LED_TOGGLE(LED) (PORTD ^=  (1<<(LED)))
    #define LED1            PD0
    #define LED2            PD1
    #define LED3			PD2
    #define LED4			PD3
    #define LED5			PD4
    #define LED6			PD5
    #define LED7			PD6
    #define LED8			PD7
     
    // TASTER ist high-active geschaltet
    #define TASTER1	        PC0			//hoch
    #define TASTER2			PC1
    #define TASTER_GEDRUECKT(TASTER)	(PINC & (1<<TASTER))
    #define TASTE_AUF          0
    #define TASTE_ZU           1
    
    
    int main(void)
    {
    
      uint8_t zaehlvariable = 0; 
    
    if(TASTER_GEDRUECKT(TASTER1))
    zaehlvariable++;
    
    
     // Taster initialisieren
     DDRC &= ~(1<<TASTER1) | (1<<TASTER2);          // Port C: Eingang für Taster
     
     // Anfangseinstellung
     DDRD |= (1<<LED1) | (1<<LED2) | (1<<LED3) | (1<<LED4); // Port D: Ausgang für LED1 und LED2
    
    for(int i=0; i<zaehlvariable; i++) 
    { 
     	  LED_AN(LED4);
    	  _delay_ms(100);  // Wert 0,1sec
    	  LED_AUS(LED4);
    	  _delay_ms(10);  // Wert 0,01sec
          LED_AN(LED3);
    	  _delay_ms(100);  // Wert 0,1sec
    	  LED_AUS(LED3);
    	  _delay_ms(10);  // Wert 0,01sec
    	  LED_AN(LED2);
    	  _delay_ms(100);  // Wert 0,1sec
    	  LED_AUS(LED2);
    	  _delay_ms(10);  // Wert 0,01sec
          LED_AN(LED1);
    	  _delay_ms(100);  // Wert 0,1sec
    	  LED_AUS(LED1);
    	  _delay_ms(10);  // Wert 0,01sec
    }
    Ich habe mit dem AVR-Studio4 programmiert fals das weiter hilft

    danke schonmal für die Hilfe

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.12.2010
    Ort
    Nähe Wien
    Alter
    27
    Beiträge
    108
    also ein problem was ich jetz prinzipiell mal seh is, das du ihm nicht sagst wie lange er auf die input eingabe warten soll

    in deinem fall wird also zu beginn des programms abgefragt ob der taster gedrückt ist oder nicht, zaehlvariable ist also 0 (initialisierungswert) oder 1 (taster gedrückt)
    da müsstest du dir noch überlegen nach welchem schema er erkennen soll, wie oft du den knopf noch weiter drücken willst...
    könntest du zb über einen timer machen (wenn länger als 5 sek kein knopf gedrückt wurde, mach weiter), oder über einen 2. taster (taster 1 wird n mal gedrückt und taster 2 bestätigt die eingabe)

    das ganze dann in eine while schleife:
    while weitere eingabe möglich -> warte auf eingabe
    abbruchbedingung durch if (zb if taster 2 gedrückt -> setze den bool für die while schleife auf false und verlasse diese dadurch)



    vielleicht liegts ja daran, das die zählvariable durch deinen programmablauf einfach immer 0 war und desshalb nie was passiert ist...

    lg

  5. #5
    Neuer Benutzer Öfters hier Avatar von Pinie
    Registriert seit
    10.12.2010
    Ort
    Ennepetal
    Beiträge
    22
    Hallo,
    habe das Problem gelöst mir fehlte nur }.
    jetzt läuft aber keine LED ich habe noch einwenig dran geändertsiehe anhang

    könnte mir jemand weiterheklfen?
    besten dank im vorraus
    Angehängte Dateien Angehängte Dateien

  6. #6
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    47
    Beiträge
    497
    Fangen wir mal mit den zwei offensichtlichsten Dingen an.
    1. wenn du in einer if-Abfrage eine auf 0 initialisierte Variable die im main nur hochgezählt wird auf kleiner 0 vergleichst, wird die Anweisung im true Zweig wohl nie ausgeführt.
    2. wo rufst du denn deine ausgabe-Funktion auf?

    Solche Sachen, wie fehlende Klammern erkennt man am Besten, wenn man den Code ordentlich einrückt. Das wirkt bei dir etwas unsortiert.

    Beinahe hätte ich noch was wichtiges vergessen. Anweisungsblöcke müssen auch immer in Klammern gepackt werden, wenn sie aus mehr als einer Anweisung bestehen.

    Es ist ein riesen Unterschied ob du
    Code:
    if (i>1) i--;
    a=i;
    oder
    Code:
    if (i>1)
    {
      i--;
      a=i;
    }
    schreibst. Im ersten Fall wird a=i; unabhängig von i immer ausgeführt. Im zweiten Fall nur wenn i>1 erfüllt ist.

    sast

    雅思特史特芬
    开发及研究

  7. #7
    Neuer Benutzer Öfters hier Avatar von Pinie
    Registriert seit
    10.12.2010
    Ort
    Ennepetal
    Beiträge
    22
    Hallo, ich habe nun in void ausgabe geändert
    Code:
    void ausgabe(uint8_t zaehlvariable)
    
    {
    if (zaehlvariable > 0)
    
    
     	  LED_AN(LED8);
    	  _delay_ms(1000);  // Wert 0,1sec
    	  LED_AUS(LED8);
    	  _delay_ms(100);  // Wert 0,01sec
          LED_AN(LED3);
    	  _delay_ms(1000);  // Wert 0,1sec
    	  LED_AUS(LED3);
    	  _delay_ms(100);  // Wert 0,01sec
    	  LED_AN(LED2);
    	  _delay_ms(1000);  // Wert 0,1sec
    	  LED_AUS(LED2);
    	  _delay_ms(100);  // Wert 0,01sec
          LED_AN(LED1);
    	  _delay_ms(1000);  // Wert 0,1sec
    	  LED_AUS(LED1);
    	  zaehlvariable--; 
    
    }
    in der while schleife habe ich nun die Ausgabe hinzugefügt
    Code:
    while(1)
       ausgabe(zaehlvariable);
    	{
        if TASTER_GEDRUECKT(TASTER1)
    	zaehlvariable++;
    	}
    jetzt leuchten die LEDs 1-3 abwechselnt aber der Tasterdruck wird im Programm nicht verarbeitet[/quote]

  8. #8
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    47
    Beiträge
    497
    es wird genau immer das hier ausgeführt

    while(1)
    ausgabe(zaehlvariable);

    die while läuft so lange bis 1 false wird.
    Ich persönlich habe das in C noch nie erlebt.

    sast

    雅思特史特芬
    开发及研究

  9. #9
    Neuer Benutzer Öfters hier Avatar von Pinie
    Registriert seit
    10.12.2010
    Ort
    Ennepetal
    Beiträge
    22
    Hallo,
    wie müsste das aussehen das wenn ich den Taster drücke sich der Wert um 1 erhöht?
    ich bin mit dem Hobby noch so ziehmlich am Anfang
    besten dank im vorraus

  10. #10
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    47
    Beiträge
    497
    Code:
    while(1)
    {
      ausgabe(zaehlvariable);
      if TASTER_GEDRUECKT(TASTER1) zaehlvariable++;
    }
    allerdings wird sich die Variable nie um mehr als eins erhöhen und dann sofort wieder zurückgesetzt.
    Du musst dir vor Augen halten, dass die Abarbeitung sequentiell passiert.
    Die while rennt zwar immer wieder durch, aber es wird ja auch jedes mal die ausgabe() aufgerufen und wieder rückgesetzt.
    Wenn du in der Abarbeitungszeit von ausgabe() mehrere Tastendrücke registrieren willst, dann musst du mit einer Interruptroutine die zaehlvariable hochzählen lassen. Das ist dann nebenläufig zum Hauptprogramm und registriert auch während der "normalen" Verarbeitung deines Programms deine Interaktion.
    Da du aber schon Schwierigkeiten beim Code hast (Klammersetzung, Anweisungsblöcke, Schleifen usw), würde ich dir raten, da mal noch etwas in der Theorie zu wühlen bevor du dich damit enttäuschst gleich Interrupts zu verarbeiten. Da kommen dann nämlich noch neue Fallstricke hinzu.

    sast

    雅思特史特芬
    开发及研究

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •