Armins AVR-Buch - Zeitschaltungen

⇑Zeitschaltungen


(armin77, 17.05.2013, 14:24:15)

Will man verschiedene Ports in verschiedenen Zeitabständen aus oder
ein schalten kommt man mit dem Befehl Wait nicht weiter.
Dafür verwendet man am besten einen Timer.
Man wählt eine geeignete Zeitbasis aus, die zu den Umschaltzeiten paßt.
Ich habe 1ms gewählt, weil ich die LED`s zwischen 500ms und 2 s blinken lasse.
Ich verwende hier Timer0. Wenn dieser bei einem Takt von 1MHZ von 130 bis 255
zählt und dann überläuft ist genau 1ms vorbei.
Für eine längere Zeitbasis nimmt man einen größeren Vorteiler/Prescale und/oder den 16Bit Timer1.
Im Timerinterrupt werden die vier Hilfsvariablen für die Schaltzeiten der 4 Ports hochgezählt.
Im Hauptprogramm wird ausgewertet, ob 500 erreicht ist. Dann wird Portd.1 umgeschaltet, nach 1000 Portd.2 usw.
Die Hilfsvariablen werden nach Erreichen des Vorgabewertes wieder null gesetzt und das Spiel geht von vorne los.
So kann das Programm immer laufen ohne Wait.
Die Schaltschwellen kann man auch als Analogwert einlesen und somit über ein Poti einstellen wann die entsprechenden
Aktionen erfolgen sollen.


Hier mal ein einfaches Beispiel:

$regfile = "m8adef.dat"
$Crystal=1000000
$hwstack=30
$swstack=30
$framesize=30


Config Portd = Output
Dim Zaehler1 As Word
Dim Zaehler2 As Word
Dim Zaehler3 As Word
Dim Zaehler4 As Word

Config Timer0 = Timer , Prescale = 8
On Timer0 Zaehlen
Enable Timer0
enable INTERRUPTS
Do
If Zaehler1 >= 500 Then
Toggle Portd.1
Zaehler1 = 0
End If

If Zaehler2 >= 1000 Then
Toggle Portd.2
Zaehler2 = 0
End If

If Zaehler3 >= 1500 Then
Toggle Portd.3
Zaehler3 = 0
End If

If Zaehler4 >= 2000 Then
Toggle Portd.4
Zaehler4 = 0
End If
Loop
End

Zaehlen:
Timer0 = 130
Incr Zaehler1
Incr Zaehler2
Incr Zaehler3
Incr Zaehler4
Return


Hier noch ein Bild vom Aufbau.
Zu sehen ist eine Trägerplatine mit zwei 28er Nullkraftsockeln, die 5V Platine und
die Digital-Ausgabeplatine vom Strippenstrolch.

Bild timer.jpg