Probleme bei Funktionsaufruf mit Wertübergabe

Gast #1246558
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;
}
#1246593
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.
#1246598
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.
#1246604
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;
#1246610
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren