mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage zu C-Code


Autor: Peter M. (hp-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe vor kurzer Zeit angefangen mich mit µC und C zu beschäftigen, 
und bin dabei auf ein für mich noch unlösbares Problem gestoßen:
Ich benutze den Code von dieser Seite 
(http://www.mikrocontroller.net/mc-project/Pages/Pr...).
Wenn ich den Code flashe(?), also auf den Controller bringe (Atmega644) 
oder aber im AVRStudio debugge, geschieht nichts an den Pins.
Ich habe diese Zeilen, in sht71.h
#define DDR_SHT  DDRB
#define PORT_SHT  PORTB
#define PIN_SHT    PINB
#define P_SCK    1
#define P_DATA    2

#define set_DATA  DDR_SHT &= ~(1<<P_DATA) //;PORT_SHT &= ~(1<<P_DATA)

In der Main durch “richtigen” Code ersetzt und es funktionierte.
Kann mir da jemand sagen woran es liegt? Neuerer Compiler? … (ich habe 
WinAVR von 20080512)
Ich hoffe, dass ich mich verständlich ausdrücken konnte ;)
Frohes Fest.

Autor: Drachenbändiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bist Du Dir sicher, dass Du vorher DDRB so gesetzt hast, dass Du eine 
Änderung durch "set_DATA" erkennst?
Meine etwas ältere avr-gcc Version erzeugt mit Deinen "define"-Zeilen 
(ATmega644) diesen korrekten Code, der im Simulator auch funktioniert:

;  um zu sehen, was der naechste Befehl macht...
DDRB=0xff;
    19de:  8f ef         ldi  r24, 0xFF  ; 255
    19e0:  84 b9         out  0x04, r24  ; 4
; na also:
set_DATA;
    19e2:  22 98         cbi  0x04, 2  ; 4

Autor: Drachenbändiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aus der Bezeichnung Deines Makros könnte man auch schließen, dass Du 
vielleicht gar nicht das DDRB, sondern PORTB verändern willst. Was Du 
tatsächlich erreichen willst und wie Du es testest, müsstest Du ggfs. 
besser erklären.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>In der Main durch “richtigen” Code ersetzt und es funktionierte.

Was ist der "richtige" Code?
#define set_DATA  DDR_SHT &= ~(1<<P_DATA) //;PORT_SHT &= ~(1<<P_DATA)

Alles, was nach den "//"kommt, ist ein Kommentar.
Der SHT-Sensor (Luftdruck/rel. Feuchte von Sensirion) hat eine Art 
I²C-Bus, braucht also Pull-Up-Widerstände an der Clock- und der 
Data-Leitung.
Dann werden die Portpins des AVR auch nur über das 
Datenrichtungsregister zwischen GND und hochohmig um geschaltet.

Und nu kommst du...

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Der SHT-Sensor (Luftdruck/rel. Feuchte von Sensirion)

Mehr Temperatur/rel.Feuchte.

MfG Spess

Autor: Peter M. (hp-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für eure Rückmeldung.

@Drachenbändiger
Was muss ich vorher mit DDRB denn machen? Und aus deinem Assembler-Code 
werde ich nicht schlau, ich kann ihn momentan nur identifizieren ;)

@STK500-Besitzer
Das mit dem Kommentar ist mir auch bekannt. Es geht eher darum, dass ich 
eine Reaktion erwarte.

Eigentlich sollte doch wenn ich in der main
set_DATA;
 schreibe das Selbe wie bei
DDRB &= ~(1<<2);
 herauskommen (symbolische Schreibweise?)
Die Theorie aus dem Datenblatt (des Temp./Feuchte-Sensors) habe ich 
soweit verstanden, und den Beispielcode eigentlich auch. Ich verstehe 
nur nicht, was ich bei dieser symbolischen Schreibweise(?) falsch mache. 
Also wieso kein Ausgang verändert wird.

Autor: Drachenbändiger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter M. schrieb:
> @Drachenbändiger
> Was muss ich vorher mit DDRB denn machen? Und aus deinem Assembler-Code
> werde ich nicht schlau, ich kann ihn momentan nur identifizieren ;)

Der Assembler-Code zeigt, dass der Compiler Deine Defines korrekt 
übersetzt: Bit 2 in DDRB wird gelöscht, wie Du es mit
#define set_DATA  DDR_SHT &= ~(1<<P_DATA)
 auch verlangst. Um bei Deinem konkreten Beispiel zu bleiben: Dieser 
Befehl ist nach einem Reset (dabei wird DDRB auf 0 gesetzt!) nur dann 
sinnvoll, wenn Bit 2 in DDRB irgendwann zwischen Reset und diesem Befehl 
auf 1 gesetzt wurde. Falls Bit 2 in DDRB 0 ist, wenn der Befehl 
abgearbeitet wird, ändert sich nichts am Wert in DDRB.

Oben habe ich Dich ja schon gefragt: Soll "set_DATA" wirklich DDRB 
manipulieren oder meinst Du PORTB? Bei Deiner "symbolischen 
Schreibweise" machst Du formell nichts falsch, aber vielleicht meinst Du 
nicht, was Du dem Prozessor als Anweisung vorgibst ... das kann ich 
nicht beurteilen (ich kenne weder den Sensor, noch habe die von Dir 
genannten Quellen gelesen).

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.