-         

Seite 1 von 5 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 50

Thema: Befehl: Eingang prüfen (ATtiny13)

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330

    Befehl: Eingang prüfen (ATtiny13)

    Anzeige

    Hallo Leute,

    Bin jetzt soweit, dass ich Ausgänge am ATtiny beschalte.

    Nun würde ich gerne mithilfe von Tastern die Leds blinken lassen...

    Jedoch funktioniert noch kein einziger meiner Codes...
    Man sieht immer wieder 'PINB (1<<PB7)' und ähnliches, aber es funktioniert einfach nicht...

    (Was << hier bedeuten soll findet man auch nirgends klar eklärt...)

    Oder kann es an der Schatung liegen?

    Ich aktiviere zuerst mittels DDRB=00000011 und nehme dann z.B. port-b3, (wegen 0 ist er ja Eingang)

    Dann... Muss ich einen pull-up einschalten?
    Das wäre dann PORTB=0000100 (Aber würde ich damit nicht wieder die Ausgänge umschalten -> von High auf Low?)

    Und schlussendlich das mit (1<<PB3)

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.183
    Taster vom Pin nach GND, PullUp aktivieren.
    if PINB(!(1<<PB3)){
    PORTB|=(1<<PB0)
    }
    Wenn nicht gedrückt dann wieder ausschalten.
    mit PORTB=0000100 schaltest du den PullUp an PB2 ein.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    23
    Beiträge
    656
    DDRX sind Data Direction Register, sie geben an, ob eine Pin als Eingang oder als Ausgang dient. Wenn z.B. mit DDRB = 0x03; (0x03 = 3 = 0b00000011) oder mit DDRB |= (1 << PB0) | (1 << PB1); PB0 und PB1 im Data Direction Register gesetzt hat, gibt man damit an, dass man diese 2 Pins als Ausgang verwenden möchte. (<< und >> sind Schiebeoperatoren, sie schieben ein Bit um x Stellen nach rechts, bzw. nach links).
    Möchtest du überprüfen, ob eine als Eingang verwendete Pin HIGH oder LOW ist kannst du das mit z.B. if(PINB & (1 << PB3)) machen.
    Wichtig: Wenn du eine Taste an einem Eingang benutzt, brauchst du immer einen PullUp-Widerstand, der die Pin bei nicht gedrückter Taste auf + zieht (ich gehe davon aus, dass deine Taste die Pin auf Masse zieht). Du kannst das entweder mit einem externen Widerstand machen oder intern, indem du das entsprechende Bit für die Pin im Datenausgangsregister PORTX setzt.

    mfg
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    Danke, werde ich gleich mal probieren und bei evt auftretenden Fragen wieder posten...

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    PORTB|=(1<<PB0)
    Was bedeutet das?
    Das selbe wie
    PORTB=0000100
    ?


    Es geht noch immer nicht... Leider...




    ___
    Ich glaube hierbei liegt der Fehler
    Taster vom Pin nach GND, PullUp aktivieren.
    if PINB(!(1<<PB3)){
    PORTB|=(1<<PB0)
    }
    Wenn nicht gedrückt dann wieder ausschalten.
    mit PORTB=0000100 schaltest du den PullUp an PB2 ein.
    PORTB|=(1<<PB0) habe ich weggelassen, weil ich es nicht verstehe...

  6. #6
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.183
    PORTB|=(1<<PB0) schaltet PB0 auf high.
    PORTB&=~(1<<PB0) schaltet PB0 wieder auf low.
    Also kannst du das nicht weglassen.
    Wo hast du denn jetzt genau die Tasten und Led angeschalten.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    Hier der Code:



    main () // Hauptprogramm, startet bei Power ON und Reset
    {
    DDRB=7;
    PORTB=16;
    if(PINB & (1<<PINB3))
    {

    // Schleifenanfang Mainloop
    PORTB=17;
    waitMs(500);
    PORTB=19;
    waitMs(250);
    PORTB=18;
    waitMs(250);
    PORTB=17;
    waitMs(100);
    PORTB=16;
    waitMs(1000); // Quellcode
    }
    while (true); // Schleifenende Mainloop


    PORTB|=(1<<PB0) schaltet PB0 auf high.
    Diese Schreibweise verstehe ich leider nicht... heißt | nicht eigentlich 'nicht' (so wie '!') ?

    Ich rechne mit 2-er Potenzen PORTB(=00000001)=1

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    29
    Beiträge
    4.544
    Das | bedeutet log. Funktion OR (Oder)
    Das & bedeutet log. Funktion AND (Und)
    Das ! bedeutet log. Funktion NOT (Nicht)

    http://de.wikipedia.org/wiki/Logischer_Operator

    MfG Hannes

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.183
    Dein Programm wird genau einmal durchlaufen und daher nicht funktionieren.
    Es fehlt die Endlosschleife.
    Deine Schreibweise ist unübersichtlich, es wird sich niemand die Mühe machen aus den Zahlen zu eruieren welche Pin gemeint sind.
    Das | ist ein oder.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  10. #10
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    Ich sreche immer nur Pin B0 und Pin B1 als Ausgang an.

    Dazu kommt Pin B3 MIt dem Wert 2^4=16


    @021aet04
    Warum hier ein Oder?
    Für mich macht das logisch keinen Sinn... Bin aber auch noch Anfänger in dem Gebiet...

Seite 1 von 5 123 ... LetzteLetzte

Berechtigungen

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