Atmel AVR
Vor einigen Tagen habe ich spontan meine Liebe zur Digital-Elektronik wiederentdeckt durch
zufälliges Lesen eines Artikels über Atmels AVR-uController. Ich habe mir einen bestellt (ATmeta8), und nachdem er sich innerhalb von einer halben Stunde seriell mit mir unterhalten und LEDs blinken lassen konnte, habe ich wieder Lust bekommen, Basteleien mit uC's
durchzuführen: Lichtmuster-Generator, ein Küchenwecker, eine mikrosekundengenaue Stoppuhr etc.
Atmel-Projekte
Hier eine Liste von Projekten, die ich mit verschiedenen Atmel-Controllern durchgeführt habe (eine
genauere Beschreibung sowie Schaltpläne oder Programme möchte ich nach und nach ins Netz stellen,
auf Wunsch können sie schon mal via E-Mail angefragt werden):
Ein Evaluation-Board mit diverser Hardware
Features:
- Zwei ATmega8, einer fest mit einem 16x2-LCD-Display verbunden, der andere mit einem 4-stelligen LED-Display (gemultiplext)
- 4x4-Matrix-Keyboard
- 8 LEDs, 2 Taster, 2 Schalter
- 1 Berührungsschalter
- 1 TSOP1736 für IR-Fernsteuerungen
- 1 Summer
- 1 2-Bit-DAC zur Dimmung der LED-Anzeige
- 2 Power-MOSFETs zur Steuerung hoher Lasten (Lampen)
Basis-Schaltungen
Möglichst einheitliche Grundschaltungen mit verschiedenen üblichen Ein- und Ausgabevarianten
und einigen LED-/Beeper-Ausgängen als Grundlage für viele ähnliche Geräte (siehe hier
z.B. LCD-Metronom oder
Vortrags-Timer mit IR-Fernsteuerung.
Features:
- Wahlweise LCD- oder LED-Anzeige (Siebensegmentanzeige)
- Wahlweise tastenbasierte Eingabe oder RC5-IR-Fernbedienung
- Möglichst einheitliche Beschaltung
Ein Eingabegerät für SPI-Protokoll
Features:
- Anschluß einer PC-Tastatur (PS/2) zur Dateneingabe
- Erzeugung von max. 4 entprellten Signalen (Pulsen)
- Kommunikation mit einem SPI-Gerät mit max. 8 Bytes. Eingabe als Hex-String, Rückgabewerte des
SPI-Gerätes ebenfalls hexadezimal.
- Anzeige von bis zu 2 Gruppen a 4 Leitungen in hexadezimaler Notation.
Ein TTL-Sequencer/Logikanalysator
Dieses Gerät erlaubt es, Logikschaltungen (z.B. GALs) mit einer vorgegebenen Sequenz von TTL-Eingangswerten
zu füttern und deren Reaktion aufzuzeichnen. Es können so sowohl kombinatorische Schaltungen als auch
zeitabhängige Logikschaltungen überprüft werden. Die Daten werden von einem Steuerprogramm (Java), das auf
einem PC läuft, erzeugt.
Das Gerät stellt also um eine Kombination von Sequencer, der eine Reihe von Datenwerten vorgibt, und
Analysator, der die Reaktion des Schaltkreises festhält, dar. Der Mikrocontroller arbeitet als seriell-parallel
Konverter, der den RS232-Datenstrom vom PC parallel auf Port B ausgibt und die freien Bits von Port D
als parallele Eingabe nutzt, um einen Rückgabewert zum PC zu generieren.
Auf dem PC läuft ein Java-Programm, das verschiedene Datenquellen, z.B direkte Angabe der Sequenz über
Kommandozeile erlaubt. Die wesentliche Datenquelle ist hierbei ein Testscript, das in einer Datei sowohl
die zu erzeugenden Ausgangsdaten enthält, als auch die erwarteten Rückgabewerte. Es kann so ein
quasi-automatischer Test einer Schaltung durchgeführt werden.
Das Java-Programm nutzt einen Timer, um (einstellbar) alle 100 ms einen weiteren Schritt der Sequenz
abzuarbeiten.
Als Beispiel sei ein Testscript für ein GAL gegeben. Die entsprechende Ausgabe
ist hier gezeigt. Zur Verdeutlichen wurden alle Ein- und Ausgaben auch
noch mit einem handelsüblichen Logikanalysator aufgezeichnet hier
(grün/rot: sequenzierte Vorgabedaten, blau: gemessene Resultate).
Lichtmustergenerator mit AT90S2313
Beispiel: eine Ampelsteuerung für eine Straßenkreuzung mit Auto- und Fußgängerampel, Normalbetrieb sowie Blinkbetrieb. Mehr folgt bald.
Stopuhr
Mikrosekundengenaue Stopuhr mit ATMega8 für physikalische Experimente sowie
ein Zusatzgerät zur Erfassung von einzelnen Impulsen von Taktsignalen
Features:
- Auflösung 1 Mikrosekunde
- Maximaler Messbereich 16 Sekunden, minimaler Meßbereich 1 Mikrosekunde
- Mehrere Meßarten: Impuls, einfache oder doppelte Flanke
- Kumulative Messung von mehreren aufeinanderfolgenden Impulsen oder - mit dem Zusatzgerät - nur des
ersten Impulses passender Polarität
TTL-Taktgenerator/Zähler mit ATmega16
Features:
- Auflösung von 0,1 Hz bis 1 MHz in dekadischer und 1/2/5-facher Abstufung
- Der ebenfalls enthaltene Zähler kann bis zu 9.999 Impulse zählen und anzeigen.
Ein TTL-Frequenzzähler
für Frequenzen von 0.1 Hz bis ca. 4 MHz, Auflösung 1 Hz (0.1 Hz) mit
ATMega8 ([Schaltplan]). Meßzeit 1 sec, kontinuierliche
Messung. Der letzte gültige Meßwert wird natürlich konstant angezeigt, also keine durchrauschenden
unleserlichen Ziffern.
Ein Küchentimer
Features:
- eine Weckzeit
- drei unabhängige Timer 0-99:59 min
- akustische Ablaufanzeige, die nicht in einem fort nervt, sondern nach jeweils 15 sec Klingeln eine
Pause von 45 sec macht. Das ganze dreimal hintereinander, ab dann wird der abgelaufene Weckerzustand
nur noch durch eine blinkende LED sichtbar gemacht (damit der Wecker, wenn man verreist ist,
nicht zwei Wochen permanent klingelt ...)
- dimmbare Anzeige über einen 3bit-DAC, die auf die Umgebungshelligkeit reagiert; auf dem
Bild erkennt man ganz links den Phototransistor,
der die Umgebungshelligkeit registriert
- Quick Edit Mode: die üblichen Timerzeiten in Fünfminutenschritten von 5 min bis 45 min auf
einen Tastendruck eingestellt und dem nächsten freien Timer zugeteilt
Der Küchentimer kann in zwei Varianten gebaut werden: einmal die bequeme Variante mit einem
4x4-Tastenfeld
zur bequemen Handhabung (empfohlen), und eine sparsamere Variante mit nur
vier Tasten,
z.B. als Schlafzimmer-Wecker, wenn das Gerät nicht so oft umgestellt wird.
Als Ausgabegerät kann ein Piezosummer mit eingebauter Elektronik verwendet werden, oder ein normaler
8Ohm-Lautsprecher; in diesem Falle wird die Tonfrequenz über einen der AVR-Timer erzeugt.
Weitere Timer, diesmal mit LCD-Anzeigen:
Features:
- LCD-Anzeige entweder 2x8 oder 2x16 Zeichen
- ansonsten baugleich mit dem Küchentimer
Küchenwecker mit IR-Fernsteuerung
Noch mehr Timer, diesmal mit IR-Fernsteuerung und LED- oder LCD-Anzeigen:
Features:
- LED-Anzeige oder LCD-Anzeige/2x8 oder 2x16 Zeichen
- Steuerung aller Funktionen über eine normale IR-Fernbedienung (RC5-codiert)
- ansonsten baugleich mit dem Küchentimer
Ein Schlafzimmerwecker
Features:
- eine Weckzeit, ein Timer 0-99:59 min
- akustische Ablaufanzeige (eh klar :-) ), auch hier wieder die bewährte Lösung, die nach dreimaligem
Klingeln (15 sec) und Pause (45 sec) nur noch eine LED blinken läßt, um die Nerven der Mitbewohner zu
schonen, wenn man schon aus dem Haus ist und das Ding nicht abgestellt hat
- dimmbare Anzeige, die auf die Umgebungshelligkeit reagiert
Ein Metronom
Features:
- Bereich 5-250 bpm mit digitaler Geschwindigkeitsanzeige
- Rhythmus-LEDs für 1 bis 4 Schläge/Takt
- akustische Ausgabe (eh klar)
Ein Metronom mit LCD-Anzeige
Features:
- LCD-Anzeige 1x8 sowie LED-Anzeige der Schläge
- Bereich 5-250 bpm
- Rhythmus-LEDs für 1 bis 6 Schläge/Takt, Unterscheidung von Haupt- und Nebenbetonungen
in Form unterschiedlich gefärbter LEDs
- akustische Ausgabe (eh klar), Unterscheidung der Haupt- und Nebenbetonungen durch
unterschiedliche Frequenzen des Knack-Geräusches
Eine digitale Eieruhr/Timer
Features:
- Bereich 1-60 min bis zum Alarmton
- zügige Minuteneingabe über Drehpotentiometer als poor-man-Drehimpulsgeber (klappt prima!)
- Digitale Anzeige der eingestellten/verbleibenden Zeit
- akustische Ausgabe über Piezosummer oder Lautsprecher
Ein Fahrrad-Tachometer
Die Schaltung nimmt mittels eines Reed-Kontaktes die Drehung des Rades auf und berechnet daraus die Drehungsfrequenz
und die Wegstrecken, Geschwindigkeiten und Beschleunigung. Features:
- Drei Anzeigemodi: aktuelle Werte, maximale/durchschnittliche Werte, interne Werte
- Anzeige in m/s oder km/h
- Anzeige von gefahrener Strecke, Geschwindigkeit und Beschleunigung (!)
- Speichern der Tagesleistung auf Wunsch additiv zur bisherigen Gesamtleistung im EEPROM
Ein Vortrags-Timer
Dieses Gerät soll helfen, einen wissenschaftlichen Vortrag z.B. auf einer Tagung im Zeitrahmen zu halten. Typischerweise
ist ein solcher Vortrag in drei Phasen einteilbar: eigentlicher Vortrag (z.B. eine halbe Stunde), Diskussion (z.B. eine
Viertelstunde) und Rest- oder Sicherheitszeit (z.B. max. 15 min bis zum Beginn des nächsten Vortrags). Das Gerät erlaubt
es nun, im Vorneherein die Dauer der drei Phasen (angezeigt als grün, gelb und rot) einzugeben. Sobald der eigene Vortrag
beginnt, beginnt eine Phase nach der anderen sekundenweise herunterzuzählen, sodaß man immer einen guten Überblick hat,
ob man gut in der geplanten Zeit liegt oder nicht. Sobald das Gerät bei Erreichen von 0 Sekunden Restzeit von Phase grün zu
Phase gelb wechselt, sollte man zum Ende kommen, da sonst die Diskussionszeit entsprechend verkürzt werden müßte.
Spätestens den Wechsel in Phase rot sollte man erstnehmen!
Ist man andererseits vorzeitig mit dem Vortrag fertig, kann man in die Gelbphase weiterschalten, wobei die eingesparte
Restzeit der Gelbphase (und entsprechend dann auch der Rotphase) zugeschlagen wird.
Features:
- Drei Zeitabschnitte (grün, gelb, rot) mit bis zu 99 Minuten Dauer
- Ist man in einem Zeitabschnitt früher fertig, wird die Restzeit auf den nachfolgenden Zeitabschnitt übertragen
- Pause-Funktion, falls der Vortrag unterbrochen werden soll
Ein Vortrags-Timer mit LCD und IR-Fernsteuerung
Dieses Gerät weist die gleiche Funktionalität wie der obige Vortragstimer auf, kann aber durch eine IR-Fernbedienung (RC5-Code)
ferngesteuert werden und zeigt die Daten über LCD an. Auf diese Weise können mehr Daten ausgegeben werden, die Bedienung
ist einfacher, aber natürlich sind die Zeit-Daten nicht so gut zu erkennen wie mit der selbstleuchtenden Siebensegment-Anzeige.
Features:
- Drei Zeitabschnitte (grün, gelb, rot) mit bis zu 99 Minuten Dauer
- Ist man in einem Zeitabschnitt früher fertig, wird die Restzeit auf den nachfolgenden Zeitabschnitt übertragen
- Pause-Funktion, falls der Vortrag unterbrochen werden soll
- Akustische Alarmausgabe, falls Phase rot überschritten wird (mit Selbststop nach 3 Alarm-Abschnitten, damit das
Gerät auch mal aufhört zu nerven, falls man den Raum längst verlassen hat (erinnern Sie sich an die vergessenen Wecker
in Hotels, die, wenn es sein muß, drei Tage lang quietschen, läuten und dudeln))
Ein Digital-Thermometer mit ATtiny26 und Fühler LM35
Features:
- Bereich -25 bis +77 oC
- Auflösung 0,1 oC, wobei der Temperaturfühler eine Genauigkeit von 0,5 oC garantiert,
seine Ausgangsspannung aber eine höhere Auflösung aufweist.
- Digitale Anzeige über 4-stelliges LED-Display
- Die Umrechnung des ADC-Meßwertes in eine Temperatur erfolgt ohne Mathe-Bibliothek
Die negative Hilfsspannung für den LM35 wird durch einen ICL7660 bereitgestellt, die analoge Signalverarbeitung
(Spreizung des Signals von -0.25/0.77V auf 0/5 V) erfolgt durch einen LM324.
Ein 4-Kanal-Digital-Thermometer
mit ATmega8, 4 Fühler LM35, LCD-Anzeige
Features:
- Bereich -50 bis +150 oC
- Auflösung 0,2 oC, wobei der Temperaturfühler eine Genauigkeit von 0,5 oC garantiert,
seine Ausgangsspannung aber eine höhere Auflösung aufweist.
- Digitale Anzeige über 2x8-stelliges LCD-Display
- Triggerung aller 4 Kanäle manuell, 2x pro Sekunde, durch externen Impuls oder durch ein
RS232-Kommando
- Aufzeichnung der Meßwerte über RS232
Die negative Hilfsspannung für den LM35 wird durch einen ICL7660 bereitgestellt, die analoge Signalverarbeitung
(Spreizung des Signals von -0.5/1.5V auf 0/5 V) erfolgt durch einen LM324. Die Eingänge werden durch einen
4051-Analogmultiplexer auf einen ADC-Kanal geleitet, ebenso wird der 0V-Punkt und eine negative Offsetspannung
von etwa -0.5 V zur Signalanhebung über den Multiplexer gemessen, sodaß jede Kalibrierung automatisch
nach der Initialisierung des Geräts erfolgen kann.
Ein Testgerät für RC5-codierte IR-Fernbedienungen
Features:
- Zeigt Geräteadresse und Kommando eines erkannten Fernbedienungspakets an
Ein mit IR-Fernbedienungen gesteuerter CountDown
Features:
- Bereich 1 min bis 99 Stunden bis zum Alarm (optisch)
- zügige Zeiteingabe über Ziffernblock der Fernbedienung
- Digitale Anzeige der verbleibenden Zeit
- optische Ausgabe über blinkende LED
- Anhalten des Countdown mit einer Pause-Funktion
Zeitschaltautomat
für Beleuchtung, mit Fernbedienung gesteuert, mit einstellbarer Länge der
Leuchtdauer und eigenständiger oder manueller Abschaltung
Leucht-Deko-Objekt
Es läßt vier weiße Leuchtdioden in vier Helligkeitsstufen anhand mehrerer einprogrammierter
Sequenzen leuchten. Die Sequenzen und die Ablaufgeschwindigkeit läßt sich durch eine IR-Fernbedienung
steuern. Die Sequenzen können entweder relativ konstantes Licht erzeugen, das Licht langsam dimmen, oder
durch rasches Abdunkeln einen recht natürlichen Flackereffekt, einer Kerze ähnlich, erzeugen. Dieser ist
besonders gut bei Verwendung von warmweißen LEDs zu sehen.
Eine weitere Variante verwendet Software-PWM, um 8 LEDs nach einem Drehbuch zu dimmen. In Arbeit ist ein
Java-GUI, das es erlaubt, per Maus graphisch eine gute Lichtregie zu entwickeln und in das Steuerprogramm
zu übersetzen.
Bewässerungsautomat
Dieser Automat soll beim Bewässern von Pflanzen bei Abwesenheit helfen. Er kann bis zu
vier Pumpen steuern und greift dazu auf eine 24-Stunden-Uhr sowie 4 Sensoren zurück, die die
aktuelle Feuchtigkeit melden. Ein weiterer Sensor prüft, ob die Pumpen trockenlaufen oder
nicht.
Als Tastatur wird ein Billig-Matrixtastenfeld von Pollin benutzt, das mit Hilfe einer
Widerstandsnetzwerks ein Analogsignal liefert, sodass eine einzelne Leitung des AVR benutzt
wird anstelle vieler digitaler Signale.
Jeder Sensor stellt im Prinzip einen Berührungssensor dar, der mit Hilfe einer Darlingtonschaltung
auf sehr kleine Ströme mit einem digitalen Signal reagiert. Die Aktoren (Pumpenmotoren) werden
über MOS-FETs gesteuert, die größere Ströme schalten können. Eine Reihe von Leuchtdioden zeigt
den Füllstand des Reservoirs, der Sensoren und der Pumpenaktivität an. Über eine Reihe von
Menüs kann die Uhr gestellt und einige Parameter des Bewsserungsprogramms konfiguriert werden.
Die Feuchtigkeitssensoren sind derzeit einfache digitale Melder, die im Versuchsaufbau
einfach in eine Tonschale eintauchen, die mit Wasser gefüllt ist. Über ein Loch im eigentlichen
Topf erhält die Pflanze das Wasser aus der Schale.
Da die Hardware nun aufgebaut ist, kann ich verschiedene Algorithmen überprüfen, z.B. Wassergabe
nach einem Zeitschema, wobei die Sensordaten verwendet werden, um ein Zuviel an Wasser zu vermeiden.
Allgemeine AVR-Hardware-Hinweise
- Keramischer 100 nF-Abblock-Kondensator zwischen jedes GND-Vcc-Pinpaar.
- Reset: 10K Pullup-Widerstand nach Vcc, wenn Reset auch mit einem ISP-Kabel verbunden ist, sonst einfach an Vcc anschließen.
- MAX232 benötigt 4 Elkos > 10 uF sowie den 100 nF-Abblockkondensator,
MAX3232 benötigt 4 Kondensatoren > 100 nF.
- Beim Einsatz eines Quarzes diesen mit 2x 22-27 pF gegen GND schalten.
- SCL- und SDA-Leitungen mit 4K7 Pullup-Widerstand versehen
- Sollen Ausgänge auch im Einschaltmoment (bevor der uC die Ports initialisiert)
auf einem definierten Pegel liegen, müssen 10K-Pullup- oder Pulldown-Widerstände
verwendet werden.
- LEDs am besten anodenseitig an +5V, kathodenseitig an einen AVR-Pin legen, da der
AVR 5 mA source-Strom, aber 20 mA sink-Strom verkraftet.
Allgemeine AVR-Software-Hinweise
- Sichern und wiederherstellen der Interruptmaske in einem Interrupt-Handler:
IRQ_Handler:
in temp, SREG
cli
...
out SREG, temp
reti
- Das Statusregister SREG und die Bedeutung seiner Bits:
SREG.7 I Interrupt enable flag
.6 T Transfer bit
.5 H Half-carry flag
.4 S Sign flag
.3 V Overflow flag (für vorzeichenbehaftete Zahlen)
.2 N Negative flag (für vorzeichenbehaftete Zahlen)
.1 Z Zero flag (für alle Zahlen)
.0 C Carry flag (für alle Zahlen)
Die Flags werden nach folgenden Kriterien verändert (Details, welche Befehle welche Flags
betreffen, sind in der Liste der Assemblerbefehle angegeben):
- Das Z-Flag wird nach jeder Rechenoperation gesetzt, die eine Null als Ergebnis hat
add, sub, ...
tst R0 ; set flags according to R0
cp R0, R1 ; set flags according to comparison result
cpc R0, R1 ; set flags according to comparison result with carry
; more commands:
clz ; clear Z flag
sez ; set Z flag
breq target ; branch on Z flag set
brne target ; branch on Z flag cleared
- Das C-Flag wird gesetzt, wenn das Resultat bei einer Rechenoperation
zwischen der höchsten und niedrigsten vorzeichenlosen Zahl (255 und 0) wechselt.
add, sub, ...
cp R0, R1 ; set flags according to comparison result
cpc R0, R1 ; set flags according to comparison result with carry
; more commands:
clc ; clear C flag
sec ; set C flag
brcs target ; branch on C flag set
brcc target ; branch on C flag cleared
- Das N-Flag wird gesetzt, wenn das Register eine Zahl enthält, die - interpretiert als vorzeichenbehaftet -
negativ wäre, d.h. wenn das Bit 7 gesetzt ist.
add, sub, ...
neg R0 ; R0 = -R0
; more commands:
cln ; clear N flag
sen ; set N flag
brmi target ; branch on N flag set
brpl target ; branch on N flag cleared
- Das V-Flag wird gesetzt, wenn das Resultat bei einer Rechenoperation zwischen der höchsten
und niedrigsten vorzeichenbehafteten Zahl (127 und -128) wechselt.
add, sub, ...
; more commands:
clv ; clear N flag
sev ; set N flag
br?? target ; branch on V flag set
br?? target ; branch on V flag cleared
- Das T-Flag wird benutzt, um Bits aus einem Register in ein anderes zu übertragen:
bst R0, 4 ; transfer bit 4 of R0 in T flag
bld R1, 1 ; set bit 1 of R1 according to T flag
; more commands:
clt ; clear T flag
set ; set T flag
brts target ; branch on T flag set
brtc target ; branch on T flag cleared
Das Zusammenspiel der N-, V-, Z- und C-Flags kann man sehen, wenn man ein Register
wiederholt inkrementiert:
Registerinhalt vorzeichenlos mit Vorzeichen C Z N V
01111110 126 +126 ? ? ? ?
01111111 127 +127 0 0 0 0
10000000 128 -128 0 0 1 1
10000001 129 -127 0 0 1 0
...
11111110 254 -2 0 0 1 0
11111111 255 -1 0 0 1 0
00000000 0 0 1 1 0 0
00000001 1 +1 0 0 0 0
Viele Bits des Statusregister werden benutzt, um Zahlen miteinander zu vergleichen. Je nach
gewünschter Bedingung werden andere Flags herangezogen. Da ein Vergleich von R0 mit R1 durch
eine Subtraktion R0-R1 durchgeführt wird, sind die N-, V-, Z- und C-Flags von Nutzen dabei:
Vergleich Resultat C Z N V passender Befehl
R0=R1 0 ? 1 ? ? breq
R0!=R1 <>0 ? 0 ? ? brne
TODO
-
Die Timer
Da der Timer 1 ein 16bit-Timer ist, muß hier beim Lesen und Schreiben von Zählerständen und anderen 16bit-Timerdaten die Reihenfolge berücksichtigt werden, in der das High- und Lowbyte übertragen werden. Das Laden des Startwertes erfolgt
so:
ldi temp, HIGH(value)
out TCNT1H, temp
ldi temp, LOW(value)
out TCNT1L, temp
|
Lesen des aktuellen Zählerstandes (auch nutzbar für das Input Capture-Register
ICR1):
in tempLow, TCNT1L
in tempHigh, TCNT1H
|
Bei 8bit-Timern muß natürlich nur ein Register gelesen oder geschrieben werden.
Modus: Interrupt bei Timer Overflow (für one-shot und Timererweiterung durch Software)
ldi temp, HIGH(value) ; load start value
out TCNT1H, temp
ldi temp, LOW(value)
out TCNT1L, temp
ldi temp, 0 ; no PWM, no output compare
out TCCR1A, temp
ldi temp, 0b00000sss ; s = prescaler, no input capture
out TCCR1B, temp
ldi temp, 1<<TOIE1 ; T1 overflow interrupt
out TIMSK, temp
sei
|
Für periodische Operationen muß der Startwert im Interrupt-Handler neu in den
Zähler geschrieben werden, da der Zähler sonst nicht die gewünschte Anzahl an
Zyklen zählt, sondern fortan bei Null beginnt und immer 65536 Zyklen bis zum
nächsten Interrupt zählt. Dieser Modus ist also eher als "one-shot"-Modus zu
verwenden, hierfür müßte der Timer aber im Interrupthandler gestoppt werden.
Modus: Interrupt bei Timer Output Compare mit Zurücksetzen auf Null bei Gleichheit (für periodische Interrupts)
ldi temp, 0 ; clear counter
out TCNT1H, temp
out TCNT1L, temp
ldi temp, HIGH(compareValue); load compare value in OCR1A
out OCR1AH, temp
ldi temp, LOW(compareValue)
out OCR1AL, temp
ldi temp, 0 ; no PWM, no pin action for Output compare match
out TCCR1A, temp
ldi temp, 0b00001sss ; s = prescaler, no input capture, reset-counter
; on output compare match
out TCCR1B, temp
ldi temp, 1<<OCIE1A ; T1 output compare match interrupt
out TIMSK, temp
sei
|
Da der Zähler durch die Einstellung von TCCR1B bei jedem Interrupt auf Null
gesetzt wird, muß in diesem Modus für periodische Interrupts kein Wert im Interrupt neu geschrieben werden.
|