- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 5 von 5

Thema: Ausgänge setzen

  1. #1

    Ausgänge setzen

    Anzeige

    Praxistest und DIY Projekte
    Es gibt ja mehrere Arten Ausgänge anzusteuern aber bei mir machen die alle was andres.
    1. PORTB |= (1<<PB4);
    2. PORTB &= ~_BV(PB4);

    Bei diesem Code habe ich die 2. Variante verwendet. Wenn ich bei dem gleichen Programm die 1. Variante anwende, dann gehen nach 50 mal Durchblinken meine LED`s nicht mehr aus.

    Code:
     
    #include <avr/io.h>
    #define F_CPU 1000000UL  // 1 MHz
    #include <util/delay.h>
    
    int main(void)
    {
      DDRB = (1<<DDB0) | (1<<DDB1) | (1<<DDB2) | (1<<DDB3);  // PB0, PB1, PB2 Ausgänge
      int leuchtzeit =200;	                                                                    // Blinkzeit
      int i=1;	
         
       while (i<50) {                                                                             // 
    	   
        PORTB &= ~_BV(PB0); _delay_ms(leuchtzeit); PORTB |= _BV(PB0);
        PORTB &= ~_BV(PB1); _delay_ms(leuchtzeit); PORTB |= _BV(PB1);
        PORTB &= ~_BV(PB2); _delay_ms(leuchtzeit); PORTB |= _BV(PB2);
    
       i++;
                          }
       return(0);
    }

    Was ist der Unterschied zwischen 1. und 2.??

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    42
    Beiträge
    1.780
    Variante 1 setzt ein Bit, Variante 2 löscht es... davon abgesehen gibt es keine Unterschiede, da _BV(x) letztendlich auch nur durch (1 << x) ersetzt wird
    So viele Treppen und so wenig Zeit!

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Wie Felix schon sagte, ist Deine Reihenfolge einfach falschrum.

    Erst setzen mit "PORTB |= _BV(PB0)" (Da wird verODERt, d.h. ein Bit GESETZT), dann löschen mit "PORTB &= ~_BV(PB0)"! (Da wird mit dem Gegenteil verUNDet, d.h. ein bit GELÖSCHT)

  4. #4
    Ah super das geht jetzt.

    wollt jetz bisschen erweitern mit ner if Anweisung.

    Code:
    #include <avr/io.h>
    #define F_CPU 1000000UL  // 1 MHz
    #include <util/delay.h>
    #include <inttypes.h>
    #include <stdint.h>
    #define leuchtzeit 200
    
    
    
    int main(void)
    {
      DDRB = (1<<DDB0) | (1<<DDB1) | (1<<DDB2) | (1<<DDB3);  // PB0, PB1,PB2Ausgänge
    
      int i=1;	
    	
      
    
       while (1)
      {
    
       	if (i > 30){	
    
    			PORTB |= (1<<PB3);
    
                         }
       	else         {
    		while (i<50) {
    	   
        		PORTB &= ~(1<<PB0); _delay_ms(leuchtzeit); PORTB |= (1<<PB0);
        		PORTB &= ~(1<<PB1); _delay_ms(leuchtzeit); PORTB |= (1<<PB1);
        		PORTB &= ~(1<<PB2); _delay_ms(leuchtzeit); PORTB |= (1<<PB2);
    
       		i++;
                         }        }
      }
    
       return(0);
    }
    Jetzt sollte ja eigentlich nach 30 mal blinken der Ausgang PB3 angesprochen sein. Aber PB3 ist nach Programmstart sofort an und geht dann wieder aus wen PB0..3 aufhören durch zulaufen. Irgendwie ignoriert der meine if Anweisung.

  5. #5
    Ich hab jetz mal die If anweisung in die Schleife gemacht dan geht es.
    Wie krig ich das hin das es auch außerhalb funktioniert?

Berechtigungen

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

Solar Speicher und Akkus Tests