-         

Seite 1 von 6 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 51

Thema: Pins, Ports und Fragen beim Lernen...

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von squelver
    Registriert seit
    20.07.2006
    Ort
    Hoykenkamp
    Alter
    37
    Beiträge
    2.474

    Pins, Ports und Fragen beim Lernen...

    Anzeige

    Hallo ihr

    Ich steh seit Wochenende n bischen auf dem Schlau bzw. verstehe etwas nicht.

    Ich habe einige Testprogramme in C getestet und mit den Port's rumprobiert, auch Tutorials hab ich mitgemacht, nur was ich nicht ganz vertehe.

    Wie ich beim Mega 8 die Ports B/ C/ D und DDR definiere, denke ich, hab ich verstanden.

    Was ich nicht verstehe:

    Wie sieht das aus bzw. was muss ich machen, wie schreiben, wie die Bits ansprechen, damit ich von z.B. PORTB jeden einzelnen Pin verwalten kann.

    Also dass ich z.B. PORTB / B0 für nen Taster als Eingang und PORTB / B2 als Ausgang definiere \/

    Mir ist aufgefallen, das wenn ich den PORTB so als Ausgang definiere, dann funtionieren alle PIN's (B0 - B5) als Ausgang, aber wie einzeln ansprechen?

    Sicher wurde das schon öfter beschrieben, ich habe leider bisher keine vernünftige Erklärung dazu finden können.

    Vielen Dank im Voraus...

    Gruß Andreas
    * Da geht noch was *

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Ich weiss jetzt nicht welchen Compiler du benutzt bei CodeVision gibt es da 2 Möglichkeiten.

    DDRC=0b00000101;

    PORT C0 und C2 sind Ausgang, alle anderen Eingang.

    oder
    DDRC.0=1;
    DDRC.2=1;

    Das Ergebnis ist das gleiche, da die Ports nach einem Controllerreset auf 0 stehen.

    Ich denke mal in AVR GCC wird das ähnlich funktionieren.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von squelver
    Registriert seit
    20.07.2006
    Ort
    Hoykenkamp
    Alter
    37
    Beiträge
    2.474
    Zitat Zitat von wkrug
    Ich weiss jetzt nicht welchen Compiler du benutzt bei CodeVision gibt es da 2 Möglichkeiten.

    DDRC=0b00000101;

    PORT C0 und C2 sind Ausgang, alle anderen Eingang.

    oder
    DDRC.0=1;
    DDRC.2=1;

    Das Ergebnis ist das gleiche, da die Ports nach einem Controllerreset auf 0 stehen.

    Ich denke mal in AVR GCC wird das ähnlich funktionieren.
    Klasse, dann war ich ja schon sehr dicht dran \/

    Ich denke, das DDRC.0=1; wird es sein, ich werd heut abend gleich probieren *freu*, hab da bestimmt ein paar Stunden mit verbracht, die Lösung zu finden, musste dann aufgeben, weil ich nichts darüber auf meinem Rechner liegen und erst heut früh meinen neuen Internetanschluss bekommen habe

    Das Fettgeschriebene hab ich gesucht:
    DDRC.0=1;

    Danke dafür, melde mich, wenn ichs getestet habe

    Andreas
    * Da geht noch was *

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.11.2006
    Ort
    Geislingen a. d. Steige
    Alter
    26
    Beiträge
    344
    Hi,

    Das wird nicht funktionieren:
    PORTX.0 = 1 ist eine spezielle funktion von CodeVision!

    so setzt man bits: PORTX |= (1<<Y); Y ist dein Bit!!
    so löscht man bits: PORTX &= ~ (1<<Y);

    MfG Martin

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von squelver
    Registriert seit
    20.07.2006
    Ort
    Hoykenkamp
    Alter
    37
    Beiträge
    2.474
    Hi

    Das Beispiel von WKrug hab ich öfter in meinen Testprogrammen vorgefunden

    Ich arbeite mit dieser Software:
    http://www.myavr.de/shop/artikel.php?artID=19

    Was meinst dazu?
    * Da geht noch was *

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.11.2006
    Ort
    Geislingen a. d. Steige
    Alter
    26
    Beiträge
    344
    Hi,
    ich kenne diese software nicht! aber mit den befehlen von mir müsste es unter jedem compiler funktionieren!

    MfG Martin

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von squelver
    Registriert seit
    20.07.2006
    Ort
    Hoykenkamp
    Alter
    37
    Beiträge
    2.474
    Dann kläre mich bitte auf, so --> PORTX |= (1<<Y); <-- kann ich mir nur denken, was da ungefähr passiert (php kenntnisse)

    Aber wie wende ich das anhand meines Beispiels (ganz oben) an?

    Ich möchte, ohne irgendwelche Zusatzfunktionen und Schleifen) jeden einzelnen Pin eines Portes im Quellcode ein- und ausschalten können.
    Lasse ich mir via LED's anzeigen

    Gruß Andreas
    * Da geht noch was *

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.11.2006
    Ort
    Geislingen a. d. Steige
    Alter
    26
    Beiträge
    344
    PORTA |= (1<<2);
    ist abgekürtzt: PORTA = PORTA | (1<<2);

    Durch 1<<2 wird die zahl 1 binär 00000001 um zwei stellen nach links verschoben also 00000100.

    jetzt wird das ergebnis mit PORTA verodert

    00000[highlight=red:fd71d6c119]1[/highlight:fd71d6c119]00
    01011[highlight=red:fd71d6c119]0[/highlight:fd71d6c119]11 PORTA
    -------------
    01011[highlight=red:fd71d6c119]1[/highlight:fd71d6c119]11

    ebenso funktioniert es beim löschen.

    PORTA &= ~(1<<2);
    ist abgekürtzt: PORTA = PORTA & ( ~(1<<2));

    erst wird wie der die zahlt eins um 2 stellen nach links verschoben

    dann wird sie mit "~" invertiert (einsen werden zu nullen und nullen zu einsen).
    und dann wird das ergebnis mit PORTA verundet

    11111[highlight=red:fd71d6c119]0[/highlight:fd71d6c119]11
    01011[highlight=red:fd71d6c119]1[/highlight:fd71d6c119]11 PORTA
    -------------
    01011[highlight=red:fd71d6c119]0[/highlight:fd71d6c119]11

    MfG Martin

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    1.892
    Das Beispiel von Martin wird auch funktionieren.

    Du Schiebst eine 1 um 0,1,2,3... nach Links (1<<2)und machst dann eine Oder verknüpfung mit dem entsprechenden Register.

    Als Alternative könnte ich noch Inline Assembler anbieten.

    #asm ("SBI DDRC,0");

    Das Beispiel geht so auch in CodeVision.
    Allerdings muss dan DDRC mit einer Assembler Direktive vorher initialisiert werden.
    Aus diesem Ausdruck wird lediglich 1 Assembler Kommando generiert, ist also sehr schnell.

    Oh Martin war schneller.

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von squelver
    Registriert seit
    20.07.2006
    Ort
    Hoykenkamp
    Alter
    37
    Beiträge
    2.474
    Soweit ist das sehr gut erklärt, muss das nur verinnerlichen und heut abend ausprobieren
    Nur warum muss man das Bit löschen? Passiert das nicht von allein?
    Wo definiere ich für ein einzelnes Bit , ob es ein Ausgang bzw. Eingang ist?

    @wkrug
    Assembler hab ich mir angeschaut und testweise auch n Quellcode davon gebrannt und rumgetestet, einiges scheint einfacher zu erstellen.
    Will aber erstmal ohne Assembler auskommen

    EDIT:
    Hab mittlerweile Infos zum Definieren und Auswerten der einzelnen Port gefunden, scheint garnicht so schwer zu sein \/
    * Da geht noch was *

Seite 1 von 6 123 ... LetzteLetzte

Berechtigungen

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