Start
Experimente
Grundlagen
Produkte
- ES-M32
-- Erster Test
-- USB
-- Bascom
-- RAM
-- ADC
-- Ports
-- Relais -- Morsen -- Datenlogger -- SIOS -- ASCII -- mV-Logger -- I/O12/24 V -- Bootloader
Neues
Impressum
|
ES-M32
Ports und PWM
Am Port D des ATmega32 liegen die
serielle Schnittstelle (PD0 unf PD1) und außerdem über
sechs Jumper die vier Tastschalter und zwei Ausgänge. Das Beispielprogramm weist den Schaltern Namen zu: S1...S4. Die
entsprechenden Ports werden als Eingänge mit internen Pullups
konfiguriert. Die Ausgänge an den LEDs heißen OUT1 und OUT2.
Sie liegen an PD4 und PD5, weil diese Anschlüsse auch als
PWM-Ausgänge genutzt werden können.
|
S1 Alias Pind.2 S2 Alias Pind.3 S3 Alias Pind.6 S4 Alias Pind.7
Config Portd = &B00110000 Portd.2 = 1 Portd.3 = 1 Portd.6 = 1 Portd.7 = 1
Out1 Alias Portd.4 Out2 Alias Portd.5
...
Sub Test3 Out1 = 0 Out2 = 0 Cls Locate 1 , 1 Lcd "S1=LED1 S2=LED2" Locate 2 , 1 Lcd "S3=LED1+2 S4=AUS" Do If S1 = 0 Then Out1 = 1 Out2 = 0 End If If S2 = 0 Then Out1 = 0 Out2 = 1 End If If S3 = 0 Then Out1 = 1 Out2 = 1 End If If S4 = 0 Then Out1 = 0 Out2 = 0 End If Waitms 10 Loop End Sub
Mit dem Test 3 werden die Tasten und
die LEDs verwendet. Wenn man auf eine Taste drückt wird der
entsprechende Portpin gegen GND gezogen und zeigt den Zustand 0. Eine
einfache Tastenabfrage lautet also dann "If S1 = 0 then". In diesem
Beispiel sind den vier Tasten bestimmte Ausgangszustände der
beiden LEDs zugeordnet. In einer realen Anwendung könnten
an den Ports z.B. zwei Lampen oder andere Verbraucher über
Relais geschaltet werden.
|
Sub Test4 Config Timer1 = Pwm , Prescale = 8 , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down Dim Pwmalta As Integer Dim Pwmaltb As Integer Pwma = 0 Pwmb = 0 Cls Do If S1 = 0 Then Pwma = Pwma + 1 If Pwma > 1023 Then Pwma = 1023 If S2 = 0 Then Pwma = Pwma - 1 If Pwma < 0 Then Pwma = 0 If S3 = 0 Then Pwmb = Pwmb + 1 If Pwmb > 1023 Then Pwmb = 1023 If S4 = 0 Then Pwmb = Pwmb - 1 If Pwmb < 0 Then Pwmb = 0 Waitms 20 Pwm1b = Pwma Pwm1a = Pwmb If Pwma <> Pwmalta Then Locate 1 , 1 Lcd "LED1 " Locate 1 , 6 Lcd Pwma End If Pwmalta = Pwma If Pwmb <> Pwmaltb Then Locate 2 , 1 Lcd "LED2 " Locate 2 , 6 Lcd Pwmb End If Pwmaltb = Pwmb Loop End Sub
Wenn man Lampen nicht nur ein- und
ausschalten will kann über die PWM-Ausgänge ihre Helligkeit
stufenlos verändert werden. Timer 1 wird dazu als PWM-Controller
eingerichtet. Die Register PWM1a und PWM1b erhalten dann Werte
zwischen 0 (ganz aus) und 1023 (ganz an). Die relative Helligkeit
lässt sich also mit einem 10-Bit-Wert in 1024
Stufen verändern. Je zwei Taster steuern einen PWM-Wert auf
und ab. Das folgende Beispiel zeigt eine automatische PWM-Steuerung:
|
Sub Test4 Config Timer1 = Pwm , Prescale = 8 , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down Dim J As Integer Dim K As Integer Pwma = 0 Pwmb = 0 Cls Do For J = 1 To 30 Pwma = J * J K = 31 - j Pwmb = K * K Pwm1b = Pwma Pwm1a = Pwmb Waitms 100 Next N For J = 30 To 1 Step -1 Pwma = J * J K = 31 - j Pwmb = K * K Pwm1b = Pwma Pwm1a = Pwmb Waitms 100 Next N Loop End Sub
Zwei Zählschleifen steuern
jeweils beide LEDs gegenläufig an. Weil der Helligkeitseindruck
für unser Auge nicht linear zum LED-Strom ist bekommt die
PWM-Ausgabe einen quadratischen Verlauf. Die Laufvariable J geht in der
obern Schleife von 1 bis 30 und in der unteren zurück von 30 bis
1. Pwma = J * J erzeugt daraus eine Helligkeitssteuerung von 1
bis 30 * 30 = 900. Der optische Eindruck ist eine
gleichförmiges An- und Absteigen der LED-Helligkeit.
|
|