- 3D-Druck Einstieg und Tipps         
Seite 2 von 5 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 50

Thema: Befehl: Eingang prüfen (ATtiny13)

  1. #11
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Generell schreibt man Zuweisungen wie PORTB = 9 so:
    PORTB = 0b00001001 (binär wenn man keine Lust hat es in Hex umzurechnen, was aber besser wäre) oder PORTB=0x09 (so ist es am übersichtlichsten, da die erste Stelle das High-Byte und die 2. das Low-Byte angibt (z.B. 0xf0 = 0b11110000) und man sofort sehen kann, was gemeint ist.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  2. #12
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    PORTB |= (1 << PB1) bedeutet PORTB = PORTB | (1 << PB1), PB1 ist als 1 definiert, also wird daraus PORTB = PORTB | (1 << 1), was man zu PORTB = PORTB | 0b10 auflösen kann. Jetzt wird PORTB der Wert von sich selber und 0b10 mit einem Oder-Operator verknüpft, zugewiesen.
    Wenn PORTB z.B. 0b11010001 ist, enststeht daraus 0b11010001 | 0b00000010 = 0b11010011 (da 0 | 1 = 1). Also wird das Bit gesetzt.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  3. #13
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    Sry, aber ich brauch es etwas langsamer...

    PORTB |= (1 << PB1)
    ...ist die Kurzschreibweise für
    PORTB = PORTB | (1 << PB1)
    soweit richtig?



    Wenn ja,
    also wird daraus PORTB = PORTB | (1 << 1)
    im Maschinencode?

    Und wieso ist auf einmal beim 2ten einser das PB weg?

  4. #14
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.220
    Pin B3 hat aber den Wert 8 und nicht 16
    Ändert aber nichts an der fehlenden Schleife.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  5. #15
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    ''while (true)''
    ist für mich ja schon die Schleife, zumindest mit den Blink-Leds hats funktioniert mit do...while

    @_R2D2
    Dass das hexa-Darstellung wäre wäre ich nie draufgekommen ....
    Für mich war das unverständliches zeugs mit 0x0f ... Jetzt machts Sinn, danke vielmals



    Hey ich glaube ich habs halbwegs verstanden... Das Oder fügt hier das Bit ein, ohne die anderen Bits (Ports) zu verstellen ...?

  6. #16
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    Hey ich glaube ich habs halbwegs verstanden... Das Oder fügt hier das Bit ein, ohne die anderen Bits (Ports) zu verstellen ...?
    Genau so ist es, mit einem einfachen = würdest du alles überschreiben und mit | kannst du alle Bits einzeln setzen ohne di anderen zu verändern.

    Mit PORTB &= ~(1 << PB1); könntest du dieses Bit wieder löschen.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  7. #17
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    Mit PORTB &= ~(1 << PB1); könntest du dieses Bit wieder löschen.
    Wieso kann ich nicht einfach PORTB=PORTB|(0<<PB) setzen??

    Heißt 0 und 1, dass auf jeden Fall eine Eins draus wird??


    PORTB &= ~(1 << PB1);
    Ist doch wieder so eine Abkürzung, oder?

    Wie heißt das für mich Laien? PORTB = PORTB & !(1<<PB1) ??
    (Könnte ich um eine deutsche Erläuterung bitten?)


    dann noch ne kleine Frage:

    in C muss ich auch bei if == setzen (?)

    Ergo: if PORTB==PORTB|(1<<PB1) wenn ich das so wörtlich eingebe, müsste es klappen?

  8. #18
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    Wieso kann ich nicht einfach PORTB=PORTB|(0<<PB) setzen??
    Das wird nie funktionieren wenn du ein Bit setzen willst, weil 0 ODER 0 nie 1 geben wird.

    Wie heißt das für mich Laien? PORTB = PORTB & !(1<<PB1) ??
    So ungefähr, nur dass ! ein einzelnes Bit negiert (also aus 0 wird 1 und umgekehrt) und ~ das gleiche aber für ein ganzes Byte macht (das nennt man komplementieren). Also heißt es PORTB = PORTB & ~(1 << PB1);
    Man benutzt aber die andere Schreibweise, weil sie eben kürzer ist.

    in C muss ich auch bei if == setzen (?)

    Ergo: if PORTB==PORTB|(1<<PB1) wenn ich das so wörtlich eingebe, müsste es klappen?
    Das müsste gehen, wenn du Klammern darum machst und statt PORTB PINB benutzt (PINB ist für den Eingang). (Ja = ist ein Zuweisungsoperator und == ist der Vergleichsoperator.)

    Besser ist aber:
    if(PINB & (1 << PB1))
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

  9. #19
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    15.04.2008
    Beiträge
    330
    main () // Hauptprogramm, startet bei Power ON und Reset
    {
    DDRB=3; // 2 Ausgänge definieren
    PORTB=0b00001000; // Pull-up Widerstand an PB4 auf ein

    if (PINB==PINB|(1<<PB3)) // <- irgendwie agiert die Funktion so, als ob es hieße, if (true)

    {
    PORTB=PORTB|(1<<PB0);
    waitMs(500);
    PORTB=16;
    waitMs(500);
    PORTB=PORTB|(1<<PB0);
    waitMs(120);
    PORTB=16;
    waitMs(120);


    } while (true);
    }




    Aber wieder der gleiche Fehler. Sobald Strom durch den Chip rinnt, läuft das Programm ab.

    Der Taster agiert so, als ob er gar nicht da wäre...

  10. #20
    Erfahrener Benutzer Roboter Experte Avatar von BurningWave
    Registriert seit
    22.12.2007
    Ort
    nahe Stuttgart
    Alter
    30
    Beiträge
    656
    Du hast Klammern vergessen:
    if (PINB==(PINB|(1<<PB3)))
    {
    ...
    }

    Außerdem bringt die while da unten gar nichts, das Program läuft so nur einmal durch.

    Wenn das nicht funktioniert, habe ich einen Denkfehler gemacht, dann musst du doch if(PINB & (1 << PB1)) nehmen.
    meine Homepage: http://www.jbtechnologies.de
    Hauptprojekte: Breakanoid 2 - Sound Maker

Seite 2 von 5 ErsteErste 1234 ... LetzteLetzte

Berechtigungen

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

Solar Speicher und Akkus Tests