Hallo,
ich habe zur Zeit in mehrerlei hinsicht Freude ein Nachtlicht bauen zu dürfen.
Das Nachtlicht soll folgenden Funktionsablauf haben.
-Start
----Nachtmodus
-------Sensor kurz betätigt
-----------LED an/aus
-------Sensor lang betätigt
-----------LED Setupmodus
-------Sensor nicht betatigt
-----------/
-------1/2 Sek warten
----Tagmodus
-------LED aus
-------Watchdog einschalten und Chip in Powerdown-Modus legen
-------Chip-Reset
Dazu hätte ich ein paar Fragen um mehr Energie zu sparen.
-Tagmodus: Der Watchdog zählt beim Attiny45 maximal bis 2048, mir würde aber auch reichen wenn er aller Minute mal prüft ob die Nacht begonnen hat.
Gibt es da eine möglichkeit den Chip später aus dem Powerdown-Modus zu holen?
-Nachtmodus: die 1/2Sek warten würde ich gern durch den Idle-Modus ersetzen. Mich stört da aber beim aufwachen via Watchdog der Chipreset.
Lässt sich der Chip auch anders in den Normal-Modus zurückholen?
Vielen Dank für Eure Hilfe.
Mein aktueller Arbeitsstand:
Code:
'*******************************************************************************
'*******************************************************************************
'****************************** NACHTLICHT V1.0 ********************************
'*******************************************************************************
'************************** 24.06.2014 by CYBORG *******************************
'*******************************************************************************
'*******************************************************************************
'****************************** Allgemein **************************************
$regfile = "attiny45.dat"
$crystal = 8000000
$hwstack = 40
$swstack = 16
$framesize = 32
'********************************* PWM 0 ***************************************
Config Timer0 = Pwm , Prescale = 256 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up
Enable Timer0
'********************************* PWM 1 ***************************************
Config Portb.4 = Output
'Config Portb.3 = Input
Tccr1 = Bits(cs10)
Gtccr = Bits(6 , Com1b0)
Ocr1b = 63 'Duty
Enable Timer1
Enable Interrupts
'********************************** LED ****************************************
R_pwm Alias Pwm1b
G_pwm Alias Pwm0b
B_pwm Alias Pwm0a
Dim R_eram As Eram Byte
Dim G_eram As Eram Byte
Dim B_eram As Eram Byte
Dim R As Byte
Dim G As Byte
Dim B As Byte
Dim R_max As Byte
Dim G_max As Byte
Dim B_max As Byte
Dim Setup_count As Word
Dim Setup_time As Word
Dim Setup_time_config As Word
Dim Setup_time_step As Word
Dim Setup_preview As Byte
Dim Is_day_temp As Byte
Dim Is_day_value As Word
Dim Is_night_value As Word
If R_eram = 0 And R_eram = 0 And R_eram = 0 Then 'Defauld Werte schreiben falls leer
R_eram = 200 'ROT-Wert ins EERAM schreiben
G_eram = 200 'GRUEN-Wert ins EERAM schreiben
B_eram = 1 'BLAU-Wert ins EERAM schreiben
End If
R = R_eram 'ROT-Wert aus EERAM lesen
G = G_eram 'GRUEN-Wert aus EERAM lesen
B = B_eram 'BLAU-Wert aus EERAM lesen
R_max = 255
G_max = 255
B_max = 255
R_pwm = 0
G_pwm = 0
B_pwm = 0
Setup_count = 0 'Setup zähler
Setup_time = 3000 'Zeit bis Setup startet
Setup_time_step = 100 'Zeit/Geschwindigkeit der Farbsteigerung
Setup_time_config = 1000 'Zeit zwischen der Farbeinstellung
Setup_preview = 100 'Helligkeit für Vorschau-LED
Is_day_temp = 0
Is_day_value = 1020 'Tag ==> Nacht Schwellwert
Is_night_value = 1000 'Nacht ==> Tag Schwellwert
'********************************** ADC ****************************************
Declare Function Sensor() As Byte
Declare Function Is_day() As Byte
Config Adc = Single , Prescaler = Auto
Dim Led_on As Word
Dim Led_off As Word
Ir_led Alias Portb.2
Config Ir_led = Output
Ir_led = 0
'********************************** MAIN ***************************************
Do
'Nacht - Modus
If Is_day() = 0 Then
'Sensor wurde aktiviert
If Sensor() = 1 Then
'Zeit bis SetupModus messen
For Setup_count = 0 To Setup_time
'Prüfen ob Sensor losgelassen wird
If Sensor() = 0 Then
If R_pwm = 0 And G_pwm = 0 And B_pwm = 0 Then
'LED einschalten
R_pwm = R
G_pwm = G
B_pwm = B
Else
'LED ausschalten
R_pwm = 0
G_pwm = 0
B_pwm = 0
End If
Exit For
End If
Waitms 1
Next
'LED-Konfiguration starten
If Setup_count >= Setup_time Then
Gosub Led_config
End If
End If
Waitms 500
'Tag - Modus
Else
'LED ausschalten
R_pwm = 0
G_pwm = 0
B_pwm = 0
'Chip ~2Sek schlafen legen
Config Watchdog = 2048
Start Watchdog
Config Powermode = Powerdown
End If
Loop
'******************************** FUNCTIONS ************************************
'***************************** SENSOR MESSUNG **********************************
Function Sensor() As Byte
Local Led_diff As Word
Led_off = Getadc(3)
Ir_led = 1
Led_on = Getadc(3)
Ir_led = 0
Led_diff = Led_off - Led_on
If Led_diff < 500 Then
Sensor = 0
Else
Sensor = 1
End If
End Function
'*************************** TAG / NACHT MESSUNG *******************************
Function Is_day() As Byte
Led_off = Getadc(3)
If Led_off > Is_day_value And Is_day_temp = 1 Then
Is_day = 0
Elseif Led_off > Is_night_value And Is_day_temp = 0 Then
Is_day = 0
Else
Is_day = 1
End If
Is_day_temp = Is_day
End Function
'************************** LED - SETUP - MODUS ********************************
Led_config:
R_pwm = Setup_preview
G_pwm = 0
B_pwm = 0
Waitms Setup_time_config
R_pwm = 0
G_pwm = 0
B_pwm = 0
Waitms Setup_time_config
For R = 0 To R_max
Waitms Setup_time_step
If Sensor() = 0 Then
Goto R_end
End If
R_pwm = R
Next
R_end:
Waitms Setup_time_config
R_pwm = 0
G_pwm = Setup_preview
B_pwm = 0
Waitms Setup_time_config
R_pwm = R
G_pwm = 0
B_pwm = 0
Waitms Setup_time_config
For G = 0 To G_max
Waitms Setup_time_step
If Sensor() = 0 Then
Goto G_end
End If
G_pwm = G
Next
G_end:
Waitms Setup_time_config
R_pwm = 0
G_pwm = 0
B_pwm = Setup_preview
Waitms Setup_time_config
R_pwm = R
G_pwm = G
B_pwm = 0
Waitms Setup_time_config
For B = 0 To B_max
Waitms Setup_time_step
If Sensor() = 0 Then
Goto B_end
End If
B_pwm = B
Next
B_end:
Waitms Setup_time_config
R_pwm = 0
G_pwm = 0
B_pwm = 0
Waitms Setup_time_config
R_pwm = R
G_pwm = G
B_pwm = B
Waitms Setup_time_config
If R > 0 Or G > 0 Or B > 0 Then
R_eram = R
G_eram = G
B_eram = B
Else
R = R_eram
G = G_eram
B = B_eram
End If
Waitms 2000
R_pwm = 0
G_pwm = 0
B_pwm = 0
Return
End
Lesezeichen