Dummy Read Variable PCF8584 LB10 LB11

Postby jackdaniels » Fri Oct 02, 2009 12:00 am

Hallo zusammen,

kann mir jemand erklären, warum die Dummy Read Variable beim PCF8584 unbedingt Global deklariert werden muss, und die Variable Datenbyte_1 (und Datenbyte_2) lokal deklariert werden kann?!
(Funktion PCF8584_rx_2 und PCF8584_rx).

Beide lesen doch das SFR S0 aus.

Würde mich über eine Erklärung freuen.

Liebe Grüße

Thomas
jackdaniels
 
Posts: 36
Joined: Fri Jan 03, 2014 2:13 pm

Postby garak » Sat Oct 03, 2009 12:00 am

Hallo Thomas,
diese Frage habe ich befürchtet!

Die Antwort dazu am Beispiel des Programms LB11, Lektion_42_Check_Box_PCF8584 (Info Pack zum Lehrbrief 11)



Wenn das Programm mit der globalen Definition der Variablen Dummy erfolgt, so kannst Du nach der Compilierung folgende Meldung lesen:

Sclass 'text': start: $0, end: $84c size: $84d/(dec.)2125 Bytes
Sclass 'xram': start: $0, end: $0 size: $1/(dec.)1 Bytes
Sclass 'dram': start: $20, end: $30 size: $11/(dec.)17 Bytes
Umake: 'C:\uC51\bin\bin2hex pcf8574_relais.bin pcf8574_relais.hex -s -e'...

Umake: *** OK ***

Wichtig: Text, also Programmspeicher: 2125 Byte!


Wird das gleiche Programm mit lokaler Variablen Definition von Dummy compiliert, so ist folgende Meldung zu lesen:

Sclass 'text': start: $0, end: $829 size: $82a/(dec.)2090 Bytes
Sclass 'dram': start: $20, end: $30 size: $11/(dec.)17 Bytes
Umake: 'C:\uC51\bin\bin2hex pcf8574_relais.bin pcf8574_relais.hex -s -e'...

Umake: *** OK ***

Wichtig: Text, also Programmspeicher: nur 2090 Byte – Warum???



Hat etwas länger gedauert, den Unterschied zu finden. Habe natürlich auch zuerst die Variable Dummy lokal definiert (bzw. auf Dummy komplett verzichtet und zweimal in die Variable Datenbyte eingelesen) und mich gewundert, dass das Programm nicht lief.

Bei der lokalen Definition von Dummy, entfernt der Compiler einfach den C-Befehl ( Dummy = CS_I2C; ) aus dem Quelltext, da ja später noch einmal das Gleiche Register ausgelesen wird ( Datenbyte = CS_I2C; ), ohne den zuerst ausgelesenen Wert (Dummy) irgendwo (lokal!!!) zu benutzen!
Der Compiler sagt sich also: „Völlig überflüssig, hier kann Speicherplatz gespart werden!“ , ohne jedoch zu bedenken, dass gemäß Datenblatt ein zweimaliges Lesen zwingend erforderlich ist!
Bei der globalen Definition der Variablen Dummy, kürzt der Compiler das Programm nicht (deshalb auch ein größerer Programmspeicher Bedarf), es wird ein zweimaliger Lese Zugriff durchgeführt und das Programm funktioniert!

Nach dem jeweiligen Compilieren findest alles zum Nachvollziehen in den zugehörigen Listing-Dateien (*.lst)!

Bis dann,
Garak
garak
 
Posts: 39
Joined: Fri Jan 03, 2014 2:12 pm

Postby jackdaniels » Sat Oct 03, 2009 12:00 am

Hallo Garak

Du bist mein HELD. Vielen Daaank!
Hatte schon einen beginnenden Selbstzweifel was mein Verständnis von Variablen angeht.
Aber auf so eine Sache wäre ich nie gekommen.
Und das mit der Listening Datei ist wirklich eine feine Sache. Vielen Dank für den Hinweis.

Einfach ein tolles Forum hier mit tollen Leuten!

Gibt es den irgendwo Unterlagen wo man solche Besonderheiten nachschlagen kann?

Vielen Dank und liebe Grüße

Thomas
jackdaniels
 
Posts: 36
Joined: Fri Jan 03, 2014 2:13 pm

Postby organist » Sun May 02, 2010 12:00 am

DANKE.

Nun ist auch mein Wochenende gerettet.

Schönen Sonntag Abend noch

Lucas
organist
 
Posts: 22
Joined: Fri Jan 03, 2014 1:56 pm


Return to Mikrocontroller-Fernlehrgang (TFH)

Who is online

Users browsing this forum: No registered users and 1 guest