mikrocontroller.net

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


Autor: Robert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Vogt (tico)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven P. (haku) Benutzerseite
Datum:

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

Autor: Robert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es geht darum das dort masse amliegen muss damit die LED Leuchet.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas Weyhrauch (thomas100)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Robert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Robert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann net folgen.......hab doch zwischen den Anweisungen ein |

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst erst mal die Pins, die du als Ausgangspins benutzen willst, 
auch auf Ausgang schalten.
int main()
{
  ...

  DDRD = ( 1 << PD0 ) | ( 1 << PD1 ) | ( 1 << PD2 ) | ( 1 << PD3 ) |
         ( 1 << PD4 ) | ( 1 << PD5 ) | ( 1 << PD6 );

  ...
}


Und dann musst du die Ausgangspins, die du für deine Zahl nicht brauchst 
auf 1 setzen.
  case 1:
    PORTD = ( 1 << PD0 ) | ( 1 << PD1 ) | ( 1 || PD2 ) |
            ( 1 << PD3 ) | ( 1 << PD5 );
    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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Robert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

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.