Die digital anzeigende Personenwaage SUPER-SERVAL - EMSP
Die digital anzeigende Personenwaage SUPER-SERVAL - EMSP
Die digital anzeigende Personenwaage SUPER-SERVAL - EMSP
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