Raspberry Pi Shutdown mit Attiny

Phantomias2006

Mitglied
10. Jan. 2010
56
0
6
Sprachen
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 ;-)

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
' -----------------------------------------------------------------------
 
Hallo,

ich bräuchte mal eure Hilfe. Ich hab da ein leichtes Verständnis Problem ;-)

Ich habe einen Attiny und einen Raspberry Pi
Der Attiny läuft mit 5V (muss so sein) und der Raspberry Pi verträgt nur 3,3V am GPIO.
Jetzt hab ich einen Spannungsteiler verwendet mit 1kOhm und 680Ohm.
Somit komme ich auf ca. 3V runter.
Soweit so gut. Es wird für den Shutdown vom AVR ein High-Signal geschickt.
Also 3Volt.
Funktioniert auch sehr gut nur hab ich nicht bedacht wenn ich den Raspberry Pi über die console
runter fahre dass der Attiny dies ja nicht mit bekommt.
Meine Überlegung war dass ich den Pin auch in die Andere Richtung nutze.
Wenn der Raspberry Pi den Pin auf High schaltet dann liegen am AVR ca. 2Volt an. Dies erkennt er auch als Signal.
Jetzt wollte ich den AVR-Pin dauernd als Input konfigurieren und falls der Shutdown über den Taster kommt
Als Output. Nur was passiert wenn der Shutdown von beiden Seiten kommt?
Also wenn der AVR auf Output steht über den Spannungsteiler 3V und der Befehl über die console vom Raspberry auch der Shutdown eingeleitet wird und der GPIO auf Output gestellt wird?
Der fall wird vermutlich nicht eintreten aber es wäre möglich.
Tut es den Pin's etwas oder ist es egal?
Vielen dank schon mal für die Hilfe.

Lg
 
Ich habe auch schon mal ausversehen einen GPIO kurzgeschlossen. Selbst das hat er überlebt, sollte also bei den im worst case fließenden 5mA nichts ausmachen (die haste beim High Pegel eh, durch den Spannungsteiler). Da wäre es viel schlimmer wenn die GPIOs mal 5V abbekommen.
Zumal der Fall ja eh nur sehr selten vorkommen könnte... Ich würde drüber hinweg sehen.
 
Das sehe ich genauso wie Tommy. Es sind auf beiden Seiten knapp 8mA. Der AVR Mikrocontroller treibt 680Ohm bei 5V, der RaspberryPi Controller treibt 680Ohm parallel 1kOhm bei 3,3V, beides die Extremfälle. Diese Einschätzung ohne Gewähr ;-)

Dirk :ciao:
 
Hallo TommyB und Dirk,

vielen Dank für die Info!
Genau diese Antwort wollte ich hören da die Platine schon Fertig bei mir liegt :-D
Eine Änderung diesbezüglich im Layout wäre zwar machbar aber dazu müsste ich neue Platinen bestellen...

Danke nochmal!

(Irgendwie Funktioniert der Bilder-Upload nicht bei mir?)
 
Ok dann versuch ich es nochmal:

image.jpeg

Die sollte jetzt Funktionieren ;-)
Ich habe es über Grafik einfügen gemacht vorher! Da kann ich auch auf Datei auswählen gehen. Kann es sein dass diese
Funktion nicht geht?
Lg
 
Ich weiß nicht, ob es da beim Einfügen Probleme gibt, teste ich mal bei Gelegenheit.
Noch ein Tipp: Im erweiterten Editor kann man mit der linken Maustaster doppelt auf das Bild klicken, dann geht ein Dialog auf, in dem kann man ein paar Sachen einstellen, auch dass das Bild in Originalgröße angezeigt wird.

Dirk :ciao:
 
Nur Interesse halber:
Wie würdet ihr die Schaltung machen um hier auf nummer sicher zu gehen? Also für die Zukunft?

Lg
 
v1.3

Hallo,

hab mal den Code etwas überarbeitet und da hier noch ein relativ alter Code von mir gepostet ist wollte ich euch mal auf einen neuen Stand bringen.

Code:
'-------------------------------------------------------------------------------

'name                     : Raspberry Pi WLANThermo v3 REV.1

'copyright                : (c) 2014-2015, Florian R.

'version                  : v1.3

'micro                    : Attiny45

'quarz                    : int 1Mhz

'             -----------------------Attiny_45-----------------------
'                                    +---v---+
'                        (Reset) PB5 |1     8| VCC (5V)
'             (LCD Beleuchtung)  PB3 |2     7| PB2 (IRLU024)
'              (Shutdown Signal) PB4 |3     6| PB1 (Taster)
'                                GND |4     5| PB0 (Status LED)
'                                    +-------+
'             -------------------------------------------------------

'-------------------------------------------------------------------------------

'$sim
$regfile = "attiny45.dat"
$crystal = 1000000
$hwstack = 100
$swstack = 68
$framesize = 68

' 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
Status_led = Status_led_off
Dim Led_flash_slow As Bit , Led_flash_fast As Bit , Led_flash As Byte
Reset Led_flash_slow
Reset Led_flash_fast
Led_flash = 0
' -----------------------------------------------------------------------

' "Taster"-befehl von AVR zu RaspberryPi für den Shutdown
Config Portb.4 = Output
Raspberry_command Alias Portb.4
Const Raspberry_command_on = 1
Const Raspberry_command_off = 0
Raspberry_command = Raspberry_command_off

' 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 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
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
' -----------------------------------------------------------------------

' Setup Menü ------------------------------------------------------------
Dim Setup_flag As Bit
Dim Setup_counter As Integer
Dim Setup_counter_2 As Integer
Dim Flash_sequence As Integer
Setup_flag = 0
Setup_counter = 0
Setup_counter_2 = 0
Const Setup_1 = 1
Const Setup_2 = 2
Const Setup_3 = 3
Const Setup_4 = 4
' -----------------------------------------------------------------------

' LCD Hintergrundbeleuchtung --------------------------------------------
Config Portb.3 = Output                                     ' LCD
Lcd_backlight Alias Portb.3                                 ' LCD
Const Lcd_backlight_on = 0                                  ' LCD Hintergrundbeleuchtung on/off deklarieren *
Const Lcd_backlight_off = 1                                 ' LCD Hintergrundbeleuchtung on/off deklarieren *
Const Lcd_time = 1500                                       'Zeit für Displaybeleuchtung (default 1500=15 Sekunden)
Dim Lcd_backlight_flag As Bit
Dim Lcd_counter As Integer
Reset Lcd_backlight_flag
Lcd_counter = 0
Lcd_backlight = Lcd_backlight_off
'* Zum invertieren 0 und 1 tauschen
' -----------------------------------------------------------------------

' Raspberry Pi Stromversorgung ------------------------------------------
Raspi_power Alias Portb.2                                   ' IRLU024
Raspi_power = 0
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
Shutdown_flag = 0
Shutdown_counter = 0
Boot_flag = 0
Boot_counter = 0
'* 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 Lcd_backlight_allways_on As Bit
Reset Lcd_backlight_allways_on
' -----------------------------------------------------------------------


' 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

Select Case Autoboot

   Case 1 :                                                 'Menü 1 : Raspberry startet Automatisch + LCD Hintergrundbeleuchtung ist bei Tastendruck für x Sekunden aktiviert

      Set Boot_flag
      Boot_counter = 0
      Status_led = Status_led_on                            'Status LED on

   Case 2 :                                                 'Menü 2 : Raspberry startet Automatisch + LCD Hintergrundbeleuchtung ist immer ein

      Set Boot_flag
      Boot_counter = 0
      Status_led = Status_led_on                            'Status Led on
      Set Lcd_backlight_allways_on                          'LCD backlight on

   Case 3 :                                                 'Menü 3 : Raspberry startet erst bei Tastendruck + LCD Hintergrundbeleuchtung ist bei Tastendruck für x Sekunden aktiviert


   Case 4 :                                                 'Menü 4 : Raspberry startet erst bei Tastendruck + LCD Hintergrundbeleuchtung ist immer ein

      Set Lcd_backlight_allways_on                          'LCD backlight on

   Case Else :                                              ' Falls im EEPROM noch kein wert hinterlegt ist...

      Autoboot = 1
      Ee_autoboot = Autoboot
      Set Boot_flag

End Select

' -----------------------------------------------------------------------

' Hauptschleife ---------------------------------------------------------
' #######################################################################
' -----------------------------------------------------------------------

Do

' -----------------------------------------------------------------------
If Raspi_power = Raspi_power_on And Lcd_backlight_allways_on = 1 And Setup_flag = 0 Then
      Lcd_backlight = Lcd_backlight_on
End If
' -----------------------------------------------------------------------

' -----------------------------------------------------------------------

Select Case Key_msg                                         ' Hier werden die Tasten-Mitteilungen verarbeitet

' Taste kurz gedrückt ---------------------------------------------------
' -----------------------------------------------------------------------
Case Key_pressed:                                           'Print "Taste einfach gedrückt"

       If Setup_flag = 0 Then
          If Raspi_power = Raspi_power_off And Setup_flag = 0 Then
             Boot_counter = 0
             Set Boot_flag                                  ' Raspberry Pi starten
          Elseif Raspi_power = Raspi_power_on And Setup_flag = 0 Then
             Set Lcd_backlight_flag                         ' Lcd Hintergrundbeleuchtung wird für x Sekunden eingeschaltet
             Lcd_counter = 0                                ' Counter zurücksetzen
             Lcd_backlight = Lcd_backlight_on               ' Hintergrundbeleuchtung einschalten
          End If
       End If

       If Setup_flag = 1 Then
          Status_led = Status_led_off
          Setup_counter_2 = 0
          Setup_counter = 0
          Select Case Autoboot
             Case 1:
                Autoboot = 2
                Set Lcd_backlight_allways_on
             Case 2:
                Autoboot = 3
                Reset Lcd_backlight_allways_on
             Case 3:
                Autoboot = 4
                Set Lcd_backlight_allways_on
             Case 4:
                Autoboot = 1
                Reset Lcd_backlight_allways_on
          End Select
       End If

' -----------------------------------------------------------------------

' Taste lange gedrückt --------------------------------------------------
' -----------------------------------------------------------------------
Case Key_long:                                              ' Taste lange gedrückt

   If Setup_flag = 1 Then
      Ee_autoboot = Autoboot
      Setup_flag = 0
      Status_led = Status_led_off
      Boot_flag = 1
      Boot_counter = 0
   End If

   If Raspi_power = Raspi_power_on And Setup_flag = 0 And Boot_flag = 0 Then       ' Wenn Raspberry schon läuft dann...

      Shutdown_flag = 1                                     ' Shutdown einleiten
      Shutdown_counter = 0                                  ' Counter auf 0 stellen
      Raspberry_command = Raspberry_command_on
      Led_flash_slow = 1                                    ' Led blinken lassen

   Elseif Raspi_power = Raspi_power_off And Setup_flag = 0 And Boot_flag = 0 Then       ' Wenn Raspi noch nicht läuft

      Setup_flag = 1
      Setup_counter = 0
      Setup_counter_2 = 0

   End If

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_backlight = Lcd_backlight_off
      Raspi_power = Raspi_power_off
      Status_led = Status_led_off
      Raspberry_command = Raspberry_command_off
   End If
End If

If Boot_flag = 1 Then
   If Boot_counter > Boot_time Then
      Led_flash_fast = 0
      Boot_flag = 0
      Boot_counter = 0
      Status_led = Status_led_on
   Else
      Led_flash_fast = 1
      Raspi_power = Raspi_power_on                          ' Raspberry Pi starten
      Led_flash_fast = 1
   End If
End If


If Lcd_backlight_flag = 1 Then
   If Lcd_counter > Lcd_time Then
      Lcd_backlight = Lcd_backlight_off                     ' Hintergrundbeleuchtung ausschalten
      Lcd_backlight_flag = 0                                ' Lcd Flag off
   End If
End If

If Setup_flag = 1 Then
   Gosub Setup
End If

Loop

End


' #######################################################################

' Subroutinen -----------------------------------------------------------
' -----------------------------------------------------------------------

' Setup -----------------------------------------------------------------
Setup:
         Flash_sequence = Autoboot * 70
         If Setup_counter = 35 And Setup_counter_2 <= Flash_sequence Then
            Toggle Status_led
            Setup_counter = 0
         End If

         Flash_sequence = Flash_sequence + 100
         If Setup_counter_2 = Flash_sequence Then
            Setup_counter_2 = 0
            Setup_counter = 0
         End If

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 gedrückt ?
      Key_msg = Key_long                                    ' Ja, Mitteilung schicken
   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 (läuft alle 10ms über)

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                                  ' Led im 50 x 10ms (500ms) takt blinken lassen
      Toggle Status_led                                     ' Led Port toggeln
      Led_flash = 0                                         ' Counter zurücksetzen
   End If
End If

If Led_flash_fast = 1 Then                                  ' Led schnell blinken lassen
   Incr Led_flash
   If Led_flash >= 35 Then                                  ' Led im 35 x 10ms (350ms) takt blinken lassen
      Toggle Status_led                                     ' Led port toggeln
      Led_flash = 0                                         ' Counter zurücksetzen
   End If
End If

If Shutdown_flag = 1 Then                                   ' Shutdown Flag
   Incr Shutdown_counter
End If

If Lcd_backlight_flag = 1 Then                              ' Lcd Flag
   Incr Lcd_counter
End If

If Boot_flag = 1 Then                                       ' Boot Flag
   Incr Boot_counter
End If

If Setup_flag = 1 Then
   Incr Setup_counter
   Incr Setup_counter_2
End If

Return
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)