Probleme bei Funktionsaufruf mit Wertübergabe

Gast #1246558
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;
}
Gast #1246570
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.
#1246584
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.
#1246587
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
Gast #1246590
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.
#1246593
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
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.
Gast #1246600
> 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.
Gast #1246603
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
#1246604
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.