ATmega328P - Input liefert keinen Wert

OP #4639325
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
Gast #4639343
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.
OP #4639348
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
Gast #4639354
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
Gast #4639437
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.
(Firma: Vescomp) #4639443
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.
OP #4639445
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
OP #4639451
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
}
#4639454
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 :-(
(Firma: Vescomp) #4639463
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...
(Firma: Vescomp) #4639476
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.
Gast #4639485
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.
(Firma: Vescomp) #4641606
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) ?
Gast #4641733
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.
OP #4642893
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
(Firma: Vescomp) #4642936
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) ?
OP #4642949
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?
#4642956
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

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