-         

Ergebnis 1 bis 8 von 8

Thema: C Anfänger! Bitte code angucken

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    15.07.2006
    Beiträge
    9

    C Anfänger! Bitte code angucken

    Anzeige

    Halllo Leute, ich fange grad bei absolut null an.

    Ich hab hier einen kleinen Code:

    Code:
    #include <avr/io.h>
    #include <stdint.h>
    #include <util/delay.h>
    uint8_t i;
     
    int main(void)
    	{
    		DDRC |= (1<<DDC0);
    		DDRB &= ~(1<<DDB0);
    		PORTC |= (1<<PORTC0);
    	while(1) {	
    		if(PINB & ~(1<<PINB0) == 1) 
    		{
    	
    		PORTC |= (1<<PORTC0);
    		_delay_ms(1000);
    
    		PORTC &= ~(1<<PORTC0);
        	_delay_ms(1000);
    		
    		PORTC |= (1<<PORTC0);
    		_delay_ms(1000);
    		}
    	}
       return 0;
     }
    leider macht der nicht was ich will, Irgendwie scheint die IF bedingung nicht zu funktionieren. an PB0 ist ein Taster angeschlossen der von VTG also 5V bei betätigung auf GND geht. Aber die schleife bedingung wird nicht abgearbeitet. Schreibe ich es anders rum das es bei logisch 1 abgearbeitet wird klappt es. Ich hab wohl nen fetten denkfehler drin.
    Brauch ich die While schleife eigentlich? Was ist der unterscheid zwischen return 0 und return 1?


    Vielen Dank!

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.11.2004
    Ort
    Aachen
    Alter
    32
    Beiträge
    246
    if(PINB & ~(1<<PINB0) == 1)

    muss zu:

    if(PINB & (1<<PINB0) == 0)

    du willst ja nur das erste bit maskieren, du hast genau dieses nicht maskiert
    Und == 0, da das ja ausgeführt werden soll, wenn der Button gedrückt wird (also auf GND zieht).

    Die while-Schleife ist einfach eine Endlosschleife, damit also immer wieder abgefragt wird, ob der Button gedrückt wurde oder nicht.
    Ansonsten würde das Programm einmal durchlaufen und das wars (das ganze ginge so schnell das würdest du gar nicht merken).

    return 0 oder return 1 ist hier egal, da dies aufgrund der while-Schleife eh nie erreicht wird...

    mfg
    zerush

    edit:
    vielleicht noch zur Erklärung
    PINB & (1<<PINB0) macht folgendes:
    PINB0 ist nichts anderes als 0, somit ist (1<<0) das gleiche wie 1, oder 0b00000001
    wenn du also PINB & 0b00000001 machst, erhälst du 0b0000000x, wobei das x das bit0 von PINB ist...
    Ich hoffe das war so verständlich

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    15.07.2006
    Beiträge
    9
    Hallo,

    ich habs wie von dir genannt, aber es klappt leider immer noch nicht. Hab gemessen, also der Pegel fällt auf GND, also die hardwareseite ist 100%ig okay.

    if(PINB & (1<<PINB0) == 0)

    aber verstehe ich das richtig. die Bedinung PINB ist doch 1 oder? und die Bedingung 1<<PINB0 ist 0 richtig?
    Die Tilde (~) sagt negiert aus richtig?

    Was macht return 0 und 1 für einen unterschied wenn ich es erreiche?

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.11.2004
    Ort
    Aachen
    Alter
    32
    Beiträge
    246
    Also, das einfache & ist KEINE Verknüpfung von Bedingungen!!! Das wäre &&...
    & ist eine bitweise VerUNDung.
    Beispiel:
    00110011
    00011100 &
    -----------
    00010000

    PINB sollte also 00000000 sein, wenn der Button gedrückt wird (der Pin auf GND liegt) und 00000001, wenn er nicht gedrückt ist.

    Das &(1<<PINB0) sorgt also nur dafür, dass du alle Bits außer dem relevanten ignorierst.

    Die Tilde invertiert dir jeweils die Bits, aus 00010010 wird also 11101101.

    return 0 gibt eine 0 zurück, return 1 ne 1..
    Das ist völlig egal, da die Main Funktion die oberste Funktion ist und wenn die zuende ist, ist das Programm zu Ende, der Rückgabe Wert interessiert dann nicht mehr

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    15.07.2006
    Beiträge
    9
    Hallo,

    dann müsste dieser Code doch funktionieren:

    Code:
    #include <avr/io.h>
    #include <stdint.h>
    #include <util/delay.h>
    uint8_t i;
     
    int main(void)
    	{
    		DDRC |= (1<<DDC0);
    		DDRB &= ~(1<<DDB0);
    		PORTC |= (1<<PORTC0);
    	while(1) {	
    		if(PINB&(1<<PINB0) == 0) 
    		{
    	
    		PORTC |= (1<<PORTC0);
    		_delay_ms(1000);
    
    		PORTC &= ~(1<<PORTC0);
        	_delay_ms(1000);
    		
    		PORTC |= (1<<PORTC0);
    		_delay_ms(1000);
    		}
    	}
       return 0;
     }
    Tut es aber nicht. Aber umgekehrt schon, also wenn ich die Bedingung ändere das sie durchläuft wenn logisch 1 dann geht solange der taster nicht gedrückt wird, drücke ich den taster stoppt die schleife nach den aktuellen durchlauf bis ich wieder los lasse.

    Irgendeine idee?

    Ach nochwas. Die gleichung von deiner Bitweisen verknüpfung also WerUNDung. ist die sicher so richtig?

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    28.10.2004
    Beiträge
    899
    !?

    Probiers mal mit:
    High:
    Code:
    if(PINB&(1<<PINB0)) {code...}
    Low:
    Code:
    if(!(PINB&(1<<PINB0))) {code...}
    Bin zwar schon etwas aus der Übung was AVR Programmieren angeht aber eig. sollte das funktionieren....

    Mfg
    Error is your friend!

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    15.07.2006
    Beiträge
    9
    Hey, genial. So klappt es. Gut dann experementier ich mal weiter.

    Danke!

    Wiefit biste denn noch auf C? Timer etc. ?

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    28.10.2004
    Beiträge
    899
    Jo geht noch so... muss halt ein paar mal was nachlesen... hab schon seit nem jahr oder so kein avr-c mehr geproggt da vergisst man schon vieles... empfehlen kann ich dir das hier:
    http://www.mikrocontroller.net/artic...ounter_des_AVR

    bzw. wenn es um pwm geht:

    http://www.kreatives-chaos.com/artik...nipsel-avr-gcc

    Mfg
    Error is your friend!

Berechtigungen

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