Der Nachfolger des WDR-Computerclub mit Wolfgang Back und Wolfgang Rudolph - ...und immer ein Bit übrigbehalten!


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: Impulse abfragen auf Open-Micro Kategorie: Open-Micro/Open-Mini/Open-Midi/Open-Macro/Open-Maxi (von Dietmar, Homepage - 10.12.2006 22:31)
 Als Antwort auf Assembler auf Open Micro? von Rainer M. - 10.12.2006 21:28
Dietmar nutzt:  CC1-M-Unit V1.1, Advanced CC1-Unit, Open-Micro, Open-Mini, Open-Mini M-Unit, Open-Mini Station, sonstige
Hallo Rainer!

> [..] 10 Mikrosek. oder 20 mikrosek. [..]

Es sind wirklich nur 10 µs? Das sind natürlich sehr kurze Impulse.

> Ich habe von Assembler keine große Ahnung. Wie frage ich damit einen Port ab?

Wie immer gibt es mehrere Möglichkeiten. Man könnte die Impulsweite, wie Du schon vermutest, per Interrupt bestimmen. Aber bei so kurzen Impulsen wird das schon knapp. Deutlich einfacher kann man die Ports per Polling abfragen. Dazu lassen sich gut die Assemblerbefehle BRCLR und BRSET verwenden. Mit ihnen wird der Zustand eines Bits in der Zeropage abgefragt. Da die Ports bei den 6808-Kontrollern "memorymapped" sind, also im Adreßraum des Kontrollers liegen, lassen sich damit auch alle Ports abfragen. BYTEPORT[1] ist im Speicher an Adresse PTA ($0) und DDRA ($4) wiederzufinden. Die Bits in diesen Byteregistern werden von 0 bis 7 gezählt. Bit Nummer 0 entspricht dem PORT[1] von BASIC. Bit Nummer 1 entspricht dem PORT[2], etc. Entsprechende Definitionen befinden sich in der INCLUDE-Datei "om.def". Ein Blick in diese Datei lohnt sich, denn dort sind ebenfalls einige Sachen erklärt.

Ich habe auf die Schnelle den folgenden Code erstellt und kommentiert. Du kannst ihn nach Bedarf ändern. In Deinem Anwendungsfall mit den sehr kurzen Impulsen benötigst Du nicht den gesamten 16-Bit-Zähler, sondern nur die unteren 8 Bit. Denn die Schleife "warte2", in der der Zähler inkrementiert wird, benötigt für einen Schleifendurchlauf 7 Taktzyklen. Bei 3.2 MHz Bustakt sind das rund 2,2 µs. In 10 bis 20 µs wird deshalb nur bis 4 bis 10 gezählt. Natürlich könntest Du die OM auch extern, mit 32 MHz takten. Dann hast Du einen Bustakt von 8 MHz. Die OM ist also 2,5 mal so schnell wie normal.

Ein Nachteil des Verfahrens ist, daß die OM wissen muß, wann ein Impuls zu empfangen ist. Du hast uns noch nicht mitgeteilt, in welcher zeitlichen Abfolge die Pulse ausgesendet werden und ob man das Signal zum Beispiel tiefpaßfiltern und auf diese Weise einfach mittels Analog-Digital-Wandler abfragen könnte.

' --------------------------------------------------------------------------
' Kurze Impulse mit der Open-Micro, Open-Mini und Open-Midi messen
' erstellt in OCBASIC 1.05 von Dietmar Harlos am 2. Advent 2006
' --------------------------------------------------------------------------

INCLUDE "om.def"          'Definitionen fuer Open-Micro und Open-Mini
'INCLUDE "omid.def"        'Definitionen fuer Open-Midi

DEFINE iport bPTA3        'PTA3 entspricht PORT[4]

DEFINE zaehler WORD       'Speicher fuer Rueckgabe per Variable
DEFINE zaehler_l BYTE[1] OF zaehler  'fuer Zugriff im BASIC, denn die
DEFINE zaehler_h BYTE[2] OF zaehler  '  Open-Micro kann kein WORD

WHILE TRUE
  PRINT
  PRINT impuls            'Aufruf und Rueckgabe des 8-Bit-Werts
  PRINT zaehler_h
  PRINT zaehler_l         'alternativ Rueckgabe per Variable
  PAUSE 10
WEND

END

FUNCTION impuls INLASM

! clrh                    '16 Bit Zaehler
! clrx

! sti                     'Interrupts deaktivieren

#warte1                   'solange warten, bis der Port auf LOW geht
! brset #iport,PTA,warte1

#warte2
! aix #1                  'Zaehler erhoehen (inkrementieren), bis
! brclr #iport,PTA,warte2 '  der Port auf HIGH geht

! cli                     'Interrupts wieder aktivieren

! sthx zaehler            'Zaehlerwert in einer Variable abspeichern.
                          'Das ist eine Moeglichkeit, den Wert des
                          'Zaehlers an das BASIC-Hauptprogramm
                          'zurueckzuliefern.

                          'Alternativ kann man wie im folgenden
                          'gezeigt, einen 8-Bit-Wert per Rechenstack
                          'an das BASIC-Programm zurueckliefern. In
                          'diesem Fall wird die Funktion mittels
                          '"PRINT impuls" oder "variable=impuls" auf-
                          'gerufen und deren Wert zurueckgeliefert.

! txa                     'nur die unteren 8 Bit des Zaehlers verwenden

! clrx                    'und per Firmwareroutine FwPush auf den
! swi                     '  Rechenstack pushen

                          'Das SWI wirkt beim Aufruf von Firmware-
                          'routinen wie ein RTS. Ohne SWI ist also
                          'noch ein RTS erforderlich!

END FUNCTION

Viele Grüße und einen schönen 2. Advent
Dietmar

Meine Homepage: http://ccintern.dharlos.de

 Antwort schreiben

Bisherige Antworten:

Re: Impulse abfragen auf Open-Micro (von Rainer M. - 11.12.2006 22:46)