Forum: Compiler & IDEs Rücksprung aus Methode?!


von Frank (Gast)


Lesenswert?

Hallo!

Ich mache gerade meine Ersten Schritte mit der Programmierung der
AVR's mit C. Vorher habe ich immer in Assembler programmiert.

Mein Problem:

Ich rufe eine Methode aus einer anderen Klasse auf. Wenn ich jetzt mit
dem Debugger im AVR-Studio den Programmablauf verfolge bleibt das
Programm am Ende der Methode hängen und springt nicht in das
Hauptprogramm zurück. Bei einem Assembler Programm hätte ich gesgat der
Stackpointer ist nicht initialisiert. Muß ich das bei C auch machen?
Wenn ja wie? Die üblichen Befehle gehen nicht.

von Rolf Magnus (Gast)


Lesenswert?

Es gibt keine direkte Unterstützung für Klassen in C. Daher vermute ich
mal, daß du C++ meinst.
Der Stackpointer muß nicht initialisiert werden. Was den Grund für den
Fehler angeht, so kann man dazu nix sagen. Zeig mal den Code.

von frank (Gast)


Lesenswert?

Ich habe bisher nur Java programmiert. (und assembler)
Deshalb meine falsche asudrucksweise.
Wie nennt man denn eine "class" in c?


Hier das Hauptprogramm das alleine in einer Datei ist

#include <PWM_abtast_lib.h>

int main(void){


 char INTx=0x00;
 char mode=0x01;

 init_PWM_abtasten(INTx, mode);


}

und hier die methode in aus einer anderen datei



#include <avr\io.h>

//********************************************************************** 
**************
//*** Diese Methode Initialisiert "External Interrupt Request"-Pinx
(x = 0,1,2,3) ***
//*** Es kann angegeben werden ob auf eine steigende oder eine fallende
           ***
//*** Taktflanke gewartet werden soll. Wenn Edge==1 dann wird auf eine
           ***
//*** steigende Taktflanke gewartet.(S.89)
           ***
//********************************************************************** 
**************


void init_PWM_abtasten(char INTx, char edge){


//Pin0
if(INTx==0){


    //External INterrupt Mask
  //Interrupt disable da ansosnsten beim schreiben in die ISC bits
Interrupts auftreten
    EIMSK &= ~(1<<INT0);


  if(edge==1){
    //External Interrupt Control Register A
    //Interrupt Sense Controll

      EICRA = (1<<ISC01)|(1<<ISC00); //rising Edge
  }else
  {
      //faling edge
    EICRA = (1<<ISC01);
    EICRA&=~(1<<ISC00);
  }

  //External Interrupt Flag Register
  //clear Interrupt Flag before enable by writing logical 1!
  EIFR=(1<<INTF0);


  //External INterrupt Mask
  //Interrupt ebable
    EIMSK = (1<<INT0);


  //Status Register
  //Global INterrupt Enable
  SREG = (1<<7);
}


//Pin1
if(INTx==1){

    //External INterrupt Mask
  //Interrupt disable da ansosnsten beim schreiben in die ISC bits
Interrupts auftreten
    EIMSK &= ~(1<<INT1);

  if(edge==1){
    //External Interrupt Control Register A
    //Interrupt Sense Controll

      EICRA = (1<<ISC11)|(1<<ISC10); //rising Edge
  }else
  {
      //faling edge
    EICRA = (1<<ISC11);
    EICRA&=~(1<<ISC10);
  }


  //External Interrupt Flag Register
  //clear Interrupt Flag before enable by writing logical 1!
  EIFR=(1<<INTF1);



  //External INterrupt Mask
  //Interrupt ebable
    EIMSK = (1<<INT1);

    //Status Register
  //Global INterrupt Enable
  SREG = (1<<7);
}


//Pin2
if(INTx==2){


    //External INterrupt Mask
  //Interrupt disable da ansosnsten beim schreiben in die ISC bits
Interrupts auftreten
    EIMSK &= ~(1<<INT2);

  if(edge==1){
    //External Interrupt Control Register A
    //Interrupt Sense Controll

      EICRA = (1<<ISC21)|(1<<ISC20); //rising Edge
  }else
  {
      //faling edge
    EICRA = (1<<ISC21);
    EICRA&=~(1<<ISC20);
  }



  //External Interrupt Flag Register
  //clear Interrupt Flag before enable by writing logical 1!
  EIFR=(1<<INTF2);


  //External INterrupt Mask
  //Interrupt ebable
    EIMSK = (1<<INT2);

    //Status Register
  //Global INterrupt Enable
  SREG = (1<<7);

}



//Pin3
if(INTx==3){

    //External INterrupt Mask
  //Interrupt disable da ansosnsten beim schreiben in die ISC bits
Interrupts auftreten
    EIMSK &= ~(1<<INT3);


  if(edge==1){
    //External Interrupt Control Register A
    //Interrupt Sense Controll

      EICRA = (1<<ISC31)|(1<<ISC30); //rising Edge
  }else
  {
      //faling edge
    EICRA = (1<<ISC31);
    EICRA&=~(1<<ISC30);
  }



  //External Interrupt Flag Register
  //clear Interrupt Flag before enable by writing logical 1!
  EIFR=(1<<INTF3);


  //External INterrupt Mask
  //Interrupt ebable
    EIMSK = (1<<INT3);

  //Status Register
  //Global INterrupt Enable
  SREG = (1<<7);

}


}

das Problem ist dass er nicht wieder zurück ins hauptprogramm
springt......

von frank (Gast)


Lesenswert?

ohhh...
ich glaub ich bin einfach nur blöd.....
Wenn ich das richtig sehe springt er nicht zurück weil das
Hauptprogramm einfach zuende ist....
Ich bin ein Holzkopf :-)
Das hat mich grade 2 Stunden gekostet g

von Roland Praml (Gast)


Lesenswert?

Ein Tip von mir:
In eine .h Date sollte eigentlich kein code, sondern nur die header
Meine .h Datei würde so aussehen:

#ifndef PWM_ABTAST_LIB_H
#define PWM_ABTAST_LIB_H

void init_PWM_abtasten(char INTx, char edge);

#endif

der Rest vom code kommt in eine eigene .c Datei. Du musst dann beim
compilieren aber den Linker sagen, welche .c (bzw. eigentlich welche
.o) Dateien er verlinken soll. Im neuen AVR-Studio welches den GCC
schon unterstützt, reicht es, wenn man die Datei links im Projektbaum
drin hat.

Man kann übrigens beim compilieren auch angeben, dass man den asm-Code
haben möchte (generate list-file), dann kannst dir mal anschauen, was
der compiler aus deinem Code macht. Vielleicht wärst dann eher drauf
gekommen ;-)

Gruß
Roland

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

zum Thema Methode und Klasse:
Beides gibt es in C nicht als Sprachbestandteil. Man kann sowas zwar im
Prinzip realisieren aber die Sprache bietet es einem halt nicht an.

Das was du da hast ist eine Funktion.

Matthias

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.