Forum: Mikrocontroller und Digitale Elektronik Ein- / Ausgaenge


von Michael M. (mi2007)


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)
}

von max power (Gast)


Lesenswert?

nein, die pins sind nicht richtig eingestellt.
dazu lies dir mal folgenden abschnitt im tutorial durch:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Datenrichtung_bestimmen

von Dominik (Gast)


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)
}

von Michael M. (mi2007)


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)
}

von Justus S. (jussa)


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...

von Christian H. (netzwanze) Benutzerseite


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.

von Michael M. (mi2007)


Lesenswert?

Hallo, herzlichen Dank fuer die Details ich muss das ganze mal verdauen. 
:- )

Gruss Michael

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.