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


von Peter M. (hp-m)


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/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.

von Drachenbändiger (Gast)


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

von Drachenbändiger (Gast)


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.

von STK500-Besitzer (Gast)


Lesenswert?

>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...

von spess53 (Gast)


Lesenswert?

Hi

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

Mehr Temperatur/rel.Feuchte.

MfG Spess

von Peter M. (hp-m)


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
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.

von Drachenbändiger (Gast)


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
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).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.