ATtiny13 als Monoflop
von Hermann Nieder

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.
Ganzen Artikel lesen...
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
AD_frt:

Sbic


ADCSRA,ADSC


;

Wert

ueber

AD-Wandler

einlesen

Rjmp


AD_frt

Sbi

ADCSRA,ADSC
AD_frt1:

Sbic


ADCSRA,ADSC


Rjmp


AD_frt1

in


ADW1,ADCH



;

und

nach

ADW1

uebertragen

;

Ende

des

AD-Wandlerteils
schl:


;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.
weiter1:

sei




;

Durch

Setzen

des

Global

Interrupt

Flags



;

globalen

Interrupt

ermoeglichen

schl0:

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
schl1:

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



weiter2:

rjmp


Start


;

Der

Einfachheit

wegen

Ruecksprung

nach

Start
Dies 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
AD_frt:

Sbic

ADCSRA,ADSC


;

10

Bit-Wert

ueber

AD-Wandler

einlesen

rjmp

AD_frt

sbi


ADCSRA,ADSC
AD_frt1:

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
schl:


;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.
weiter1:

sei



;

Durch

Setzen

des

Global

Interrupt

Flags



;

Globalen

Interrupt

ermoeglichen

schl0:

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


schl1:

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
weiter2:

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.
...
schl:


;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.
weiter1:
....

;

notwendig

fuer

einmalige

Ausfuehrung

bei

Logikpegel

Low

an

PB3

schl1:

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


weiter2:

rjmp


Anfang

;

Der

Einfachheit

wegen

Ruecksprung

nach

Anfang

....
Download: Quelletexte T13_MF
Bezugsquellen, verwendete Literatur:
[1] „Einführung in die Digitalelektronik", herausgegeben von Jean Pütz, VGS Köln, 1981
[2] Handbuch zum „Lernpaket Mikrocontroller", Franzis Verlag, 2007

Lernen Sie die ganze Vielfalt vom Franzis Buch- und Softwareverlag kennen