Steuerung Führanlage

Führanlage?? So gings mir auch. Das ist ne Art Hamsterlaufrad für Pferde. Mit einem Drehstrommotor, einem Frequenzumrichter und dem Schweisser deines Vertrauens ist sowas machbar. Das Problem war nun folgendes:
Die Drehrichtung der Anlage sollte ab und zu wechseln, damit die Tiere keinen Drehwurm kriegen, ausserdem sollten verschiedene Geschwindigkeiten je nach Fitness der Pferde möglich sein.
Also musste ein AT-Mega her. Da die Anzahl der verschiedenen Programme offen war, entschied ich mich zum Einsatz einer Infrarotfernbedienung. Dort kann die Anlage ein und ausgeschaltet werden und bis jetzt 3 verschiedene Intervallmuster ausgewählt werden. Im Downloadbereich ist ein Schaltplan und der Quellcode hinterlegt.

Download

fuehranlage.bas

Quellcode

'--------------------------------------------------------------
'                        F?hranlage f?r Pferde
'                  (c) 2007, Gerold Electronic
'                        Fileversion 1.0
'--------------------------------------------------------------
'
'Pin 5:  Eingang TSOP 1736 (IR-Empf?nger)
'Pin 11: Ausgang LED Programm 1
'Pin 12: Ausgang LED Programm 2
'Pin 13: Ausgang LED Programm 3
'Pin 14: Ausgang Piezo
'Pin 15: Ausgang Relais langsam,Zeit1-schnell,Zeit2 (Geschwindigkeitund Zeit)
'Pin 16: Ausgang Relais links-rechts (Drehrichtung)
'Pin 17: Ausgang Relais Steuerung ein
'Pin 23: Eingang Poti 1. Zeitintervall einstellen
'Pin 24: Eingang Poti 2. Zeitintervall einstellen

$regfile = "m8def.dat"
$crystal = 3686400
$baud = 9600
'Use byte library for smaller code
'$lib "mcsbyte.lbx"

'This example shows how to decode RC5 remote control signals
'The GETRC5 function uses TIMER0 and the TIMER0 interrupt.
'The TIMER0 settings are restored however so only the interrupt can not
'be used anymore for other tasks

Dim Address As Byte , Command As Byte
Dim Zeit1 As Word , Zeit2 As Word , Zeita As Word , Zeitb As Word
Dim I As Byte                                               'Zahl der Timerdurchl?ufe
Dim K As Byte                                               'Zahl der Wendungen





Ddrc = &B00000000                                           'Ausg?nge setzen
Ddrb = &B00001111                                           'Ausg?nge setzen
Ddrd = &B11100000



Config Rc5 = Pind.3                                         'Eingang f?r IR-Empfang, belegt Timer 0 !!
Config Timer1 = Timer , Prescale = 1024
Enable Timer1                                               'Overflow Interrupt ein
Enable Interrupts                                           'Interrupts werden f?r IR-Empfang ben?tigt

On Timer1 Timerfertig

Stop Timer1

Do
   Admux = &B01100000
   Adcsra = &B11000010
   Getrc5(address , Command)
 '  Print Address ; "--" ; Command
   If Command > 127 Then                                    'Toggle bit  enfernen
      Command = Command - 128
   End If
      Select Case Command
       Case 1 :                                             'Taste "1"
       If Portd.5 = 0 Then                                  ' verhindert einen erneuten Aufruf, wenn Taste 1 schon gedr?ckt wurde
         Portd.5 = 1
         Portd.6 = 0
         Portd.7 = 0
         Sound Portb.0 , 288 , 65
         'Die Zeit von den Potis holen...
         Zeita = Adch
         Zeitb = 0
         Zeit1 = Zeita \ 16
         I = 0
         K = 0
         Portb.1 = 0
         Portb.2 = 0
         Portb.3 = 1
         Timer1 = 0
         Start Timer1
         Print Zeit1
       End If
       Case 2 :                                             'Taste "2"
       If Portd.6 = 0 Then                                  ' verhindert einen erneuten Aufruf, wenn Taste 2 schon gedr?ckt wurde
         Portd.5 = 0
         Portd.6 = 1
         Portd.7 = 0
         Sound Portb.0 , 288 , 65
         Waitms 50
         Sound Portb.0 , 288 , 65
         Admux = &B01100001
         Adcsra = &B11000010
         Waitms 250
         Zeita = Adch
         Zeitb = 0
         Zeit1 = Zeita \ 16
         I = 0
         K = 0
         Portb.1 = 1
         Portb.2 = 0
         Portb.3 = 1
         Timer1 = 0
         Start Timer1
         Print Zeit1
       End If
       Case 3 :                                             'Taste "3"
       If Portd.7 = 0 Then                                  ' verhindert einen erneuten Aufruf, wenn Taste 3 schon gedr?ckt wurde
         Portd.5 = 0
         Portd.6 = 0
         Portd.7 = 1
         Sound Portb.0 , 288 , 65
         Waitms 50
         Sound Portb.0 , 288 , 65
         Waitms 50
         Sound Portb.0 , 288 , 65
         Zeita = Adch
         Admux = &B01100001
         Adcsra = &B11000010
         Waitms 250
         Zeitb = Adch \ 16
         If Zeitb = 0 Then Zeitb = 1
         Zeit1 = Zeita \ 16
         I = 0
         K = 0
         Portb.1 = 0
         Portb.2 = 0
         Portb.3 = 1
         Print Zeit1
         Print Zeitb
         Timer1 = 0
         Start Timer1
       End If
       Case 12 :                                            'Taste "Standby"
       If Portd.5 = 1 Or Portd.6 = 1 Or Portd.7 = 1 Then    ' verhindert einen erneuten Aufruf, wenn Taste Standby schon gedr?ckt wurde
         Stop Timer1
         Portd.5 = 0
         Portd.6 = 0
         Portd.7 = 0
         Portb.1 = 0
         Portb.2 = 0
         Portb.3 = 0
         Sound Portb.0 , 288 , 100

       End If
       End Select
Loop

Timerfertig:

   I = I + 1
   If I >= Zeit1 Then
      Portb.2 = Not Portb.2
      I = 0
      If K < 3 Then K = K + 1
      If Zeitb > 0 And K >= 2then                           'Programm 3 ist aktiv
         Portb.1 = Not Portb.1
         K = 0
         If Zeit1 = Zeita Then
            Zeit1 = Zeitb
         Else
            Zeit1 = Zeita
         End If
      End If
   End If

Return

End