www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ein- / Ausgaenge


Autor: Michael M. (mi2007)
Datum:

Bewertung
0 lesenswert
nicht 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)
}

Autor: max power (Gast)
Datum:

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

Autor: Dominik (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)
}

Autor: Michael M. (mi2007)
Datum:

Bewertung
0 lesenswert
nicht 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)
}

Autor: Justus Skorps (jussa)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Christian H. (netzwanze) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael M. (mi2007)
Datum:

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

Gruss Michael

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.