Ein- / Ausgaenge

OP #1571510
Lesenswert?

Hallo, Ich versuche folgenden Aufbau zum laufen zu bringen. (Dies ist 
mein erster AVR Versuch - bitte um Geduld). Moechte mittels AVR 
Erdfeuchtigkeit messen. Je nach Feuchtigkeitswert soll dann eine LED 
leuchten.

Bevor ich weitermache, moechte ich nur mal wissen ob ich die Ein-  und 
Ausgaenge richtig inititializiert habe. Wuerde mich freuen wenn mir 
jemand sagen koennte ob ich auf dem richtigen Weg bin. Danke.

Gruss Michael


/*
  ATtiny13v

/*

   GND
    |
    R1
    |      /--------+
   LED1    1        5---VCC
    |      |        |
    +PB3---2        6---PB2---LED2---R2----GND
           |        |
           3        7      +-------Nail ~~~ Nail+---VCC (5V)
           |        |      |
     GND---4        8--PB0-+
           +--------+      |
                           R3
                           |
                          GND

LED1 = RED
LED2 = GREEN
R1,R2 = 220 OHM
R3 = 10k OHM

*/

#include <avr/io.h>          // (1)

int main (void) {            // (2)
   // set PB0 as input and PB2 and PB3 as output

   DDRB &= ~( (1<<PB0) | (0 << PB2) | (0 << PB3)); // (3)

   while(1) {                // (5a)
   }                         // (5c)

   return 0;                 // (6)
}
Gast #1571556
Lesenswert?

Hallo,

ich würde das so machen:

[c]
*/

#include <avr/io.h>          // (1)

int main (void) {            // (2)
   // set PB0 as input and PB2 and PB3 as output

   // DDRB |=  (1 << PB2) | (1 << PB3)
   //(alternativ könnte man hier auch schnell einfach alle zunächst als 
Ausgang deklarieren, dann die Eingänge expliziet setzen)
   //Ausgänge setzen, diese sähe dann wie folgt aus:
    //DDRB = 0xFF             // zunächst alle als Ausgänge schalten)

  // nur wir der Eingang gesetzt, indem gezielt das Bit gelöscht wird
   DDRB &= ~( 1 << DDB0 ); // PB0 gezielt als Eingang setzen

   while(1) {                // (5a)
   }                         // (5c)

   return 0;                 // (6)
}
OP #1572069
Lesenswert?

Hallo, danke fuer die Hilfe. Nun, ich habe es wie folgt uebernommen. Es 
faellt mir einfach ziemlich schwer (4) zu verstehen. Die Methode (4a) 
ist da schon einfacher.

Frage: Spricht irgendwas dagegen, alle meine Bitmanipulationen mittels 
(4a) Methode durch zu fuehren?

Beim ATtiny13v kann ich doch alle Ports fuer das messen eines Analogen 
Wertes verwenden, oder?

Gruss Michael



#include <avr/io.h>          // (1)

int main (void) {            // (2)

   DDRB = 0xFF;             // (3) Declare all pins on Port B as output
 //  DDRB &= ~( 1 << DDB0);   // (4) Set Pin 0 as input
   DDRB = 0b00000001;   // (4a) same as 4 but easier to understand

   while(1) {                // (5a)
   }                         // (5c)

   return 0;                 // (6)
}
#1572073
Lesenswert?

Michael M. schrieb:
> Hallo, danke fuer die Hilfe. Nun, ich habe es wie folgt uebernommen. Es
> faellt mir einfach ziemlich schwer (4) zu verstehen. Die Methode (4a)
> ist da schon einfacher.
>
> Frage: Spricht irgendwas dagegen, alle meine Bitmanipulationen mittels
> (4a) Methode durch zu fuehren?

ja! Es ist unübersichtlicher, de Code ist schwerer zu Portieren, wenn du 
hier Fragen hast und in deinem Code deine Einstellungen mit (4a) machst, 
werden viele dir nicht helfen wollen...

und vor allem: (4) und (4a) sind nicht gleich, und das gleich doppelt...
Persönliche Seite #1572093
Lesenswert?

Justus Skorps schrieb:
> und vor allem: (4) und (4a) sind nicht gleich

Ich bin heute mal wieder sehr nett:

    DDRB &= ~( 1 << DDB0);
    DDRB = DDRB & ~(1 << DDB0);
    DDRB = DDRB & ~(1 << 0);
    DDRB = DDRB & ~(1);
    DDRB = DDRB & ~(0b00000001);
    DDRB = DDRB & 0b11111110;
    DDRB &= 0b11111110;

Das ist alles gleichwertig (hoffentlich ;-)

Ach ja, noch etwas: 0b11111110 versteht nicht unbedingt jeder Compiler.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren