Forum: Projekte & Code ADC-Wandler 80C552


von Thomas Alexander Strauß (Gast)


Lesenswert?

;AD-Wandler - Programm für 80C552
;Assembler ist von Metalink (umsonst bei Philips.de etc.)

$mod552
datanf set 0
datend set 7fh

                org 0
                sjmp start



                org 3
                clr EX0            ;Taste deaktivieren
                acall _reti        ;weitere Interrupts enablen
                acall _ppause      ;große Pause für die Taste
                reti


                org 0bh
                dec A
                reti


                org 53h
                mov 20h,ADCON      ;Low-Byte von ADC
                mov 1fh,ADCH       ;High-Byte von ADC
                anl ADCON,#239     ;vor Neustart ADCI löschen!
                orl ADCON,#8       ;neue Wandlung starten
                anl 20h,#11010000b ;Bit1-0 + ADCI bleiben
                reti


                org 80h
start:          mov IEN0,#83h      ;Enable All + T0/EX0 -Interrupt
                mov TMOD,#0        ;Timer0/16bit
                orl PCON,#1        ;warten auf Tastendruck /EX0
                mov DPTR,#datanf-1 ;initialisieren Speicher
                setb EAD           ;AD-Wandler-Interrupt aktivier.
                orl ADCON,#8       ;Start AD-Wandler
                acall _click       ;Programm zur Aufnahme von Volt
                clr EAD            ;danach Interrupt sperren
                acall _pause       ;zum Auslaufen d. letzt. Wandl.
                anl ADCON,#239     ;danach ADCI löschen (falls
                                   ;Unterprogramm _click öfter
                                   ;aufgerufen wird)
;hier kommen noch Befehle für Unterprogramme (Schnittstelle), die
;natürlich hier auch noch fehlen!


                org 100h
_click:         jnb 20h.4,_click  ;warten auf ADC-fertig/K1
                clr 20h.4         ;Statusbit init./Bit1-0 remain
                mov B,20h         ;Bit1-0 retten/K1
                mov A,1fh         ;Bit9-2 laden/K1
                inc DPTR
                movx @DPTR,A      ;Bit9-2 von K1 speichern
                jnb 20h.4,$       ;warten auf ADC-fertig/K2
                clr 20h.4         ;Statusbit init./Bit1-0 remain
                mov A,1fh         ;Bit9-2 laden/K2
                rr A
                rr A
                anl A,#00111111b  ;Bit9-4 bleiben übrig
                orl A,B           ;Bit1-0/K1+Bit9-4/K2
                inc DPTR
                movx @DPTR,A      ;speichern
                mov A,1fh         ;Bit9-2 erneut laden/K2
                anl A,#00000011b  ;Bit3-2 bleiben übrig
                orl A,20h         ;Bit1-0+3-2
                rr A
                rr A
                mov B,A           ;Bit3-0 retten
                jnb 20h.4,$       ;warten auf ADC-fertig/K3
                clr 20h.4         ;Statusbit init./Bit1-0 remain
                mov A,1fh         ;Bit9-2 laden /K3
                swap A            ;Bit9-6 als unteres Nibble
                anl A,#00001111b  ;bleiben übrig
                orl A,B           ;Bit3-0/K2+Bit9-6/K3
                inc DPTR
                movx @DPTR,A      ;speichern
                mov A,1fh         ;Bit9-2 erneut laden /K3
                swap A            ;Bit5-2
                anl A,#11110000b  ;bleiben übrig
                mov B,A           ;Bit5-2 retten
                mov A,20h         ;Bit1-0 laden/K3
                swap A            ;Bit1-0 auf Bitposition 3-2
                orl A,B           ;Bit5-0
                mov B,A           ;Bit5-0 retten/K3
                jnb 20h.4,$       ;warten auf ADC-fertig/K4
                clr 20h.4         ;Statusbit init./Bit1-0 remain
                mov A,1fh         ;Bit9-2 laden/K4
                rl A
                rl A
                anl A,#00000011b  ;Bit9-8 bleiben übrig
                orl A,B           ;Bit5-0/K3 + Bit9-8/K4
                inc DPTR
                movx @DPTR,A      ;speichern
                mov A,1fh         ;Bit9-2 erneut laden/K4
                rl A
                rl A
                anl A,#11111100b  ;Bit7-2 bleiben übrig
                mov B,A           ;Bit7-2 retten
                mov A,20h         ;Bit1-0 laden/K4
                rl A
                rl A
                orl A,B           ;Bit7-0/K4
                inc DPTR
                movx @DPTR,A      ;speichern
                mov A,#datend     ;bis Speicher voll ist o.ä.
                cjne A,DPH,Q000
                ret               ;sonst Rücksprung
Q000:           ajmp _click



                org 200h
_pause:         djnz ACC,_pause
                ret


                org 280h
_ppause:        mov A,#10
                setb TR0
                jnz $
                clr TR0
                reti


                org 300h
_reti:          reti


                end

;****************************************************
;Programm läßt den AD-Wandler fast ohne Unterbrechung
;laufen, speichert die Resultate in 1fh/20h ab - muß
;sein, da sonst die Resultate "erschüttert" sind (der
;Monitor auf dem PC legt diesen Ausdruck nahe);
;während die nächste Wandlung läuft, wird das alte 10bit-
;Ergebnis redundanzfrei
;, d.h. ohne Speicherplatzverschwendung, abgespeichert;
;insgesamt werden bei einem U-Programm-Durchlauf 4 mal
;10bit-Resultate auf 5 mal 8bit -Speicherplätze abgespeichert
;(KGV von 8 und 10 ist 40);
;wer will, kann sich von mir das komplette Programm gegen
;eine Gebühr von Porto + Diskette (kann nicht viel sein)
;schicken lassen (erst mal umsonst, da ich nicht weiß, was
;ich selber bezahlen muß); dazu gehört jedoch noch Controller-
;seitig das Schnittstellen-Programm und zur grafischen Wieder-
;gabe ein PC-Programm (läuft unter DOS), das die Stichproben
;des AD-Wandlers auf dem Monitor anzeigt, d.h. auf 8bit reduziert
;bzw. mit Page-Wechsel auch 10bit; dieses Programm ist sicher
;noch verbesserungswürdig! der Code ist in jedem Fall free!
;zu erhalten bei        Thomas Strauß
                        Landsberger Allee 81
                        10407 Berlin - Prenzlauer Berg
                        0175-254 80 83
Postkarte schicken!

von gill (Gast)


Lesenswert?

ich habe 8 sensoren die wandeln mir die tempeatur um in spannungen von 
0-5v.ich verwende jedoch den
AT90S8535.ich will jeden eingang des ad wandlers fur einen sensor 
benutzen.kann mir dein programm helfen die 8 analogen daten einzulesen 
und seriell
in einem protokoll verpackt wieder rauszugeben.
die analogen spannungen werden ununterbrochen eingelesen 24 h am tag.und 
sollen gleich rausgegeben werden.

von Thomas Strauß (Gast)


Lesenswert?

Hallo Gill
Man kann mein Programm dazu verwenden, beliebig viele Analog-Eingänge 
hintereinander abzufragen und vier * 10bit-Resultate auf 5*8bit 
Ramplätze abzulegen; dazu müsste man in der Interrupt-Routine den 
Eingang entsprechend umschalten. Z.B. alternierend
im ADCON-Control-Register die Pin-auswählenden Bits hochzählen
und dann wieder von Null bis zum höchsten Wert.

z. B. mit folgender Syntax:  inc bit2-0     ;Bits für die 8 Inputs
                             anl bit2-0,#7  ;max. 7

etwas schematisch; vielleicht muß das Register erst in den Akku geladen 
werden und alles nach rechts rotiert werden, bis das Bit, was für 
Eingang 0 zuständig ist, auf Bitposition 0 ist, und anschließend alles 
zurückgeschrieben werden in das ADCON-Register. Das sähe dann etwa so 
aus:
                  mov A,ADCON
                  ror A
                  ror A
                  ...
                  inc A
                  anl A,#7
                  mov ADCON,A


Der AT80535 ist meiner Vermutung nach ein Siemens SAB80535 -
Nachfolger, von Atmel. Der SAB80535 hat jedoch nur einen 8bit-
AD-Wandler, so daß mein Programm hierfür nicht verwendet werden
kann; falls Dein Chip jedoch auch über einen 10bit-Wandler (1024
Stufen-Auflösung)verfügt, könnte mein Programm - nach Anpassung
auf die anderen Special-Function-Registern und mit oben genannter
Umschaltung, für dein Problem interessant sein;

Das Protokoll würde dann nur darin bestehen, die Daten in der richtigen 
Reihenfolge zu entschlüsseln; die Reihenfolge der Daten
entspräche dann den Sensoren;

bei einem Chip mit 8bit-AD-Wandler würde es auch reichen, die
Reihenfolge der abgelegten Bytes (AD-Resultate)beim Empfangsgerät
einzuhalten; aber sehr sicher ist diese Methode natürlich nicht.

Man könnte vorab eine 3-stellige Binärzahl zu dem AD-Resultatsbyte 
absenden, die die 8 möglichen Sensoren angibt, zu dem das Byte gehört; 
das heißt jedoch, man muß dann 11bit abspeichern mit Einhalten der 
Reihenfolge oder man nimmt 16bit, wobei das erste Byte die Nummer des 
Sensors enthalten würde, das zweite Byte die Information dazu! Das ist 
natürlich leichter abzuspeichern.
Die Reihenfolge ist dann immer noch wichtig; ein Protokoll, was
sicher sein soll, muß dann schon komplizierter sein; die Nummer
des Sensors vorab, und davor vielleicht eine Kennung, daß jetzt
eine neue Information kommt, unabhängig von der vorhergehenden...
Mit solchen Problemen habe ich mich bisher noch nicht beschäftigt,
das ist Nachrichtentechnik und ein weites Feld; am besten beschäfigt man 
sich dann mit Nachrichtenübertragung und dergleichen;

von Thomas Strauß (Gast)


Lesenswert?

Das vollständige Programm ist noch umfangreicher; ich werde es
demnächst mit einem dazugehörigen DOS-Programm als Open-Source
und als ausführbare Datei absenden; das Dos-Programm kann insge-
samt über 32000 Stichproben als Kurvendiagramm anzeigen, 624
Stichproben mit 8bit und jeweils 16 Stichproben mit 10bit Auflösung als 
Zoom; Ausdrucken geht auch.

Zur grafischen Auswertung von x-y-Kurven (Temperatur-Zeit etc.).

von der ohne ahnung (Gast)


Lesenswert?

was is

von Bene (Gast)


Lesenswert?

Hallo.
Ich benutze einen 89c2051. Gibts dafür auch eine Rutine??
Der hat ja auch 2 analoge Eingänge

von Elektrikser (Gast)


Lesenswert?

Der 89C2051 hat aber keine AD-Eingänge! Das sind einfache
Vergleichseingänge (Komparator). Diese können zwei analoge Spannungen
miteinander vergleichen, aber viel mehr nicht.

Gruß Elektrikser

von Manfred (Gast)


Lesenswert?

Hallo,
Ich bin auf der Such nach einem Elektroniker der uns weiterhelfen
kann.

Wir sind eine Gruppe von 9 Bikern und haben ein Problem wo uns bis
jetzt keiner weiter helfen konnte.
Ich hoffe das Sie uns dabei helfen können.

Mir ist bei der Suche nach einem Miniatur Sender / Empfänger Ihre Seite
in die Hände gefallen.
Ich suche verzweifelt nach einem A/D – D/A Wandler ( Konverter) der in
der Lage sein sollte auf der einen Seite den Bluetooth USB auf zu
nehmen und die Digitalen Informationen umwandelt in Analoge
Informationen
und auf der anderen Seite einen Line / IN und Line /out  haben sollte.


Das Problem ist folgendes:

Wir haben sowohl Radio als auch Funk an den Motorrädern, nun ist mir
das Kabel vom Helm zum Moped irgendwie zu viel und möchte das ganze
über Bluetooth machen, leider finde ich nicht einen geeigneten
Wandler
Der meinen Bluetooth – Stick aufnehmen kann und mir die Möglichkeit
bietet, die analogen Sachen wie mein Radio und Funk über diesen
Bluetooth – Stick zu senden. Habe schon bei Conrad und Konsorten
nachgeschaut aber ich finde nicht das was ich suche,

Könntest Sie uns vielleicht weiter helfen.
Ich stehe Ihnen gerne für weitere Infos zu Verfügung.

Danke im Voraus

Gruß
Manfred

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.