Hallo!
Wir haben ein Problem mit der Ansteuerung unseres Tasters. Eigentlich
wollten wir nur ein einfaches programm zum testen schreiben, was jedoch
nicht funktioniert hat:
#include <avr/io.h>
int main(void)
{
DDRB=0b11111111;
DDRD=0b00000000;
while(1)
{
if (PORTD==0b00000001) // Taster zu
{
PORTB=0b00000111; //LEDs an
}
}
}
Als wir das Programm auf unseren Mirokontroller gebrannte hatten, war
zwischen dem PORTD und hight noch nicht mal eine Spannung. Die LEDs
haben dementsprechend auch nicht geleuchtet,auch wenn man den tTaster
gedrückt hat.
Wäre super, wenn uns das jemand vertsänlich erklären könnte, weil wir
noch wirklich wenig Erfahrungen mit programmieren haben.
Danke schon mal
und LG
amateur schrieb:> Als wir das Programm auf unseren Mirokontroller gebrannte hatten, war> zwischen dem PORTD und hight noch nicht mal eine Spannung.
Logisch.
WOher soll sie auch kommen?
Von einem Pin, der auf Eingang geschaltet ist sicher nicht. Der gibt
keine Spannung ab, sondern 'erfühlt' den Spannungspegel, der ihm
vorgegeben wird. Deswegen ist das ja auch ein Eingang und kein Ausgang.
Lies dir das mal durch.
http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagenhttp://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports
Die Assembler Anweisungen lässt du links liegen. Es geht darum, wie sich
Portpins verhalten.
amateur schrieb:> Aber was haben wir im Programm falsch gemacht bzw. was müssen wir machen?
Das kommt drauf an, wie und wo ihr den Taster angeschlossen habt und ob
ein Pull-up/-down Widerstand aktiviert bzw. vorhanden ist.
Nicht gleich die Führung abgeben wollen,
wenn mal jemand einen Hinweis gibt. ;-)
Lies nochmal den Abschnitt:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Zugriff_auf_IO-Ports
und vergleiche ihn mit Deinem Programm. Stück für Stück. Wort für Wort.
Du findest es bestimmt selbst. Und das "Aha" ist es wert.
amateur schrieb:> OK Danke!> Dann ist das schonmal geklärt. Aber was haben wir im Programm falsch> gemacht bzw. was müssen wir machen?
Ihr müsst vor allen Dingen erst mal wissen, wie eure Taster
angeschlossen sind.
Ein Eingang darf nie ohne eine definierten Spannungspegel bleiben.
Entweder der Taster gibt das in beiden Fällen (gedrückt oder nicht
gedrückt) vor oder aber er sorgt nur dann, wenn er gedrückt ist für
einen definierten Pegel. Dann muss man durch geeignete sonstige
Beschaltung dafür sorgen, dass es auch im nicht gedrückten Zustand eine
definierte Spannung gibt.
Und dazu muzss man wissen, wie die Taster eigentlich genau angeschaltet
sind und was passiert, wenn man den Tatser drückt.
"ansteuerung eines Tasters mit AVR Controller in C" ist das Thema, nicht
etwa umgekehrt.
Stellt sich also die Frage, unter welchen Bedingungen der Taster seinen
Zustand ändert. Alles andere geht am Thema vorbei.
Michael schrieb:
"Das kommt drauf an, wie und wo ihr den Taster angeschlossen habt und ob
ein Pull-up/-down Widerstand aktiviert bzw. vorhanden ist."
Wir haben einen Pull-up widerstand aktiviert und den Taster an Masse
angschossen. Solange der Taster nicht gedrückt ist, hat er eine Spannung
von 5 Volt. Eigentlich müsste das so richtig sein, aber wir sind uns
nicht ganz sicher. Deshalb hier nochmal unser Programm:
#include <avr/io.h>
int main(void)
{
DDRB=0b11111111;
PORTD=0b00000001; //Pull up widerstand aktivieren
DDRD=0b00000000;
while(1)
{
PORTD=0b00000100; // Pin2 auf 1 ??
if (PIND==0b00000100)
{
PORTB=0b00000111;
}
}
}
"Das kommt drauf an, wie und wo ihr den Taster angeschlossen habt"
Stimmt. Es macht einen Unterschied, ob der Taster im Bad oder in der
Küche ist. Ebenfalls ist es maßgeblich, wieviele Anschlüsse des Tasters
Verwendung finden.
Gerade frage ich mich ein weiteres mal nach dem Sinn dieses Forums ...
Kinder, lasst doch einfach die Finger von Elektronik!
Mein Name ist Dieter Sieber, und ich bin ein Ingeneur bei Exxon Mobil in
Deutschland.
Da ich jetzt viel Freizeit habe, ist die Sinnfrage zunehmend wichtig
geworden. Umsomehr verdient es unser aller Achtung, wenn sich ein
"Ingeneur" (sic!" sich outet, dass er seinen Titel nicht mal richtig
schreiben kann.
amateur schrieb:> von 5 Volt. Eigentlich müsste das so richtig sein,
Nö.
Das ist kompletter Quatsch.
Werdet euch doch mal darüber einig, an welchem Pin ihr was angeschlossen
habt.
Und dann leg diese bescheuerte Bitschreibweise ab, wenn du damit nicht
klarkommst.
Ein Pin wird mit
PORTx |= ( 1 << Pinnummer );
auf 1 gesetzt.
Ein Pin wird mittels
PORTx &= ~( 1 << Pinnummer );
auf 0 gesetzt,
Ein Pin wird mittels
if( PIN & ( 1 << Pinnummer ) )
darauf hin abgefragt, ob er 1 ist.
DDR Register: Für einen Pin muss das Bit mit seiner Pinnummer auf 0
sein, dann ist der Pin Eingang.
Ist selbiger Pin auf 1, dann ist der Pin Ausgang.
Bei einem Eingangspin bekommt das PORT Register (nicht PIN, PIN ist mit
dem physikalischen Pin verknüpft) für diesen Pin eine Sonderrolle: es
schaltet den Pullup an diesem Pin ein bzw. aus. ( 1 ist ein)
Und das zieht ihr jetzt durch! Das ist doch nicht schwer!
Karl Heinz Buchegger schrieb:> amateur schrieb:>>> von 5 Volt. Eigentlich müsste das so richtig sein,>> Nö.> Das ist kompletter Quatsch.>
Stimmt. Der "angesteuerte Taster" dürfte erst ab 2,5 kV leitend werden.