#include<hidef.h> /* for EnableInterrupts macro */
2
#include"derivative.h" /* include peripheral declarations */
3
4
5
6
voidmain(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?
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.
>> 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
voidmain(void){
2
3
EnableInterrupts;/* enable interrupts */
4
/* include your code here */
5
6
7
8
for(;;){
9
....
wird zu dem hier
1
voidmain(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.
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?
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
So wird dann einfach EnableInterrupts ersetzt durch
1
__asmCLI;
.
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?
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
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
Jan R. schrieb:> Wenn es nun alle deaktiviert. Wieso steht da dann EnableInterrupts?
Weil derjenige, der das geschrieben hat, noch konfuser war als du?
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?)
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.
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?
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?
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.
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... ;-)
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.
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.
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. :-)
Lothar Miller schrieb:> Udo Schmitt schrieb:>> Die nächste Frage kommt bestimmt...> Welche? ;-)
Keine Ahnung, vieleicht:
"Was bedeutet der '*' oder das '&' vor dem Variablennamen?"
:-)
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.
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.
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.
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...
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; ;