03.12.2012 Aufrufe

Die digital anzeigende Personenwaage SUPER-SERVAL - EMSP

Die digital anzeigende Personenwaage SUPER-SERVAL - EMSP

Die digital anzeigende Personenwaage SUPER-SERVAL - EMSP

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

<strong>Die</strong> <strong>digital</strong> <strong>anzeigende</strong> <strong>Personenwaage</strong> <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Nachträgliche Ergänzungen zur Firmware<br />

Von Henry Westphal<br />

Seite 5- 1


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

<strong>Die</strong> Idee<br />

Im Rahmen der Lehrveranstaltung wurde aus Zeitgründen ein bereits bei Tigris vorhandener Hardware-<br />

Abstraction-Layer verwendet. Da dieser auch bei Kundenprojekten eingesetzt wird, kann er nicht<br />

veröffentlicht werden, was dem Open-Source-Gedanken dieses Projekts widerspricht.<br />

Weiterhin erscheint es interessant, anstelle des (intern) umfangreichen und universellen Hardware-<br />

Abstraction Layers, der ja in einem gewissen Sinne, eine im Sinne des Gewinnens von Erkenntnis<br />

eigentlich unerwünschte „Blackbox“ darstellt, eine sparsame Programmierung zu setzen, die nur das<br />

für den Funktionsumfang des Super-Serval Notwendige enthält.<br />

<strong>Die</strong>ses Programm wurde im Oktober 2008 im Rahmen einer internen Mitarbeiterfortbildung der Tigris-<br />

Elektronik GmbH erstellt.<br />

Seite 5- 2


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

<strong>Die</strong> verwendeten Tools<br />

Das Programm wurde im Rahmen einer einzigen (selbst geschriebenen) Datei realisiert. Hierzu kam<br />

der C-Compiler IAR Embedded Workbench EW8051 Version 7.50A zum Einsatz. Weiterhin wurde die<br />

Software „Windows Serial Download“ von Analog Devices verwendet, um das vom IAR-Compiler<br />

generierte Hex-File in den Microcontroller-Flash zu laden. <strong>Die</strong>se Software ist im Lieferumfang des<br />

Analog-Devices AD845 Eval-Kits enthalten.<br />

Mit zu diesem Kit gehört ein Download-Kabel, das hier ebenfalls verwendet wurde. Das Interface<br />

zwischen dem Download-Kabel und der Super-Serval-Baugruppe ist eine Tigris-spezifische<br />

Adapterbaugruppe, die im Folgenden dokumentiert ist:<br />

5-6: Emulator<br />

(nur für Entwicklungsstadium)<br />

7-8 S/W-Download Taster<br />

(nur für Entwicklung und Produktion)<br />

J6002<br />

CON4<br />

GND<br />

TXD<br />

RXD<br />

VDD<br />

1-2 RXD/TXD TTL-Pegel J6001<br />

(nur für Entwicklung und Produktion)<br />

CON8<br />

2 1<br />

3-4 Brücke zum Abtrennen USB<br />

(nur für Entwicklung und Produktion)<br />

4 3<br />

9-10 Resettaster<br />

(nur für Entwicklung und Produktion)<br />

6<br />

8<br />

10<br />

1 234<br />

5<br />

7<br />

9<br />

SW6003<br />

SW PUSHBUTTON<br />

SW6004<br />

SW PUSHBUTTON<br />

1 2<br />

J6003<br />

CON2<br />

+5V<br />

ADI<br />

EVAL-KABEL<br />

RESET<br />

DOWNLOAD<br />

EMULATOR<br />

Adapterbaugruppe, J6001 ist 1 zu 1 mit J201 auf dem Super-Serval verbunden<br />

Seite 5- 3


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

GND<br />

TXD<br />

4<br />

RXD<br />

3<br />

VDD<br />

2<br />

1<br />

Definition der Belegung des Gegensteckers zum Download-Kabel von Analog Devices<br />

Das Download-Kabel wird PC-seitig an den COM-Port angeschlossen.<br />

Seite 5- 4


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Der Source-Code<br />

Da der Source-Code mit umfangreichen Kommentaren versehen ist, wird die voranstehende<br />

Beschreibung kurz gehalten.<br />

<strong>Die</strong> Waage wird mit zwei Tastern kalibriert.<br />

Bei leerem Wägeteller drückt man die Taste „0kg“. Damit wird der Nullwert erfasst und als<br />

Kalibrierkonstante im nichtflüchtigen Datenspeicher des AduC845 abgelegt.<br />

Bei mit Kalibriergewichten von insgesamt 80kg belastetem Wägeteller drückt man die Taste „80kg“.<br />

Damit wird der dazugehörige Ausgangscode des A/D-Umsetzers als zweiter Kalibrierwert nichtflüchtig<br />

abgelegt.<br />

<strong>Die</strong> Gewichtsanzeige entsteht dann durch Verrechnung des aktuellen Ausgangscodes des A/D-<br />

Umsetzers mit den gespeicherten Kalibrierdaten.<br />

Nach dem Laden der Kalibrierkonstanten und der Initialisierung des A/D-Umsetzers gelangt das<br />

Programm in eine Endlosschleife, in der laufend das Gewicht gemessen und angezeigt wird. In<br />

dieser Schleife werden zudem die Kalibriertaster abgefragt, wird ein Tastendruck erkannt wird, erfolgt<br />

eine Aktualisierung des gewählten Kalibrierwertes sowie dessen nichtflüchtige Speicherung.<br />

/*******************************************************<br />

*<br />

* Firmware <strong>Personenwaage</strong> <strong>SUPER</strong>-<strong>SERVAL</strong><br />

*<br />

* Version 1.00 29.10.2008<br />

*<br />

* 31.10.2008 Gleitender Mittelwert hinzugefügt<br />

*<br />

* (c) TIGRIS Elektronik GmbH<br />

*<br />

* Hinweis: dieses Programm wurde nur zu Demonstrations- Lehr- und<br />

* Ausbildungszwecken erstellt. Es entspricht nicht in allen Details den<br />

* Anforderungen, die an die Qualität eines kommerziellen Programms zum<br />

* professionellen Einsatz gestellt werden<br />

*<br />

*******************************************************/<br />

/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!<br />

*<br />

* Bitte unbedingt beachten:<br />

*<br />

* Man muß beim WSD-Downloader "Erase Code only" einstellen, unter<br />

* "Configuration". In der Default-Einstellung wird auch der<br />

* Datenspeicherbereich gelöscht, womit die Kalibrierdaten gelöscht werden.<br />

*<br />

* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */<br />

// Registerdefinitionen für ADuC845, im Lieferumfang von IAR enthalten<br />

#include "ioADUC845.h"<br />

Seite 5- 5


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

/*********************************************************<br />

*<br />

* Tigris-interne Standard-Typdefinitionen<br />

*<br />

**********************************************************/<br />

typedef unsigned char int8u;<br />

typedef unsigned int int16u;<br />

typedef unsigned long int32u;<br />

typedef signed char int8s;<br />

typedef signed int int16s;<br />

typedef signed long int32s;<br />

typedef float flt32;<br />

typedef double flt64;<br />

typedef int8u bool;<br />

#define true (bool)1<br />

#define false (bool)0<br />

/*********************************************************<br />

* Delay-Routine<br />

*<br />

* Verzögerung um die übergebene Zeit delay_time, Wert der<br />

* Variablen multipliziert mit etwa 4 us<br />

*<br />

**********************************************************/<br />

void delay (int32u delay_time)<br />

{<br />

int32u volatile actual_time;<br />

}<br />

actual_time = 0;<br />

while (actual_time < delay_time)<br />

{<br />

actual_time ++;<br />

}<br />

Seite 5- 6


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

/*********************************************************<br />

* Initialisierung des A/D-Wandlers<br />

*<br />

* kontinuierliche Wandlung im Bereich 320mV mit vorheriger Kalibrierung<br />

* Eingangsbuffer überbrückt!<br />

*<br />

**********************************************************/<br />

void adc_setup( void)<br />

{<br />

int mode0;<br />

int mode1;<br />

int mode2;<br />

int mode3;<br />

int mode4;<br />

int mode5;<br />

int mode6;<br />

int mode7;<br />

// Register ADCMODE<br />

mode7 = 0;<br />

mode6 = 1; // Notch-Filter 50/60 Hz aktiv<br />

mode5 = 1; // Primary ADC eingeschaltet<br />

mode4 = 1; // Auxiliary ADC eingeschaltet<br />

mode3 = 0; // Chop aktiv, da Bit negiert<br />

mode2 = 0; // idle<br />

mode1 = 0;<br />

mode0 = 1;<br />

ADCMODE = ( mode0 // kein sequentieller, bitweiser Zugriff<br />

+ (mode1


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

// Register SF<br />

SF = 246; // ca. 5 Wandlungen pro Sekunde. Bessere<br />

// Performance als "255", wurde durch Tigris-<br />

// interne Tests festgestellt<br />

// Auch wenn zu einem späteren Zeitpunkt eine Kalibrierung auf Systemebene<br />

// stattfindet, wird sicherheitshalber die im Datenblatt vorgeschlagene<br />

// Kalibriersequenz ausgeführt<br />

// interner Nullpunktabgleich im Bereich 2,56V<br />

// Register ADC0CON1<br />

ADC0CON1_bit.RN0 = 1; // Eingangsspannungsbereich 2,56V<br />

ADC0CON1_bit.RN1 = 1;<br />

ADC0CON1_bit.RN2 = 1;<br />

// Register ADCMODE<br />

mode7 = 0;<br />

mode6 = 1; // Notch-Filter 50/60 Hz aktiv<br />

mode5 = 1; // Primary ADC eingeschaltet<br />

mode4 = 1; // Auxiliary ADC eingeschaltet<br />

mode3 = 0; // Chop aktiv, da Bit negiert<br />

mode2 = 1; // internal zero calibration<br />

mode1 = 0;<br />

mode0 = 0;<br />

ADCMODE = ( mode0<br />

+ (mode1


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

// interner Fullscale-Abgleich im Bereich 2,56V<br />

// Register ADC0CON1<br />

ADC0CON1_bit.RN0 = 1; // Eingangsspannungsbereich 2,56V*/<br />

ADC0CON1_bit.RN1 = 1;<br />

ADC0CON1_bit.RN2 = 1;<br />

// Register ADCMODE<br />

mode7 = 0;<br />

mode6 = 1; // Notch-Filter 50/60 Hz aktiv<br />

mode5 = 1; // Primary ADC eingeschaltet<br />

mode4 = 1; // Auxiliary ADC eingeschaltet<br />

mode3 = 0; // Chop aktiv, da Bit negiert<br />

mode2 = 1; // internal full scale calibration<br />

mode1 = 0;<br />

mode0 = 1;<br />

ADCMODE = ( mode0<br />

+ (mode1


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

// "continuous conversion" für den weiteren Betrieb einstellen<br />

}<br />

// Register ADCMODE<br />

mode7 = 0;<br />

mode6 = 1; // Notch-Filter 50/60 Hz aktiv<br />

mode5 = 1; // Primary ADC eingeschaltet<br />

mode4 = 1; // Auxiliary ADC eingeschaltet<br />

mode3 = 0; // Chop aktiv, da Bit negiert<br />

mode2 = 0; // Continous Conversion<br />

mode1 = 1;<br />

mode0 = 1;<br />

ADCMODE = ( mode0<br />

+ (mode1


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

/*********************************************************<br />

* Auslesen des A/D-Wandlers<br />

*<br />

* Es wird ein 24-Bit-Wert aus dem ADC ausgelesen<br />

*<br />

* 0xffffff = positive full scale voltage<br />

* 0x800000 = zero voltage<br />

* 0x000000 = negative full scale voltage<br />

*<br />

* Bei erfolgreichem Erkennen des READY-Flags wird die<br />

* grüne LED gepulst<br />

*<br />

**********************************************************/<br />

int32u adc_readout (void)<br />

{<br />

int32u volatile ready;<br />

int32u value;<br />

int32u volatile low_byte;<br />

int32u volatile mid_byte;<br />

int32u volatile high_byte;<br />

}<br />

ready = 0;<br />

value = 0;<br />

while ( ready == 0) // Ready-Flag des ADC pollen<br />

{<br />

ready = ADCSTAT_bit.RDY0;<br />

}<br />

if (ready == 1)<br />

{<br />

P2_bit.P20 = 0; // Pulsen der grünen LED bei<br />

delay(5); // Erkennen des Abschlusses<br />

P2_bit.P20 = 1; // der A/D-Wandlung<br />

}<br />

low_byte = ADC0L;<br />

mid_byte = ADC0M;<br />

high_byte = ADC0H;<br />

value = low_byte + (mid_byte


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

/*********************************************************<br />

* Einlesen der Taster<br />

*<br />

* <strong>Die</strong> Taste wird als gedrückt interpretiert,<br />

* wenn 90% der übergebenen "debounce time" ein Low-Pegel<br />

* erkannt wurde<br />

*<br />

* Rückgabe<br />

* 0 = keine Taste gedrückt<br />

* 1 = nur "0kg"-Taste gedrückt<br />

* 2 = nur "80kg"-Taste gedrückt<br />

* 3 = Taste "0kg" und Taste "80kg" gedrückt<br />

*<br />

**********************************************************/<br />

int scan_switches (int32u debounce_time)<br />

{<br />

}<br />

int32u volatile time;<br />

int32u volatile sum_P22;<br />

int32u volatile sum_P23;<br />

int32u switch_state;<br />

int32u volatile P22;<br />

int32u volatile P23;<br />

time = 0;<br />

sum_P22 = 0;<br />

sum_P23 = 0;<br />

P22 = 0;<br />

P23 = 0;<br />

while ( time < debounce_time ) // Abfrage und Summierung der<br />

// Tastenzustände über die<br />

// Entprellzeit<br />

{<br />

if (P2_bit.P22 == 0) // Abfragen Taste "0kg"<br />

{<br />

sum_P22 ++;<br />

}<br />

}<br />

if (P2_bit.P23 == 0) // Abfragen Taste "80kg"<br />

{<br />

sum_P23 ++;<br />

}<br />

time ++;<br />

if ( sum_P22 > ( debounce_time * 0.9)) // Vergleich mit 90% Kriterium<br />

{<br />

P22 = 1;<br />

}<br />

if ( sum_P23 > ( debounce_time * 0.9)) // Vergleich mit 90% Kriterium<br />

{<br />

P23 = 1;<br />

}<br />

switch_state = P22; // Bildung des Rückgabewertes<br />

switch_state = switch_state + ( P23 * 2 ); // mit gewichteter Summierung<br />

return switch_state;<br />

Seite 5- 12


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

/*********************************************************<br />

* Anzeige einer HEX-Zahl<br />

*<br />

* Nur zum Debuggen<br />

*<br />

* Anzeige einer vierstelligen Zahl auf den LED-Displays im<br />

* HEX-Format<br />

*<br />

**********************************************************/<br />

void display_hex( int32u value)<br />

{<br />

}<br />

P0_bit.P04 = 1; // Alle Latch-Eingänge<br />

P0_bit.P05 = 1; // der Displays werden<br />

P0_bit.P06 = 1; // in den inaktiven<br />

P0_bit.P07 = 1; // Zustand (high)<br />

// gebracht<br />

// Schreiben des ersten Digits von rechts<br />

P0_bit.P04 = 0; // Latch-Signal auf low<br />

P3 = ( (value & ( 0x0f 0 ) 4 ) 8 )


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

/*********************************************************<br />

* Anzeige einer Dezimalzahl<br />

*<br />

*<br />

* Anzeige einer vierstelligen Zahl auf den LED-Displays im<br />

* Dezimal-Format<br />

*<br />

**********************************************************/<br />

void display_dec( int32u value)<br />

{<br />

}<br />

int digit0; // Hilfsvariablen für die einzelnen<br />

int digit1; // 4 Digits<br />

int digit2;<br />

int digit3;<br />

digit0 = (value / 1 ) % 10; // Umwandlung Hex zu BCD<br />

digit1 = (value / 10 ) % 10; // erst Teilen, dann den "Rest"<br />

digit2 = (value / 100 ) % 10; // (mit "%") bestimmen<br />

digit3 = (value / 1000 ) % 10; // Beispiel: Anzeigen der zweiten<br />

// Stelle von 1234 d, intern hexadezimal<br />

// abgelegt 1234 geteilt durch 100 ist<br />

// 12,3412,34 % 10 ist 2,34<br />

// angezeigt wird dann "2"<br />

P0_bit.P04 = 1; // Alle Latch-Eingänge der Displays<br />

P0_bit.P05 = 1; // werden in den inaktiven Zustand<br />

P0_bit.P06 = 1; // (high) gebracht<br />

P0_bit.P07 = 1;<br />

// Schreiben des ersten Digits von rechts<br />

P0_bit.P04 = 0; // Latch-Signal auf low<br />

P3 = digit0


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

/*********************************************************<br />

* Schreiben in den nichtflüchtigen Speicherbereich des AduC845<br />

*<br />

* Es wird eine 32 bit-Zahl "data" übergeben, die in der<br />

* ebenfalls übergebenen Adresse "page_address" gespeichert wird<br />

*<br />

* Bei erfolgreichem Verify wird die grüne LED gepulst<br />

*<br />

**********************************************************/<br />

void write_nv( int16u page_address, int32u data)<br />

{<br />

EADRL = page_address & 0x00FF; // Page-Address in Adress-<br />

EADRH = (page_address & 0xFF00) >> 8; // register schreiben<br />

}<br />

EDATA1 = data & 0x000000FFul; // Daten in Datenregister<br />

EDATA2 = (data & 0x0000FF00ul) >> 8; // schreiben<br />

EDATA3 = (data & 0x00FF0000ul) >> 16; // "Verteilung" auf die<br />

EDATA4 = (data & 0xFF000000ul) >> 24; // 4 Byte einer Page<br />

ECON = 0x05; // Page (4 Byte) löschen<br />

ECON = 0x02; // Inhalt der Datenreister<br />

// in EEPROM übertragen<br />

ECON = 0x04; // Verify durchführen<br />

if (ECON == 0) // Wenn Verify OK, dann<br />

{ // grüne LED pulsen<br />

P2_bit.P20 = 0;<br />

delay(2000);<br />

P2_bit.P20 = 1;<br />

}<br />

else // Wenn Fehler, dann rote LED<br />

{ // pulsen<br />

P2_bit.P21 = 0;<br />

delay(2000);<br />

P2_bit.P21 = 1;<br />

}<br />

Seite 5- 15


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

/*********************************************************<br />

* Lesen aus dem nichtflüchtigen Speicherbereich des AduC845<br />

*<br />

* Es wird eine 32 bit-Zahl "data" zurückgegeben, die aus der<br />

* übergebenen Adresse "page_address" ausgelesen wird<br />

*<br />

**********************************************************/<br />

int32u read_nv( int16u page_address)<br />

{<br />

int32u data; // Rückgabewert 32bit<br />

int32u byte1; // Hilfsvariable<br />

int32u byte2; // Hilfsvariable<br />

int32u byte3; // Hilfsvariable<br />

int32u byte4; // Hilfsvariable<br />

}<br />

EADRL = page_address & 0x00FF; // Page-Address in Adressregister<br />

EADRH = (page_address & 0xFF00) >> 8; // schreiben<br />

ECON = 0x01; // Daten aus EEPROM-Zellen in<br />

// Datenregister übertragen<br />

// 4 Bytes einer Page werden<br />

// gleichzeitig übertragen<br />

byte1 = EDATA1; // <strong>Die</strong> Inhalte der Datenregister<br />

byte2 = EDATA2; // werden in Hilfsvariablen<br />

byte3 = EDATA3; // übertragen Damit werden<br />

byte4 = EDATA4; // Typenkompatibilitätsprobleme<br />

// umgangen<br />

data = byte1; // gewichtete Addition der<br />

data = data + ( byte2


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

/*********************************************************<br />

* Hauptprogramm<br />

*<br />

* Ablauf:<br />

* Initialisieren<br />

* Holen der Kalibrierwerte aus dem EEPROM<br />

* Endlosschleife mit laufender Gewichtsanzeige<br />

* und Abfrage der Taster<br />

* Bei Erkennen gedrückter Kalibriertaster<br />

* Aktualisierung der Kalibrierdaten im EEPROM<br />

*<br />

* Zum Kalibrieren bei leerem Wägeteller die Taste "0kg" drücken,<br />

* bis die grüne LED für ca. 1/4 s dauerhaft aufleuchtet.<br />

* Bei mit 80kg belastetem Wägeteller die Taste "80kg" drücken,<br />

* bis die grüne LED für ca. 1/4 s dauerhaft aufleuchtet.<br />

*<br />

**********************************************************/<br />

int main(void)<br />

{<br />

int32u debounce_time; // Entprellzeit Taster<br />

double filtered_value; // Zwischenwert zu Aufsummierung Mittelwert<br />

double ref0kg; // Kalibrierwert Nullpunkt (ADC-Wert 0kg)<br />

double ref80kg; // Kalibrierert Steigung (ADC-Wert 80kg)<br />

double gewichtkg; // errechnetes Gweicht in kg<br />

debounce_time = 20; // Entprellzeit Taster<br />

int32u ADC_wert_1;<br />

int32u ADC_wert_2;<br />

int32u ADC_wert_3;<br />

int32u ADC_wert_4;<br />

/* Initialisierung */<br />

delay (10000);<br />

adc_setup(); // ADC initialisieren<br />

ref80kg = read_nv(2); // Laden der Kalibrierkonstanten<br />

ref0kg = read_nv(1); // aus internem EEPROM<br />

/* Programmablauf */<br />

while(1) // Endlosschleife<br />

{<br />

// Bildung des gleitenden Mittelwerts über 4 A/D-Wandlungen<br />

ADC_wert_4 = ADC_wert_3;<br />

ADC_wert_3 = ADC_wert_2;<br />

ADC_wert_2 = ADC_wert_1;<br />

ADC_wert_1 = adc_readout();<br />

filtered_value = ( ADC_wert_1<br />

+ ADC_wert_2<br />

+ ADC_wert_3<br />

+ ADC_wert_4 ) / 4 ;<br />

Seite 5- 17


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

// Bildung des Gewichts in kg aus A/D-Wandlungsergebnis und Kalibrierdaten<br />

}<br />

gewichtkg = ( ( filtered_value - ref0kg)/ (ref80kg - ref0kg) )* 80 * 100;<br />

// Gewicht anzeigen<br />

if (gewichtkg < 0)<br />

{<br />

gewichtkg = gewichtkg * (-1);<br />

P2_bit.P21 = 0; // rote LED leuchtet bei negativen Werten<br />

}<br />

else<br />

{<br />

P2_bit.P21 = 1;<br />

}<br />

display_dec( ((int32u)gewichtkg));<br />

// Kalibrieren (nur wenn entsprechende Taste gedrückt)<br />

}<br />

if ( scan_switches(debounce_time) == 1) // Wenn Taste "0kg" gedrückt<br />

{<br />

ref0kg = filtered_value; // ADC-Wert in EEPROM schreiben<br />

write_nv(1,(int32u)ref0kg);<br />

}<br />

if ( scan_switches(debounce_time) == 2) // Wenn Taste "80kg" gedrückt<br />

{<br />

ref80kg = filtered_value; // ADC-Wert in EEPROM schreiben<br />

write_nv(2, (int32u)ref80kg);<br />

}<br />

Seite 5- 18


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

<strong>Die</strong> Handhabung der Tools<br />

<strong>Die</strong> Installationen.<br />

Analog-Devices-Tools:<br />

Hier gibt es keinerlei Besonderheiten, es muß lediglich die angezeigte Installer-Sequenz abgearbeitet<br />

werden.<br />

IAR-EW8051:<br />

Man installiert von der mitgelieferten CD, exakt nach der Installer-Sequenz. (Von einem Image der CD<br />

ist keine Installation möglich). Hierbei arbeitet man mit dem Startup-Freigabecode, der 30 Tage gilt.<br />

Man registriert das Produkt und erhält per E-Mail einen Dauer-Code zurück, der dann, nach Anleitung<br />

in der E-Mail eingegeben werden muß.<br />

Seite 5- 19


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

<strong>Die</strong> grundlegenden Schritte mit dem IAR-EW8051 und dem AD-<br />

WSD.<br />

Vorbemerkung<br />

Hier sind bewußt nur rudimentäre Bedienvorgänge auf Anfänger-Niveau beschrieben. <strong>Die</strong><br />

Möglichkeiten des Programms sind hierbei wahrscheinlich nicht mal im einstelligen Prozentbereich<br />

genutzt. <strong>Die</strong>se Schritte, die in wenigen Minuten erlernbar sind, reichen aber schon aus, um ein<br />

Programm in der Komplexität der Super-Serval-Firmware erfolgreich zu realisieren!<br />

Neues Projekt anlegen<br />

Verzeichnis mit Windows-Explorer anlegen<br />

Seite 5- 20


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

IAR-EW8051 starten<br />

Start => Programme => Entwicklung => IAR Embedded Workbench<br />

(Pfad ist rechnerspezifisch)<br />

Es erscheint folgendes Fenster:<br />

Seite 5- 21


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

File => New => Workspace<br />

Seite 5- 22


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Project => create new Project<br />

Tool chain => 8051 auswählen<br />

Seite 5- 23


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Device specific project templates => Analog Devices auswählen:<br />

Baustein AduC845 auswählen und mit OK bestätigen:<br />

Seite 5- 24


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

„Speichern unter“ in das zuvor für dieses Projekt erstellte Verzeichnis<br />

Einen Namen für das Project festlegen und Box dann mit „speichern“ verlassen.<br />

Seite 5- 25


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Damit ist automatisch ein „Rumpf-File“ ad845.c angelegt.<br />

Seite 5- 26


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Man kann entweder mit dem vorhandenen Rumpf-File AD845.c manuell weiterarbeiten, also dort<br />

seinen neuen Source-Code erstellen...<br />

Seite 5- 27


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

...oder dieses löschen und ein bereits vorhandenes File einbinden, mit dem man weiterarbeiten will.<br />

Hierzu das vorhandene File, mit dem man weiterarbeiten will, mit dem Explorer in das zuvor erstellte<br />

Projekt-Hauptverzeichnis kopieren und als „AD845.C“ benennen. Zuvor das „Rumpf-File“ im Project-<br />

Fenster schließen.<br />

Seite 5- 28


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Nach Abschluß erscheint das gewünschte File im Project-Fenster, wenn man „ad845.c“ wieder<br />

öffnet.<br />

Nun kann man mit diesem File weiterarbeiten und es verändern oder ergänzen.<br />

Seite 5- 29


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

„Wiederfinden“ eines Projekts<br />

Der einfachste Weg ist der „Shortcut“ über „Recent Workspaces“:<br />

Seite 5- 30


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Wenn man auf den entsprechenden Workspace clict, öffnet sich das Projekt:<br />

Seite 5- 31


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Wenn der „Shortcut“ nicht verfügbar ist, dann kann man den Workspace auch „ganz normal“ öffnen:<br />

File => Open => Workspace<br />

Seite 5- 32


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Das *.eww-File auswählen:<br />

Dann öffnet sich das Projekt:<br />

Seite 5- 33


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Compilieren und Downloaden<br />

Zum Compilieren F7 drücken.<br />

Beim ersten Compilieren kommt zunächst die folgende Meldung<br />

Nun muß man einen Namen für die Workspace festlegen und eingeben<br />

Dann die Box mit „Speichern“ verlassen.<br />

Seite 5- 34


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Danach erfolgt die Compilierung:<br />

Am unteren Rand des Bildschirms erscheinen Warnungen, Fehlermeldungen und Statusmeldungen.<br />

Bei allen weiteren Compileraufrufen mit F7 geschieht die Compilierung sofort.<br />

Zum Download das Programms in den ADuC 845-Baustein den „Windows Serial Downloader“ (WSD)<br />

von AD starten:<br />

Start => Programme => ADuC => WSD<br />

(Pfad ist rechnerspezifisch)<br />

Seite 5- 35


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Es erscheint folgendes Fenster:<br />

Seite 5- 36


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Zunächst das „Configuration“-Fenster öffnen und sicherstellen, daß „Erase the CODE ONLY“ gewählt<br />

ist, sonst werden bei jedem Download die Kalibrierdaten gelöscht!<br />

Dann das „Configuration“-Fenster mit OK verlassen und im Hauptfenster auf „Download“ clicen.<br />

Hier dann das herunterzuladende Hex-File auswählen:<br />

Es heißt „ADuC845.hex“ und befindet sich im Unterverzeichnis ...\Debug \Exe<br />

Seite 5- 37


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Zur Verdeutlichung die entstandene Verzeichnisstruktur als Explorer-Darstellung:<br />

Auf dem Adapterboard die Reset-Taste drücken und gedrückt halten.<br />

Dann die Download Taste drücken.<br />

<strong>Die</strong> Reset-Taste loslassen.<br />

Dann erst die Download-Taste loslassen<br />

Nun durch clicen auf „Öffnen“ den Download starten.<br />

Seite 5- 38


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Der Download startet, es öffnet sich das folgende Fenster:<br />

Der Download schließt mit der Meldung „Sucess“ ab.<br />

Was tun, wenn der Download fehlschlägt?<br />

<strong>Die</strong> häufigsten Gründe dafür sind:<br />

- Der COM-Port ist nicht richtig zugewiesen, dies kann unter „Configuration“ korrigiert werden<br />

- Bei USB-COM-Port-Adaptern tritt dieser Fehler sehr häufig auf. Siehe hierzu den Anhang „USB-<br />

Portzuteilung“<br />

- <strong>Die</strong> Tastensequenz wurde nicht ganz korrekt ausgeführt<br />

- Eventuell sind die Taster durch häufige Benutzung verschlissen, womit sich unsauberes Schalten<br />

ergibt, dann muß die Schaltsequenz mit besonderer Präzision ausgeführt werden.<br />

- <strong>Die</strong> Kabelverbindungen sind nicht korrekt<br />

Dann Reset-Taste drücken<br />

Das heruntergeladene Programm beginnt abzulaufen.<br />

Seite 5- 39


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Besonderheiten bezüglich des Programmcodes<br />

Es muß ein Bezug zwischen der Hardware des Bausteins ADuC845 und dem Programmcode<br />

hergestellt werden. Hierzu dient die Datei ioADuC845.h, die bei der Anlage eines neuen Projekts<br />

automatisch eingebunden wird.<br />

<strong>Die</strong> Vorgehensweise wird beispielhaft anhand von Port 0 gezeigt:<br />

Bytweise Ausgabe: P0 = variable<br />

Byteweises Einlesen: variable = P0<br />

Bitweise Ausgabe auf P1.0: P0_bit.P01 = variable (nur die Werte 1 oder 0 möglich)<br />

Bitweise Eingabe von P1.0: variable = P0_bit.P01 (nur die Werte 1 oder 0 möglich)<br />

Achtung: Nicht alle Bezeichnungen in dieser Datei entsprechen exakt den Bezeichnungen im<br />

Datenblatt. Das SF-Register des A/D-Umsetzers finden man nicht in dem dazugehörigen Abschnitt,<br />

sondern unter „System Management“.<br />

Seite 5- 40


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Anhang: USB-Portzuteilung<br />

Wenn sich bei dem Downloadprogramm Schwierigkeiten mit der Portzuteilung in Verbindung mit<br />

einem USB-Adapter ergeben, dann können diese nach dem folgenden Lösungsweg behoben<br />

werden:<br />

Zunächst gilt es herauszufinden, wie das Betriebssystem den USB-Port als virtuellen COM-Port mit den<br />

im Betriebssystem angelegten COM-Ports verknüpft hat.<br />

Zunächst USB-zu Seriell-Adapter mit dem Rechner verbinden<br />

Dann: Start => Einstellungen => Systemsteuerung => Verwaltung => Copmputerverwaltung =><br />

Gerätemanager => Anschlüsse (COM und LPT)<br />

Man sieht hier im Beispiel, daß der virtuelle USB-COM-Port auf COM8 gelegt wurde.<br />

Abschließend den vorhin gesehenen / geänderten COM-Port dort auswählen/einstellen (unter<br />

„Configuration“ beim AD-Downloadprogramm.<br />

Für das Download-Programm von AD besteht jedoch die Notwendigkeit, sich auf die COM-Ports<br />

COM1 bis COM4 zu beschränken.<br />

Wenn dies durch die automatische Zuteilung nicht erfüllt wird, dann existiert der folgende<br />

Lösungsweg:<br />

Seite 5- 41


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Durch Doppelclicen auf das im Beispiel blau markierte Feld „USB Seriel Port (COM8) geht ein Fenster<br />

mit den Eigenschaften des virtuellen COM-Ports auf:<br />

Registerkarte „Port Settings“ wählen<br />

Seite 5- 42


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Dann auf „Advanced“ gehen.<br />

Seite 5- 43


Abschlußbericht Mixed Signal Baugruppen 2007/8 Digitaltechnik BACK TO THE ROOTS <strong>SUPER</strong>-<strong>SERVAL</strong><br />

Dort einen anderen, zulässigen COM-Port wählen:<br />

Dann das AD-Downloadprogramm starten.<br />

Abschließend den vorhin gesehenen / geänderten COM-Port dort auswählen/einstellen (unter<br />

„Configuration“ beim AD-Downloadprogramm.<br />

Seite 5- 44

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!