Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Was tut dieser Quelltext?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
15.07.2004, 12:53 Uhr
Unwissende
...die wirklich Unwissende 8-)


Hallöchen allerseits,

zunächst einmal hoffe ich, dass ich im richtigen Forum bin, es geht nämlich um die Ansteuerung eines Microcontrollers mittels der Programmiersprache "C". Die Entwicklungsumgebung ist uvision [sprich: müüüüüüüü wischn] von Keil.
Also, das ist der Code, der als Beispielprojekt bei der Entwicklungsumgebung bereits dabei war, den ich verweden möchte.Ich werde ihn zur Ansteuerung einer kleinen LED verwenden (ihr seht, bin erst am Anfang meiner Microcontroller-"Karriere"....)

C++:
#include <reg552.h>

void main (void)
{    
    unsigned char i;
    while (1)
    {
        for (i=0x01; i<=0x80;i<<=1) /*bitshift*/
        {    P1=i;
        }
    }
}

/*zur Erinnerung:     0x01: 0000 0001        
        0x80: 1000 0000
*/




Im Header "reg552.h" befinden sich halt ein paar Definitionen, z.B. eben die Adresse von P1, also dem Port1 des Microcontrollers (übrigens ein 552er von Philips, wer hätte das gedacht...). Der Port1 hat *imDatenBlattNachSchau* 8 Pins, okay, das ist ja eigentlich auch logisch, weil in der for-Schleife mit 8-Bit-Zahlen gearbeitet wird, wo dann die Bits geshiftet werden (Hoffentlich versteht jemand meine wirren Gedanken )
Sodale, hab ich das jetzt richtig verstanden....?!?! Durch die for-Schleife wird jeder Pin vom Port1 auf HIGH gesetzt, d.h. man bräuchte an jedem Pin eine LED (und selbstverständlich einen Vorwiderstand, der U=5Volt beim Controller auf U=2V bei der Diode runterbringt, bei 20mA, *rechenrechen* 150Ohm) um das zu überprüfen?
Habt ihr eine Idee, für was die While-Schleife gut sein könnte? (=Endlosschleife???), wieso macht man das net in einer endlichen Schleife etc.?


Bearbeitung von typecast:
code Tags durch cpp Tags ersetzt

--
__________________________________
Unwissenheit ist vorläufig- Dummheit für immer

Dieser Post wurde am 15.07.2004 um 14:14 Uhr von typecast editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.07.2004, 12:57 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich würde mal sagen, es werden nach Port1 deines Controls in einer Endlosschleife (wg while) nacheinander immer wieder die Werte 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 geschrieben (wg. for schleife)
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
15.07.2004, 15:09 Uhr
ao

(Operator)



Zitat von Unwissende:
Habt ihr eine Idee, für was die While-Schleife gut sein könnte? (=Endlosschleife???), wieso macht man das net in einer endlichen Schleife etc.?

Weil Mikrocontroller ein bisschen anders ticken als PCs.

Die haben keine Shell oder kein Betriebssystem, mit dem man Programme startet und zu denen man nach Ende wieder zurückkehrt. Wenn man den Controller einschaltet, springt das Programm an und läuft, bis man wieder abschaltet. Darum bestehen µC-Programme meist aus etwas Initialisierungs-Code und einer großen Endlosschleife.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
15.07.2004, 15:48 Uhr
Unwissende
...die wirklich Unwissende 8-)



Zitat von ao:

Weil Mikrocontroller ein bisschen anders ticken als PCs.

Die haben keine Shell oder kein Betriebssystem, mit dem man Programme startet und zu denen man nach Ende wieder zurückkehrt. Wenn man den Controller einschaltet, springt das Programm an und läuft, bis man wieder abschaltet. Darum bestehen µC-Programme meist aus etwas Initialisierungs-Code und einer großen Endlosschleife.


Danke schön, das hab ich jetzt aber auch vor etwa einer halben Stunde im Handbuch gelesen
--
__________________________________
Unwissenheit ist vorläufig- Dummheit für immer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.07.2004, 20:38 Uhr
Hans
Library Walker
(Operator)



Zitat von virtual:
Ich würde mal sagen, es werden nach Port1 deines Controls in einer Endlosschleife (wg while) nacheinander immer wieder die Werte 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 geschrieben (wg. for schleife)

Hi,

das sehe ich auch so. -> Ist also im prinzip ein Lauflicht, wenn an allen Pinnen eine LED (+Vorwiderstand) angeschlossen wird. Nur dürfte man davon nicht viel sehen, weil der Controller das vieeel zu schnell abarbeitet. Man hat wohl eher den Eindruck, das alle LEDs gleichzeitig leuchten. Wenn Du noch eine Warteschleife einbaust, sollte man es aber irgendwann als Lauflicht erkennen...

C++:
while (1)
{
    for (i=0x01; i<=0x80;i<<=1) /*bitshift*/
    {    P1=i;
          // hier die Warteschleife...
    }
}

--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.07.2004, 09:11 Uhr
Unwissende
...die wirklich Unwissende 8-)


Jep, Warteschleife hab ich jetzt drin und das Board neben mir blinkt und blinkt und blinkt (Okay, ist nur 1LED dran, aber trotzdem ) Wie Weihnachten

Falls es noch jemanden interessiert, so sieht die Warteschleife aus:

C++:
void warte (void)  
{                  
  ;             /*delay*/                      
}


Aufgerufen wird die dann so:

C++:
for (i=0; i<10000; i++)
{        
      warte ();                        
}


--
__________________________________
Unwissenheit ist vorläufig- Dummheit für immer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.07.2004, 09:19 Uhr
virtual
Sexiest Bit alive
(Operator)


Hm, und warum dann nicht gleich:

C++:
for (i=0; i<10000; i++)
    ;


?
Optimiert das Compiler weg oder so?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.07.2004, 17:00 Uhr
Unwissende
...die wirklich Unwissende 8-)


weiß nich, muss ich mal ausprobieren, aber nä. Woche, jetzt ist Wochenende
--
__________________________________
Unwissenheit ist vorläufig- Dummheit für immer
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.07.2004, 19:12 Uhr
Hans
Library Walker
(Operator)


Hm... - also wenn der Compiler das wegoptimiert ist das natürlich doof. Aber das müsste sich doch auch irgendwo einstellen lassen...
Aber besser, weil unabhängig von der Taktfrequenz wäre es wohl, wenn man da einen der Timer benutzt. Die primitive Variante könne dann in etwa so aussehen:

C++:
#include <reg552.h>

/* Funktionsprototypen */
void init(void);
void warte(void);

void main (void)
{    
    unsigned char i;

    init();

    while (1)
    {
        for (i=0x01; i<=0x80;i<<=1) /*bitshift*/
                                    /*zur Erinnerung:     0x01: 0000 0001        
                                                          0x80: 1000 0000 */


        {    P1=i;
              warte ();
        }
    }
}

void warte(void)
{
   // hier den Timer abfragen, ob noch zählt, oder nicht
   // (Wenn er nicht mehr zählt, dann erneut starten und return;
}

void init(void)
{
   // hier den Timer initalisieren, d.h. einen Startwert angeben und festlegen
   // wie er arbeiten soll
}



Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 16.07.2004 um 19:23 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
16.07.2004, 22:50 Uhr
ao

(Operator)



Zitat von Hans:
Aber besser, weil unabhängig von der Taktfrequenz wäre es wohl, wenn man da einen der Timer benutzt.

Wenn man sich aber entscheidet, dafür einen Timer zu spendieren, dann sollte man auch konsequent sein und den Interrupt des Timers scharfmachen und das Lauflicht im Interrupt-Handler programmieren.

Erstens staunt man nämlich, wie wenig Code das wird (die ISR wird ein Einzeiler, und die Initialisierung des Timers und des Interruptsystems dürften auch höchstens drei oder vier Zuweisungen sein) und zweitens vergeudet man nicht die ganze CPU-Zeit mit Warten aufs Timer-Ereignis.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: