- fchao-Sinus-Wechselrichter AliExpress         
Seite 4 von 4 ErsteErste ... 234
Ergebnis 31 bis 37 von 37

Thema: Problem mit Timer0

  1. #31
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Versteh nur noch nicht warum es besser ist zwei Variablen zu deklarieren anstatt eine global zu deklarieren...
    Da hab ich mir was angetan

    Aber wenn man a sagt muß man auch b sagen, ich versuchs mal.

    Es ist allgemein besser, wenn sich Funktionen Ihre Daten gegenseitig zuschieben, anstatt die Daten über globale Variablen auszutauschen, du hast auch gut angefangen schau:
    Code:
    uint16_t ADC_einlesen(void)
    {
       uint8_t i;                                 //Variable i deklarieren
       
    
       for (i=0; i<3; i++)                           //for-Schleife für dreimalige Wandlung
       {
          ADCSRA |= (1<<ADSC);                     //Wandlung starten
          while(ADCSRA & (1<<ADSC));                  //auf Ergebnis warten
          result += ADC;                           //Ergebnis in Variable result schreiben
       }
    
       ADCSRA &= ~(1<<ADEN);                        //ADC deaktivieren
       result /=3;                                 //result durch 3 teilen
       return result;
    }
    Bei dieser Variante ist return result nicht nötig, weil result bei Dir global ist, die Funktion hätte ohne Rückgabewert funktioniert.
    Du kannst von überall auf result zugreifen, verändern usw.
    Das ist schon der Erste knackpunkt.
    Du könntest es auch verändern ohne es zu wollen.
    Zugegeben bei diesem kleinem Programm wohl nicht so einfach, du willst aber irgendwann was größeres schreiben, vielleicht über mehrere *.c Dateien verteilt, da sieht es schon anders aus mit der Übersichtlichkeit.
    Sowas hat mit Datenkapselung zu tun und Gültigkeitsbereichen, ich denke da an OOP mit Klassen und private Atributen.
    Nehmen wir jetzt eine Variante mit lokalen Variablen
    Code:
    uint16_t ADC_einlesen(void)
    {
       uint8_t i;                                 //Variable i deklarieren
       uint16_t result = 0;
    
       for (i=0; i<4; i++)                           //for-Schleife für dreimalige Wandlung
       {
          ADCSRA |= (1<<ADSC)|(1<<ADEN);         //Wandlung starten
          while(ADCSRA & (1<<ADSC));                  //auf Ergebnis warten
          result += ADC;                           //Ergebnis in Variable result schreiben
       }
    
       ADCSRA &= ~(1<<ADEN);                        //ADC deaktivieren
       result /=4;                                 //result durch 3 teilen
       return result;
    }
    Hier wird Dein ADC Ergebnis zurückgeliefert, ich habe mir erlaubt noch 2 Änderungen vorzunehmen, OK ?

    Diese Funktion wird in main so aufgerufen und zwar ohne lokale Variable zu nehmen
    Code:
    if(ADC_einlesen() <350)
          {
             PORTB &= ~(1<<PB1);         //Einschalten der LED an B1
          }
          else
          {
             PORTB |= (1<<PB1);            //wenn result größer, LED ausschalten
          }
       }
    Ich hoffe, du stimmst mir zu, das die Sache übersichtlicher ist

    Denke man daran daß Du eventuell in einem Jahr an Deinem Programm was ändern willst.

    Andere Sache ist, Globale Variablen 'leben' im Ram, lokale fast immer in Registern, auch der Rückgabewert wird in Registern übergeben was die Sache natürlich schneller macht.

    Zum Schluß Zitiere ich paar Zeilen aus Kerninghan&Ritchie

    " Übrigens besteht eine Tendenz alle nur denkbaren Variablen extern zu vereinbaren, denn das vereinfacht anscheinend die Zusammenarbeit
    zwischen Funktionen - Parameterlisten sind kurz und Variablen sind immer verfügbar, wenn wir sie benötigen.
    Aber externe Variablen sind immer verfügbar, sogar dann, wenn wir sie nicht benutzen wollen.
    Sich zu sehr auf externe Variablen zu verlassen ist höchst gefählich,
    denn es führt zu Programmen, deren Dattenverbindungen absolut nicht offensichtlich sind - Variablen können an unerwarteten Stellen sogar unbeabsichtlich verändert werden, und das Programm ist sehr schwer zu ändern..."

    Seite 32

    So jetzt habe ich keine Lust mehr

    P.S. Wenn Du mit global besser klar kommst werde ich es Dir nicht mehr ausreden, wir sprechen uns irgendwann mal wieder
    Software is like s e x: its better when its free.
    Linus Torvald

  2. #32
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.653
    Zitat Zitat von izaseba
    .. Da hab ich mir was angetan .. Aber wenn man a sagt muß man auch b sagen, ich versuchs mal...
    Herrlich, Sebastian. Auf die Art fange sogar ich an, C zu verstehen.

    Aber nun (m)ein Sonderfall ! ? Die ISR. Die kann doch keinen aufrufenden Parameter haben. Und nun will ich den Wert (beispielsweise eine Zeitmarke)
    Code:
    ISR(TIMER0_COMPA_vect)          // Vektor 14
    {
      {
        if (Izeit_1 < 60000)	//Zeitstand Interrupt-Timer läuft von 1 .. 60 000
          Izeit_1 ++;		//  d.h. alle drei Sekunden wird 60000 erreicht
          				//  und Izeit_1 bleibt in der uint16-Grenze
        else
          {  
          Izeit_1 = 0;		// ansonsten: Rückstellen auf Null
          				//    d.h. alle drei Sekunden wird 60000 erreicht
          PORTC ^= (1<<PC0);        //  Zur Kontrolle im Test PC1 toggeln - 50 µs.
          }
      }
      {
        if (Iregmo < 200)           //Zeitstand Regelungs-Timer läuft von 1 .. 200
          Iregmo ++;		//    d.h. alle Sekunden wird 100 mal geregelt
        else
          { Iregmo = 0;		// ansonsten: Rückstellen auf Null und
             			//    100 mal pro Sec Regelungsaktion durchführen
            PORTC ^= (1<<PC2);      // Statt Regelung im Test PC1 toggeln,
    	                        // 200 * 0,050 ms => 10 ms.
          }
      }
    }
    auch im main auswerten - ohne ihn zu beschädigen oder beim Auslesen von der ISR beschädigt zu bekommen. Klar - Übernahme im main erst nach cli. Aber anders als global geht es doch hier garnicht. Oder?
    Ciao sagt der JoeamBerg

  3. #33
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hallo Joe,
    ja Du hast recht wenn Du mit Interrupts Daten tauschen willst, kommst Du um Globale Variablen nicht herum, leider.
    Bei kleinen Programmen geht das noch, kein Problem, aber sobald es größer wird...
    Vor allem wenn Du über mehrere *.c Dateien gehst.
    z.B. Der avr-gcc Port von Butterfly http://www.siwawi.arubi.uni-kl.de/avr_projects/#bf_app
    Den habe ich seinerzeit auseinandergenommen um den Butterfly in einen Dattenlogger zu verwandeln, das war eine Fleißarbeit glaube mir.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  4. #34
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.653
    Danke Sebastian, dann bin ich erstmal beruhigt. Und Deinen Rat - na ja, mit dem von K&R natürlich - werde ich hoffentlich IMMER beherzigen.

    Schliesslich - ISR sind doch meist recht projektbezogen, oder? Zumindest meine soll Zeitgeber und Antriebsregelung werden. Das kann ja nicht so leicht allgemein verwendet werden.
    Ciao sagt der JoeamBerg

  5. #35
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Ja Joe,
    keine Panik, vielleicht habe ich mich etwas zu weit aus den Fenster gelehnt, so schlimm ist es ja nicht wenn man was global macht, nur Anfänger neigen dazu die nur noch zu nehmen (sehe Zitat aus K&R)
    Es gab hier sogar schon einen 'Helfer' der gesagt hat man sollte alle Variablen volatile machen um Problemen wie im Anfangspost aus dem Weg zu gehen...

    Wie weit bist Du mit Deinem K&R ? Da sind wirklich sehr gute Beispiele wie Funktionen untereinander Daten austauschen, findest Du das Buch gut, oder haben wir Dir doch was falsches empfohlen ?

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  6. #36
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.653
    Ja - ich finde das Buch gut (schon allein deswegen, weil ich es seit Jahrzehnten vom Hörensagen kenne). Also hier mal meinen Dank. Ohne euren (drängenden) Rat hätte ich den weder gekauft noch gelesen. Aber ich bin nicht durch. Ich mache so ein Gemisch aus Buch lesen, programmieren (fehlerbehaftet, siehe unten) und "löten".

    Andererseits: Nein, ich finde die Tutorials besser. Wo sonst kann ich mit [Strg] [F] nach - beispielsweise so etwas wie &= ~ "auf die Schnelle" finden - weil ich da einen dämlichen Fehler gemacht hatte, der drei Tage böse Worte gegen des mega168 ergab.

    Sinn ergibt also das Gemisch aus allen vieren: K&R, tutorials, selber machen UND in den Threads schmökern.

    Immerhin ist mein jüngstes Problem (mega168 - SRAM zu 76 % voll und ich will noch was reinbringen) nur auf die dritte Art lösbar - wenn man dann alle sendusart´s streicht, bleiben knapp 4% genutztes SRAM übrig.

    Nee, es ist sogar ein Gemisch aus fünfen: einer der wirklich wichtigen Punkte sind die hilfreichen Geister, die sich durch meine elllenlangen Codes durcharbeiten und Tips geben oder aufmuntern - einfach wirklich helfen!
    Ciao sagt der JoeamBerg

  7. #37
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Immerhin ist mein jüngstes Problem (mega168 - SRAM zu 76 % voll und ich will noch was reinbringen) nur auf die dritte Art lösbar - wenn man dann alle sendusart´s streicht, bleiben knapp 4% genutztes SRAM übrig.
    BITTE ?
    Was hast Du alles an Variablen drin ?
    Geht sicher zu lösen? sendusarts ? lass mich raten, Du gibst viele Texte aus ?

    Hmm wir werden Offtopic hier (wie immer) schreib mir bitte ein PN mit Deinem Problem, vielleicht kann ich helfen

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

Seite 4 von 4 ErsteErste ... 234

Berechtigungen

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

Labornetzteil AliExpress