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.