mikrocontroller.net

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


Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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......

Autor: frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Roland Praml (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Μαtthias W. (matthias) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.