
Für eines meiner Projekte benötigte ich vor einigen Wochen ein IC, das bei 5 V Gleichspannung folgendes Verhalten zeigt: Der Ausgang nimmt für eine bestimmte Zeit High-Pegel an und danach wieder Low-Pegel, und zwar bei auslösendem kurzem Steuerimpuls oder bei länger anstehendem High-Pegel am Eingang. Es ist dies das Verhalten einer monostabilen Kippschaltung (Monoflop), konnte ich in einem Fachbuch zur Digitaltechnik [1] nachlesen.
Für diese Zwecke gibt es ICs, wie z. B. das
74LS221 mit zwei solchen Kippgliedern oder das CMOS-IC 4047 und andere.
Da ich mich aber gerade ein wenig mit der Programmierung des ATtiny13
beschäftigte, wollte ich versuchen, mit diesem ein Monoflop per
Assembler-Programm mit so wenig externen Bauteilen wie möglich zu
verwirklichen.
Bei einem Monoflop-IC wie den oben genannten
wird normalerweise die Verweildauer durch einen Widerstand und einen
Kondensator festgelegt. Da diese in bestimmten Bereichen einstellbar
sein soll, erfolgt dies durch ein Potenziometer oder Trimmerpoti
zusammen mit einem Kondensator.
Diese Möglichkeit schloss ich
für den ATtiny13 aus und fand im Kapitel „6 Der Timer/Counter" des
Handbuchs zum Lernpaket Mikrocontroller [2] mit der Überschrift
"Minuten-Timer" entscheidende Hilfen für die Gestaltung meines
Assembler-Programms für die Verwendung des Mikrocontrollers als
Monoflop. Der Nachteil eines in Anlehnung an das dort abgedruckte
Listing gestaltetes Assembler-Programm besteht allerdings darin, dass
die Verweildauer für bestimmte Fälle stets neu programmiert werden
müsste.
Wie konnte ich die Zeit einstellbar machen? Beim
intensiven Lesen im Handbuch fand ich eine weitere Hilfe im Kapitel „7
Der AD-Wandler" mit der Überschrift "7.2 8-Bit-Messung". Das Ergebnis
einer solchen Messung ist je nach Eingangsspannung von 0 bis 5 V ein
Zahlenwert von 0 bis 255. Diesen Wert wollte ich zur Einstellung der
Verweildauer des Monoflops nutzen.
Es sollte mit einem High-Pegel an PB3 aktiviert werden können.
Dazu
sah ich mir die Ausführungen zum Auswerten eines Eingangs im Kapitel
„4.7 Digitale Eingänge" genau an und gestaltete auf der Grundlage der
oben drei genannten Beispiel-Programme aus dem Handbuch zum Lernpaket
Mikrocontroller mein Assembler-Programm für den ATtiny13, damit dieser
sich wie ein Monoflop verhält.
Dies ist hier ist ein Ausschnitt aus diesem Assembler-Programm.


;
AD-Wandler-Teil
zum
Einlesen
des
Faktors
für
die
Dauer
des
Impulses

ldi
ADW1,3

out
ADCSRA,ADW1
sbi
ADCSRA,ADEN
dec
ADW1
out
ADMUX,ADW1
;
ADC2
(PB4)
auswaehlen
sbi
ADMUX,ADLAR
;
8-Bit-Aufloesung
festlegen
sbi
ADCSRA,ADSC
Sbic
ADCSRA,ADSC
;
Wert
ueber
AD-Wandler
einlesen
Rjmp
AD_frt
Sbi
ADCSRA,ADSC
Sbic
ADCSRA,ADSC

Rjmp
AD_frt1
in
ADW1,ADCH

;
und
nach
ADW1
uebertragen
;
Ende
des
AD-Wandlerteils

;Der
Start
soll
mit
Logikpegel
High
an
PB3
erfolgen.
sbic
pinb,3
;
Bei
High
an
PB3
Sprung
zu
weiter1
rjmp
weiter1
sbis
pinb,3
rjmp
schl

;
bei
Low
an
PB3
wieder
zurueck
nach
schl.
sei


;
Durch
Setzen
des
Global
Interrupt
Flags

;
globalen
Interrupt
ermoeglichen

cpi
r20,1
;
Ist
der
Inhalt
von
Register
r20
bereits
1
?
;
Groessere
Werte
als
1
ergeben
laengere
Dauer
des
Impulses.
brlo
schl0
;
wenn
nein,
dann
zurueck
nach
schl0
cli


;
Durch
Loeschen
des
Global
Interrupt
Flags
Interrupt
sperren
cbi
portb,0
;
LED
an
Portb.0
ausschalten
;
notwendig
fuer
einmalige
Ausfuehrung
bei
Logikpegel
High
an
PB3
sbis
pinb,3
;
Bei
High
an
PB3
geht
es
nach
weiter2
rjmp
weiter2

sbic
pinb,3
;
und
bei
Low
an
PB3
wieder
zurueck
nach
schl1.
rjmp
schl1



rjmp
Start
;
Der
Einfachheit
wegen
Ruecksprung
nach
StartDies ist der Anschlussplan, nach dem ich die Bauteile an den Mikrocontroller anschloss.

Die Bedienung des Monoflops geschieht nach Übertragung der Hex-Datei zum ATtiny13 folgendermaßen:
Durch
kurzes Berühren bzw. lange dauerndes Verbinden des Anschlusses 1 des
10k-Widerstandes mit Vcc wird das Monoflop gestartet, nachdem die
Verweilzeit zuvor mit dem Trimmerpoti eingestellt wurde.
Dieses
stellt je nach Einstellung eine Gleichspannung zwischen 0 und ca. 5 V
bereit, die an ADC2 (PB4) eingelesen und im Programm des ATtiny13 als
Zeitkonstante mit einem Wert zwischen 0 und 255 ausgewertet wird.
Es lässt sich über das Trimmerpoti eine Verweildauer von bis zu etwa 10 Sekunden einstellen.
Eine Vergrößerung der Verweildauer um den Faktor 4 ist auch über eine 10-Bit-Messung möglich.
Hier folgt ein Ausschnitt aus dem Assembler-Programm, das dies berücksichtigt.
AD-Wandler-Teil
zum
Einlesen
des
Faktors
für
die
Dauer
des
Impulses
Ldi
ADW1,3

out
ADCSRA,ADW1
sbi
ADCSRA,ADEN
dec
ADW1
out
ADMUX,ADW1
;
ADC2
(PB4)
auswaehlen
sbi
ADCSRA,ADSC
Sbic
ADCSRA,ADSC
;
10
Bit-Wert
ueber
AD-Wandler
einlesen
rjmp
AD_frt
sbi
ADCSRA,ADSC
Sbic
ADCSRA,ADSC
rjmp
AD_frt1
in
ADW1,ADCL

;
und
nach
ADW1
in
ADW2,
ADCH
;
sowie
ADW2
uebertragen
inc
ADW2
;
notwendig,
damit
der
Inhalt
von
ADW2


;
auch
bei
kleinen
Eingangsspannungen

;
mindestens
1
ist


;
Einfuegen
von
lsl
ADW2


;
Multiplikation
mit
2

;
in
der
Zeile
darunter
fuehrt
zu
einer

;
Verdopplung
der
Impulszeit
;
Ende
des
AD-Wandlerteils

;Der
Start
soll
mit
Logikpegel
High
an
PB3
erfolgen.
sbic
pinb,3
;
Bei
High
an
PB3
erfolgt
ein
Sprung
zu
weiter1,
rjmp
weiter1
sbis
pinb,3
rjmp
schl
;
bei
Low
an
PB3
wieder
zurueck
nach
schl.
sei

;
Durch
Setzen
des
Global
Interrupt
Flags

;
Globalen
Interrupt
ermoeglichen

cp
r20,ADW2
;
Ist
der
Inhalt
von
Register
r20


;
bereits
gleich
dem
von
ADW2
?
brlo
schl0
;
wenn
nein,
dann
zurueck
nach
schl0
cli

;
Durch
Loeschen
des
Global
Interrupt
Flags

;
Interrupt
sperren
cbi
portb,0
;
LED
an
Portb.0
ausschalten

notwendig
fuer
einmalige
Ausfuehrung
bei
Logikpegel
High
an
PB3

sbis
pinb,3
;
Bei
High
an
PB3
geht
es
nach
weiter2
rjmp
weiter2

sbic
pinb,3
;
und
bei
Low
an
PB3
zurueck
nach
schl1.
rjmp
schl1
rjmp
Start
;
Der
Einfachheit
wegen
Ruecksprung
nach
Start

Ich probierte auch diese Version des Schaltungsaufbaus aus. Der Widerstand von 10 k ist als Pull-up-Widerstand angeschlossen. Das Monoflop wird mit einem Low-Pegel aktiviert.
Die wesentlichen Programmänderungen sind hier im Ausschnitt eines der jeweiligen Assembler-Listings (8-Bit- Version und 10-Bit-Version) zu erkennen. Diese Zeilen sind bei beiden Listings gleich.

;Der
Start
soll
mit
Logikpegel
Low
an
PB3
erfolgen.
sbis
pinb,3

;
Bei
Low
an
PB3
erfolgt
ein
Sprung
zu
weiter1,
rjmp
weiter1
sbic
pinb,3
rjmp
schl

;
bei
High
an
PB3
wieder
zurueck
nach
schl.
;
notwendig
fuer
einmalige
Ausfuehrung
bei
Logikpegel
Low
an
PB3

sbic
pinb,3
;
Bei
Low
an
PB3
geht
es
nach
weiter2
rjmp
weiter2

sbis
pinb,3
;
und
bei
High
an
PB3
wieder
zurueck
nach
schl1.
rjmp
schl1


rjmp
Anfang
;
Der
Einfachheit
wegen
Ruecksprung
nach
Anfang
Download: Quelletexte T13_MF