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

Thema: GCC Anfangsprobleme

  1. #1
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    32
    Beiträge
    601

    GCC Anfangsprobleme

    Anzeige

    Praxistest und DIY Projekte
    Hi,

    ich habe mich wieder einmal mit AVR-GCC beschäftigt und man staune es
    sogar geschaft 2 Leds blinken zu lassen (bei dem vorherigen Versuch habe
    ich sie nicht mal getrennt anbekommen...). Naja ich habe mich dann mal
    an deinen Taster gewagt, was auch funktioniert hat. Nun möchte ich über
    einen Taster eine Variable hochzählen und je nach Wert die Leds an schalten.

    Nur geht das nicht so ganz wie ich das will, hier erstmal der Code den ich
    habe:
    Code:
    #include <avr/io.h>          // (1)
    #include <util/delay.h>
    #include <stdint.h>
       uint8_t i; 
    
    int main (void) {            // (2)
     
       i = 1;
    
       DDRD = (0 << DDD2) | (1 << DDD5) | (1 << DDD6);
    
       while(1) {                // (5a)
    
    	if (PIND & 0x04) {
    		_delay_ms(150);
    		i++;
    		if (i==3){
    			i=1;
    		}
    	}
     		if (i==1) {
    			PORTD = (1 << PORTD5);
    			PORTD = (0 << PORTD6);
    		}
    
     		if (i==2) {
    			PORTD = (0 << PORTD5);
    			PORTD = (1 << PORTD6);
    		}
      }                         // (5c)
     
       /* wird nie erreicht */
       return 0;                 // (6)
    }
    Wenn man auf den Taster (Portd.2) drückt (kurz) wird der gewünschte
    Effekt eigendlich erzieht (die Leds (Portd.5 & 6) blinken). Wenn ich den
    Taster gedrückt halte blinkt nur die Led an D.6, bzw. passiert irgendwas.
    Irgendwie ist das ganze Programm auch etwas instabil und macht was
    es will.

    Gibt es irgendwo in meine Program größere Fehler?

    Was ich auch noch nicht so raus habe ist der Vergleich von Variablen. Muss
    man da if ( i & 0x01 ) ; if ( i == 1 ) oder if ( i = 1 ) benutzen?
    Grüße Furtion

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.11.2004
    Ort
    Aachen
    Alter
    38
    Beiträge
    246
    Ja, den gibt es:

    setzten eines Bits geht so:

    PORTD |= ( 1 << PORTD5);

    und löschen so:

    PORTD &= ~(1 << PORTD5);

    Zum Vergleich:

    if( i & 0x01 ) macht eigentlich folgendes: if( (i & 0x01) != 0)
    i & 0x01 ist hierbei ein bitweises UND.
    Mit der if-Anweisung prüfst du quasi, ob das Bit mit dem Wert 0x01 gesetzt ist.

    if( i == 1) prüft, ob i den Wert 1 hat.

    if ( i = 1) ist nicht das, was du haben willst und vergleicht NICHT i mit 1.


    Viel Erfolg und frohes Fest,
    Thomas

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    13.05.2005
    Alter
    32
    Beiträge
    601
    Hi,

    es geht

    Danke und ein frohes Fest
    Grüße Furtion

Berechtigungen

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

Labornetzteil AliExpress