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


von alex (Gast)


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.
1
#include <avr/io.h>
2
3
int main(void){
4
5
  DDRD=0xff;
6
  PORTD=0xff;
7
8
  while(1){
9
10
        PORTC=PIND;
11
  
12
  }//end while
13
}//end main
Verwende ich jedoch diesen Code funktioniert garnichts? Wo liegt mein 
Fehler, das müsste doch so richtig sein.
1
#include <avr/io.h>
2
3
unsigned char abc(void);
4
5
int main(void){
6
7
8
  DDRD=0xff;
9
  PORTD=0xff;
10
  
11
  while(1){
12
13
      
14
  PORTC=abc();
15
  
16
  }//end while
17
}//end main
18
19
20
unsigned char abc(){
21
22
return PIND;
23
24
}

von Peter B. (pbuenger)


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

von alex (Gast)


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.
1
 return 0x55;
 schreibe funktioniert es nicht.

von Helfer (Gast)


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.

von alex (Gast)


Lesenswert?

PORT C ist als Ausgang geschaltet.

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

von Helmut L. (helmi1)


Lesenswert?

alex schrieb:
> DDRD=0xff;


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

von alex (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

test des doch einfach mal im simulator, dann sieht du doch was passiert.

von Helfer (Gast)


Lesenswert?

Sieht dein Programm inzwischen so aus?

1
#include <avr/io.h>
2
3
unsigned char abc(void);
4
5
int main(void)
6
{
7
  DDRC = 0xff; // <== !
8
  PORTD = 0xff;
9
  while (1) {
10
    // Port C Pin o---###--->|---o GND
11
    //                 R    LED
12
    PORTC = abc();
13
  }//end while
14
}//end main
15
16
unsigned char abc(void)
17
{
18
  // Port D Pin o------TASTER------o GND
19
  // interne Pullups aktiviert
20
  return PIND;
21
}

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.

von Peter D. (peda)


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

von alex (Gast)


Lesenswert?

Vielen, vielen Dank Peter :-) Jetzt funktioniert alles so wie es soll

von Attila (Gast)


Lesenswert?

Und was war jetzt der Fehler?

von alex (Gast)


Lesenswert?

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

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.