PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfänger hat fragen zu interrupts



Andy91
10.01.2008, 18:07
Hey Leute hab mal ne Frage!

Ich habe ein eigentlich fertiges Programm, jedoch möchte ich einen der Schalter per Interrupt abfragen, aber ich hab keinen Plan wie das gehen könnte!

Kann mir jemand helfen?? Brauch nen Code zum konfigurieren des Schalters (im Code ist er auf Pinb.4, muss natürlich dann auf portd gesetzt werden, das ist klar)


'################################################# #################################
'# #
'# #
'# Programmiert von: Andynformatics #
'# Kontakt: siehe unten (Copyright-Informationen) #
'# #
'# #
'# Um das Programm zum laufen zu bringen muss an Porta ein Display angeschlossen #
'# werden, mit der folgenden Konfiguration: Pin 0 = DB7, Pin 1 = DB6, Pin 2 = DB5 #
'# Pin 3 = DB4, Pin 4 = Enable2, Pin 5 = Enable1, Pin 7 = RS. #
'# #
'# Zudem muss an Port B an Pin 6 eine LED (LED1) und an Pin 4 ein Schalter be- #
'# liebiger Art angeschlossen werden (nach Möglichkeit KEIN Taster!). #
'# #
'# An Port C an Pin 6 muss ein Schalter (nach Möglichkeit ein Keylock) ange- #
'# schlossen werden. #
'# #
'# Zudem muss an Port D an Pin 6 eine LED (LED2) angeschlossen werden werden. #
'# #
'################################################# #################################

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

' Allgemeine Konfigurationen

' Angaben zum Controller konfigurieren
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600

'----------

'Timer konfigurieren

' Timer1 konfigurieren für einen Halbsekunden-Takt
Config Timer1 = Timer , Prescale = 256
Enable Timer1
Enable Interrupts
On Timer1 Ueberlauf_timer1
Timer1 = 3036

'----------

' Ports konfigurieren

' Port A konfigurieren
' Das LCD (an Port A) konfigurieren
Dim ___lcdno As Byte
Config Lcd = 40 * 4
Config Lcdpin = Pin , Db7 = Porta.0 , Db6 = Porta.1 , Db5 = Porta.2
Config Lcdpin = Pin , Db4 = Porta.3 , E2 = Porta.4 , E = Porta.5
Config Lcdpin = Pin , Rs = Porta.7

' Grundgerüst des LCDs aufbauen
___lcdno = 0
Initlcd
Cls
Locate 1 , 1
Lcd "Keylock: gesperrt "
Locate 2 , 1
Lcd "LED 1: aus "
Cursor Off

___lcdno = 1
Initlcd
Cls
Locate 1 , 1
Lcd "LED 2: aus "
Locate 2 , 1
Lcd "Uptime: "
Cursor Off


' Port B konfigurieren
' Den Schalter für LED 1 an Pin 4 konfigurieren
Config Pinb.4 = Input
Portb.4 = 1
Schalter Alias Pinb.4

' LED 1 auf Pin 6 konfigurieren
Config Portb.6 = Output
Ledgruen Alias Portb.6


' Port C konfigurieren
' Keylock an Pin 6 konfigurieren
Config Pinc.6 = Input
Portc.6 = 1
Keylock Alias Pinc.6
' Keylockvariable, ob erst Keylock grade ein-/ausgeschaltet wurde
Dim Keylockvar As Bit

' Port D konfigurieren
' LED 2 an Pin 6 konfigurieren
Config Portd.6 = Output
Ledrot Alias Portd.6

'----------

' Variablen deklarieren

' Variablen für den Uptime-Zähler deklarieren
Dim Uptime As Integer
Dim Uptime_counter As Bit

' Variablen für die Umrechnung der Uptime
Dim Mysec As Integer
Dim Mymin As Integer
Dim Myh As Integer
Dim Temp As Integer
Dim Temp2 As Integer

' Ende der Konfigurationen

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

' Hauptprogramm

Do
' Auf Keylock überprüfen
' Wenn Keylock aus ist Programm durchführen
If Keylock = 1 Then
' Wurde Keylock grade eben eingeschaltet, dann ausgeben, das LED 2
' blinkt und Keylock offen ist Außerdem Keylockvar auf true setzen
If Keylockvar = 0 Then
___lcdno = 0
Locate 1 , 10
Lcd "offen "
___lcdno = 1
Locate 1 , 10
Lcd "blinkt "
Cursor Off
Keylockvar = 1
End If
' Überprüfen, ob Schalter an ist, wenn ja, LED 1 zum Leuchten bringen
' ansonsten LED 1 ausschalten, außerdem auf dem LCD ausgeben ob LED 1
' an oder aus ist
If Schalter = 0 Then
Ledgruen = 1
___lcdno = 0
Locate 2 , 10
Lcd "leuchtet "
Cursor Off
Elseif Schalter = 1 Then
Ledgruen = 0
___lcdno = 0
Locate 2 , 10
Lcd "aus "
Cursor Off
End If

'-------

' Wenn Keylock an ist dann Alle LEDs ausschalten und ausgeben, dass Key-
' lock angeschaltet wurde
Else
If Keylockvar = 1 Then
___lcdno = 0
Locate 1 , 10
Lcd "gesperrt "
Locate 2 , 10
Lcd "aus "
___lcdno = 1
Locate 1 , 10
Lcd "aus "
Cursor Off
Keylockvar = 0
End If
Ledgruen = 0
Ledrot = 0
End If

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

'Uptime errechnen und in den Variablen "Myh", "Mymin" und "mysec" spei-
'chern
Temp2 = Uptime
Myh = Temp2 / 3600

Temp = Myh * 3600
Temp2 = Temp2 - Temp
Mymin = Temp2 / 60

Temp = Mymin * 60
Temp2 = Temp2 - Temp
Mysec = Temp2

'Uptime ausgeben, jedoch bei Zahlen kleiner 10 eine führende 0 einsetzen.
___lcdno = 1
Locate 2 , 10
If Myh < 10 Then
Lcd "0" ; Myh
Else
Lcd Myh
End If
Lcd ":"
If Mymin < 10 Then
Lcd "0" ; Mymin
Else
Lcd Mymin
End If
Lcd ":"
If Mysec < 10 Then
Lcd "0" ; Mysec
Else
Lcd Mysec
End If
Cursor Off
Loop
End

' Ende Hauptprogramm

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

' Definitionen von Timer-ISR und möglichen Funktionen


' ISR von Timer1 definieren
Ueberlauf_timer1:

' Timer1 wieder zurücsetzen, damit GENAU eine halbe Sekunde gezählt wird
Timer1 = 31250


' Led 2 umschalten (im Halbsekundentakt)
If Keylock = 1 Then
If Ledrot = 0 Then
Ledrot = 1
Elseif Ledrot = 1 Then
Ledrot = 0
End If
Else
Ledrot = 0
End If


' Uptime bei jedem ZWEITEN Durchlauf um 1 erhöhen, da Timer ja im 2Hz und
' nicht im 1Hz-Modus läuft
If Uptime_counter = 0 Then
Uptime_counter = 1
Else
Incr Uptime
Uptime_counter = 0
End If
Return
'-----------------

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


'################################################# #################################
'# #
'# SUPPORT #
'# #
'# Bei Fragen bitte an Andynformatics wenden: admin@andynformatics.de.lv #
'# #
'################################################# #################################

'################################################# #################################
'# #
'# © Andynformatics #
'# (www.andynformatics.de.lv) #
'# #
'################################################# #################################

Also!! NOchmal, bitte kurz eine Code-Ergänzung übers Forum (oder die im Programm angegebene E-Mail-Adresse) schreiben!!

Danke, im Voraus


-------------
Andy91

Vitis
11.01.2008, 00:36
schalter an interrupt ist nicht so ideal wegen dem Prellen
aber wenns denn sein soll, schu mal in die Hilfe unter
config intx

Andy91
11.01.2008, 18:02
Herzlichen Dank für die Antwort!! Dass das alles nicht so sinnvoll ist habe ich inzwischen auch schon bemerkt!! Hab nämlich nachgelesen, dann ausprobiert und natürlich stoppt der eingebaute timer!! Schade!! Wollte die Schalterabfrage per interrupt eigentlich noch einbauen aer das geht dann wohl nicht.
Nya, hätt mir vielleich auch EHER einfallen können!!! #-o #-o

Vitis
12.01.2008, 09:26
nunja, du kannst den Int auch auf falling oder rising konfigurieren,
sprich, nur im Moment der Schalterbetätigung wird der Int ausgelöst,
dann nicht mehr. Dann laufen auch die Timerinterrupts wieder.
Wenn Du den Int halt auf Level konfigurierst kommt er aus der
Interruptroutine nicht mehr raus und alle anderen Interrupts gehen
nur noch auf gut Glück.

Andy91
13.01.2008, 10:27
Jaja, aber dann müsste ich den sowohl bei falling als auch bei rising den status ändern können. Denn er soll ja beim umschalten auf 1 angehen und beim umschalten auf 0 ausgehen..... also müsste der eig mit Level konfiguriert werden. Oder kann man das machen, dass der sowohl bie falling als auch bei rising auslöst??