Inhaltsverzeichnis

Grundlegende Experimente mit einer MCU -INPUT-

Die hier angegebenen Experimente wurden mit der MCU MSP430G2553 von Texas Instruments auf deren LaunchPad gemacht. Die Experimente können aber ebenso gut mit anderen MCUs angestellt werden. Es wird aber für nichts gehaftet.

Für diese Experimente brauchte ich ein LaunchPad, ein Multimeter, ein Oszilloskop und einige Kleinteile wie Widerstände und Kondensatoren, und einen kleinen Lautsprecher. Ein Steckbrett kann nicht schaden, ebenso ein Bündel Prüfklipp-Kabel die einfach an das LaunchPad angeklemmt werden können.

Als Ersatz für einen Speicher-Oszillographen wurde zudem der Soundkarten-Oszillograph benutzt, in Verbindung mit der preiswerten externen Soundkarte (mit USB-Anschluß) von Behringer, der U-Control UCA202, die einen 48kHz Konverter enthält. Für die Beobachtung serieller Übertragungen z.B. reicht so etwas völlig aus, und gibt gute Einblicke in die Abläufe.

Die verwendete MCU erwies sich als erstaunlich robust. Wie man so eine MCU dann doch kaputt kriegt ist hier beschreiben.

Wie man an das 4e4th kommt steht auf der 4e4th.start Seite.

Auf dieser Seite werden INPUT Experiemente gezeigt. Die grundlegenden OUTPUT Experimente sind auf einer extra Seite zusammengefasst.

Taster abfragen

noname-Taster; prellt 4.5ms lang LP-Taster; saubere fallende Flanke Ist der Taster gedrückt oder nicht? Das klingt zunächst nach einer einfachen Sache. Die Taster auf dem MSP430LaunchPad sind auch qualitativ gut, prellen praktisch nicht. Das Bild „LP-Taster“ wurde mit einem Speicheroszilloskop aufgenommen. Es zeigt, dass eine saubere fallende Flanke resultiert, wenn der Taster gedrückt wird. Es gibt einen deutlichen Druckpunkt bei der Bedienung, beim Drücken wie beim Loslassen „knackt“ es etwas. Doch das ist nicht bei allen Tastern so. Das Experiment mit einem einfachen NoName-Taster zeigt dessen Verhalten. Es gibt keinen so sauberen Druckpunkt, und der Pegel am Portpin fällt nicht nur einmal, sondern prellt. Für etwas 4.5ms gibt es immer wieder H- und L-Pegel in rascher Folge. Das ist so ein alter "NoName" Taster

Um auch von solche einem Taster ein klares „gedrückt“ oder „nicht-gedrückt“ zu erhalten muss entprellt werden, was per Software gemacht wird. Das folgende kleine Forthprogramm zeigt wie. Damit ist es möglich klar zu ermitteln wann der Taster stabil gedrückt gehalten wurde. Und es wird eine Regelung gezeigt, die sicher stellt, dass nur ein einziger stabiler Tastendruck ausgewertet wird. Bei weiter gedrücktem Taster erfolgt keine weitere Reaktion mehr. Er muss erst losgelassen werden, bevor das Programm auf „neuer Tastendruck registriert“ befindet.

Die Schaltung für das Experiment ist denkbar einfach:

P1.3 --- S2 --- GND

Dazu wird der Portpin als digitaler Eingang geschaltet. Im Beispiel ist Pin3 von Port1 der MCU MSP430G2553 auf dem LaunchPad über den Taster S2 direkt mit Masse (GND) verbunden. Das geht ohne weiteres. Ein interner pullup-Widerstand liefert den positiven Spannungspegel.

S2         P1.3

offen      H
gedrückt   L

Forth Quellcode

\ Hochzaehlen einer Variablen an den LEDs darstellen. 
\ Zählen jeweils auf S2-Tastendruck, pollen von S2. 

HEX
FFFF constant TRUE
DECIMAL

\ S2 -- P1.3
\ Taster S2 ist im 4e4th schon initialisiert. Es gibt das Abfragewort S2?

: S2??  \ -- f  \ Taster S2 entprellen 
  true  5 zero DO 10 ms s2? and LOOP ; \ Verzögerungszeit experimentell.

: 1SHOT \ x0 f0 -- x1 f1  \ f wird nur wahr wenn Taster erneut gedrueckt wurde.
  2dup >r >r         \ R: -- x0 f0 
  invert swap drop   \ f0 --> x1
  r> r>              \ x1 x0 f0 -- 
  2dup  and    IF 2drop true exit THEN  
  2dup  and 0= IF 2drop zero exit THEN  
  2drop zero ; 


\ LED1 -- P1.0 red
\ LED2 -- P1.6 green
\ Die LEDs sind im 4e4th schon initialisiert. 

BIN
: SETLEDS  \ n -- \ Binaerwert an den LEDs darstellen.
  >r  \ Als lokale variable sichern. 
  r@ 00000001 and IF green cset ELSE green cclr THEN   \ Bit0 auswerten.
  r> 00000010 and IF red   cset ELSE red   cclr THEN ; \ Bit1 auswerten.
HEX

variable OUT
: OUT>     \ Wert aus der Variablen an den LEDs anzeigen. 
  out @  setleds ; 

: INC     \ Ein Binaerzaehler fuer die beiden LEDs am LaunchPad. 
  zero BEGIN 
  s2?? 1shot    \ Tastendruck abfragen. 
  IF 1 out +! THEN out>  \ Binaer zaehlen und Display aktuell halten. 
  key? UNTIL drop  key drop ; \ Ende und Stack aufraeumen.  

: ?? ( adr -- ) @ u. ; \ Helfer um den Inhalt einer Variablen zu sehen.

( finis)

Port Pin als digitalen Eingang benutzen

Pin P2.3 der MCU wird als Eingang geschaltet, d.h sein direction register bit wird auf logisch null gesetzt. Dann kann man an diesem Eingang ablesen, ob außen ein high- oder low-Pegel anliegt. Der Eingang schaltet per Schmidttrigger abhängig von der anliegenden Spannung in den einen oder anderen Zustand. Um das sichtbar zu machen, wird ein sehr langsames Auf und Ab des Spannungspegels an einem genügend großen RC-Glied erzeugt. Laden und Entladen des Kondensators übernimmt ebenfalls die MCU. Dazu arbeitet Pin P1.7 als Ausgang über einen Widerstand auf einen Elektrolytkondensator. Die grüne LED auf dem LaunchPad dient als Anzeige des Ladezustandes. Das kleine Forth-Programm dafür ist nachstehend wiedergegeben. Man kann alle allgemeinen I/O Pins vom Eingang zum Ausgang machen, wie, das ist MCU-spezifisch. Bitte im User Manual deiner MCU nachsehen.

Schaltplan für den langsamen Pegelwandel

Man kann den Pegel an P2.3 zusätzlich mit dem Oszilloskop, oder mit einem Multimeter anzeigen. In meinem Aufbau war beides angeschlossen. Mit dem Multimeter wurde die Spannung fortlaufend im MIN/MAX Modus gemessen. Dabei wurde folgendes beobachtet:

Das Ganze geht natürlich auch mit winzigen Kapazitäten und hohen Widerständen. Oder mit Kapazitätsänderungen von Folien, Oberflächen usw. Dieses Verhalten lässt sich dann z.B. dazu benutzen einen ADC-Wandler ohne ADC-Wandler aufzubauen; Prinzip: Per Programm die Takte bis zur Umschaltschwelle zählen (Dank an Jürgen Pintaske für den Artikel).

Forth Quellcode

\  Kondensator laden und entladen als Analog Signal für den Eingang.

hex
80 P1 2constant P1.7out
08 P2 2constant P2.3out
80 P1 1+ 2constant P1.7dir
08 P2 1+ 2constant P2.3dir
08 P2 1- 2constant p2.3in

: init   
   P1.7dir cset            \ make P1.7 output
   P2.3dir cclr            \ make P2.3 input
   red cclr  green cclr ;  \ LEDs aus

: C+     P1.7out cset ; \ Kondensator laden
: C-     P1.7out cclr ; \ Kondensator entladen

: warte-auf-voll  ( -- ) 
   begin p2.3in cget until  ;
: warte-auf-leer  ( -- ) 
   begin p2.3in cget invert until  ;

: TEST ( -- )
  init begin
    c+  warte-auf-voll  green cset 
    c-  warte-auf-leer  green cclr 
  key? until red cset ;

\ finis

Das Ganze mit höherer Frequenz

Aufgenommen mit dem Eigenbau mecrisp-Oszillograph von M.Koch

Die blaue Kurve zeigt den Pegel an P2.3 und die rote Kurve den resultierenden Puls, der an P1.7 ausgegeben wird. Das Bild täuscht auf den ersten Blick! Der Pegel am RC-Glied bestimmt die Frequenz des Rechtecksignals, und nicht umgekehrt. Hier macht es sich schon bemerkbar, dass der Oszillator von einem high level Programm erzeugt wird.

Wenn die ansteigende Schaltschwelle erreicht ist, wird ausgeschaltet. Aber der Vorgang das zu tun dauert etwas. Während dessen lädt der Kondensator weiter auf. Wenn die MCU-Logik endlich fertig ist, schaltet sie den Treiber-Port ab, der Kondensator wird entladen. Wenn dann die absteigende Schaltschwelle erreicht ist, wird wieder angeschaltet. Aber auch das hat eine Latenz die hier bemerkbar wird. Der Kondensator wird noch weiter entladen, bis endlich wieder umgeschaltet wird. Die Hysterese ist daher gar nicht zu erkennen. Sie ist besser zu erkennen, wenn das RC-Glied eine sehr langsame Frequenz liefert, also R und C relativ groß gewählt werden - was hiermit gezeigt werden sollte.

Sinus am Eingangspin

Besser sieht man was geschieht, wenn ein sinusförmiges analoges Signal an den Eingangspin anlegt wird. MIt einem Tongenerator ist das schnell gemacht. Testtöne gibt es aber auch im Internet, und vom lineout der Soundkarte lässt sich das Testsignal dann genauso gewinnen. Ist die Frequenz des Tones nicht zu hoch, ist die Hysterese um die Schaltschwellen herum wieder gut zu erkennen.

Um das Audiosignal einzukoppeln ohne das die negative Halbwelle abgeschnitten wird, ist eine Beschaltung erforderlich. Der Kondensator C entkoppelt das Signal von Gleichspannungsanteilen, und die beiden Widerstände schieben das Signal mittig zwischen Vcc und Vss. Täte man das nicht, würde der negative Anteil der Welle von der Schutzdiode am Einganspin geschluckt, die in der MCU schon integriert ist. Alle R=10K und als C eine kleine Tantal-Perle, das sollte genügen.

Audio-Eingang und digitaler Ausgangs-Pin Am grünen Punkt liegen die Schaltschwellen. (Daten aufgenommen mit dem mecrisp-Oszillograph)

Und wenn das Eingangssignal zu groß wird?

Dann kommt es zu clipping, der MCU passiert nichts. Jedenfalls solange der Strom für die Schutzdioden des Ports nicht zu groß wird, 2mA kann sie schlucken. Der Sachverhalt ist in den Bildern gezeigt, diesmal aufgenommen mit dem Audio-Scope. Mit einem 10K Vorwiderstand vor dem Eingang dürfte also bis 10V nichts passieren. Mein Tongenerator schafft einen Hub von 6,5V (Spitze-Tal-Wert) und das wurde anstandslos vertragen.

Das Rechteck am OUTPUT folgt dem 200Hz-Sinus-Signal am Input. Das Rechteck am OUTPUT folgt auch hier dem 200Hz-Sinus-Signal am Input. Das Signal ist aber zu groß, die Spitzen werden abgeschnitten.

ledcomm (nach Matthias Koch)

Hier sieht man die Lichtstrecke zwischen zwei Platinen

Ein optische Datenübertragung über eine kurze Strecke kann man äußerst simple mit nichts weiter als zwei superhellen roten LEDs aufbauen.

Das Prinzip: Erst wird die winzige Kapazität in einer LED aufgeladen. Dann wird die Zeit gemessen die sie braucht um sich wieder zu entladen.

Dazu muss man wissen, das eine LED, die in Sperrichtung betrieben wird, eine kleine Menge elektrischer Ladung im Subststrat speichert. Und deren Abfluss ist abbhängig von der Lichtmenge welche auf die LED fällt. Im Dunklen bleibt die Ladung länger bestehen als im Hellen. Diesen Effekt kann man ausnutzen für die Datenübertragung. Man läd LED-II auf und leuchtet sie dann mit der gleichartigen LED-I an, oder eben nicht. Und an der Entladezeit kann man dann erkennen, ob die LED-II angeleuchtet worden ist oder nicht. Und in der anderen Richtung funktioniert es ebenso.

Matthias Koch hat in seinem gleichnamigen Beitrag im Forth-Magazin "Vierte Dimension" gezeigt wie das geht. Die Einzelheiten und sein Forth-Programm-Beispiel bitte dort nachlesen. Man braucht wirklich nicht mehr als die beiden LEDs und zwei LaunchPads! Und natürlich das Programm:
mecrisp-ledcomm-winxp.zip
mecrisp-ledcomm.tar.gz

Diese Ausrüstung wird natürlich 2x benötigt Der Aufbau ist simpel!

Ihr werdet sicher eine Anwendung finden für so eine kabellose Datenübertragung. Anmerkung: Nicht jede MCU kann das so. Das hängt von der Art und Weise ab wie so ein Portpin gemacht ist. Hast Du Ledcomm auch schonmal auf dem TI Stellaris Launchpad ausprobiert? Der Quelltext liegt auch dem Mecrisp-Stellaris Paket bei, und trägt zur Völkerverständigung zwischen MSP430 und ARM Cortex bei.

Ausschnitt aus dem Forth-Quellcode

Darin ist das Prinzip zu sehen. Beim „Strahlen“ wird die Anode und die Kathode der LED anders herum betrieben als beim „Lauschen“.

...
1 constant Anode
2 constant Kathode

: Strahle ( -- )
  Anode   P2OUT cbis!
  Kathode P2OUT cbic!
  Anode Kathode or P2DIR cbis!   
;  
 
: Lauschen-Vorbereitung ( -- )
  Anode   P2OUT cbic!            \ SperrschichtkapazitŠt
  Kathode P2OUT cbis!            \ durch Verpolung laden
  Anode Kathode or P2DIR cbis!
  begin Kathode P2IN cbit@ until \ Warten, bis die Kathode geladen ist
  Kathode P2DIR cbic!
;

: Lauschen-Nachbearbeitung ( -- Flag )
  Kathode P2IN cbit@ not        \ Ist die Kathode entladen, ist es hell
; 
...

Im Rest des Codes wird dann das Timing gemacht.

ledcomm Experimente

ledcomm beobachten

Will man prüfen und nachmessen wie die LEDCOMM-Verbindung arbeitet, ist etwas mehr Aufwanf nötig. Denn die Kapazität an so einer LED ist so winzig, das schon die Messleitung zum Oszilloskop deren Wert so verändert, dass die Schaltung nicht mehr funktioniert. Die Beobachtung muss also ebenfalls optisch erfolgen, ohne einen elektrischen Kontakt. Mit dem Phototransistor BPW40 in einfacher Schaltung ging das; beide R=10K. Die Fotos zeigen den Aufbau. Die Phototransistoren sitzen unter dem weißen Plastikstück das die Zimmerbeleuchtung abschirmte.

Zwei BPW40 am Soundkarten-Oszillograph Foto des Aufbaus... ...ledcomm in Aktion

Am Oszilloskop kann dann das Verhalten des Phototransistor sichtbar gemacht werden. Doch mein altes Oszilloskop speichert nichts. Immerhin konnte ich so schon mal schätzen, dass da eine Übertragung von Pulsen mit einer niedrigen Frequenz so um die 100 und 300 Hz in Gange war, also im Audiobereich. So einen Frequenzbereich kann man noch bequem mit einem Soundcard-Oszilloskop ansehen. Eine preiswerte externe 2-Kanal Soundkarte diente als AD-Wandler (Behringer, U-Control UCA202; 48kHz Konverter). Auf diese Weise erhält man auswertbare Bilder.

Verbindung ist "down" Verbindung ist "up"

Aufbau der ledcom-Beobachtungsstecke

Allerdings war die gute Empfindlichkeit des Phototransistors gleichzeitig das Problem. Er sieht jede Lichtquelle die in der Nähe ist, auch wenn diese seitlich oder von hinten in das klare Gehäuse kommt. Weil dieses Fremdlicht störte, war zunächst das Wechselspiel der LEDs auch damit nicht klar darzustellen.

Nach einigen Versuchen wurde dann aber eine Anordnung gefunden, in der die LEDCOMM-LEDs sich einerseits noch gut „sehen“ konnten, andererseits aber auch genug Licht an „ihren“ Phototransistor abgaben. Und der Phototransistor abgeschirmt genug war, um nur „seine“ LED zu sehen. Der Trick bestand darin die LEDs ganz knapp über eine weiße Wand hinweg sich anblinzeln zu lassen, während eine gute Portion ihres Lichtes von dieser Wand zurück in den Phototransistor geworfen wurde, der abgeschirmt in einem Messingröhrchen saß.

Das war die ursprüngliche Idee...
... die aber nicht ging; Störlicht von der Seite!
So gings dann.
Blick unter die Abdeckplatte auf die beiden Messingröhrchen, in denen die Phototransistoren stecken. Blick von der Seite auf eines der Messingröhrchen; die andere Seite ist symetrisch dazu aufgebaut. Ein kleiner Teil des Lichtes der LED geht über die Wand hinüber zur anderen LED.

Beobachtungsergebnisse

Ein U wird übertragen Es wurden die verschiedenen Zustände der ledcom registriert. Der Verbindungsaufbau, der DOWN- und UP-Zustand, und die Zeichenübertragung im UP-Zustand. Mit dem Scope war es leicht Ausschnitte im Signal zu finden die zeigen was da tatsächlich geschieht.

Wie dann ein Zeichen übertragen wird zeigt das nebenstehende Bild. Hier wurde ein großes U gesendet. Dazu wurde im Terminalfenster des sendenden LaunchPads einfach das U festgeklemmt. Von der Gegenseite wurde dies empfangen, man sieht deren Synchronisation in die Lücken des Zeichens. Auch hier wird die Zeit von rechts nach links gelesen, rechts die zeitlich älteren Pulse, links die jüngeren. Man sieht einen breitern Startpuls, dann die Abfolge schmal, breit, schmal, breit, schmal, breit, schmal. Es werden 7Bit übertragen.

Das U liest sich binär also so: Startbit, 1010101

Die rote LED als Photozelle

Dieses Experiment verdanke ich ebenfalls Matthias Koch.

Das eine LED auch etwas Spannung erzeugt wenn sie beleuchtet wird, kann man am LaunchPad recht einfach zeigen. Auf der Platine ist eine kleine rote LED schon vorhanden, angeschlossen an Pin P1.0, der Vorwiderstand stört da nicht weiter. Macht man diesen Pin zum Eingang, kann man im Kanal-0 mit dem ADC10-Wandler dort nachschauen was passiert, wenn die kleine rote LED im Hellen oder Dunklen ist. Hier ein kleines Forthprogramm dazu: Rotauge. - das Forthwort ADC@ liefert den Messwert. Um den Hell-Dunkel-Effekt deutlich zu erkennen, kann man die superhelle rote LED, die im klaren Gehäuse aus dem Ledcomm-Experiment, gleich auch hier als Beleuchtung verwenden - das Bild zeigt den simplen Aufbau. Die Forthworte HELL und DUNKEL schalten die LED ein und aus.

Der Aufbau......in Betrieb.

LED-1 beleuchtet die kleine rote LED-2

Die sampels zeigen deutliche hell/dunkel Unterschiede

Wie der Analog-Digital-Umsetzter ADC10 konfiguriert wird, bitte dem User Manual des MSP430G2553 entnehmen. Im Prinzip geht das so: Die gewünschten Eigenschaften des ADC einstellen, und dann per Software eine einzelne Conversion anstoßen. Dann das Ergebnis aus dem Register des ADC auf den Datenstack holen. Die kleine rote LED braucht etwas Zeit bis sich die Spannung am Eingang so aufbaut, dass deutliche Unterschiede erkennbar werden. Bei meinem Exemplar taten es 200ms.

Spannungsteiler

Mehrere der Port-pins können zu Eingängen für die ADC-Kanäle gemacht werden, ein Pin je Kanal. Die MCU hat einen ADC10, d.h. die Spannung am Pin kann in 10Bit=1024 Stufen abgebildet werden. Für den Test wurde das ADC-Test-Programm in Forth benutzt. Es konfiguriert Pin P1.4 als Eingang für den 4. Kanal des ADC10, initialisiert ihn, und stellt das Wort ADC bereit, mit dem eine einzelne Konversion gestartet und ausgelesen werden kann.

Offener Portpin

Was an dem offenen Inputpin P1.4 passiert zeigt das Diargamm. Es werden schwankende Spanungswerte gefunden, die scheinbar wahllos auftreten - Rauschen. Ein Draht an diesem Pin erhöht die Schwankungen, besonders wenn man das blanke Ende anfasst. Die Stichproben wurden im Sekundentakt genommen. Schließt man den Draht an GND (Vss) an, misst man den Wert 0 . An Vcc findet man 1023 . Der Eingang arbeitet also korrekt. Die stark schwankenden Werte dazwischen sind also tatsächlich Rauschen auf der Leitung. Der Draht wirkt als Antenne.

ADC Stichproben im Sekundentakt vom offenen Eingang.

Das Ganze in Zahlen.

offener Eingang P1.4 mit Draht angefasst
328 max 335 max568 max
302,02 Mittelwert 290,74 Mittelwert 405 Mittelwert
269 min 222 min 248 min
13,6984 Abweichung 21,1296 Abweichung 104,5 Abweichung
4,54% 7,27% 25,80%

Ohmsche Widerstände

Das Bild ändert sich wenn man einen Spannungsteiler anschließt. Der ADC-Wert stellt sich auf den Wert am Spannungsteiler ein, und die Schwankungsbreite der Werte wurde etwas geringer. Ein Tantal-Kondensator zwischen dem Eingang und Vss (Tiefpass) glättet das Rauschen noch weiter.

Der Spannungsteiler aus drei 10K und 10µF Tantal als Tiefpass

Es wurde R=10K gewählt. Ein Draht an P1.4 wurde abwechseln an Punkt x1 und Punkt x2 gehalten. Dabei wurden nachstehende Werte abgelesen.

x1x2x1 & C
adc gemittelt 675,5adc gemittelt 346,5adc gemittelt 683
min 669min 341min 681
max 682max 352 max 685
Differenz 13Differenz 11Differenz 4

Für die Konversion der Spannung am P1.4 in einen relativen digitalen Wert war der ADC10 so eingestellt, dass die interne Referenzspannung Vref = 2,5V als Bezug diente, und nicht Vcc ! Der ADC-Messwerte muss also auf 2,5V bezogen umgerechnet werden (Vadc). Das ergibt gegenüber dem Messwert eine lineare Abweichung nach unten, und man müsste einen Korrekturfaktor hinzunehmen, um den echten Wert zu erhalten. Da Vcc je nach Last an der MCU schwanken kann, wird auch der Messwert mitschwanken. Sodass statt Vcc eine stabilisierte und geeichte Referenzspannung nachmal besser wäre. Daher gibt es die Möglichkeit, die Referenzspannung der MCU auf einen Portpin nach außen zu schalten, und den Spannungsteiler mit Vref statt Vcc zu treiben. Das wurde hier jedoch weggelassen um das Prinzip zu zeigen.

Gemessen mit dem Multimeter und mit dem ADC10.

R Vmeß Vadc ADC-Wert
Vcc 29,64 3,56 2,50 1023,00
x1 19,86 2,35 1,68 675,50
x2 9,97 1,21 0,84 346,50
Vss 0 0,00 0,00 0,00
R1 9,780
R2 9,890
R3 9,970
Korrekturfaktor 1,42
x1korr 2,39
x2korr 1,20

Fotowiderstand

Aus dem vorherigen Versuch lässt sich leicht ein Weiterer machen, mit dem ein Fotowiderstand (LDR) beobachtet werden kann. Ein Laserpointer diente als schaltbare punktgenaue Beleuchtung direkt auf den LDR. Der kleine Fotowiderstand stammte aus einer Grabbelkiste, no-name, billig. Seine Widerstandswerte bei verschiedener Beleuchtung waren:

Dunklheit3MΩ
Leuchtstoffröhre in 2m Entfernung1,35kΩ
Direkt im Laserpointer-Licht400Ω

Er spricht also gut auf Licht an. Damit lassen sich helligkeitsbezogene Anwendungen realisieren, wenn diese langsam genug erfolgen. Dieser LDR war gegenüber einem Fototransistor träge. Ein Versuch mit einer 220V-Glühbirne und Oszilloskop zeigte, das er den Helligkeitsveränderungen (Strahlungsveränderungen!) durch den 50Hz Wechselstrom eher ohmsch folgte. Birne näher ran, sinkender Pegel im Spannungsteiler; weiter weg, steigender Pegel. Aufgelagert war eine leichte Welligkeit mit 10ms Periode und 0,1V Amplitude, an der der Wechselstrom im Lichtsignal noch zu erkennen war. Also schon recht träge, aber in „Helligkeit“ über die Zeit ok. Ganz langsame Helligkeitsänderungen brauchen dann noch weitere Maßnahmen damit diese sicher erfasst werden - Richard S. LaBarbera, Intelligent Dusk/Dawn Light Sensor, Oktober 2006. 19 Seiten PDF - Freundlicherweise bereitgestellt von Matthias Koch.

R2 und R3 aus der vorherigen Schaltung wurden durch einen LDR erseetzt.... ...und beleuchtet mit einem roten Laserpointer im schummrigen Kellerlicht.

Elektretmikrofon

Ersetzt man den Fotowiederstand durch eine https://de.wikipedia.org/wiki/ElektretmikrofonElektret-Mikrofonkapsel erhält man eine einfache Möglichkeit Schall aufzuzeichnen. Der Feldeffekt-Transistor der Mikrofonkapsel wirkt dabei wie ein schallempfindlicher Widerstand. Die Spannungsschwankungen können direkt mit dem ADC-Eingang erfasst werden. Es ist bei diesem Aufbau nicht nötig einen Kondensator dazwischen zu geben. Die Mikrofonkapsel stammte aus einem ausgemustertem USB headset, war also für die niedrige Spannung von 5V geeignet.

Die Abfrage des ADC10-Eingangs kann mit Forth einfach durchgeführt werden. Das kleine Testprogramm registriert den Spannungspegel als ganzzahligen Wert. Minimum und Maximum werden gespeichert. So kann die Amplitude, die eine Schallwelle am Spannungsteiler auslöst, ermittelt werden. Der verwendete Mikroprozessor wäre schnell genug die Schallwelle feiner abzutasten, hat aber nicht genug RAM um die Werte alle zu speichern. Hier ging es ja auch nur um das Prinzip, und das kann man schon erkennen wenn die Extremwerte registriert werden.

Im Beispiel „Händeklatschen“ ist schön zu erkennen wie die Amplitude sich mit dem Schalldruck ändert. Am ADC10 wurden dabei registriert:

test3
81 435 981 900 ok

Die Pegel lagen zwischen 81 und 981 was eine Differenz von 900 ergibt, der Messbereich war 0…1024. Es lässt sich also ein sehr deutliches großes Signal einfach finden. (Die Mikrofonkapsel war recht unempfindlich, man musste schon laut klatschen und auch ganz in der Nähe. Aber so ist es wohl gewollt bei solchen Mikrofonen aus einem headset.) Das Bild am Oszilloskop zeigt welche Pegel beim Händeklatschen entstanden sind. Die starken Ausschläge dauerten 6.95mS mit einer Spanungsschwankung von 2.72V.
Das Elektretmikrofon wird mit Spannung versorgt über einen Widerstand Testaufbau Elektretmikrofon am ADC-Eingang des LaunchPad Pegel beim Händeklatschen.

\ mikrofon test  4e4th

\ ADC input Versuche

hex
01B0 CONSTANT ADC10CTL0
01B2 CONSTANT ADC10CTL1
01B4 CONSTANT ADC10MEM
004A CONSTANT ADC10AE0

0020 constant p1in
0021 constant p1out
0022 constant p1dir
0027 constant p1ren

bin
\ FEDCBA9876543210
\   1               SREF_1      1*0x2000 VREF+ and VR- 
\    1              ADC10SHT_2  2*0x800  16 x ADC10CLKs
\          1        REF2_5V     0x040    ADC10 Ref 0:1.5V / 1:2.5V 
\           1       REFON       0x020    Reference on
\            1      ADC10ON     0x010    ADC10 On/Enable 
0011000001110000  CONSTANT ADCSETUP

0000000000000010  CONSTANT ENC      \ Enable Conversion.
0000000000000001  CONSTANT ADC10SC  \ sample-and-conversion start.
0000000000000100  CONSTANT ADC10IFG
0100000000000000  CONSTANT INCH4    \ input chanel 4 <------------
00000001 CONSTANT BIT0
00000010 CONSTANT BIT1
00000100 CONSTANT BIT2
00001000 CONSTANT BIT3
00010000 CONSTANT BIT4
00100000 CONSTANT BIT5
01000000 CONSTANT BIT6
10000000 CONSTANT BIT7

: ADC-INIT
  adcsetup ADC10CTL0 !
  inch4 ADC10CTL1 !        \ input channel 4
  bit4  ADC10AE0  c! ;     \ Analog Input Enable P1.4 = CA4
: ADC+   1 ADC10CTL0 cset ;  \ Start ADC10  
: ADC-   1 ADC10CTL0 cclr ;  \ STOP ADC10 
: ADC \  -- adcmem       sample & convert once
  ENC ADC10SC +  ADC10CTL0 cset  
  BEGIN ADC10IFG ADC10CTL0 cget UNTIL adc10mem ;

hex  variable MINIMUM   variable MAXIMUM 

: INIT     
  bit4  p1dir cclr  \ P1.4 is input
  bit4  p1ren cclr  \ resistor disable
  bit4  p1out cset
  adc- adc-init adc+ 
  FFFF minimum !   0 maximum !  ;

decimal  
: range   ( n -- )
  dup minimum @ umin minimum !
  maximum @ umax maximum ! ;

: .adc
  minimum @ u. 
  adc @ dup u. range 
  maximum @ u. 
  maximum @ minimum @ - u. ;

: TEST      init page BEGIN  1000 ms page .adc  key? UNTIL ;
: TEST2     init page BEGIN          page .adc  key? UNTIL ;
: TEST3     init begin adc @ range key? until cr .adc ;

: .DATA   init 50 0  DO cr adc @ u. LOOP ;
: .DATA2  init 50 0  DO cr 100 ms adc @ u. LOOP ;

( finis )