Forum: Mikrocontroller und Digitale Elektronik C Frage zu Befehl


von Peter M. (allforone)


Lesenswert?

Hallo Leute,
hier mal eine ganz simple Frage.
1
#include <hidef.h> /* for EnableInterrupts macro */
2
#include "derivative.h" /* include peripheral declarations */
3
4
5
6
void main(void) {
7
8
  EnableInterrupts; /* enable interrupts */
9
  /* include your code here */
10
11
12
13
  for(;;) {
14
    __RESET_WATCHDOG(); /* feeds the dog */
15
  } /* loop forever */
16
  /* please make sure that you never leave main */
17
}

EnableInterrupts;
Was ist das für ein Befehl?
Für eine Methode müssten doch Klammern dabei sein.
Für eine Deklaration müsste ein Datentyp angegeben sein.
Für ein Kommentar müsste es in speziell gekennzeichnet sein.

Was ist es nun wirklich?

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Jan R. schrieb:
> #include <hidef.h> /* for EnableInterrupts macro */

steht da drin ;)

von Udo S. (urschmitt)


Lesenswert?

Ein Macro oder Makro.

Schau in dein C Buch was das ist und was die Besonderheiten sind.

von Peter M. (allforone)


Lesenswert?

1
#define EnableInterrupts  /* __asm CLI; */

Hier findet sich dann dies hier.
Jetzt muss CLI aber wieder irgendwo definiert sein oder?

von Peter II (Gast)


Lesenswert?

Jan R. schrieb:
> Hier findet sich dann dies hier.
> Jetzt muss CLI aber wieder irgendwo definiert sein oder?

ist es wirklich auskommentiert? CLI ist ein ASM befehl der muss nicht 
nicht mal definiert werden.

von Peter M. (allforone)


Lesenswert?

Ne das auskommentieren war ich gerade probehalber.
Ok gut vielen Dank!

von Karl H. (kbuchegg)


Lesenswert?

Jan R. schrieb:
>
1
> #define EnableInterrupts  /* __asm CLI; */
2
>
>
> Hier findet sich dann dies hier.

Das besagt, so wie es da steht, dass das Wort 'EnableInterrupts' durch 
nichts zu ersetzen ist. (Der Kommentar zählt nicht, der wird 
weggefiltert)

D.h. dein Code
1
void main(void) {
2
3
  EnableInterrupts; /* enable interrupts */
4
  /* include your code here */
5
6
7
8
  for(;;) {
9
    ....

wird zu dem hier
1
void main(void) {
2
3
  ; /* enable interrupts */
4
  /* include your code here */
5
6
7
8
  for(;;) {
9
    ....
umgeformt, ehe der Compiler das Pamphlet zu sehen kriegt. Beachte, dass 
da nur der ; übrig geblieben ist (was zulässig ist). Aktion wird da 
keine mehr durchgeführt.

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


Lesenswert?

Jan R. schrieb:
> Was ist es nun wirklich?
Was hast du für einen Prozessor?
Welche Toolchain verwendest du?
Und wie werden dort Assembler-Befehle in C eingebunden?

von spess53 (Gast)


Lesenswert?

Hi

>Jetzt muss CLI aber wieder irgendwo definiert sein oder?

cli ist ein Assemblerbefehl. Allerdings macht er genau das Gegenteil:

Global Interrupt Disable.

MfG Spess

von Peter M. (allforone)


Lesenswert?

1
#define EnableInterrupts   __asm CLI;

So wird dann einfach EnableInterrupts ersetzt durch
1
__asm CLI;
.
D.h. es werden automatisch alle Interrupts aktiviert und ich muss kein 
einziges mehr selber von Hand aktivieren?

Alternativ könnte man auch direkt den asm Code ohne das makro 
reinschreiben, oder?

von Peter M. (allforone)


Lesenswert?

> cli ist ein Assemblerbefehl. Allerdings macht er genau das Gegenteil:

Hier steht sicher in der hidef.h datei:
1
#define EnableInterrupts   __asm CLI;
2
  /*!< Macro to enable all interrupts. */
3
#define DisableInterrupts  __asm SEI;
4
  /*!< Macro to disable all interrupts. */

von spess53 (Gast)


Lesenswert?

Hi

>D.h. es werden automatisch alle Interrupts aktiviert und ich muss kein
>einziges mehr selber von Hand aktivieren?

Noch mal: CLI deaktiviert alle Interrupts.

>und ich muss kein einziges mehr selber von Hand aktivieren?

Doch, must du.

MfG Spess

von Peter M. (allforone)


Lesenswert?

Wenn es nun alle deaktiviert. Wieso steht da dann EnableInterrupts?

von Oliver (Gast)


Lesenswert?

Jan R. schrieb:
> Hier steht sicher in der hidef.h datei:
>
>
1
> #define EnableInterrupts   __asm CLI;
2
>   /*!< Macro to enable all interrupts. */
3
> #define DisableInterrupts  __asm SEI;
4
>   /*!< Macro to disable all interrupts. */
5
>

In diesem Fall solltes du diese Headerdatei in den elektronischen 
Rundordner befördern, und ohne diesen Blödsinn weiter machen.

Was mit sei bzw. cli eigentlich aktiviert bzw. deaktiviert wird, steht 
u.a. hier im Turorial, und auch im Datenblatt zu deinem Prozessor:

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts

Das solltes du vielleicht mal von ganz vorne durcharbeiten.

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Jan R. schrieb:
> Wenn es nun alle deaktiviert. Wieso steht da dann EnableInterrupts?

Weil derjenige, der das geschrieben hat, noch konfuser war als du?

von Peter M. (allforone)


Lesenswert?

Nein, aber jetzt wirklich.
Das Headerfile ist ja von einer Firma.
Wieso schreibt die bei Enableinterrupts dann cli?

von Peter II (Gast)


Lesenswert?

Jan R. schrieb:
> Nein, aber jetzt wirklich.
> Das Headerfile ist ja von einer Firma.
> Wieso schreibt die bei Enableinterrupts dann cli?

schau doch mal in die Doku von deinem Prozessor (was ist es überhaupt 
für einer?)

von Peter M. (allforone)


Lesenswert?

Board ist das MC9S08AW60 von freescale.
Prozessor HCS08.

von Stefan E. (sternst)


Lesenswert?

Jan R. schrieb:
> Prozessor HCS08

Dann ist es so, wie es im Header steht, richtig:
cli -> Interrupts erlauben
sei -> Interrupts sperren

von Peter M. (allforone)


Lesenswert?

Das bedeutet, dass es bei dem Prozessor einfach umgedreht ist?
Können die sich nicht auf eins einigen?

von Dr. Sommer (Gast)


Lesenswert?

Jan R. schrieb:
> Können die sich nicht auf eins einigen?
Warum können sich Autohersteller nicht auf einen Motor einigen...? :-D

von Stefan E. (sternst)


Lesenswert?

Jan R. schrieb:
> Das bedeutet, dass es bei dem Prozessor einfach umgedreht ist?

Das I-Bit ist dort halt kein Enable-Bit, sondern ein Mask-Bit.

von Holm T. (Gast)


Lesenswert?

...auf AVR? oder Was?

Mit nur noch AVRs wirds ein Bisschen Langweilig, denkst Du nicht?

Gruß,

Holm

von Karl H. (kbuchegg)


Lesenswert?

1
Within the CPU, if the global interrupt mask (I bit in the CCR) is 0,
2
the CPU will finish the current instruction, stack the PCL, PCH, X, A,
3
and CCR CPU registers, set the I bit, and then fetch the interrupt vector
4
for the highest priority pending interrupt. Processing then continues in
5
the interrupt service routine.

und
1
CLI Clear Interrupt Mask Bit (I -> 0)

daraus ergibt sich, dass auf diesem Prozessor ein CLI die Interrupts 
zulässt.

Was lernen wir daraus?
Wenn es in die Hardware hineingeht, sei es durch spezielle Hardware oder 
auch nur Assembler, ist die Nennung des konkreten CPU Types das um und 
auf, wenn man ordentliche Antworten haben will.

von Peter M. (allforone)


Lesenswert?

Nochmal zum Grundverstädnis.
Durch den Befehl werden Interrupts erlaubt, aktivieren muss ich die 
Interrupts für die verschiedensten Teile aber noch alle selber?

Sobald, dass Global Interrupt Enable Bit nicht gesetzt ist, können gar 
keine Interrupts ausgelöst werden, unabhängig ob sie aktiviert wurden 
oder nicht.

Ist das so richtig?

von Karl H. (kbuchegg)


Lesenswert?

Jan R. schrieb:
> Nochmal zum Grundverstädnis.
> Durch den Befehl werden Interrupts erlaubt, aktivieren muss ich die
> Interrupts für die verschiedensten Teile aber noch alle selber?

Hier ist das Datenblatt zu deinem Prozessor
http://www.freescale.com/files/microcontrollers/doc/data_sheet/MC9S08QG8.pdf

Auch wenn du C programmierst, wirst du ohne es kaum auskommen.

Versuch mal deine Frage nur mit diesem Datenblatt alleine zu 
beantworten.
Sieh dir zb mal das Konfigurationsregister für den Analog Comperator an. 
Welche Funktion hat dort drinnen das ACIE Bit?

Von welchen Komponenten würdest du noch erwarten, dass sie in die 
Interrupt Steuerung eingebunden sind? Kannst du das in den 
Konfigurationsregistern nachvollziehen?

von Peter M. (allforone)


Lesenswert?

Ja in diesem Fall, wird ein Interrupt nur dann ausgelöst, wenn ACIE 
gesetzt ist und auf der anderen Seite ACF gesetzt ist.

Keyboard Interrupt und SPI-Schnittstelle haben auch ein solches 
Interrupt-Enable-Bit. Sie werden demnch genauso gesteuert.

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


Lesenswert?

Karl Heinz Buchegger schrieb:
> Was lernen wir daraus?
Dass man immer die Toolchain und den Prozessor benennen und trotzdem mit 
Unvorhersehbarem und Aussergewöhnlichem rechnen sollte...  ;-)

von Udo S. (urschmitt)


Lesenswert?

Ich lerne daraus, dass der TO noch nie ein C Buch durchgearbeitet hat.
Die nächste Frage kommt bestimmt...

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


Lesenswert?

Udo Schmitt schrieb:
> Die nächste Frage kommt bestimmt...
Welche?  ;-)

von Peter M. (allforone)


Lesenswert?

Udo Schmitt schrieb:
> Ich lerne daraus, dass der TO noch nie ein C Buch durchgearbeitet
> hat.
> Die nächste Frage kommt bestimmt...

Danke für diesen konstruktiven Beitrag.
Ich bin Schüler und habe in der Schule noch NICHTS damit zu tun gehabt.
Und ja ich habe noch kein C Buch durchgelesen.
Ich interessiere mich dafür und bin motiviert etwas zu lernen.
Weise mich doch einfach auf den Fehler hin... oder lass es bleiben.

von Udo S. (urschmitt)


Lesenswert?

Jan R. schrieb:
> Weise mich doch einfach auf den Fehler hin... oder lass es bleiben.

Ich weise dich ganz deutlich auf die Fehler hin.
Dein größter ist zu glauben einfach durch basteln und copy paste C 
lernen zu können.
Du brauchst Grundlagen, und die bekommst du nur wenn du ein ordentliches 
C Buch durcharbeitest!
Wenn du mir nicht glaubst dann warte ab was dir Karl Heinz nach den 
nächsten 2 Fragen predigt.

von Stefan R. (srand)


Lesenswert?

Jan R. schrieb:
> Und ja ich habe noch kein C Buch durchgelesen.
> Ich interessiere mich dafür und bin motiviert etwas zu lernen.

Dann weißt du ja jetzt, wie du am einfachsten etwas lernst. :-)

von Udo S. (urschmitt)


Lesenswert?

Lothar Miller schrieb:
> Udo Schmitt schrieb:
>> Die nächste Frage kommt bestimmt...
> Welche?  ;-)

Keine Ahnung, vieleicht:
"Was bedeutet der '*' oder das '&' vor dem Variablennamen?"
:-)

von Peter M. (allforone)


Lesenswert?

Ja das mit den Makros hätte ich dort sicher gelernt.
Allerdings wäre die Interruptfrage geblieben.
Habe ich das jetzt so richtig verstanden?



>Ja in diesem Fall, wird ein Interrupt nur dann ausgelöst, wenn ACIE
>gesetzt ist und auf der anderen Seite ACF gesetzt ist.

>Keyboard Interrupt und SPI-Schnittstelle haben auch ein solches
>Interrupt-Enable-Bit. Sie werden demnch genauso gesteuert.

von Stefan R. (srand)


Lesenswert?

Jan R. schrieb:
> Ja das mit den Makros hätte ich dort sicher gelernt.
> Allerdings wäre die Interruptfrage geblieben.
> Habe ich das jetzt so richtig verstanden?

Richtig, ein allgemeines C-Buch geht eher nicht auf Interrupts ein, und 
wenn, dann sicher nicht auf den Unterschied Interrupt-Enable oder 
-Maskierung zwischen verschiedenen Prozessoren.

von Karl H. (kbuchegg)


Lesenswert?

Jan R. schrieb:
> Ja das mit den Makros hätte ich dort sicher gelernt.
> Allerdings wäre die Interruptfrage geblieben.
> Habe ich das jetzt so richtig verstanden?

Jau.

Genauso, wie dir das Buch zur theoretischen Fahrprüfung keine Auskunft 
darüber gibt, wie konkret in deinem Fahrzeug eine ausgebrannte Glühbirne 
zu wechseln ist.
Das wiederrum steht in der Bedienungsanleitung deines konkreten KFZ.


allgemeines C-Buch für Standard C
Wenn es das gibt: spezifisches C-Buch für deinen Prozessor
Auf jeden Fall: Datenblatt des Prozessors, für alle technischen
                µC-spezfischen Fragen

Mit diesen 3 'Unterlagen' bist du gut gewappnet. Das Datenblatt reicht, 
wenn man es am Anfang überfliegt um zu wissen welche Kapitel es gibt und 
was da so ungefähr drinnen steht.
Das C-Buch muss durchgearbeitet und die Übungen am Ende eines Kapitels 
bwarbeitet werden. Am Besten macht man das (zumindest für das erste 
Buchdrittel) auf dem PC. Und erst dann wendet man sich den Spezifika 
eines speziellen µC zu.

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


Lesenswert?

Jan R. schrieb:
> Board ist das MC9S08AW60 von freescale.
> Prozessor HCS08.
Und idealerweise nimmt man für den Anfang das, was Alle (PIC, AVR) 
nehmen. Dann findet man am ehesten ein brauchbares Buch, ein gutes 
Tutorial und letztlich einen, der schon mal das selbe Problem hatte...

von Erbsenzähler (Gast)


Lesenswert?

Jan R. schrieb:
> #define EnableInterrupts   __asm CLI;
>
> So wird dann einfach EnableInterrupts ersetzt durch__asm CLI;.
> D.h. es werden automatisch alle Interrupts aktiviert und ich muss kein
> einziges mehr selber von Hand aktivieren?
>
> Alternativ könnte man auch direkt den asm Code ohne das makro
> reinschreiben, oder?

Nicht ganz. So wie das Makro aufgerufen wird, erzeugt es:
__asm CLI; ;

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.