Forum: Mikrocontroller und Digitale Elektronik ATmega328P - Input liefert keinen Wert


von Thomas Z. (tom_tom)


Lesenswert?

Hallo Zusammen,

ich habe einen ATmega328P auf einem Breadboard und diesen über die 
Arduino IDE programmiert. Output funktioniert auch alles super. Auch das 
Senden von fixen Daten über Funk an meinen Pi funktioniert problemlos. 
Was jedoch nicht funktioniert, ist das Abfragen von Eingängen.

void setup() {

//Bewegungssensor
  pinMode(5, INPUT_PULLUP);
  digitalWrite(5, HIGH);

}

void loop() {

  //Dieser Wert ist immer 0 Dies ist jetzt ein Bewegungssensor.
  //Auch Temperatursensor liefert keinen Wert.
  //Das Gleiche direkt am Nano funktioniert super.
  //Habe auch schon die Pins gewechselt.

  int test = digitalRead(5);

}

Muss man hier bei einem nackten ATmega328P noch irgendetwas beachten was 
beim Nano und Uno auch so funktioniert?

Danke!

VG, Thomas

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

Ja, die Zuordnung von pin Nummer zu Port

von Thomas Z. (tom_tom)


Lesenswert?

Hey Christopher, vielen Dank für die schnelle Antwort.
Kannst du mir bitte ein Beispiel für meinen Code geben wie ich diese 
Zuordnung mache?

Vielen Dank!

Thomas

von Wolfgang (Gast)


Lesenswert?

Christopher B. schrieb:
> Ja, die Zuordnung von pin Nummer zu Port

Die Zuordnung Pin Nummer zu Port erledigt die offensichtlich benutze 
Arduino Software Ebene.

Thomas Z. schrieb:
> Was jedoch nicht funktioniert, ist das Abfragen von Eingängen.

An welchem Pin vom ATmega328 hast du denn dein Signal angelegt und was 
für eine Boardbeschreibungsdatei hast du in der Arduino IDE verwendet?

Ob du am richtigen Pin gewackelt hast, kannst du feststellen, indem du 
ihn erstmal als Ausgang z.B. blinken läßt, prüfst, ob das der von dir 
vermeintlich als Eingang zugeordnete Pin ist und du dann wieder zu 
deiner Eingangstestfunktion gehst.

von Thomas Z. (tom_tom)


Lesenswert?

Hallo Wolfgang,

ich hatte den digitalen Pin 2 und Pin 5 verwendet.
ArduinoPin 2 am ATmega328P = PD2
ArduinoPin 5 am ATmega328P = PD5

Das mit der LED hatte ich an den Pins getestet und funktioniert 
wunderbar.

Anbei die Boardbeschreibung:

##############################################################

atmega328bb.name=ATmega328 on a breadboard (8 MHz internal clock)

atmega328bb.upload.protocol=arduino
atmega328bb.upload.maximum_size=30720
atmega328bb.upload.speed=57600

atmega328bb.bootloader.low_fuses=0xE2
atmega328bb.bootloader.high_fuses=0xDA
atmega328bb.bootloader.extended_fuses=0x05

atmega328bb.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex
atmega328bb.bootloader.unlock_bits=0x3F
atmega328bb.bootloader.lock_bits=0x0F

atmega328bb.build.mcu=atmega328p
atmega328bb.build.f_cpu=8000000L
atmega328bb.build.core=arduino:arduino
atmega328bb.build.variant=arduino:standard


atmega328bb.bootloader.tool=arduino:avrdude
atmega328bb.upload.tool=arduino:avrdude

Viele Grüße,

Thomas

von Einer K. (Gast)


Lesenswert?

Dieses ist doppelt gemoppelt:
1
pinMode(5, INPUT_PULLUP);
2
  digitalWrite(5, HIGH);


Einfach nur:
1
pinMode(5, INPUT_PULLUP);
2
 // digitalWrite(5, HIGH);
reicht völlig

Alternativ:
1
pinMode(5, INPUT);
2
  digitalWrite(5, HIGH);

Oder nur
1
digitalWrite(5, HIGH);
Weil der Default sowieso Input ist.


Tipp:
Arduino Pin 5
Ist PD5
Am DIL ATMega328P Pin 11

von Thomas Z. (tom_tom)


Lesenswert?

Danke für den Hinweis mit dem doppelt gemoppelten. :)

Aber für mein Problem hast du auch keine Idee, was ich machen kann... 
oder?
Das Teil kostet mich ganz schön Nerven.

von Karl M. (Gast)


Lesenswert?

Hallo,

zum ersten Posting,
ein "nackten" ATmega328P hat keinen Bootloader und läuft nur mit 1MHz RC 
Oszillator !

Programmier ihn ohne die Arduino-IDE, das ist sicherlich die bessere 
Lösung um schnellen Code zu schreiben.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Thomas Z. schrieb:
> //Dieser Wert ist immer 0 Dies ist jetzt ein Bewegungssensor.
>   //Auch Temperatursensor liefert keinen Wert.

 Woher weisst du das ?
 Wo und wie wird dieser Wert angezeigt bzw. ausgegeben ?


> Aber für mein Problem hast du auch keine Idee, was ich machen kann...
> oder?

 In main() über serial ständig PD5 ausgeben.

 Dann einfach PD5 mit einem Kabel mehrmals kurz mit Masse verbinden.

 im loop laufen lassen.

von Thomas Z. (tom_tom)


Lesenswert?

Hallo Karl,

sorry, da habe ich mich wohl falsch ausgedrückt. Also der Arduino 
Bootloader ist drauf. Mit nackt meinte ich nur, dass es ein reiner 
ATmega328P ist. Wenn man nach ATmega328P googelt, findet man immer nur 
Beiträge zu Arduinos.
Ich hätte ihn gerne mit Atmel Studio so programmiert, da ich mit Atmel 
Studio allerdings nicht schaffen konnte, die String Bibliothek 
einzubinden, bin ich dann auf die Arduino IDE umgestiegen.
Und hier geht soweit alles ganz gut, nur das Auslesen von Sensoren 
leider nicht. Egal ob Temperatur- oder Bewegungssensor.

VG, Thomas

von Thomas Z. (tom_tom)


Lesenswert?

Hallo Marc, das weiß ich, weil ich mir die Werte mit einem Funkmodul 
NRF24L01+ an meinen BananaPi senden lasse. Und dort sehe ich dann die 
Daten die ankommen. Am Senden kann es nicht liegen. Sofern ich feste 
Zahlen eintrage, kommen die sauber drüben an.

Hier mal der gesamte Code:
1
#include <SPI.h>
2
#include "nRF24L01.h"
3
#include "RF24.h"
4
#include "printf.h"
5
#include "DHT.h"
6
7
8
9
10
//DHT 22 Sensor
11
DHT dht;
12
13
/* Hardware configuration: Set up nRF24L01 radio on SPI bus plus pins 9, 13 */ 
14
RF24 radio(8,7);
15
uint64_t pipeAddressSenderLivingroom = 0xf0f0f0f0e1;
16
uint64_t pipeAddressReceiver = 0xf0f0f0f0d2;
17
18
struct dataStruct{
19
  char room[4] = "WZ";
20
  float temperature = 0.0;
21
  float humidity = 0.0;
22
  int test = 8;
23
} data;
24
25
26
27
28
void setup() {
29
  // put your setup code here, to run once:
30
31
32
  //DHT 22
33
  dht.setup(2); // data pin 2
34
35
  //NRF24L01
36
//  Serial.begin(9600);
37
  radio.begin();
38
39
  radio.setPALevel(RF24_PA_HIGH);
40
  radio.setDataRate(RF24_250KBPS);
41
  radio.setChannel(87);
42
  radio.setRetries(15,15);
43
  //radio.setAutoAck(1,false);
44
  
45
  //Sender
46
  radio.openReadingPipe(1,pipeAddressReceiver);
47
  radio.openWritingPipe(pipeAddressSenderLivingroom);
48
  radio.stopListening();
49
//  printf_begin();
50
//  radio.printDetails();
51
52
//Bewegungssensor
53
  pinMode(5, INPUT);
54
  digitalWrite(5, HIGH);
55
56
}
57
58
void loop() {
59
  // put your main code here, to run repeatedly:
60
61
  data.temperature = dht.getTemperature();
62
  data.test = digitalRead(5);
63
  data.humidity = dht.getHumidity();
64
  
65
//  Serial.println(data.temperature);
66
//  Serial.println(data.humidity);
67
//  Serial.println();
68
69
//    printf("Now sending ");
70
//    printf("",sizeof(data));
71
    //unsigned long time = millis();
72
    radio.stopListening();
73
    //bool ok = radio.write( &time, sizeof(unsigned long) );
74
    bool ok = radio.write(&data,sizeof(data));
75
    radio.startListening();
76
//    if (ok)
77
//      printf("ok.\n\r");
78
//    else
79
//      printf("failed.\n\r");
80
81
  delay(dht.getMinimumSamplingPeriod());
82
  //delay(600000);
83
84
}

von Toni R. (torei55)


Lesenswert?

Thomas Z. schrieb:
> void loop() {
>
>   //Dieser Wert ist immer 0 Dies ist jetzt ein Bewegungssensor.
>   //Auch Temperatursensor liefert keinen Wert.
>   //Das Gleiche direkt am Nano funktioniert super.
>   //Habe auch schon die Pins gewechselt.
>
>   int test = digitalRead(5);
>
> }

hallo thomas,

so kann das nicht funktionieren!
die zeile "int test = digitalRead(5);" optimiert der kompiler einfach 
weg, da "test" nicht weiter verwendet wird.

oder ist das nicht der vollständige code?

gruß toni

ups, da war ich wohl zu langsam :-(

: Bearbeitet durch User
von Thomas Z. (tom_tom)


Lesenswert?

Hallo Toni, das war nur ein vereinfachtes Beispiel um mein Problem zu 
erklären. ;) Den Code habe ich eben weiter oben komplett gepostet.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Thomas Z. schrieb:
> Daten die ankommen. Am Senden kann es nicht liegen. Sofern ich feste
> Zahlen eintrage, kommen die sauber drüben an.

 Und so ?
1
void loop() {
2
  data.test = digitalRead(5);
3
  Serial.println(data.test);
4
5
  delay(50);
6
}

 Und dann mehrmals PD5 mit GND verbinden.
 Wenn es funktioniert, dht testen, danach nRF.

 Irgendwo muss man ja mit der Fehlersuche anfangen und das sollen ja
 nicht gleich zwei Sensoren und 2 Funkmodule sein...

von Thomas Z. (tom_tom)


Lesenswert?

Hallo Marc, ich weise nochmal darauf hin, dass es sich um einen 
ATmega328P handelt, der nur mit der Arduino IDE programmiert wird. Es 
ist kein Arduino. Daher gibt es auch keine serielle Schnittstelle zu 
meinem PC. Deshalb muss ich den Umweg über das Funkmodul gehen.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Thomas Z. schrieb:
> ist kein Arduino. Daher gibt es auch keine serielle Schnittstelle zu
> meinem PC. Deshalb muss ich den Umweg über das Funkmodul gehen.

 Nein.
 Lasse einfach an irgendeinem Portpin eine LED leuchten, wenn sich
 am PD5 irgendetwas ändert, bzw. LED ist AN wenn PD5 == 0 und
 AUS wenn PD5 == 1.
 Dasselbe danach für dht, wenn dht <> 0, LED ist AN usw.

: Bearbeitet durch User
von Wolfgang (Gast)


Lesenswert?

Thomas Z. schrieb:
> Daher gibt es auch keine serielle Schnittstelle zu
> meinem PC. Deshalb muss ich den Umweg über das Funkmodul gehen.

Ein Funkmodul scheint doch für solche elementaren Tests arg übertrieben. 
Man könnte einfach einen anderen Pin als Ausgang initialisieren und dort 
eine LED anschließen, auf die man ein Echo vom Pin 5 ausgibt.

von Thomas Z. (tom_tom)


Angehängte Dateien:

Lesenswert?

So, ich habe jetzt mal einen Test mit einer LED gemacht und es tut sich 
auch nichts.

Anbei mal ein Screenshot was mein oben gepostetes Programm derzeit an 
den Pi sendet.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Thomas Z. schrieb:
> So, ich habe jetzt mal einen Test mit einer LED gemacht und es tut sich
> auch nichts.

 Und wenn du PD5 mehrmals kurz mit GND verbindest ?

: Bearbeitet durch User
von Thomas Z. (tom_tom)


Angehängte Dateien:

Lesenswert?

Also ich habe jetzt mal einen komplett neuen ATmega328P genommen und 
jetzt kommen auch schon mal Werte an. Allerdings nicht die, dich ich mir 
erhofft hatte. (siehe Screenshot)

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Thomas Z. schrieb:
> Also ich habe jetzt mal einen komplett neuen ATmega328P genommen und
> jetzt kommen auch schon mal Werte an. Allerdings nicht die, dich ich mir
> erhofft hatte. (siehe Screenshot)

 Wie wird der Bewegungssensor gestartet und wie werden die Werte
 eingelesen ?
 Wo wird bei dir DHTPIN definiert ?
 Wo wird bei dir DHTTYPE definiert ?

von Thomas Z. (tom_tom)


Lesenswert?

Der Bewegungsmelder (Sensor) muss ja nicht gestartet werden.
Eingelesen wird er hier
1
data.test = digitalRead(5);
Für die DHT Pins gibt's eine extra Klasse.
Die habe ich hier her: http://playground.arduino.cc/Main/DHTLib

VG, Thomas

von Thomas Z. (tom_tom)


Angehängte Dateien:

Lesenswert?

Hall zusammen, anbei hänge ich nochmal den Schaltplan mit an. Vielleicht 
ist der hilfreich.

VG, Thomas.

von Wolfgang (Gast)


Lesenswert?

Thomas Z. schrieb:
> Hall zusammen, anbei hänge ich nochmal den Schaltplan mit an. Vielleicht
> ist der hilfreich.

Da solltest du erstmal ein bisschen aufräumen und die wirren Striche 
beseitigen, bevor du den raus gibst.

von Dieter F. (Gast)


Lesenswert?

Schau mal da hin - z.B. wie das Teil angeschlossen wird ...

https://learn.adafruit.com/dht/connecting-to-a-dhtxx-sensor

von Thomas Z. (tom_tom)


Lesenswert?

Hallo Dieter, auch mit zusätzlichem externen Pullup-Widerstand wie auf 
der Seite beschrieben, bekomm ich leider keine ordentlichen Werte. Temp: 
0,0 Grad, Feuchtigkeit: 2,0 Prozent.

VG, Thomas

von Hubert G. (hubertg)


Lesenswert?

Ich hoffe du hast deiner Schaltung, entgegen dem "Schaltplan", zumindest 
die Standardkondensatoren am Spannungsregler und µC spendiert.

von Thomas Z. (tom_tom)


Lesenswert?

Hallo Hubert,

ja, ich hatte es auch mit Angstkondensator versucht. Auch das hatte 
leider nichts geholfen.

VG, Thomas

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Thomas Z. schrieb:
> ja, ich hatte es auch mit Angstkondensator versucht. Auch das hatte
> leider nichts geholfen.

 Tja, so geht das mit Arduino users - wenn der Sketch nicht läuft,
 ist man schon am Ende...

 Zum letzten Mal:
Marc V. schrieb:
> Wo wird bei dir DHTPIN definiert ?
> Wo wird bei dir DHTTYPE definiert ?
Marc V. schrieb:
> Wie wird der Bewegungssensor gestartet und wie werden die Werte
>  eingelesen ?
Thomas Z. schrieb:
> Der Bewegungsmelder (Sensor) muss ja nicht gestartet werden.
> Eingelesen wird er hierdata.test = digitalRead(5);
Marc V. schrieb:
> Und wenn du PD5 mehrmals kurz mit GND verbindest ?


 Reagiert PinD5 überhaupt als Eingang (Taster nach Masse) ?

von Einer K. (Gast)


Lesenswert?

Marc V. schrieb:
> Tja, so geht das mit Arduino users - wenn der Sketch nicht läuft,
>  ist man schon am Ende...

Mag im Einzelfall so sein...
Aber kein Grund die kategorische Keule zu schwingen.

Falls du nicht weißt, was das bedeutet:
"kategorisches Urteil (einfache, nicht an Bedingungen geknüpfte 
Behauptung)"
Aus dem Duden.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

U. F. schrieb:
> Falls du nicht weißt, was das bedeutet:

 Danke, ich weiss es auch ohne Duden zu bemühen.

 Falls du nicht weiter als Grundschule gekommen bist:
 Das nennt sich Logik, wird schon in Gymnasium gelehrt.

von Thomas Z. (tom_tom)


Lesenswert?

Hallo Zusammen,

ich habe nochmal einen Test gemacht. Also Blink LED an PIN 2 und auch an 
PIN 5 funktioniert super.

Es sind nur die Eingänge die nicht wollen. Selbst ein Taster liefert mir 
nichts zurück. Egal ob gedrückt oder nicht. Egal ob mit oder ohne PULLUP 
bzw. PULLDOWN - Widerstand. Es scheint fast so, als könnten die Pins an 
diesem ATmega ausschließlich schreiben und nicht lesen.

Achso Marc,

DHT Type wird automatisch ermittelt. Das macht die Bibliothek die ich 
oben gepostet hatte:
http://playground.arduino.cc/Main/DHTLib

DHT-Pin: Siehe oben den Code
1
  //DHT 22
2
  dht.setup(2); // data pin 2
VG, Thomas

: Bearbeitet durch User
von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Thomas Z. schrieb:
> ich habe nochmal einen Test gemacht. Also Blink LED an PIN 2 und auch an
> PIN 5 funktioniert super.
>
> Es sind nur die Eingänge die nicht wollen. Selbst ein Taster liefert mir
> nichts zurück. Egal ob gedrückt oder nicht. Egal ob mit oder ohne PULLUP

 Bravo.
 Hat nicht mal volle 4 Tage gedauert.

Marc V. schrieb:
> Dann einfach PD5 mit einem Kabel mehrmals kurz mit Masse verbinden.
Marc V. schrieb:
> Und dann mehrmals PD5 mit GND verbinden.
Marc V. schrieb:
> Lasse einfach an irgendeinem Portpin eine LED leuchten, wenn sich
>  am PD5 irgendetwas ändert, bzw. LED ist AN wenn PD5 == 0 und
Marc V. schrieb:
> Und wenn du PD5 mehrmals kurz mit GND verbindest ?
Marc V. schrieb:
> Reagiert PinD5 überhaupt als Eingang (Taster nach Masse) ?

von Thomas Z. (tom_tom)


Lesenswert?

Hallo Marc,

ich hatte die Tests vorher schon gemacht.
Auch deinen Trick, den Pin mehrmals kurz mit Masse zu verbinden. Dann 
hat sich der Wert der Temperatur bei Verbindung von 1,0 auf NaN 
geändert.
Hatte nur heute nochmal komplett von vorn begonnen. Da es aber heute 
wieder nichts gebracht hatte, habe ich nun zusätzlich noch einen neuen 
ATmega328P genommen und nun funktioniert zumindest mal der Taster und 
ein Bodenfeuchtemesser bringt auch akzeptable Daten. Evtl. hat der 
andere ATmega eine Macke. Kann es sein, dass die DHT Bibliothek, welche 
ich verwende, einfach nur ausschließlich für Arduino funktioniert? Oder 
kann es evtl. was mit der Frequenz zu tun haben wegen der Einlesezeit am 
Sensor?

von Michael U. (amiga)


Lesenswert?

Hallo,

der Arduino ist ein Mega328 mit Bootloader.
Natülich verlassen sich die Routinen darauf, daß der AVR mit der 
angegeben Taktfrequenz läuft, also 16MHz beim Uno und Nano und 8 oder 
16MHz beim ProMini. Für andere Frequenzen wirst Du Dir eine passende 
Boardbeschreibung in boards.txt bauen müssen, wenn Du mit der IDE 
compilierst.

Gruß aus Berlin
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.