www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Rückgabewert von Funktion wird nicht übegeben


Autor: alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo, ich habe ein kleines Programm geschrieben um meine Hardware zu 
testen. Der verwedete Controller ist ein meag64
An Port D hängen Taser, und an Port C hängen LEDs mit vorwiederstand.
Wenn ich folgenden Code compiliere und auf den Controller übertrage
geht die jeweilige LED aus wenn ich den entsprechenden Taster drücke.
#include <avr/io.h>

int main(void){

  DDRD=0xff;
  PORTD=0xff;

  while(1){

        PORTC=PIND;
  
  }//end while
}//end main

Verwende ich jedoch diesen Code funktioniert garnichts? Wo liegt mein 
Fehler, das müsste doch so richtig sein.
#include <avr/io.h>

unsigned char abc(void);

int main(void){


  DDRD=0xff;
  PORTD=0xff;
  
  while(1){

      
  PORTC=abc();
  
  }//end while
}//end main


unsigned char abc(){

return PIND;

}

Autor: Peter Bünger (pbuenger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn ich folgenden Code compiliere und auf den Controller übertrage
> geht die jeweilige LED aus wenn ich den entsprechenden Taster drücke.


Das bezweifle ich. Wenn Du den Port B als Ausgang schaltest, kannst Du 
keine Taster einlesen.

Peter

Autor: alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe den port jetz als eingang geschaltet. es hat vorher trotzdem 
funktioniert.
ich bekomme von der funktion trozdem kein rückgabewert. auch wenn ich 
z.b.
 return 0x55; 
 schreibe funktioniert es nicht.

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was willst du bezwecken mit:
>>  PORTC=abc();
> habe den port jetz als eingang geschaltet.

Wenn du einen Wert ausgeben willst, musst du PORTC auf AUSGANG setzen.

Autor: alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PORT C ist als Ausgang geschaltet.

wenn ich schreibe PORTC=PIND; funktionert es.
Wenn ich schreibe PORTC=abc(); dann funktioniert es nicht...

Autor: Helmut Lenzen (helmi1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
alex schrieb:
> DDRD=0xff;


In dieser Zeile passiert es.  Port D wird auf Ausgang gestellt und nicht 
Port C.

Autor: alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, das habe ich bereits korrigiert... PORTC ist als Ausgang, PORTD als 
Eingang mit Pullup

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
test des doch einfach mal im simulator, dann sieht du doch was passiert.

Autor: Helfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sieht dein Programm inzwischen so aus?

#include <avr/io.h>

unsigned char abc(void);

int main(void)
{
  DDRC = 0xff; // <== !
  PORTD = 0xff;
  while (1) {
    // Port C Pin o---###--->|---o GND
    //                 R    LED
    PORTC = abc();
  }//end while
}//end main

unsigned char abc(void)
{
  // Port D Pin o------TASTER------o GND
  // interne Pullups aktiviert
  return PIND;
}

Ist der richtige AVR im Projekt eingestellt? Wenn da ein Fehler gemacht 
wird, funktioniert der Aufruf der abc() Funktion nicht.

Es gibt Atmega64 und Atmega644, ohne weitere Bezeichnung und mit 
weiterer Bezeichnung... die sind nicht alle identisch!

Wenn AVR richtig eingestellt ist: Mal die LSS Datei erzeugen lassen 
(unter Projektoptionen in AVR Studio) und zeigen. Alternativ HEX-Datei 
hochladen zum disassemblieren.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
alex schrieb:
> Verwende ich jedoch diesen Code funktioniert garnichts? Wo liegt mein
> Fehler, das müsste doch so richtig sein.


Er benötigt den Stack (Funktionsaufruf) und der zeigt bei Dir in den 
Wald (M103-Fuse).


Peter

Autor: alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen, vielen Dank Peter :-) Jetzt funktioniert alles so wie es soll

Autor: Attila (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und was war jetzt der Fehler?

Autor: alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dass der Prozessor per Fuse-Bit als Mega103 konfiguriert war, und nicht 
als Mega64.

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.