Erste Schulstunde Microcontroller

Gast #2550817
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
Gast #2550828
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-------------------------------------------------- 
--------
#2550858
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.
Gast #2550871
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 !
#2550878
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
Gast #2550881
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
Gast #2550890
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?
(Firma: matzetronics) #2550916
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.
#2550977
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
Gast #2551024
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.
Persönliche Seite #2551195
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!
#2551588
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
Gast #2551754
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).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren