Forum: Mikrocontroller und Digitale Elektronik Ausgang ist zu lange geschaltet


von Chandler B. (chandler)


Lesenswert?

Hallo,
ich habe folgendes Problem: wenn ich bei meinen Mikrocontroller 
ATTINY2313 den Eingang PA0 auf high schalte geht der Ausgang PB7 auf 
high. Setze ich den Eingang PA0 auf Low, bleibt der Ausgang PB7 auf 
high, für eine unbestimmte Zeit.
Das Programm sieht wie folgt auf:
1
  DDRA = 0x00; // PortA als Eingang deklarieren
2
  PORTA=0x00; //Ports auf LOW schalten
3
  DDRB = 0xff; // PortB als Ausgang deklarieren
4
  PORTB = 0x00; // Ports auf LOW schalten
5
6
7
  while(1) {
8
  if (PINA == 0b00000001) {
9
    PORTB = 0b10000000;
10
        }
11
  else {
12
    PORTB = 0b00000000;
13
  }

Hat jemand von euch eine Idee voran es liegen könnte??
Viele Grüße

von Jim M. (turboj)


Lesenswert?

Die anderen Bits von PINA sind nicht ausmaskiert, eine "1" dort führt 
zum else- Zweig. Falls sie offen sind, können sie durch "Elektrosmog" 
durchaus auf "1" umkippen.

von Karl H. (kbuchegg)


Lesenswert?

> bei meinen Mikrocontroller ATTINY2313 den Eingang PA0 auf high schalte

Wie genau machst du das?
Was hast du an den Pin extern angeschlossen.


Es ist ein Irrtum zu glauben, dass ein Pin der auf Eingang geschaltet 
ist und an dem nichts hängt, (der also 'offen' ist), utomatisch einen 
0-Pegel einnimmt. Das ist in den seltensten Fällen der Fall. 
Eingangspins müssen immer mit einem Pegel beaufschlagt werden um 
reproduzierbare Ergebnisse zu bekommen. Genau aus dem Grund verschaltet 
man bei einem AVR die Schalter/Taster so, dass sie in Richtung GND 
schliessen und schaltet den internen Pullup Widerstand zu. Denn dann hat 
der Pin immer einen definierten Pegel. Ist der Schalter offen, dann 
zieht der Pullup Widerstand den Pin auf Vcc und damit auf 1. Ist der 
SChalter geschlossen, dann zieht der Schalter (weil er gegenüber dem 
Pullup den viel geringeren Widerstand repräsentiert) den Pin auf 0.


AVR-Tutorial
AVR-GCC-Tutorial

von Chandler B. (chandler)


Lesenswert?

Beide Daumen hoch!!
Vielen Dank Karl Heinz, habe dein Vorschlag sofort getestet und es 
funktioniert jetzt so wie ich es haben will.

von Chandler B. (chandler)


Lesenswert?

Habe da doch noch mal eine nachfrage, wie ich das ganze mit einem 
schalter machen kann, ist mir nun bewusst, aber wie muss ich es 
schalten, wenn ich nur einen Taster habe? da habe ich ja nur einen 
Eingang und einen Ausgang (wo soll ich GND anlegen?

von Dietrich L. (dietrichl)


Lesenswert?

Chandler Bing schrieb:
> wenn ich nur einen Taster habe?

Genauso wie bei einem Schalter: 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Taster_und_Schalter

von Karl H. (kbuchegg)


Lesenswert?

Chandler Bing schrieb:
> Habe da doch noch mal eine nachfrage, wie ich das ganze mit einem
> schalter machen kann, ist mir nun bewusst, aber wie muss ich es
> schalten, wenn ich nur einen Taster habe? da habe ich ja nur einen
> Eingang und einen Ausgang (wo soll ich GND anlegen?

An einem Pin vom Taster. Der andere kommt an den Pin vom µC

von eProfi (Gast)


Lesenswert?

if (PINA == 0b00000001) {
--->
  if (PINA & 0b00000001) {
ist eine Kurzform für
  if ((PINA & 0b00000001) != 0) {

von Karl H. (kbuchegg)


Lesenswert?

eProfi schrieb:
> if (PINA == 0b00000001) {
> --->
>   if (PINA & 0b00000001) {
> ist eine Kurzform für
>   if ((PINA & 0b00000001) != 0) {

@TO
Und noch besser schreibt es sich als
1
   if (PINA & ( 1 << PA0 ))
denn da sieht man dann auch gleich, dass es auf den Pin PA0, UND NUR AUF 
DEN PIN PA0 ankommt!

Bei dir, mit Taster gegen Masse geschaltet, dann eben
1
   if ( !(PINA & (1<<PA0)) )


Ich hab dir doch die Tutorien verlinkt. Warum schaust du da nicht rein? 
Da steht alles drinnen, so dass sich hier keiner mit immer dem gleichen 
Zeug den Mund fusselig reden muss.

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.