-         

Ergebnis 1 bis 6 von 6

Thema: benötige Hilfe bei Register

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    31.12.2007
    Beiträge
    131

    benötige Hilfe bei Register

    Anzeige

    Hallo,

    ich benötige eure Hilfe bei der Konfigurierung der Ports.
    Also ich besitze das Buch Mehr Spaß mit Asuro band 1, dort ist eben die Rede, dass man eben die Ports als Eigang ('0') oder Ausgang ('1') konfigurieren kann.
    Nun ist in dem Buch geschrieben, dass man die StatusLED zum Aufleuchten bringen kann. Dazu wird folgendes Beispiel erwähnt:

    Von Port B den Pin 0 auf Ausgang setzen: DDRB |= (1<<PB0)
    Jetzt nur noch auf diesen Pin eine '1' achreiben: PORTB |= (1<<PB0)
    Wieder ausschalten, falls gewünscht: PORTB &= ~(1<<PB0)

    So ist es in diesem Buch beschrieben, allerdings verstehe ich dieses Beispiel nicht genau, vll könnt ihr mir ja es noch einmal kleinlich erklären.

    Danke
    mfg Hans

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.11.2006
    Ort
    Hamburg
    Alter
    25
    Beiträge
    384
    Hi Hans,

    DDRB ist das Steuerregister für die I/O Ports in dem Fall für den Port B dort legt man nur fest, ob der Port ein bzw. Ausgang sein soll. Wenn
    im Steuerregister der Port als Eingang konfiguriert ist, dann kann mann mit dem Register PORTX einen sog. Pull Up widerstand einschalten.
    Code:
    DDRB &= ~(1<<PB0)
    PORTB|= (1<<PB0)
    Den braucht man zum Beispiel um "unsaubere" Signale wie zum Beispiel Taster zu entprellen, d.h. es liegt quasi Strom auf der Leitung und der Taster zieht den Port dann auf Masse (logisch 0). Wenn im Steuerregister der Port als Ausgang konfiguriert ist, dann kann man mit dem PORTX Register den Port bzw auch den einzelnen Pin ein- und ausschalten.
    Code:
    DDRB |= (1<<PB0)
    PORTB|= (1<<PB0) //  PB.0 einschalten
    
    DDRB |= (1<<PB0)
    PORTB&= ~(1<<PB0) //  PB.0 ausschalten
    ich hoffe ich habs irgendwie verständlich erklärt.

    mfg
    Erik

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    31.12.2007
    Beiträge
    131
    Hi danke für deine erklärung, ich hatte auch sachon vorher verstanden, wie das so abläuft, allerdings war und ist mir leider immer noch nicht klar, warum ich nun
    DDRB |= (1<<PB0)
    PORTB|= (1<<PB0) // PB.0 einschalten
    schreiben muss,
    kannst du mir diese vorgehensweise mit der ich schätze bitverschiebung genauer erklären, irgendwie verstehe ich das noch nicht...

    Danke aber trotzdem für deine mühe!!!

  4. #4
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.913
    http://www.roboternetz.de/phpBB2/zei...g.php?p=341057

    schau mal da und scroll etwas runter, da hab ich das mal erklärt.
    kleinschreibung ist cool!

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    31.12.2007
    Beiträge
    131
    Zitat Zitat von damaltor
    aaahaalso.. =)

    | bedeutet oder.
    0|0 = 0
    0|1 = 1
    1|0 = 1
    1|1 = 1

    & bedeutet und.
    0|0 = 0
    0|1 = 0
    1|0 = 0
    1|1 = 1

    ~ bedeutet NICHT.

    ~1 = 0
    ~0 = 1


    << bedeutet linksschiebung, >> bedeutet rechtsschiebung.

    1<<3 = 1000
    1<<4 = 10000
    1<<1 = 10
    1<<0 = 1 usw.

    das wort, ws dahinter steht ist eingentlich auch bloß eine zahl, die dem compiler vorher mitgeteilt wurde, oder eine variable.

    0101 << 3 = 0101000

    es werden also ganze zahlen verschoben. so kann man zB eine eins durch einen port wandern lassen mit einer einzigen schleife:

    PORTB = 0x01 //00000001
    PORTB = PORTB<<1 //00000010
    PORTB = PORTB<<1 //00000100
    PORTB = PORTB<<1 //00001000
    PORTB = PORTB<<1 //00010000
    PORTB = PORTB<<1 //00100000
    usw. immer mit edm gleicheb befehl wird der wert nach links geschoben.

    jetzt zu den kompleyxeren sachen.


    stell dir vor, du hast ein register (zB PORTB), dessen inhalt du nicht exakt kennst bzw der veränderlich ist. du willst das bit 2 setzen. du könntest folgendes machen:
    PORTB = 1<<2;
    nachteil: alle anderen bits im register werden auf null gesetzt, denn 1<<2 = 00000100. das ist aber selten das ziel. folgendes ist besser:
    PORTB = PORTB | (1<<2);
    es wird also jedes bit aktiviert, was vorher schon aktiviert war ODER durch 1<<2 definiert wurde. die kurzvorm davon ist
    PORTB |= (1<<2);

    jetzt wollen wir das bit löschen. wir könnten scheiben:
    PORTB = 0;
    jetzt sind aber alle bits null.alternative:
    PORTB = ~(1<<2);
    wir schreiben hier also 00000100, invertieren das zu 11111011, und schreiben das rein. auch nicht besonders gut.besser so:
    PORTB = PORTB & ~(1<<2);
    es werden also nur die bits aktiv, die vorher aktiv waren UND duch ~(1<<2) definiert sind. das bit an stelle zwei wird also gelöscht, alle anderen bleiben. auch davon eine kurzform:
    PORTB &= ~(1<<2);

    also:

    bit setzen:
    REGISTER |= (1<<STELLE);
    bit löschen:
    REGISTER &= ~(1<<STELLE);
    ************************************************** ***********

    Hallo,
    vielen dank für deine Hilfe!!
    Jetzt hab ichs verstanden.

  6. #6
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.913
    Du hättest es vielleicht nich nochmal komplett kopieren müssen... aber gut dass du es verstanden hast.
    kleinschreibung ist cool!

Berechtigungen

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