Forum: Mikrocontroller und Digitale Elektronik Attiny85 Digital Input Problem


von Tony S. (tooony)


Lesenswert?

Hallo in die Runde,

für ein Projekt verwende ich den Attiny85. Einen I/O verwende ich zum 
Ansteuern eines 433 MHz Sender. Weiterhin sollen 5 Taster nutzbar sein. 
Aus diesem Grund ist meine Frage, ob man den Reset-Pin softwareseitig 
(Pin 1 des Attiny85) als digitalen Eingang nutzen kann.

Den Quellcode schreibe ich mit der Arduino IDE und übertrage die 
Software via Arduino als Programmer auf den Attiny85.

Danke für eure Hilfe!

Gruß,
Tony

von Karl M. (Gast)


Lesenswert?

Nun die 5 Taster können alle über einen ADC Eingang verarbeitet werden.

Frage Dich mal für was der #Reset da ist und was ist, wenn man #Reset 
abschaltet.

Steht natürlich alles im Datenblatt.

von holger (Gast)


Lesenswert?

>Aus diesem Grund ist meine Frage, ob man den Reset-Pin softwareseitig
>(Pin 1 des Attiny85) als digitalen Eingang nutzen kann.

Kann man, aber dann kann nicht mehr per ISP programmiert werden.
Dann geht nur noch HighVoltage Programming.

von SonicHazard (Gast)


Lesenswert?

Nach dem Programmieren der entsprechenden Fuse kann man den Reset-Pin 
anderweitig nutzen. Man verliert aber den Zugriff über die 
ISP-Schnittstelle.
Also die Fuse nur schreiben, wenn man auch einen HV-Programmer (z.B. 
STK500)zur Verfügung hat!!

von Thomas E. (thomase)


Lesenswert?

Tony S. schrieb:
> Aus diesem Grund ist meine Frage, ob man den Reset-Pin softwareseitig
> (Pin 1 des Attiny85) als digitalen Eingang nutzen kann

Das Problem wurde ja schon hinreichend genannt. Aber du kannst den Pin 
als Analogeingang nutzen. Wenn du mit dem Taster die Spannung am Reset 
um z.B. 10% absenkst, wird kein Reset ausgelöst und du kannst das mit 
dem ADC messen und auswerten. Die Programmierfähigkeit über ISP bleibt 
dabei erhalten.

von HildeK (Gast)


Lesenswert?

Thomas E. schrieb:
> Aber du kannst den Pin
> als Analogeingang nutzen.

Dann kann er gleich diesem Vorschlag folgen:

Karl M. schrieb:
> Nun die 5 Taster können alle über einen ADC Eingang verarbeitet werden.

von Sebastian S. (amateur)


Lesenswert?

Natürlich kann man nicht auf zwei Stühlen gleichzeitig sitzen, aber 
probiere es doch mal nacheinander.

Der ISP ist - üblicherweise - offen und wird nur Sonntagnachmittags bei 
schönem Wetter genutzt. Jedenfalls nicht im "Normalbetrieb".

Bei weiteren Problemen: Jump(er) and feel good. Bei Problemen mit den 
Kosten, die gibt es auch zum Nulltarif, wenn Du sie im Layout 
entsprechend, als Lötbrücken, vorsiehst.

von Holger L. (max5v)


Lesenswert?

Jeden Taster mit einem Widerstand bestücken an einen Pin anschließen und 
den entsprechenden Widerstandswert messen?

von Thomas E. (thomase)


Lesenswert?

HildeK schrieb:
> Dann kann er gleich diesem Vorschlag folgen:

Sicherlich. Ist aber nicht das selbe.

von Tony S. (tooony)


Lesenswert?

Danke für eure Antworten! Ich hab mir sowas schon fast gedacht. Ich habe 
jetzt zum Attiny84 gewechselt. Hierbei taucht jedoch ein weiteres 
softwareseitiges Problem auf:

Mittels einer LED möchte ich testen, ob der Code in die richtigen Events 
rennt. Beim Anlegen der Spannung ist die LED aus - soweit OK. Drücke ich 
dann eine Taste, geht die LED an, aber nicht wieder aus. Grundlegend 
soll die LED nur beim Button druck (hier nur testweise bei einem Button) 
kurz angehen.

EDIT: Pull Down auf GND ist am digitalen Eingang geschalten.

Hier mein Code:
1
#include <RCSwitch.h>
2
RCSwitch mySwitch = RCSwitch();
3
4
const long senderId = 55412;
5
const int rxPin = 6;
6
const int pinReset = 5;
7
const int pinButtonOK = 4;
8
const int pinButtonC1 = 3;
9
const int pinButtonC2 = 2;
10
const int pinButtonC3 = 1;
11
long sendData = 0;
12
const int pinLED = 7;
13
14
15
void setup() {
16
17
  mySwitch.enableTransmit(2);
18
  pinMode(pinReset, INPUT); 
19
  pinMode(pinButtonOK, INPUT); 
20
  pinMode(pinButtonC1, INPUT); 
21
  pinMode(pinButtonC2, INPUT);
22
  pinMode(pinButtonC3, INPUT);
23
  pinMode(pinLED, OUTPUT); 
24
  
25
}
26
27
void loop() {  
28
29
  if(digitalRead(pinReset) == HIGH){
30
    digitalWrite(pinLED, HIGH);
31
    sendData = senderId * 100;
32
    sendData = sendData + 0;
33
    mySwitch.send(sendData, 24);
34
    digitalWrite(pinLED, LOW);    
35
  } else if(digitalRead(pinButtonOK) == HIGH){
36
    digitalWrite(pinLED, HIGH);
37
    sendData = senderId * 100;
38
    sendData = sendData + 1;
39
    mySwitch.send(sendData, 24);
40
    digitalWrite(pinLED, LOW);     
41
  } else if(digitalRead(pinButtonC1) == HIGH){
42
    digitalWrite(pinLED, HIGH);
43
    sendData = senderId * 100;
44
    sendData = sendData + 2;
45
    mySwitch.send(sendData, 24);
46
    digitalWrite(pinLED, LOW);      
47
  } else if(digitalRead(pinButtonC2) == HIGH){
48
    digitalWrite(pinLED, HIGH);
49
    sendData = senderId * 100;
50
    sendData = sendData + 3;
51
    mySwitch.send(sendData, 24);
52
    digitalWrite(pinLED, LOW);      
53
  } else if(digitalRead(pinButtonC3) == HIGH){
54
    digitalWrite(pinLED, HIGH);
55
    sendData = senderId * 100;
56
    sendData = sendData + 4;
57
    mySwitch.send(sendData, 24);
58
    digitalWrite(pinLED, LOW);    
59
  }
60
    
61
}

: Bearbeitet durch User
von Oliver H. (Firma: OliverHeinrichs.de) (dobson)


Lesenswert?

Du kannst den Reset-Pin mittels Spannungsteiler auf einen Wert von 4,5 
bzw. 5V über einen Taster toggeln und mittels ADC auslesen. Hab ich hier 
irgendwo mal im Forum gelesen. Wenn du über der LOW-Flanke mit dem 
Spannungsteiler bleibst, wird auch kein Reset ausgelöst. Musst halt den 
ADC benutzen. Dann gehts auch ohne Änderung der Reset-Fuse.

: Bearbeitet durch User
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.