- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 12

Thema: Speicherfunktion ???

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    shedepe
    Gast
    Dann mach doch erst mal die Variante mit _delay_ms(5000).
    Also
    Code:
    if(Pin HIGH)
    {
        _delay_ms(5000);
        if(Pin ist immer noch HIGH)
        {
           //DO some stuff
           //Und natürlich die Pin ist high abfrage durch den richtigen Code ersetzen ;)
        }
    }
    Bezüglich Timer: Lies das Datenblatt, da wird das erklärt Ich weiß es leider auch nicht auswendig.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    872
    Um die Timerkonfig durchzugehen, müsstest Du schreiben, welchen genauen Typ Du verwendest (wahrscheinlich ATTiny11 oder 12???) und bei welcher Frequenz der Controller läuft (bei 16MHz würde die Konfiguration rechnerisch Sinn ergeben, es funktioniert aber bei den o.g. Typen nicht, weil die nur einen Overflow im TCNT0 signalisieren).

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    08.02.2017
    Beiträge
    21
    Das ist richtig, ich nutze einen Attiny85.

    Der Controller wurde von mir nicht verändert.
    Somit sollte er mit 1 MHz laufen denke ich

    shedepe, wenn ich das richtig verstanden habe nützt es mir jetzt nichts, wenn ich einfach eine if Abfrage mit einbaue.

    Warum ?

    Ich habe ja dan über der If Abfrage meinen Code stehen ( siehe weiter oben )
    Der Code wird jedes mal Abgearbeitet wenn der Controller Strom bekommt.

    Somit darf doch der Code nicht über der If Abfrage stehen oder ?
    Ich möchte ja per Taster sagen, wenn 5 Sekunden gedrückt Funktion deaktivieren.
    Wenn wieder 5 Sekunden gedrückt wurde Funktion aktivieren.

    Verstehe ich das falsch ?

  4. #4
    shedepe
    Gast
    Ich glaube dir fehlt so ein bisschen das Grundverständnis für Mikrocontroller.

    Letztendlich hat dein Code eine main Funktion

    Code:
    int main(void)
    {
    
    }
    Wenn der Controller startet oder einen Reset durchführt schaut er im Speicher an einer bestimmten Stelle nach. Nämlich dort wo der Code für die Main Funktion liegt. Dieser Code wird dann ausgeführt.
    D.h. effektiv wenn wir einfach nur eine Anweisung reinschreiben, dann wird diese ausgeführt und das Programm ist zu Ende.
    Also z.B

    Code:
    int main(void)
    {
        DDRB = (1<<PB0);
        //Und jetzt endet das Programm
    }
    Deshalb haben wir die Main schleife. Jede Anweisung darin wird so lange ausgeführt bis der Controller ausgeschaltet wird:
    Also:

    Code:
    int main(void)
    {
        //Einmalige Setup Sachen (z.B. pin auf Eingang setzen)
         while(1)
         {
           //Sachen die wiederholt getan werden sollen (Also z.B. Pin Zustand abfragen)
         }
    }
    Für Deinen Fall bedeutet das jetzt, dass du in etwa sowas hier willst:

    Code:
    int main(void)
    {
        DDRB = (1<<PB0); //Entsprechende PINs auf Eingang setzen
        //Weitere Setup Aktionen durchführen wie z.B. LED Pin auf Ausgang setzten
        //Zustand aus dem EEPROM lesen
         if(statusfromeeprom)
         {
             //LED an
             //10 Sekunden warten
             //LED aus
         }
        while(1)
        {
            //Hier jetzt den Taster abfragen:
            if(PINB & (1<<PB0))
            {
                _delay_ms(5000); //5 Sekunden warten
                if(PINB & (1<<PB0)) //Schauen ob der Pin immer noch High ist
                {
                   //Jetzt wissen wir der Taster wurde für mindestens 5 sekunden gedrückt
                   //Also neuen Status in das EEPROM schreiben
                }
            }
        }
    }
    Ich habe hier Pseudocode(als Kommentar) und realen Code gemischt

    PS. Was ich vergessen habe: Tu dir selber den Gefallen und verbringe einfach mal paar Stunden zum einen damit das passende Datenblatt des Controllers zu lesen:
    http://www.atmel.com/images/atmel-25..._datasheet.pdf (Schau ob das das richtige ist!)
    Und vorallem das AVR-GCC Tutorial: https://www.mikrocontroller.net/arti...R-GCC-Tutorial
    https://www.mikrocontroller.net/arti...n-_und_Ausgabe
    Dabei geht es gar nicht darum dass man danach alles weiß was drin steht, sondern in den Datenblättern/Tutorien wird auch allgemein einiges über Prinzipien und Abläufe erklärt. Wenn man sich die Mühe macht das mal durchzuarbeiten hat man danach einen viel tieferen Einblick was alles möglich ist und vorallem wie es möglich ist.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    55
    Beiträge
    2.814
    Das Konstrukt mit dem Delay sollte man wirklich ert mal machen und zum laufen bringen, also inklusive Abfrage des Zustandmerkers aus dem EEPROM und schreiben des selben.
    Auch wenn das Delay nicht erkennt, wenn jemand den Taster drückt für 4,9 Sekunden loslässt und grade noch rechtzeitig vor Ende des Delays ein zweites mal drückt.
    Das wird man dann später mit einem Interrupt der auf Pegeländerung des Tastereingangs reagiert und einem Timer abfangen können.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    08.02.2017
    Beiträge
    21
    Habe das ganze jetzt mal versucht zu ändern.

    Hier der Code.

    Code:
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/eeprom.h>
    
    	
    	int main(void)
    	{
    		DDRB |= (1<<PB1);     // Ausgang für LED
    		DDRB = ~(1<<PB0);     // Eingang für Taster
    		PORTB |=  (1<<PB0);   // Pullup Einschalten
    		
    		 
    		if(statusfromeeprom)        // Zustand aus dem EEPROM lesen
    		{
    			DDRB |= (1<<PB1);      // LED Einschalten
    			_delay_ms(10000)      //  10 Sekunden warten
    			DDRB &= ~(1<<PB1);   // LED ausschalten
    			
    		}
    		while(1)
    		{
    			//Hier jetzt den Taster abfragen:
    			if(PINB & (1<<PB0))
    			{
    				_delay_ms(5000);          //5 Sekunden warten
    				if(PINB & (1<<PB0))      //Schauen ob der Pin immer noch High ist
    				{
    					//Wie soll ich hier den neuen Wert ins Eeprom schreiben ?
    					//Also neuen Status in das EEPROM schreiben
    				}
    			}
    		}
    	}

    Das habe ich zum Eeprom lesen und schreiben gefunden.

    Code:
    // Byte aus dem EEPROM lesen
    uint8_t EEPReadByte(uint16_t addr)
    {
      return eeprom_read_byte((uint8_t *)addr);
    }
    
    // Byte in das EEPROM schreiben
    void EEPWriteByte(uint16_t addr, uint8_t val)
    {
      eeprom_write_byte((uint8_t *)addr, val);
    }
    Natürlich habe ich noch viel mehr zum Eeprom gefunden.
    Nur ist es für einen Anfänger nicht gerade leicht das richtige zu finden.

    Und ja, ich lese wirklich sehr sehr viel im Internet nur leider fällt es mir sehr schwer das ganze zu verstehen

    PS: Welche Zugriffsart benötige ich bei meinem Programm?
    Byte, word, dword, float oder block ?

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    55
    Beiträge
    2.814
    Welche Zugriffsart Du benötigst, müsstest Du eigenlich wissen.

    https://de.wikipedia.org/wiki/Byte

    https://de.wikipedia.org/wiki/Datenwort

    https://de.wikipedia.org/wiki/Gleitkommazahl

    BLockread und Blockwrite nimmt man normalerweise für große Datenmengen wie ganze Dateien oder Datenströme.


    Du willst doch eigenlich nur ein einzelnes Bit als Merker für den Systemzustand nutzen.
    Nimm einfach das was am nächten an einem Bit dran ist.

Berechtigungen

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

12V Akku bauen