Hallo,
für ein Projekt brauch ich einen Shutdown/Boot Taster für den Raspberry Pi. Leider Funktioniert dies nicht ohne zusätzlicher Hardware bzw. nur eingeschränkt... Nach langer Überlegung wie ich das ganze realisieren kann
bin ich beim Attiny hängengeblieben. Und zwar gehts hier um den Attiny 25/45/85.
1 Pin wurde fürn Taster verwendet.
1 Pin für eine Status Led
1 Pin die LCD Hintergrundbeleuchtung
1 Pin für die Stromversorgung fürn Raspberry Pi
1 Pin wird noch verwendet für den Shutdown Befehl zum Raspberry.
Aber seht es euch selber an und falls noch Fragen sind dann einfach stellen. Das Porgramm Funktioniert bei mir am Steckbrett. Eventuell könnt ihr ja mal drüber schauen was man noch verbessern könnte ;-). Das einzige was ich noch machen muss ist noch einen Spannungsteiler für den Pin vom AVR zum Raspberry und dann im Code einfügen.
Lg
Ps.: Falls gewünscht kann ich den Schaltplan gerne einstellen sobald ich ihn Fertig habe ;-)
für ein Projekt brauch ich einen Shutdown/Boot Taster für den Raspberry Pi. Leider Funktioniert dies nicht ohne zusätzlicher Hardware bzw. nur eingeschränkt... Nach langer Überlegung wie ich das ganze realisieren kann
bin ich beim Attiny hängengeblieben. Und zwar gehts hier um den Attiny 25/45/85.
1 Pin wurde fürn Taster verwendet.
1 Pin für eine Status Led
1 Pin die LCD Hintergrundbeleuchtung
1 Pin für die Stromversorgung fürn Raspberry Pi
1 Pin wird noch verwendet für den Shutdown Befehl zum Raspberry.
Aber seht es euch selber an und falls noch Fragen sind dann einfach stellen. Das Porgramm Funktioniert bei mir am Steckbrett. Eventuell könnt ihr ja mal drüber schauen was man noch verbessern könnte ;-). Das einzige was ich noch machen muss ist noch einen Spannungsteiler für den Pin vom AVR zum Raspberry und dann im Code einfügen.
Lg
Ps.: Falls gewünscht kann ich den Schaltplan gerne einstellen sobald ich ihn Fertig habe ;-)
Code:
' Raspberry Pi Shutdown
' Attiny85
' Quarz int 1Mhz
$regfile = "attiny85.dat"
$crystal = 1000000
$hwstack = 48
$swstack = 48
$framesize = 48
' Status LED ------------------------------------------------------------
Config Portb.0 = Output ' Status LED
Status_led Alias Portb.0 ' Status LED
Const Status_led_on = 0 ' Status LED on/off deklarieren
Const Status_led_off = 1 ' Status LED on/off deklarieren
Dim Led_flash_slow As Bit
Dim Led_flash_fast As Bit
Dim Led_flash As Byte
Dim Led_toggle_counter As Byte
' -----------------------------------------------------------------------
' Taster ----------------------------------------------------------------
Config Pinb.1 = Input ' Tastenpin als Eingang
Set Portb.1 ' Pullup ein, Taste schaltet nach GND
Taster Alias Pinb.1 ' Passenden Alias vergeben
' -----------------------------------------------------------------------
' Taster Auswertung -----------------------------------------------------
Const Is_down = 0 ' Konstantendeklarationen für die Taste
Const Is_up = 1 ' Konstantendeklarationen für die Taste
Const Key_void = 0 ' Konstantendeklarationen der Mitteilungen
Const Key_pressed = 1
Const Key_long = 2
Const Key_repeat = 3
Const Slot_time = 5 ' Abfragerate in ms
Const Ktime_valid = 1 ' Ab diesem Wert x Slot_Time ist ein Tastendruck gültig = 50ms
Const Ktime_long = 100 ' Ab diesem Wert x Slot_Time gilt eine Taste als lange gedrückt = 5s
Const Ktime_repeat = 150 ' Ab diesen Wert x Slot_Time wird eine Taste wiederholt = 7.5s
Const Ktime_rep_rate = 10 ' Wiederholrate x Slot_Time = 100ms = 10 x pro Sekunde
Const Ktime_rep_set = Ktime_repeat - Ktime_rep_rate ' Errechnen des Resetwertes für die Wiederholrate
Dim Key_time As Byte ' Zeit wie lange die Taste gedrückt ist in 10ms Stufen
Dim Key_msg As Byte ' Mitteilung über den Zustand der Taste
Dim Slot_time_counter As Byte
' -----------------------------------------------------------------------
' LCD Hintergrundbeleuchtung --------------------------------------------
Config Portb.3 = Output ' LCD
Lcd_power Alias Portb.3 ' LCD
Const Lcd_power_on = 0 ' LCD Hintergrundbeleuchtung on/off deklarieren *
Const Lcd_power_off = 1 ' LCD Hintergrundbeleuchtung on/off deklarieren *
Const Lcd_time = 1500 'Zeit für Displaybeleuchtung (default 1500=15 Sekunden)
Dim Lcd_flag As Bit
Dim Lcd_counter As Integer
Lcd_power = Lcd_power_off
'* Zum invertieren 0 und 1 tauschen
' -----------------------------------------------------------------------
' Raspberry Pi Stromversorgung ------------------------------------------
Raspi_power Alias Portb.2 ' IRLU024
Config Portb.2 = Output ' IRLU024
Const Raspi_power_on = 1 ' Raspberry Pi Stromversorgung on/off deklarieren *
Const Raspi_power_off = 0 ' Raspberry Pi Stromversorgung on/off deklarieren *
Const Shutdown_time = 1000 ' Shutdown Zeit = 10 Sekunden
Const Boot_time = 600 ' Startzeit für die Led_Sequenze
Dim Shutdown_flag As Bit
Dim Shutdown_counter As Integer
Dim Boot_flag As Bit
Dim Boot_counter As Integer
'* Zum invertieren 0 und 1 tauschen
' -----------------------------------------------------------------------
' Timer0 ----------------------------------------------------------------
Config Timer0 = Timer , Prescale = 256 ' Interrupt alle 10ms
Enable Timer0
On Timer0 Isr_timer0
Enable Interrupts
Timer0 = 217
Dim Status_config As Byte
' -----------------------------------------------------------------------
' Setup Menü ------------------------------------------------------------
Dim Setup_flag As Bit
' -----------------------------------------------------------------------
' Autoboot --------------------------------------------------------------
Dim Autoboot As Byte ' Variable
Dim Eedummy As Eram Byte ' Erste Speicheradresse Freilassen
Dim Ee_autoboot As Eram Byte ' EEPROM Variable setzen
Autoboot = Ee_autoboot
If Autoboot = 1 Then
Gosub Raspi_boot
Status_led = Status_led_on
Status_config = 0 'LCD off
Elseif Autoboot = 2 Then
Gosub Raspi_boot
Status_led = Status_led_on
Status_config = 1
Elseif Autoboot = 3 Then
Raspi_power = 0
Status_led = Status_led_off
Status_config = 0
Elseif Autoboot = 4 Then
Raspi_power = 0
Status_led = Status_led_off
Status_config = 1
Else ' Falls EEPROM noch nicht beschrieben ist wird Autoboot auf on gesetzt
Autoboot = 1
Ee_autoboot = Autoboot
Gosub Raspi_boot
End If
' -----------------------------------------------------------------------
' Hauptschleife ---------------------------------------------------------
' -----------------------------------------------------------------------
Do
If Raspi_power = Raspi_power_on And Status_config = 1 Then
Lcd_power = Lcd_power_on
End If
Select Case Key_msg ' Hier werden die Tasten-Mitteilungen verarbeitet
Case Key_pressed: 'Print "Taste einfach gedrückt"
If Raspi_power = Raspi_power_off Then
Gosub Raspi_boot ' Raspberry Pi starten
Elseif Raspi_power = Raspi_power_on Then
Lcd_flag = 1 ' Lcd Flag setzen
Lcd_counter = 0 ' Counter zurücksetzen
Lcd_power = Lcd_power_on ' Hintergrundbeleuchtung einschalten
End If
Case Key_long: ' Taste lange gedrückt
If Raspi_power = Raspi_power_on Then ' Wenn Raspberry schon läuft dann...
Shutdown_flag = 1 ' Shutdown einleiten
Shutdown_counter = 0 ' Counter auf 0 stellen
Led_flash_slow = 1 ' Led blinken lassen
Elseif Raspi_power = Raspi_power_off Then ' Wenn Raspi noch nicht läuft
Setup_flag = 1
Led_flash_slow = 1
Led_toggle_counter = 0
End If
Case Key_repeat : ' Print "Taste im Wiederholmodus"
End Select
Key_msg = Key_void ' Taste wurde verarbeitet, Ereignis löschen
If Shutdown_flag = 1 Then
If Shutdown_counter > Shutdown_time And Status_led = Status_led_off Then
Led_flash_slow = 0
Shutdown_flag = 0
Lcd_power = Lcd_power_off
Raspi_power = Raspi_power_off
Status_led = Status_led_off
End If
End If
If Boot_flag = 1 Then
If Boot_counter > Boot_time And Status_led = Status_led_on Then
Led_flash_fast = 0
Boot_flag = 0
Status_led = Status_led_on
End If
End If
If Lcd_flag = 1 Then
If Lcd_counter > Lcd_time Then
Lcd_power = Lcd_power_off ' Hintergrundbeleuchtung ausschalten
Lcd_flag = 0 ' Lcd Flag off
End If
End If
If Setup_flag = 1 Then
If Led_toggle_counter >= 4 And Status_led = Status_led_off Then
Led_flash_slow = 0
Setup_flag = 0
Gosub Setup
End If
End If
Loop
End
' #######################################################################
' Subroutinen -----------------------------------------------------------
' -----------------------------------------------------------------------
' Raspberry Pi starten --------------------------------------------------
Raspi_boot:
Boot_flag = 1 ' Starten einleiten
Boot_counter = 0 ' Start-Counter auf 0 stellen
Raspi_power = Raspi_power_on ' Raspberry Pi starten
Led_flash_fast = 1 ' Led blinken lassen
Return
' -----------------------------------------------------------------------
' Setup Menü ------------------------------------------------------------
Setup:
If Autoboot = 1 Then
Ee_autoboot = 2
Autoboot = 2
Status_config = 1
Elseif Autoboot = 2 Then
Ee_autoboot = 3
Autoboot = 3
Status_config = 0
Elseif Autoboot = 3 Then
Ee_autoboot = 4
Autoboot = 4
Status_config = 1
Elseif Autoboot = 4 Then
Ee_autoboot = 1
Autoboot = 1
Status_config = 0
End If
Gosub Raspi_boot
Return
' -----------------------------------------------------------------------
' Tastendruck auswerten -------------------------------------------------
Key_evaluate:
If Taster = Is_down Then ' Taste gedrückt ?
Incr Key_time ' Tastendruckzeit hochzählen
If Key_time = Ktime_long Then ' Taste lange = 100 = 1s gedrückt ?
Key_msg = Key_long ' Ja, Mitteilung schicken
Else
If Key_time = Ktime_repeat Then ' Taste = 150 = 1.5 Sekunden gedrückt ?
Key_msg = Key_repeat ' Ja, Mitteilung schicken
Key_time = Ktime_rep_set ' Auf einen Wert unterhalb 150, hier auf 140 setzen, Differenz 10 = Wiederholrate 100ms
End If
End If
Else ' Wird dieser Teil erreicht, so ist/wurde die Taste losgelassen
If Key_time >= Ktime_valid And Key_time < Ktime_long Then ' Länger als 5 = 50ms und kürzer als Taste lange 100 = 1s gedrückt ?
Key_msg = Key_pressed ' Ja, Mitteilung schicken
End If
Key_time = 0
' Tastenzähler zurücksetzen, alles kleiner oder gleich 50ms wird zwecks Entprellung ignoriert
End If
Return
' -----------------------------------------------------------------------
' Timer0 interrupt ------------------------------------------------------
Isr_timer0: ' Timer0 interrupt
Timer0 = 217 ' Timer preload
Incr Slot_time_counter ' Alle x ms die Tastenauswertung aufrufen
If Slot_time_counter = Slot_time Then
Slot_time_counter = 0
Gosub Key_evaluate
End If
If Led_flash_slow = 1 Then ' Led langsam blinken lassen
Incr Led_flash
If Led_flash = 50 Then
Toggle Status_led ' Led Port toggeln
Led_flash = 0
If Status_led = Status_led_off Then
Incr Led_toggle_counter
End If
End If
End If
If Led_flash_fast = 1 Then ' Led schnell blinken lassen
Incr Led_flash
If Led_flash = 35 Then
Toggle Status_led ' Led port toggeln
Led_flash = 0
If Status_led = Status_led_off Then
Incr Led_toggle_counter
End If
End If
End If
If Shutdown_flag = 1 Then ' Shutdown Flag
Incr Shutdown_counter
End If
If Lcd_flag = 1 Then ' Lcd Flag
Incr Lcd_counter
End If
If Boot_flag = 1 Then ' Boot Flag
Incr Boot_counter
End If
Return
' -----------------------------------------------------------------------