PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : int0 eine bestimmte Zeit abschalten



umbras
26.09.2008, 16:58
Hallo Leute,
ich beschäftige mich erst seit ein paar Wochen mit dem Programmieren.
Im Programm läuft eine Softuhr, die einmal am Tag mit einem Funkwecker
synchronisiert wird. Int0 wird bei steigender Flanke vom Pieper des Weckers
angesteuert. Da aber der Wecker eine Weckwiederholung hat, muß der Int0
für ca. 30 min abgeschaltet werden. Hatte mir vorgestellt mit fallender Flanke
Int1 dafür zu nehmen, aber es hat nicht funktioniert.
Ich versuch mal das Programm zu posten, ist das erstemal also schon mal
Danke.
Board ist R-N control 1.4 mit Mega 32

umbras
26.09.2008, 20:57
Habs jetzt hinbekommen

umbras
26.09.2008, 20:59
'-------------------------------------------------------------
' Solaris
' AtMega32 auf Rn Control Umbras
'-------------------------------------------------------------
'Solarnachführung
'Weckzeitgesteuert mit Funkwecker

$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
Config Clock = User

$framesize = 100
$swstack = 100
$hwstack = 100

'Sound Portd.7 , 400 , 450 'BEEP









Dim Lsyssec As Long
Dim Lsyssec_old As Long
Dim Strtime As String * 8
Dim _tag As Integer
Dim Zaehler As Long
'Dim W1 As Word ' Workaround to get _DIV16




'W1 = W1 / W1

'Ports für 'horizontal Motor
Config Pinc.6 = Output 'Linker Motor Kanal 1 -> Pins definieren, die für die Drehrichtung verantwortlich sind:
H_1 Alias Portc.6
Config Pinc.7 = Output 'Linker Motor Kanal 2 -> Pins definieren, die für die Drehrichtung verantwortlich sind:
H_2 Alias Portc.7


'Ports für vertikal Motor
Config Pinb.0 = Output 'Rechter Motor Kanal 1 -> Pins definieren, die für die Drehrichtung verantwortlich sind:
V_1 Alias Portb.0
Config Pinb.1 = Output 'Rechter Motor Kanal 2 -> Pins definieren, die für die Drehrichtung verantwortlich sind:
V_2 Alias Portb.1

H_1 = 0
H_2 = 0
V_1 = 0
V_2 = 0





'Hier wird der Timer und der Teiler festgelegt
Config Timer1 = Timer , Prescale = 256

'Hier wird das Unterprogramm festgelegt, das
'in dem von ihnen eingestellten Intervall aufgerufen wird
On Timer1 Timerinterrupt

'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
Const Timervorgabe = 3036


'Hier werden die Timer aktiviert
Enable Timer1


Config Int0 = Rising 'Interrupt bei steigender Flanke
On Int0 Irq0 'Festlegen wo bei externem Interrupt hin gesprungen wird
Enable Int0 'Diesen Interrupt aktivieren

Config Int1 = Falling 'Interrupt bei steigender Flanke
On Int1 Irq1 'Festlegen wo bei externem Interrupt hin gesprungen wird
Enable Int1 'Diesen Interrupt aktivieren




Enable Interrupts 'Alle aktivierten Interrupts einschalten




'Sound Portd.7 , 400 , 450 'BEEP



Do
Do


Lsyssec = Syssec()


Loop Until Lsyssec <> Lsyssec_old



Strtime = Time(lsyssec) ' convert to time string
'Print "Running " ; Strtime
'Print "Tag : " ; _tag
Print "sec : " ; Zaehler
Lsyssec_old = Lsyssec





'Main:

'Motor läuft nach Westen
If Zaehler < 34801 And _sec = 0 Then '34801

Print " Motor läuft nach Westen"
Sound Portd.7 , 400 , 450 'BEEP
H_1 = 1
H_2 = 0


Waitms 340 'Dauer der Nachfuehrung von 8:20 - 18:00

H_1 = 0
H_2 = 0
End If



' Rückfahrt nach Osten
If Zaehler = 35000 Then '35000

'Sound Portd.7 , 400 , 450 'BEEP
Print "Rückfahrt nach Osten"

H_1 = 0
H_2 = 1



End If




If Zaehler = 35500 Then '35500

H_1 = 0
H_2 = 0

End If
'---------------------------------------------------- 'bis heir getestet und lauffähig

If _tag > 182 And Zaehler = 36000 Then '36000

V_1 = 0
V_2 = 1 'Motor abwärts

Waitms 400
V_1 = 0
V_2 = 0

End If

If _tag < 182 And Zaehler = 36000 Then '36000

V_1 = 1
V_2 = 0 'Motor aufwärts

Waitms 400
V_1 = 0
V_2 = 0

End If



Loop










Timerinterrupt:
Incr Zaehler
If Zaehler = 86400 Then
Zaehler = 0
End If
Incr _sec
If _sec = 60 Then
_sec = 0
Incr _min
End If
If _min = 60 Then
_min = 0
Incr _hour
End If
If _hour = 24 Then
_hour = 0
Incr _tag
End If
If _tag = 365 Then
_tag = 0
End If
Return

'Interrupt Routine wird immer ausgelöst wenn der Pegel von 0 auf 1 am
'INT0 (Pin 18 PD2) Eingang wechselt
'Weckzeit auf 8:20 Uhr
Irq0:


Zaehler = 0
_sec = 0
_min = 0
_hour = 0

'Goto Main

Return

'Interrupt Routine wird immer ausgelöst wenn der Pegel von 1 auf 0 am
'INT1 (Pin 18 PD3) Eingang wechselt

Irq1:

'If Zaehler < 1800 Then Disable Int0

Return