Forum: Compiler & IDEs Probleme bei Funktionsaufruf mit Wertübergabe


von Robert (Gast)


Lesenswert?

Hallo.
Ich würde mich jetzt mal als neuling in der C-Welt bezeichen und habe 
bei einem simplen Programm ein Problem. Das Mainprogramm ruft zwar die 
Funktion auf aber die Übergabewerte passen iregnwie net. Der Reale test 
geht auch net...genau wie die simulation. Ist es normal das ich im 
AVR-Studio kein "Inelisence"(wie das auch immer geschreiben wird)habe?

Hab ich was vergessen..?

Danke im vorraus.

PS. Die Codeirung ergiebt sich aus dem Aufbau und bei direkter 
Ansteuerung geht es.


#include <avr/io.h>
#include <stdint.h>
#ifndef F_CPU
#define F_CPU 6000000
#endif
#define UART_BAUD_RATE 9600
#include <avr/io.h>
#include  <util/delay.h>


void Ausgabe7Seg(int Digit,int Wert)
{

switch(Digit)
{
case 1:PORTC = (1<<PC0);break;
case 2:PORTC = (1<<PC2);break;
case 3:PORTC = (1<<PC4);break;
case 4:PORTD = (1<<PD7);break;
default:PORTD = (1<<PD7);break;
}
switch(Wert)
{
case 0:  PORTC = (1<<PC3);
    PORTD = (0 <<PD5)|(0<<PD6)|(0 <<PD4)|(0<<PD0)|(0<<PD3);break;

case 1:  PORTD = (0<<PD6)|(0 <<PD4);break;

case 2:  PORTC =   (1<<PC3)|(0<<PC1);
    PORTD = (0 <<PD5)|(0<<PD6)|(0 <<PD4)|(0<<PD0)|(0<<PD3);break;

case 3:  PORTC =   (0<<PC1);
    PORTD = (0 <<PD5)|(0<<PD6)|(0 <<PD3)|(0<<PD0);break;

case 4:  PORTC =   (0<<PC1);
    PORTD = (0 <<PD5)|(0<<PD6)|(0 <<PD4)|(0<<PD0);break;

case 5:  PORTC = (1<<PC3)|(0<<PC1);
    PORTD = (0 <<PD5)|(0 <<PD4)|(0<<PD0);break;

case 6:  PORTC = (1<<PC3)|(0<<PC1);
    PORTD = (0 <<PD5)|(0<<PD6)|(0 <<PD4)|(0<<PD0)|(0<<PD3);break;

case 7:  PORTC =   (1<<PC3)|(0<<PC1);
    PORTD = (0 <<PD4)|(0<<PD0)|(0<<PD3);break;

case 8:  PORTC = (1<<PC3)|(0<<PC1);
    PORTD = (0 <<PD5)|(0<<PD6)|(0 <<PD4)|(0<<PD0)|(0<<PD3);break;

case 9:  PORTC = (1<<PC3)|(0<<PC1);
    PORTD = (0 <<PD5)|(0<<PD6)|(0 <<PD4)|(0<<PD0);break;

default:PORTC = (0<<PC1);break;

}
}

int main (void)
{

DDRC = (1<<PC0)|(1<<PC2)|(1<<PC4);
DDRD = (1<<PD7);
while(1)
{

Ausgabe7Seg(3,2);

}

return 0;
}

von Peter (Gast)


Lesenswert?

also die Parameter übergabe sieht eigentlich gut aus.

aber

PORTD = (0 <<PD5)|(0<<PD6)|(0 <<PD4)|(0<<PD0)|(0<<PD3);

lässt sich einfacher als

PORTD = 0

schreiben.

von Andreas V. (tico)


Lesenswert?

Robert wrote:
>     PORTD = (0 <<PD5)|(0<<PD6)|(0 <<PD4)|(0<<PD0)|(0<<PD3);break;

Nullen in der Gegend herumzuschieben bewirkt genau nichts.
Lies nochmal das Tutorial.

von Sven P. (Gast)


Lesenswert?

Werden die PORTDs auch irgendwo mal gesetzt oder löschst du die nur, 
weils so schön is..? g

von Robert (Gast)


Lesenswert?

es geht darum das dort masse amliegen muss damit die LED Leuchet.

von Karl H. (kbuchegg)


Lesenswert?

Und lass mich raten:
Bei dir leuchten immer alle LED

An deinem PortD liegen immer alle Pins immer nur auf 0.
Die werden nie 1!

>  DDRD = (1<<PD7);

Ausserdem wärs gut, wenn du die Pins PD0 bis PD6 auf Ausgang stellst, 
wenn du dort was ausgeben willst.

von Thomas W. (thomas100)


Lesenswert?

Hallo,

das AVR-Studio ist ein etwas besserer Editor. Sowas wie Intelisense 
gibts da nicht.


Du überschreibst im zweiten switch-Block immer deine Werte aus dem 
ersten switch-Block.

Wenn du einzelne Bits setzten und löschen willst, musst du das mit "|" 
bzw. mit "&" machen.

Gruß
Thomas

von Robert (Gast)


Lesenswert?

ne nix leuchtet...wenn ich die Anweisung so reinschreibe gehts...aber 
mit Funktion irgendwie net...der führt die Case-anweisung mit 3 und 9 
aus...jedenfalls in der simulation.

von Karl H. (kbuchegg)


Lesenswert?

Robert wrote:
> ne nix leuchtet...

Du hast die Pins PD0 bis PD6 nicht als Ausgang konfiguriert!

(Habs erst später gesehen)

> wenn ich die Anweisung so reinschreibe gehts...

Kann ich mir irgendwie nicht vorstellen.
An deinem PortD sind alle Pins immer 0. Das schaltet noch nicht mal die 
Pullup-Widerstände an den Einpgangspins ein.

von Robert (Gast)


Lesenswert?

Ich kann net folgen.......hab doch zwischen den Anweisungen ein |

von Gast (Gast)


Lesenswert?

http://www.mikrocontroller.net/articles/Bitmanipulation

Aber trotzdem müssen die Ausgangspins auf AUSGANG indem du die 
entsprechenden DDRD Pins setzt (eine 1 reinschreibst).

von Karl H. (kbuchegg)


Lesenswert?

Du musst erst mal die Pins, die du als Ausgangspins benutzen willst, 
auch auf Ausgang schalten.
1
int main()
2
{
3
  ...
4
5
  DDRD = ( 1 << PD0 ) | ( 1 << PD1 ) | ( 1 << PD2 ) | ( 1 << PD3 ) |
6
         ( 1 << PD4 ) | ( 1 << PD5 ) | ( 1 << PD6 );
7
8
  ...
9
}


Und dann musst du die Ausgangspins, die du für deine Zahl nicht brauchst 
auf 1 setzen.
1
  case 1:
2
    PORTD = ( 1 << PD0 ) | ( 1 << PD1 ) | ( 1 || PD2 ) |
3
            ( 1 << PD3 ) | ( 1 << PD5 );
4
    break;

Und gewöhn dir gleich jetzt einen vernünftigen Stil an. Ich musst 3 mal 
hinschauen um mich zu vergewissern, dass du die break nicht vergessen 
hast.

von Peter (Gast)


Lesenswert?

> ich hab doch zwischen den Anweisungen ein |
ja aber eine 0 | 0 bleibt nun mal eine 0.

Zum schluss kannst du gleich hinschreiben PortD = 0; mehr macht dein 
Code nicht.

von Robert (Gast)


Lesenswert?

hab das problem gefunden...wenn ich einene Ausgang nicht auf masse legen 
will muss ich schreiben DDRD (1<<PD) und nicht einfach PORTD(1<<PD) 
weglassen

von Karl H. (kbuchegg)


Lesenswert?

Robert wrote:
> Ich kann net folgen.......hab doch zwischen den Anweisungen ein |

Und?

  0 << 3

ergibt immer noch 0. Eine 0 kann man links schieben sooft man will, sie 
bleibt trotzdem immer 0

  ( 0 << 3 ) | ( 0 << 5 )

0 << 3  ergibt 0
0 << 5  ergibt auch 0

    0 | 0

ergibt wieder 0

deine ganze << und | Orgie ergibt immer 0. In allen Fällen.
Damit sind in dem 2.ten switch alle Zuweisungen an PortD immer nur 
komplizierte Variationen von

   PORTD = 0;

von Karl H. (kbuchegg)


Lesenswert?

Robert wrote:
> hab das problem gefunden...wenn ich einene Ausgang nicht auf masse legen
> will muss ich schreiben DDRD (1<<PD) und nicht einfach PORTD(1<<PD)
> weglassen

Ja. (auch wenn der Satz von dir jetzt etwas konfus ist, weil du DDRD und 
PORTD durcheinanderwürfelst)

Und du musst die Portpins auch auf AUSGANG schalten.

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.