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
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-------------------------------------------------- --------
Datenrichtungen für die Ausgänge vergessen? Was für ein Microcontroller ist das denn und was für ein Compiler?
:( Das Programm ist ja noch total unvollständig ich brauche echt ein paar tipps
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.
Tipp: "ich habe heute meine erste Stunde Microcontroller gehabt." Evtl. mal daran denken, was Thema der Stunde war?
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 !
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
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
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?
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.
holger schrieb: >>if-Schleife > > http://www.if-schleife.de Genau genommen sind es Bedingte Anweisungen oder Verzweigungen ;)
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.
Eine erste Schulstunde mit den Top-Guns des mikrokontroller.net Seehr interessant ... @Maik intelligent gewählte Überschrift!
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.
@Über die Schulter-Gucker Das ist die Bezeichnung unseres Kurses !
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
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?
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.
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
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.
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!
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
>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).
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.