C Frage zu Befehl

OP #3250372
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?
#3250402
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.
OP #3250412
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?
Gast #3250417
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
Gast #3250423
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
#3250454
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.
OP #3250456
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?
#3250471
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?
OP #3250589
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.
#3250596
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.
OP #3250610
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.
#3250614
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.
#3250630
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.
Gast #3251011
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; ;

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