Forum: Mikrocontroller und Digitale Elektronik Syntax Error - Token


von Peter K. (electro_stony)


Lesenswert?

Hallo zusammen,

ich bin neu hier, und würde mich freuen wenn ich vielleicht von
euch den einen oder anderen Tip bekäme.

Folgendes habe ich:

Fehlermeldung des SDCC Compilers:

timer01.c:36: syntax error: token -> 'Interrupt' ; column 33

Ausgelöst durch folgende Zeile:

void counter0_Int(void) Interrupt 1  <=== DIE HIER
  {
  TR0 = 0;
  P3 = 0xFF;
  for (i = 0; i<1000; i++)
  P3 = 0;
  TH0 = 0xFF;
  TL0 = 0xF0;
  TR0 = 1;
  }

Ich komme hier echt nicht weiter und würde mich über jede Hilfe freuen. 
Danke schonmal.

von ASCI (Gast)


Lesenswert?

Du brauchst ein C-Buch!

void counter0_Int(void)
  {
  TR0 = 0;
  P3 = 0xFF;
  for (i = 0; i<1000; i++)
  P3 = 0;
  TH0 = 0xFF;
  TL0 = 0xF0;
  TR0 = 1;
  }


Übrigens: Warteschleife im Interrupt: Pfui!

von Peter K. (electro_stony)


Lesenswert?

Hallo,

danke für den Tip. Hat funktioniert.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

ASCI schrieb:
> Du brauchst ein C-Buch!

Das hilft bei compilerspezifischen Spracherweiterungen wie Interrupts 
ausnahmsweise mal gar nicht. C kennt keine Interrupts, und ein C-Buch 
daher auch nicht.
Interrupts werden je nach Compilerhersteller auf unterschiedliche Art 
und Weise umgesetzt; wer also mit SDCC Interrupts nutzen will, muss die 
korrekte SDCC-Interrupt-Syntax nutzen und kann nur dann Codebeispiele 
für einen anderen Compiler verwenden, wenn dessen Interruptsyntax der 
des SDCC entspricht.

von ASCI (Gast)


Lesenswert?

>Das hilft bei compilerspezifischen Spracherweiterungen wie Interrupts
>ausnahmsweise mal gar nicht. C kennt keine Interrupts, und ein C-Buch
>daher auch nicht.

Richtig. Braucht er aber trotzdem. Und das Manual zum SDCC.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

ASCI schrieb:
> Braucht er aber trotzdem.

Klar.

Der Aufruf üblicher Quelltext-Editoren sollte hart verdongelt werden mit 
zufälligen Abfragen einzelner Wörter im K&R ... so daß das Buch 
zwingend vorhanden sein muss.

von Peter K. (electro_stony)


Lesenswert?

Hallo zusammen,

also ich muß mich, nachdem die Diskussion doch anhält, nochmals melden.

SDCC (lt. aktuellem Handbuch) gibt für einen Interrupt des 80C51 
folgendes vor:

void external_isr (void) interrupt interruptNumber using bankNumber
{

}

Das Handbuch liegt mir durch aus vor. Übrigend der K&R schweigt sich an 
dieser Stelle aus. Andere C Bücher, die im wesentlichen die 
Programmierung eines PC beinhalten und sich auf den K&R stützen, 
ebenfalls.

Somit muß ich mich auf das oben genannte beziehen. Was anderes gibt es 
nicht. Und das funktioniert nicht. Immer der gleiche token Fehler.

Wenn man es, wie von ASCII genannt, ausführt - läuft zwar der Compiler 
durch. Aber der Interrupt funkt nicht.

Vielleicht trägt das etwas zur Klarheit der Diskussion bei.

Gruß, und Danke für Eure Antworten.

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Interrupt != interrupt!

von Stefan W. (dl6dx)


Lesenswert?

Peter K. schrieb:
1
void external_isr (void) interrupt interruptNumber using bankNumber

Dann definiere die Funktion doch auch so! (Ich hab im folgenden mal 
unterstellt, dass du durchgehend Registerbank 0 verwendest.)
1
void counter0_Int(void) interrupt 1 using 0
2
  {
3
   // code
4
  }

Abgesehen davon: Macht die ISR wirklich das, was du beabsichtigst?
Schau dir die for()-loop noch mal genau an.

Peter K. schrieb:
> Übrigens der K&R schweigt sich an dieser Stelle aus.

Warum wohl? Das ist eine Besonderheit des SDCC außerhalb des 
C-Sprachstandards.

Grüße

Stefan

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.