Forum: Mikrocontroller und Digitale Elektronik Erste Schulstunde Microcontroller


von Maik (Gast)


Lesenswert?

Guten Tag,

ich habe heute meine erste Stunde Microcontroller gehabt. Die 
Aufgabenstellung lautete wie folgt:

erstellen sie ein programm bei dem mit dem schalter rot an p1.0 die leds 
an p1.2/3/4/5/6/7 ausgeschaltet werden.
diese leds werden bei bestätigung blau an p1.1 angeschaltet.

Ich versuche das die ganze Zeit mit If/Else zu erarbeiten doch ich komme 
nicht weiter! :(

Kann mir jemand nen Tipp geben?

LG
Maik

P.S. Danke schonmal für eure Antworten und für die damit verbundene Zeit

von Grml (Gast)


Lesenswert?

Poste mal was du bis jetzt hast.

von Maik (Gast)


Lesenswert?

versuche mich gerade an C also bitte nicht zu streng ! :(




//====================================================================== 
=========
//  IO_01    Aufgabe 1
//
//====================================================================== 
=========
//----------Quelltextdateien-------------------------------------------- 
---------
#include <Reg515c.h>   //Definition der Port-Bytes usw.
//----------Funktionsdeklerationen-------------------------------------- 
---------
void main(void);
//----------Hauptprogramm----------------------------------------------- 
---------
unsigned char temp;
unsigned char rot;
unsigned char blau;

void main(void)
{
  while(1)  //endlos
  {
    temp=P1;  //Port P1 einlesen
    P1.1=temp;  //an Port P1.1 ausgeben

    if(rot=1)
    {
      p1.2=0;
      p1.3=0;
      p1.4=0;
      p1.5=0;
      p1.6=0;
      p1.7=0;

    }else{
      p1.2=1;
      p1.3=1;
      p1.4=1;
      p1.5=1;
      p1.6=1;
      p1.7=1;
    }
  }
}
//----------Funktionen-------------------------------------------------- 
--------

von timo91 (Gast)


Lesenswert?

Zum vergleichen musst du "==" anstatt "=" benutzen

von Grml (Gast)


Lesenswert?

Datenrichtungen für die Ausgänge vergessen?

Was für ein Microcontroller ist das denn und was für ein Compiler?

von Karl H. (kbuchegg)


Lesenswert?

und wie kommt rot zu seinem Wert?

von Maik (Gast)


Lesenswert?

:( Das Programm ist ja noch total unvollständig ich brauche echt ein 
paar tipps

von Karl H. (kbuchegg)


Lesenswert?

Maik schrieb:
> :( Das Programm ist ja noch total unvollständig

Sooooo weit bist du gar nicht daneben!

> ich brauche echt ein
> paar tipps

Hast du doch schon

  Vergleich auf Gleichheit ist in C  ein ==   und kein   =

  Wenn du einen externen Schalter/Taster was auch immer benutzen
  sollst, dann wirst du den auch irgendwo einlesen müssen.


Deine Aufgabenstellung sagt

Wenn der Taster 'rot' auf P1.0 eingeschaltet ist.
Na das übersetzt sich doch schon fast von selbst


   if ( p1.0 == 1 )    // oder 0, weiss nicht wie deine Schalter
                       // verschaltet sind
   {
     mach was mit den LED, zb einschalten
   }

Wenn der Taster blau auf p1.1 betätigt wird


   if ( p1.1 == 1 )
   {
     mach was anderes mit den LED, zb ausschalten
   }


Ob du jetzt die Pins irgendwie programmteechnisch behandeln musst, damit 
sie als Eingang funktionieren weiß ich nicht. Aber dazu bist du ja im 
Kurs.

Nur Mut. Es ist noch kein Meister vom Himmel gefallen und fehlschläge 
gehören dazu. Da musst du durch.

von ich (Gast)


Lesenswert?

Tipp:

"ich habe heute meine erste Stunde Microcontroller gehabt."

Evtl. mal daran denken, was Thema der Stunde war?

von Maik (Gast)


Lesenswert?

Ja aber wenn der Schalter dann losgelassen wird geht der doch aus der 
if/else anweisung raus? aber die leds müssen doch an bleiben und durch 
bestätigung von rot aus gehen und dann wenn man blau drückt das die 
wieder an gehen aber beim drücken auf rot aus bleiben !

von Peter D. (peda)


Lesenswert?

Du mußt schon einen Pin testen, wenn Du irgendwas damit machen willst.

Ein Byte zu testen, was nirgends geändert wird, ist ziemlich witzlos.

Und nicht Bits (einzelne Portpins) und Bytes (ein ganzer Port) 
miteinander vermanschen.

Auch solltest Du erstmal klären, ob die Tasten und LEDs low- oder 
high-aktiv sind.

Beim 8051 macht man beides üblicher Weise low-aktiv, da dann die Tasten 
die internen Pullups verwenden können und der low-Pegel mehr Strom für 
die LEDs liefern kann.
Außerdem ist der Resetzustand alle Portpins = high.


Peter

von Ratgeber (Gast)


Lesenswert?

Maik schrieb:
> Ja aber wenn der Schalter dann losgelassen wird geht der doch aus der
> if/else anweisung raus? aber die leds müssen doch an bleiben und durch
> bestätigung von rot aus gehen und dann wenn man blau drückt das die
> wieder an gehen aber beim drücken auf rot aus bleiben !

dann musst du halt die if-Schleife noch mal verschachteln und dort den 
aktuellen Zustand des Ports abfragen

von Maik (Gast)


Lesenswert?

das soll wie funktionieren? ich habe bis jetzt nur html und css gelernt 
versuche mich nun an C danach kommt Java möchte das gerne wissen

DIe verschachtelung kriege ich hin aber wie frage ich den zustand eines 
ports ab?

von holger (Gast)


Lesenswert?


von Ronald S. (mline)


Lesenswert?

Maik schrieb:
> DIe verschachtelung kriege ich hin aber wie frage ich den zustand eines
> ports ab?

Dazu musst du uns erst sagen welche Hardware und Software du benutzt.

von Ronald S. (mline)


Lesenswert?

holger schrieb:
>>if-Schleife
>
> http://www.if-schleife.de

Genau genommen sind es Bedingte Anweisungen oder Verzweigungen ;)

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Maik schrieb:
> DIe verschachtelung kriege ich hin aber wie frage ich den zustand eines
> ports ab?

Du musst uns langsam mal verraten, was du für einen Prozessor 
verwendest. Beim MCS51 liest du einfach vom Port (vorausgesetzt er wurde 
am Anfang mal auf high gesetzt, um ihn als Eingang zu benutzen ) und 
maskierst das gewünschte Bit :
1
#define roterButton 1 // roter Knopf gegen GND auf P1.1
2
3
char roteTaste(void) {
4
  return (!(P1 & (1<<roterButton)));
5
}
Diese Funktion sollte >0 liefern, wenn die 'rote Knopf Leitung' auf low 
gezogen ist. Das Ausrufezeichen steht für NOT ( also invertiert ), P1 
ist der Port 1 und das & (1<<roterButton) maskiert den Pin.
Wenns ein AVR ist, musst du das PIN Register lesen und vorher den Port 
auf Input schalten. Auch solltest du den Pullup an diesem Pin aktiviert 
haben.

von Über die Schulter-Gucker (Gast)


Lesenswert?

Eine erste Schulstunde mit den Top-Guns des mikrokontroller.net

Seehr interessant ...

@Maik
intelligent gewählte Überschrift!

von Karl H. (kbuchegg)


Lesenswert?

Maik schrieb:
> Ja aber wenn der Schalter dann losgelassen wird geht der doch aus der
> if/else anweisung raus?

Falls du es noch nicht gemerkt hast.

Du brauchst kein else

In deiner Aufgabenstellung gibt es nichts, was sich zu einem else 
übersetzen würde.

von Maik (Gast)


Lesenswert?

verwendet wird C515C-L

von Maik (Gast)


Lesenswert?

@Über die Schulter-Gucker Das ist die Bezeichnung unseres Kurses !

von Arne P. (ob3lix)


Lesenswert?

also wir haben das mal so gemacht:
1
unsigned char ein = 0;
2
unsigned char aus = 0;
3
4
if(p1.0 == 1)
5
{
6
   ein = 1;
7
   aus = 0;
8
}
9
10
else if (p1.1 == 1)
11
{  
12
   ein = 0;
13
   aus = 1;
14
}
15
16
17
if (ein == 1)
18
{
19
   //Mach was
20
}
21
22
else if ( aus == 1)
23
{
24
   //mach was andres
25
}

ich hoff mal ich erzähl kein stuss ;) ist ne einfache, aber net 
unbedingt ne ressourcen optimierte lösung :D

von Karl H. (kbuchegg)


Lesenswert?

Arne Pfäffle schrieb:

> ich hoff mal ich erzähl kein stuss ;)

Das nicht

> ist ne einfache

du beliebst zu scherzen :-)
Was ist da drann einfach?

von Über die Schulter-Gucker (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Was ist da drann einfach?

die Verwendung von else?

von Fritz M. (Gast)


Lesenswert?

Hier erst einmal ein Beispiel zum grundsätzliche vorgehen.

8051 Bit I/O Example Program

http://www.keil.com/download/docs/84.asp


/*---------------------------------------------------------------------- 
-------
Definitions for P1 (8 bits), P1.0, and P1.1.
------------------------------------------------------------------------ 
-----*/
sfr P1 = 0x90;        /* SFR for P1 */

sbit P1_0 = P1^0;     /* SFR for P1.0 */
sbit P1_1 = P1^1;     /* SFR for P1.1 */

/*---------------------------------------------------------------------- 
-------
MAIN C function
------------------------------------------------------------------------ 
-----*/
void main (void)
{
P1_0 = 1;                  /* Configure P1.0 as an input */

/*-----------------------------------------------
This loop reads P1.0 and writes the value read
to P1.1.

Open the Port 1 Dialog from the Peripherals Menu
and change the value of the P1.0 Pin.  When you
set P1.0 LO, P1.1 outputs LO.  When you set
P1.0 HI, P1.1 outputs HI.
-----------------------------------------------*/
while (1)
  {
  P1_1 = P1_0;            /* Copy P1.0 to P1.1 */
  }
}

/*---------------------------------------------------------------------- 
-------
------------------------------------------------------------------------ 
-----*/

Die Definitionen für die einzelnen Bits scheinen in der Reg515c.h noch 
nicht vorgenommen zu sein.
http://www.keil.com/dd/docs/c51/infineon/reg515c.h

Grüße
Fritz M.

von Peter D. (peda)


Lesenswert?

Für high aktive Logik und die Austaste dominiert:
1
#include <reg51.h>
2
3
sbit P1_0 = P1^0;
4
sbit P1_1 = P1^1;
5
6
void main()
7
{
8
  for(;;)
9
    P1_0 ? P1 &= 0x03 : P1_1 ? P1 |= 0xFC : 0;
10
}

Peter

von Tobias (Gast)


Lesenswert?

Hallo,
wir programmieren in der Schule ebenfalls mit dem 8051 und arbeiten den 
Kurs von ET-Tutorials durch http://ET-Tutorials.de/Mikrocontroller
Das funktioniert bei uns super.

von M. K. (avr-frickler) Benutzerseite


Lesenswert?

Peter Dannegger schrieb:
> Für high aktive Logik und die Austaste dominiert:
>
1
> #include <reg51.h>
2
> 
3
> sbit P1_0 = P1^0;
4
> sbit P1_1 = P1^1;
5
> 
6
> void main()
7
> {
8
>   for(;;)
9
>     P1_0 ? P1 &= 0x03 : P1_1 ? P1 |= 0xFC : 0;
10
> }
11
>
>
> Peter

Jaja der peda wieder. Entweder Genial und ich verstehe es nicht oder da 
ist ein kleiner Fehler drin. ich vermute mal mit 0x03 schaltest du die 
Pullups für die Taster ein, warum schaltest du sie mit 0xFC dann aus?

Oder aber du gehst von einen Schalter an VCC mit einem 
Pulldown-Wiederstand aus, dann währe 0x03 aber verkehrt und müsste wohl 
eher 0x00 heißen.

Erklären Sie doch mal Herr Dannegger!

von Peter D. (peda)


Lesenswert?

M. K. schrieb:
> Erklären Sie doch mal Herr Dannegger!

AND (&=) und OR (|=) löschen bzw. setzen nur die gewünschten Bits eines 
Bytes. Die Pins 0 und 1 bleiben daher unverändert.

Da Eingangspins auf 1 stehen müssen, könnte man aber auch eine Zuweisung 
machen. Auf die Codegröße hat das keinen Einfluß.

Auch sind AND/OR Read-modify-write Befehle, d.h. lesen und ändern nur 
das Ausgangsregister.


Peter

von MCUA (Gast)


Lesenswert?

>Auch sind AND/OR Read-modify-write Befehle, d.h. lesen und ändern nur
>das Ausgangsregister.
Read-modify-write hat nichts mit der Lage des Speichers (Register, RAM, 
Port usw) zu tun, es kann sich prinz. auf alles beziehen. (Nur manche 
CPUs haben diese Einschränkung).
Read-modify-write heisst auch nicht, dass es deshalb langsamer sein 
muss. (obwohl das bei manchen CPUs so ist).

von chick (Gast)


Lesenswert?

Stell mir grad vor wie die zweite und erst die dritte Stunde 
"Microcontroller" ablaufen.

Was für eine manpower hier gebraucht wird. Der reine Wahnsinn.

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.