Forum: Mikrocontroller und Digitale Elektronik in C Taster benutzen?


von Rob (Gast)


Lesenswert?

Schönen guten Morgen,

ich bin Anfänge in sachen C Programmieren und habe jetz ein paar kleine 
Aufgaben gemacht. Ich habe Blinklichter programmiert und Lauflichter. 
Diese Codes habe ich dann versucht so weit wie geht zu stauchen.
Jetz sitz ich gerade an meiner neuen Übung und möchte wenn ich einen 
Taster drücke das lauflicht anfängt zu "laufen" und wenn ich los lasse 
soll das Lauflciht auch aus sein. Ich habe ein code geschrieben wo ich 
nicht weiß ob der funktioniert, da ich auf arbeit bin und keinen 
Programmierer gerade bei mir habe, kann ich das gerade nicht testen.
Wäre nett wenn ihr ma schaun könnt ob das so grundlegend richtig ist 
oder wenn nicht was falsch ist und wie man es anders machen kann bzw 
muss.

#include<avr/io.h>
#include<util/delay.h>

int main()
{
  int i;

  DDRB=0xFF;
  DDRD=0x00;

  while(1)
  {
    if(PORTD=0x01)
    {
    for (i=0; i < 8; i++)
      {
      PORTB = 1 << i;
      _delay_ms(500);
      }
    }

    else (PORTD=0)
    {
    DDRB=0;
    }
  }
return1;
}

Vielen Dank im vorraus!

Liebe Grüße
Rob

von Achim M. (minifloat)


Lesenswert?

Rob schrieb:
> if(PORTD=0x01)

Taster nach Masse? dann heißt das
1
#define WO_IST_DER_KNOPF PD0
2
#define KNOPF_PIN        PIND
3
#define KNOPF_DDR        DDRD
4
#define KNOPF_PORT       PORTD
5
6
//knopp init
7
KNOPF_DDR  &= ~(1 << WO_IST_DER_KNOPF);
8
KNOPF_PORT |=  (1 << WO_IST_DER_KNOPF);
9
10
//abfrage
11
if((KNOPF_PIN & (1 << WO_IST_DER_KNOPF)) != (1 << WO_IST_DER_KNOPF))
12
{
13
   /*code*/
14
}
Der Vergleichsoperator bei Vergleich heißt übrigens ==

und zum Port einlesen PIN benutzen.

meinen Code kannste außerdem wiederbenutzen, wenn der knopf mal woanders 
hinkommt.
mfg mf

von Achim M. (minifloat)


Lesenswert?

Rob schrieb:
> else (PORTD=0)

der else-Zweig braucht keine Bedingung. er wird bei nicht-eintreten der 
Bedingung des if(Bedingung) ausgeführt.

Rob schrieb:
> da ich auf arbeit bin und keinen
> Programmierer gerade bei mir habe, kann ich das gerade nicht testen.

kompilieren kannst du es aber. Der wird eine Menge Errors schmeißen.
Die kannst du dann Korrigieren.

Nebenbei: if(PORTD = 0x01) ist immer "true", da eine Zuweisung erfolgt 
und der Wert "0x01" bewertet wird. der ist eben ungleich 0 und somit 
"true".
solche Fehler bereiten einem oft stundenlange Fehlersuche im Code, nur 
weil ein == aus Versehen zu einem = verkommen ist.

mfg mf

von Rob (Gast)


Lesenswert?

Vielen dank:) Ich werde das dann nachher gleich mal testen :)

Liebe Grüße

von Achim M. (minifloat)


Lesenswert?

ja, fehlt halt noch dein Lauflicht, aber das bekomms du ja allein hin :)
mfg mf

PS:
1
//abfrage
2
if( !( KNOPF_PIN & (1 << WO_IST_DER_KNOPF) ) )
3
{
4
   /*code*/
5
}
wäre noch kürzer. !(Bedingung) dreht die Bedeutung von "true" und 
"false" um, es wäre somit auch
1
//abfrage
2
if(KNOPF_PIN & (1 << WO_IST_DER_KNOPF))
3
{
4
   /*code für knopp nicht gedrückt*/
5
}
6
else
7
{
8
   /*code für knopp gedrückt*/
9
}
möglich.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Mini Float schrieb:
> !(Bedingung) dreht die Bedeutung von "true" und "false" um
Naja, hört sich seltsam an, diese Beschreibung einer simplen 
Negierung. Das "Nicht" ist eigentlich die allereinfachste logische 
Operation...
1
// Zuhause mache ich den Kaffee selber
2
if (BinZuhause) 
3
  MacheKaffeeSelber();
4
5
// Wenn ich nicht zuhause bin, kaufe ich den fertig
6
if (!BinZuhause) 
7
  LasseKaffeeMachen();

von Achim M. (minifloat)


Lesenswert?

Lothar Miller schrieb:
> Das "Nicht" ist eigentlich die allereinfachste logische
> Operation

Ja, aber es ist die "logische" Negation "!(Ausdruck)" und nicht die 
Bitweise Negation "~(Ausdruck)".
Wenn man aber an "logisches Irgendwas" denkt, denkt man meist an 
CMOS-/TTL-Logikschaltungen(was Bitoperationen entspräche). Viele 
Anfänger kommen so mit den Begrifflichkeiten ins Schleudern. Deswegen 
meine umständliche, komische Erklärung. Du hast natürlich recht :). In 
diesem Sinne
mfg mf

von Peter D. (peda)


Lesenswert?

Ich würde dazu raten, sich das Thema Entprellen erstmal völlig 
unabhängig von einem Projekt zu erarbeiten:

1.
Eine Taste + eine LED.
Bei jedem Drücken wechselt die LED.
Wichtig: Die Dauer des Drückens darf keine Rolle spielen!

2.
2 .. 8 Tasten + 2 .. 8 LEDs.
Bei jedem Drücken wechselt die zur Taste gehörende LED.
Wichtig: Jede LED muß unabhängig von jeder anderen Taste funktionieren, 
also auch wenn diese gedrückt gehalten bleibt!

Und wenn man das geschafft hat, schmeißt man alles weg und nimmt eine 
bewährte Lösung:

http://www.mikrocontroller.net/articles/Entprellung#Komfortroutine_.28C_f.C3.BCr_AVR.29


Es programmiert sich nämlich deutlich entspannter, wenn man das 
Entprellen einmal verstanden und gelöst hat. Vorherige riesige Probleme 
werden plötzlich ganz einfach und in wenigen Zeilen zu erschlagen.

Ich verstehe nicht, warum viele bei jedem Projekt immer wieder neu 
anfangen, irgendwelche abenteuerlichen Entprellkonstrukte in das Projekt 
hinein zu verweben.
Man erspart sich enorm Zeit, wenn man das Entprellen als eigenständige 
Routine implementiert, die man dann nur noch aufrufen muß. Und die 
keinerlei störende Delays in das Programm mit einbaut.


Peter

von Rob (Gast)


Lesenswert?

Okey danke.

Ich werde mich dann mal ans Entprellen machen und das durch arbeiten.

von 3.141592653589793238462643383279 (Gast)


Lesenswert?

Ich bin sehr dafür, dass jedenmal, wenn Peter auf seine 
(zugegebenermaßen sehr gute) Entprellroutine hinweist, ihm 10 ct 
überwiesen werden. :-P

Von Deiner ersten Million kannst Du mir dann ja was abgeben, Peter. :-)

von Achim M. (minifloat)


Lesenswert?

Peter Dannegger schrieb:
> Thema Entprellen

3.141592653589793238462643383279 schrieb:
> wenn Peter auf seine
> (zugegebenermaßen sehr gute) Entprellroutine hinweist, ihm 10 ct
> überwiesen werden

Ich bin dafür, dass wenn Peter als erster im Thread seine eigene 
Entprellroutine vorschlägt, π(3,1416) keine Prozente bekommt.
Außerdem wird Peter dir für deine Idee, auch wenn sie gut ist und Geld 
bringt, keine Prozente abdrücken, da die Entprellroutine seine Arbeit 
war/ist.

mf

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

da ich auf arbeit bin und keinen Programmierer gerade bei mir habe, kann 
ich das gerade nicht testen.

naja, sooo schlecht ist der Emulator im AVR Studio auch nicht.

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.