Ich bin ein absoluter Anfänger im Programmieren von Mikrocontrollern.
Ich habe bisher kleine LED Schaltungen im Atmel Studio in C
programmiert. Die haben prima geklappt, aber ich krieg des mit den
Tastern net hin. Ich will dass eine LED beim erten Tastendruck angeht
und beim nächsten wieder ausgeht. Kann mir bitte jemand helfen, ich hab
schon edliche Befehle versucht. Schonmal im vorraus danke!
if (PINA & (1 << PINA0))
{
PORTB ^= (1<<PORTB0);
}
Was das genau macht darfst du jetzt selber herausfinden. Steht alles im
Tutorial hier auf der Seite.
- Welcher Mikrocontrollertyp genau (AVR/STM32/MSP430), welches Derivat?
- Wie ist der Taster angeschlossen?
- Welchen Code hast du geschrieben der nicht läuft?
Zeig mal was du hast, dann können wir Tipps geben.
Tobias schrieb:> trotz der Prellung müsste die LED doch zum Leuchten beginnen
ab und zu ja, je nachdem wann man die Taste loslässt,
während man sie drückt wird die LED ziemlich schnell ein/ausgeschaltet,
also jedenfalls nicht das Verhalten das der TO will
Ich benutze das eHajo aTeVal und versuche einen ATTiny2313A.
Undich hab noch ne Verzögerung in beiden if Funktionen eingebaut aber es
passiert immer noch nichts
Tobias benutzte am besten das mit dem
PORTD ^= (1<<PORTDX); damit kannst du das in einer IF Abfrage
abfertigen.
Aber du solltest/musst dir noch etwas zum entprellen Überlegen. Für eine
sehr einfache, wenn auch nicht die eleganteste Lösung , hast du in
deinem Programm schon eine lib eingebunden als Tipp.
Das mit den Bit Manipulationen ist im Tutorial nachzulesen genauso wie
man Taster entprellt.
Generell noch als Tipp gewöhne dir die Schreibweise mit Shift
Operationen an.
Tobias schrieb:> if ( (PIND & (1<<PIND3)) && n==0 )> {> PORTD=0b1000000;> n=1;> }>> if((PIND & (1<<PIND3)) && n==1)> {> PORTD=0b0000000;> n=0;> }
es tritt in beiden IF. solange bis Sie die Taste loslassen
Fehler = n 1 / n = 0
Loop
erste, n = 0 dann ausführen 1. If > dann n = 1
zwei n = 1 dann ausführen 2. If > dann n = 0
endloop
bis Sie die Taste loslassen
Mfg Ib
Tobias schrieb:> Ich benutze das eHajo aTeVal und versuche einen ATTiny2313A.
Daran kann ich nicht erkennen, wie die Taster verschaltet sind.
Wenn sie (was wahrscheinlich ist) nach GND schalten, brauchst Du einen
Pull-Up-Widerstand. Der sorgt dafür, dass bei offenem Taster ein
definierter Pegel am Port anliegt. Wenn dieser Widerstand nicht auf der
Leiterplatte (also extern) ist, musst Du den internen Pull-Up des µC per
Software einschalten:
1
PORTD|=(1<<PD3);
Allerdings muss Dein Programm dann anders werden, da Du mit ...
1
PORTD=0b1000000;
... das Bit gleich wieder löschst.
Dazu solltest Du Dir das Thema "Bitmanipulation" mal anschauen:
http://www.mikrocontroller.net/articles/Bitmanipulation
Aber das ist unabhängig von den sonstigen Problemen Deiner
while-Schleife - wie oben schon angedeutet.
Gruß Dietrich
Ib schrieb:> es tritt in beiden IF. solange bis Sie die Taste loslassen> Fehler = n 1 / n = 0>> Loop> erste, n = 0 dann ausführen 1. If > dann n = 1> zwei n = 1 dann ausführen 2. If > dann n = 0> endloop> bis Sie die Taste loslassen>> Mfg Ib
Bitte vergessen. war zu schnell
Ich hab etz ein anderes Programm geschrieben:
#define F_CPU 20000000UL //Mikrokontroller Leistung
#include <util/delay.h> //einfügen der Zeit funktionen
#include <avr/io.h>
int main(void)
{
while(1)
{
DDRD=0b1100000; //PD6 und PD5 LED
if (PIND & (1<<PIND3))
{
PORTD=0b1000000;
_delay_ms(200);
PORTD=0b0000000;
PORTD=0b0100000;
_delay_ms(20);
PORTD=0b0000000;
}
}
}
_________________________________________________________________________
Das komische an dem Programm ist, es wird irgendwie aktiviert obwohl ich
den Taster garnicht berühre. Wenn ich meinen Finger si auf 2mm an den
Taster annähere startet das Programm. woran liegt das???
Tobias schrieb:> Das komische an dem Programm ist, es wird irgendwie aktiviert obwohl ich> den Taster garnicht berühre. Wenn ich meinen Finger si auf 2mm an den> Taster annähere startet das Programm. woran liegt das???
Es wird nicht ohne Gund nach dem Schaltplan bzw Verschaltung des Tasters
gefragt. Vermutlich hängt der µC Eingang "in der Luft" da ja auch keine
internen Pullups aktiviert sind
Mit den Zuweisungen an PORTD beeinflußt du gleich alle Bits obwohl da ja
auch der Eingang für den Taster ist.
Tobias schrieb:> Ich hab etz ein anderes Programm geschrieben:
Schön für Dich.
Und was hast Du Dir dabei gedacht?
Etwas ohne Syntaxfehler hinschreiben kann jeder.
Das Schwere ist nur, daß es auch eine Funktion zuverlässig erfüllen
soll.
Da aber niemand in Deinen Kopf hineinschauen kann, mußt Du das Programm
kommentieren, was Du Dir bei jeder Zeile, Funktion, Variable, Zahlenwert
gedacht hast, wie es funktionieren soll.
Kommentare sind kein überflüssiger Schnickschnack.
Auch Anfänger dürfen kommentieren, nicht nur Profis.
Allgemein ist zuverlässiges Entprellen nichts, was man so einfach aus
dem Ärmel schüttelt.
Es lohnt sich also, erstmal die Grundlagen zu lesen bzw. sich bewährte
Entprellroutinen anzuschauen.
Peter Dannegger schrieb:> Allgemein ist zuverlässiges Entprellen nichts, was man so einfach aus> dem Ärmel schüttelt.
Das stimmt. Da braucht es schon einen/den echten Entprellspzialisten.
Ich lach mich weg ... Der arme Tobias.
SchemaF schrieb:> Ich lach mich weg ...
Also mir vergeht regelmäßig das Lachen, wenn ich mich über kommerzielle
Geräte ärgern muß, die prellen oder Tastendrücke verlieren oder
Ewigkeiten warten, ehe sie reagieren.
Da inzwischen geklärt ist, dass die Taste keinen Pull-Up hat, muss Du
(Tobias) das Programm ändern.
Hier mal eine Abwandliung Deines letzten Versuchs ohne Anspruch auf
Schönheit (und hoffentlich richtig):
1
hierderVorspann,dann:
2
3
intmain(void)
4
{
5
DDRD|=(1<<PD6)|(1<<PD5);// PD6 und PD5 = Ausgang (LEDs)
0b0000000 und
0b1000000 sind
---------
--6543210 (Bit-Nr.)
keine richtig definierten Werte für ein 8-Bit-Register.
Probier es doch mal mit
0b00000000
0b10000000
----------
--76543210 (Bit-Nr.)
Bernie schrieb:> 0b0000000 und> 0b1000000 sind> ---------> --6543210 (Bit-Nr.)>> keine richtig definierten Werte für ein 8-Bit-Register.>> Probier es doch mal mit> 0b00000000> 0b10000000> ----------> --76543210 (Bit-Nr.)
Wollte es auch gerade erwähnen...
Ist bisher in keinem Post erläutert worden.
Binär Angaben immer in 8-bit Konstellationen.
Michael L. schrieb:> Tim schrieb:>> Er soll sich lieber gleich den shift angewöhnen.>> Ja stimmt, das ist viel lesbarer ... z.B. so hier:>>
1
(1<<7)|(1<<6)|(1<<5)|(1<<3)|(1<<2)|(1<<1)
>> Würg ...
Da spricht ein wahrer Programmierer.
Ich ersetzte die direkte Bitmaske durch ein die Funktion beschreibende
Defines und füge noch das Macropaket von PeDa Peter hinzu.
*sbit.h*
Bernie schrieb:> Probier es doch mal mit> 0b00000000> 0b10000000> ----------> --76543210 (Bit-Nr.)
Das ist aber falsch, weil die LEDs an PD5 und PD6 angeschlossen sind.
Tobias Version war schon funktionell richtig, aber höchsten unschön. Der
Compiler fügt die führenden Nullen schon selber ein.
Gruß Dietrich