Verständnisfrage zu C-Code

OP #1530868
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/Projekte/Wetterstation/sensors/SHT75/sht75.zip).
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
1
#define DDR_SHT  DDRB
2
#define PORT_SHT  PORTB
3
#define PIN_SHT    PINB
4
#define P_SCK    1
5
#define P_DATA    2
6

7
#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.
Gast #1530891
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
Gast #1530910
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.
Gast #1531068
>In der Main durch “richtigen” Code ersetzt und es funktionierte.

Was ist der "richtige" Code?
1
#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...
OP #1531148
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
1
set_DATA;
 schreibe das Selbe wie bei
1
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.
Gast #1531173
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
1
#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

Eine eigene Frage? Dieser Thread ist über 16 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.