- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: If-Anweisung

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    22.10.2007
    Beiträge
    23

    If-Anweisung

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,


    in AVR Studio setze ich PINA auf HIGH. Die Abfrage if ( i != 0 ) ergibt doch eine "1", also wahr. Jetzt muss demnach Funktion test() angesprungen werden. Im Simulator wird PINA mit "1" angezeigt. Warum wird der Funktionsaufruf test() übersprungen? Bin neu in C. Fehlt irgendwo ein { oder ; oder sonst was? Nach der if-Abfrage springt der Befehlszähler sofort auf PORTB +=akku;

    Danke meinen Helfern.

    Udo

    Code:
    #include <avr\io.h>
    
    uint8_t i, akku=9;
    
    
    int main( void )
    {
    
    while(1)
    
    {
    // Funkion test1 aufrufen, wenn Bit 0 in Register PINA gesetzt (1) ist
    
    
    i = PINA; // Inhalt in Arbeitsvariable
    i = i & 0x01; // alle Bits bis auf Bit 0 ausblenden (logisches und)
    // falls das Bit gesetzt war, hat i den Inhalt 1
    
    if ( i != 0 ) // Ergebnis ungleich 0 (wahr)?
    {
    int test1(); // dann muss Bit 0 in i gesetzt sein -> Funktion aufrufen
    }
    akku+=1;
    
    PORTB +=akku;
    ....................................................................
    
    Hier geht es weiter in der While-Schleife
    
    // FUNKTIONEN test1() und weitere
    
    
    int test1();
    {
    
    PORTB=0x55;
    }
    
    return 0 ;

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Kann es sein, dass du den Pin erst auf High setzt, nachdem das Programm bereits i initialisiert hat?
    Oder überschreibt möglicherweise die Tatsache, dass das DDRA nach einem Reset erst einmal auf Input steht, deinen manuell gesetzten Wert?
    Am einfachsten wäre es wohl, wenn du den entsprechenden Anschluss (im Programm) auf Ausgang und "1" setzt ...

    mfG
    Markus

    PS: Wenn du den Wert von PINA0 haben möchtest, nimm doch die entsprechende Konstante anstelle von 0x01, damit bist du auch abgesichert für den Fall, dass der Pinwert mal nicht mit dem Bit korrespondiert (gibts das überhaupt?)

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    22.10.2007
    Beiträge
    23
    ็Hallo Markus,

    ich habe, deinem Vorschlag zur Folge, vor der Anweisung i=PINA den PINA0 auf HIGH gesetzt. Trotzdem wird die Funktion test() übersprungen.

    Also:

    PINA|= (1<<PA0);
    i = PINA; // Inhalt in Arbeitsvariable
    i = i & 0x01; // alle Bits bis auf Bit 0 ausblenden (logisches und)

    if ( i != 0 ) // Ergebnis ungleich 0 (wahr)?
    {
    extern test1(); // dann muss Bit 0 in i gesetzt sein -> Funktion aufrufen
    }

    Das sieht wohl nach einem kapitalen Anfängerfehler aus, oder? Ich weiß aber nicht, was an diesen Anweisungen falsch sein könnte.


    Udo

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    42
    Beiträge
    2.009
    Also das hier:
    Code:
    PINA|= (1<<PA0);
    dürfte nix bringen. Soweit ich weiss, kann man von PINx nur lesen.
    Zum Schreiben gibts PORTx und DDRx.
    Also zum "High" setzen gibts 2 Möglichkeiten:

    Als Input, mit aktivem Pull-Up:
    Code:
    DDRA &= ~(1 << PA0);
    PORTA |= (1 << PA0);
    Als Output:
    Code:
    DDRA |= (1 << PA0);
    PORTA |= (1 << PA0);

    Du kannst ja mal nach "i = PINA;" den Wert von i ausgeben lassen, ob da auch wirklich was drinsteht.
    #ifndef MfG
    #define MfG

  5. #5
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    Guten Morgen 1udo1

    mir sind erst mal zwei Sachen sofort ins Auge gefallen die mich zweifeln lassen, dass dein Code überhaupt kompiliert wurde. Zumindest nicht ohne dir irgendetwas mitzuteilen.
    Irgendwie stimmen die öffnenden und schließenden Klammern nicht so recht überein.

    Deine Funktion test1() hat als Rückgabewert einen int, den du aber erst außerhalb der Funktion setzt. Ich verstehe auch nicht wieso du die Funktion innnerhalb der main deklarieren willst. Muss gleich mal ausprobieren was mein Kompiler dazu sagt.

    Irgendwie weiß man gar nicht wo deine main() aufhört. Da wird das Helfen schwer. Ich gehe mal davon aus, dass du nur Ausschnitte kopiert hast.

    Nimm doch mal die Deklaration oder sogar die ganze Definition von test1() vor die main und ruf dann einfach mit x=test(); auf. Wenn du keinen Rückgabewert brauchst kann die Funktion auch void test1(void) sein. Dann sieht dein Aufruf test1(); auch wieder besser aus.

    Wie gut sind denn deine C Kenntnisse?

    Man sollte auch alle Warnungen beachten. Das spart so manche Überraschung bei der Ausführung

    sast

    雅思特史特芬
    开发及研究

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Alles nötige wurde schon angesprochen, ich ergänze und fasse zusammen:
    - int test() macht nur über dem Hauptprogramm Sinn, im Hauptprogramm nur "x = test();" aufrufen.
    - Bitte code-Tags benutzen, damit man den Code besser lesen kann.
    - Die Klammern überprüfen oder das ganze Programm posten.
    - Warnungen des Compilers lesen!
    - Die Zeile "PINA|= (1<<PA0);" ist quatsch.
    - Was Jaecko gesagt hat, passt leider nicht zum Thema, muss aber trotzdem beachtet werden!
    - PortB muss erst als Ausgang definiert werden.

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    if ( i != 0 )
    {
    int test1(); //Das ist eigentlich nur eine definition und kein Code
    }
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    21.07.2008
    Ort
    Moosburg
    Alter
    46
    Beiträge
    49
    Hi!

    Du schreibst:
    Code:
    if ( i != 0 ) // Ergebnis ungleich 0 (wahr)?
    {
        int test1(); // dann muss Bit 0 in i gesetzt sein -> Funktion aufrufen
    }
    Das "int" beim Funktionsaufruf von test1() ist falsch. Nimm das mal weg. Mit
    Code:
    int test1();
    deklarierst Du eine Funktion. Ich weiss jetzt allerdings nicht, ob das irgendwo zwischendrin C-konform ist. Ich denke mal, dass es daran liegen könnte.


    Viele Grüße,

    Markus

  9. #9
    Erfahrener Benutzer Roboter-Spezialist Avatar von sast
    Registriert seit
    30.11.2004
    Alter
    53
    Beiträge
    502
    so hab es mal getestet, weil es mir keine Ruhe gelassen hat und ein int test2(); in die main() getippt. Wie zu erwarten war kam bei mir folgende Warnung: "warning: function declaration isn't a prototype"

    Wenn du wissen willst ob er überhaupt in die if springt, kannst du den Inhalt deiner test1 Funktion einfach mal an die Stelle des Funktionsaufrufes setzen.

    Besser von klein nach groß probieren, als hinterher abspecken zu müssen. Da baut man sich sonst bloß noch neue Fehler ein.

    Du solltest dich da vorher mal genauer mit Funktionen -Deklaration, Definition und Aufruf- beschäftigen. Sonst kommt ganz schnell was anderes raus als man geplant hat.

    Und nochmal der Hinweis mit den Warnungen. Das kann man nicht oft genug sagen.

    sast

    雅思特史特芬
    开发及研究

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    22.10.2007
    Beiträge
    23
    Hallo und DANKE an meine Tutoren,

    für meine Kollegen Anfänger poste ich das Programm, wie es meine Helfer vorgeschlagen haben. Es wird dem einen oder anderen eine Hilfestellung sein, um sich in C langsam vorzutasten.

    Kann mir vorstellen, dass es nicht unbedingt geschickter Code ist, aber er funktioniert.

    Noch eine Frage an die Fachleute:

    Wird der Variablen x ein Wert zugewiesen?

    Code:
    x = test1();  // dann muss Bit 0 in i gesetzt sein -> Funktion
    Bin mir nicht sicher, weil im Klammerausdruck von test() kein Parameter drin steht. Stimmt das?

    Bitte habt Nachsehen, ich blicke noch nicht so durch!

    Also hier der Code, der funktioniert

    Code:
    // Port einlesen mit Prüfung des Zustandes von Portbits IF-ANWEISUNG
    
    // Januar 2009 o.k.
    
    // Tastenkombinationen 
    // << links unten,    { ALT-GR und 7,   } ALT-GR und 0,   [ ALT-GR und 8,  ] ALT-GR und 9,
    // ~ ALT-GR und *,    | ALT-GR und Pfeil unten links,
    
    #include <avr\io.h>
     
    uint8_t i, x, akku, c_akku,b;
    
    
     int test1()
     {
     c_akku +=1;
    
     PORTC = c_akku;
    
     return 0 ;
    
      }
    
    int main( void )
    {
      	DDRA = 0xff;	// R24 Ausgang 
    	DDRB = 0xff;	// R24 Ausgang 
    	DDRC = 0xff;	// R24 Ausgang
    
       while(1)
       	{
    // Funkion test1 aufrufen, wenn Bit 0 in Register PINA gesetzt (1) ist
    	
    	i = PINA;       // R18 Inhalt in Arbeitsvariable
    
    // PORTA0 wird nur gelesen, wenn DDRA als Ausgang definiert ist; wird der PORTA0 auf 
    //HIGH gesetzt, dann wird automatisch das Bit PINA0 gesetzt
    
    	i = i & 0x01;   // alle Bits bis auf Bit 0 ausblenden (logisches und)
                      	           // falls das Bit gesetzt war, hat i den Inhalt 1
    	
    	if ( i != 0 )	// Ergebnis ungleich 0 (wahr)? 
    		{   			
      		x = test1();  // dann muss Bit 0 in i gesetzt sein -> Funktion aufrufen
        	            }
    		akku+=2;
    		PORTB =akku;
    	} // Ende while-Schleife
    }

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress