Forum: Mikrocontroller und Digitale Elektronik ATMega8 I/O Problem mit PD2 und PD3


von Tobias N. (silberkristall)


Lesenswert?

Hallo,

also ich habe mir eine Schaltung erstellt. Bei dieser sind alle PINs des 
ATMega8 belegt. Hauptsächlich wird I/O geschaltet. An allen PINs ausser 
an PD2 und PD3 wird mit Masse geschaltet, an PD2 und PD3 wird mit 5V+ 
geschaltet.

An PC2,3,4 und 5 habe ich Transistoren die wiederrum Motoren schalten. 
An PB2,3,4 und 5 habe ich Taster angeschlossen.

Drückt man den Taster an PB2 dreht der Motor an PC2.
Drückt man den Taster an PB3 dreht der Motor an PC3.
Drückt man den Taster an PB4 dreht der Motor an PC4.
Drückt man den Taster an PB5 dreht der Motor an PC5.

Die Taster schalten Masse an die jeweiligen PINs.

Das klappt ja auch so weit wie es soll.

Nun wollte ich es so haben das das ganze erst geht wenn an PD2 5V+ 
anliegen, also sowas wie "reagiere erst auf Taster wenn 5V+ an PD2 
anliegen".

Allerdings macht der Chip, sobald 5V+ an PD2 oder PD3 anliegen was er 
will bzw. sobald ich Strom an PD2 oder PD3 anlege dreht der Motor an PC4 
für 3 - 4 sek. danach reagiert der Chip auch auf die Taster nicht mehr. 
Erst wenn ich die Spannung von PD2 wieder weg nehme reagiert der Chip 
wieder auf die Taster. Genau das gleiche passiert auch bei PD3.

Im Code habe ich lediglich, if ((PIND & 1<<PD2)) { strom = 1; } else { 
strom = 0; }

und dann halt if (strom == 1) { der code für die Taster }.

Kann mir da jemand weiter helfen?

von Karl H. (kbuchegg)


Lesenswert?

Tobias N. schrieb:

> Allerdings macht der Chip, sobald 5V+ an PD2 oder PD3 anliegen

Wie ist die Aussenbeschaltung dieser Pins?

Wenn nicht 5V+ anliegen, ist sichergestellt, dass die Pins 
Massepotential haben (sprich: hast du einen Pulldown-Widerstand oder 
etwas vergleichbares?).

Ein Eingangs-Pin, an den NICHTS angeschlossen ist, hat nicht automatisch 
einen 0-Wert. Da musst schon du dafür sorgen.

von Hubert G. (hubertg)


Lesenswert?

Tobias N. schrieb:
> if ((PIND & 1<<PD2))

sollte doch so sein
if (PIND &(1<<PD2))
Ansonst Schaltung und gesamten Code, sonst kann man nur Raten.

von Ausprobierer (Gast)


Lesenswert?

Tobias N. schrieb:
> An allen PINs ausser
> an PD2 und PD3 wird mit Masse geschaltet, an PD2 und PD3 wird mit 5V+
> geschaltet.

Hoffentlich mit Pulldown-Widerständen? Ansonsten würde ich alle Taster 
gegen Masse schalten und die Programmlogik entsprechend anpassen:
1
if (!(PIND & (1 << PD2)) // Die zusätzlichen Klammern sind unnötig, aber höflicher gegenüber Programmierern, die die Operatoren-Priorität nicht auswendig wissen.
2
{
3
    // Taster-Code
4
}

von Tobias N. (silberkristall)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Tobias N. schrieb:
>
>> Allerdings macht der Chip, sobald 5V+ an PD2 oder PD3 anliegen
>
> Wie ist die Aussenbeschaltung dieser Pins?
>
> Wenn nicht 5V+ anliegen, ist sichergestellt, dass die Pins
> Massepotential haben (sprich: hast du einen Pulldown-Widerstand oder
> etwas vergleichbares?).
>
> Ein Eingangs-Pin, an den NICHTS angeschlossen ist, hat nicht automatisch
> einen 0-Wert. Da musst schon du dafür sorgen.

Naja, ich will die internen nutzen.

Ausprobierer schrieb:
> Tobias N. schrieb:
>> An allen PINs ausser
>> an PD2 und PD3 wird mit Masse geschaltet, an PD2 und PD3 wird mit 5V+
>> geschaltet.
>
> Hoffentlich mit Pulldown-Widerständen? Ansonsten würde ich alle Taster
> gegen Masse schalten und die Programmlogik entsprechend anpassen:

Also die die mit Masse schalten funktionieren ja 1A. Ja also bei den die 
mit Masse schalten ist es if (!(.... und bei 5V+ muss das (!) ja weg, 
oder? Aber wie gesagt, an den beiden Pins macht die Schaltung probleme.

Vll. sollte ich noch erwähnen das die 5V+ direkt von einem 7805er rein 
kommen. Also 12V => 100nf => 7805 => 10nf => 1k widerstand => PD2 / PD3

von Tobias N. (silberkristall)


Angehängte Dateien:

Lesenswert?

Hier dann mal der gesamte Code. Wahrscheinlich kann man den noch enorm 
kürzen aber so blicke ich selber da wenigstens durch :) Ich denke ihr 
könnt ihn lesen und verstehen.

von Karl H. (kbuchegg)


Lesenswert?

Tobias N. schrieb:

>> Ein Eingangs-Pin, an den NICHTS angeschlossen ist, hat nicht automatisch
>> einen 0-Wert. Da musst schon du dafür sorgen.
>
> Naja, ich will die internen nutzen.

Die internen kannst du nicht nutzen, wenn der Ruhepegel deines 
Eingangspins 0V sein soll.

Die internen sind Pull-UP Widerstände. Bei dem was dir vorschwebt 
brauchst du aber Pull-DOWN Widerstände.

von Tobias N. (silberkristall)


Lesenswert?

also löte ich die 7805er raus, löte dann transistoren ein die masse 
schalten und mit dem 12V signal schalte ich dann masse zum ATMega, dann 
sollte es doch gehen, also dann schalten PD2/3 auch mit Masse.

Ähm, könnte sich vll. auch mal jemand meinen Timer ansehen? Also ich 
hätte den Timer gerne so das der jede ms arbeitet, also so das meine 
variablen jede ms hochgezählt werden. dann kann ich mit ms arbeiten, 
derzeit arbeite ich mit sek. und das ist zu schlecht, und delay_ms ist 
ja noch schlimmer. Ich habe mir schon viel über Timer durchgelesen aber 
ich kapiere nicht wie / wo man die berechnet und die beispiele die man 
so findet passen auch irgendwie nicht auf meinen Timer.

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.