www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pofitive Flanke an PortA.0 zählen PIC16F627A


Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Ich möchte mit einem PIC die L-H-Übergänge zählen.
Mache hier schon Stunden rum.
Das Zählergebnis soll einfach in einem Register stehen und anschließend 
nach PortB ausgegeben werden.
Danke

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Micha wrote:
> Hi,
> Ich möchte mit einem PIC die L-H-Übergänge zählen.
> Mache hier schon Stunden rum.
Und was ise das Resultat dieser Stunden? Konkrete Fragen?

> Das Zählergebnis soll einfach in einem Register stehen und anschließend
> nach PortB ausgegeben werden.
Was heisst anschliessend? Nach jedem L-H Übergang?
Wie schnell erfolgen die Übergänge?

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine Versuche:
funktioniert in MPLAP-Sim aber nicht auf dem Board
W                            EQU     H'0000'
F                            EQU     H'0001'

;----- Register Files------------------------------------------------------

INDF                         EQU     H'0000'
TMR0                         EQU     H'0001'
PCL                          EQU     H'0002'
STATUS                       EQU     H'0003'
FSR                          EQU     H'0004'
PORTA                        EQU     H'0025'
PORTB                        EQU     H'0006'

INTCON                       EQU     H'000B'
OPTION_REG                   EQU     H'0081'
TRISA                        EQU     H'0085'
TRISB                        EQU     H'0086'
CMCON                        EQU     H'001F'

;----- STATUS Bits --------------------------------------------------------
IRP                          EQU     H'0007'
RP1                          EQU     H'0006'
RP0                          EQU     H'0005'
NOT_TO                       EQU     H'0004'
NOT_PD                       EQU     H'0003'
Z                            EQU     H'0002'
DC                           EQU     H'0001'
C                            EQU     H'0000'

;----Variablen-------------------------------------------------------------

INSTATUS  equ    0x23
INPORTALT  equ    0  ;INSTAUS, BIT
INPORTNEU  equ    1
TINPORT         equ    PORTA
TIN    equ    0    ;Takt in Port

TEMP1    equ    0x20
TEMP2    equ    0x21
INZAEL    equ    0x22


;==========================================================================
;
;       Configuration Bits
;
;==========================================================================

_BODEN_ON                    EQU     H'3FFF'
_BODEN_OFF                   EQU     H'3FBF'
_CP_ALL                      EQU     H'03FF'
_CP_75                       EQU     H'17FF'
_CP_50                       EQU     H'2BFF'
_CP_OFF                      EQU     H'3FFF'
_DATA_CP_ON                  EQU     H'3EFF'
_DATA_CP_OFF                 EQU     H'3FFF'
_PWRTE_OFF                   EQU     H'3FFF'
_PWRTE_ON                    EQU     H'3FF7'
_WDT_ON                      EQU     H'3FFF'
_WDT_OFF                     EQU     H'3FFB'
_LVP_ON                      EQU     H'3FFF'
_LVP_OFF                     EQU     H'3F7F'
_MCLRE_ON                    EQU     H'3FFF'
_MCLRE_OFF                   EQU     H'3FDF'
_ER_OSC_CLKOUT               EQU     H'3FFF'
_ER_OSC_NOCLKOUT             EQU     H'3FFE'
_INTRC_OSC_CLKOUT            EQU     H'3FFD'
_INTRC_OSC_NOCLKOUT          EQU     H'3FFC'
_EXTCLK_OSC                  EQU     H'3FEF'
_LP_OSC                      EQU     H'3FEC'
_XT_OSC                      EQU     H'3FED'
_HS_OSC                      EQU     H'3FEE'

  __CONFIG        _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC

      ORG    0

;******************************** MACROS ****************************************************
movff    macro  quelle,ziel
      movf  quelle,w
      movwf  ziel
      endm


      MOVLW  B'00000111'  ;Disable Comparator module's
      MOVWF  CMCON
    ;
      BSF    STATUS,RP0  ;RegBank 1 einschalten
    ;  MOVLW  B'11010111'  ;Set PIC options (See datasheet).
    ;  MOVWF  OPTION_REG  ;Write the OPTION register.
    ;
      CLRF  INTCON    ;Disable interrupts
      MOVLW  B'11000000'
      MOVWF  TRISB    ;RB7 & RB6 sind Eingänge ;RB5...RB0 sind Ausgänge.
      MOVLW  B'00001111'  ;RA0...RA3 sind Eingänge
      MOVWF  TRISA
      BCF    STATUS,RP0  ;RegBank 0 einschalten
      CLRF  PORTB    ; PortB löschen
INROUTINE  bcf    INSTATUS,INPORTALT  ;INSTATUS,INPORTNEU -> INSTATUS,INPORTALT
      btfsc  INSTATUS,INPORTNEU
      bsf    INSTATUS,INPORTALT

      movf  TINPORT,w
      movwf  TEMP1
      bcf    INSTATUS,INPORTNEU  ;TIN -> INSTATUS,INPORTNEU, TEMP1,INPORTALT
      btfsc  TEMP1,TIN
      bsf    INSTATUS,INPORTNEU
      clrf  TEMP2
      btfsc  TEMP1,TIN
      bsf    TEMP2,INPORTALT

      movf  INSTATUS,w
      xorwf  TEMP2,f

      btfss  TEMP2,INPORTALT  ;Hat sich am Pin TIN der Pegel geändert?
      goto  INROUTINE
      btfss  INSTATUS,INPORTNEU  ;ja: -> steigende oder fallende Flanke?
      goto  INROUTINE    ;fallende Flanke
INLHFLANKE  incf  INZAEL,f    ;steigende Flanke: Zählregister +1
      movff  INZAEL,PORTB
      goto  INROUTINE   
      end

Autor: TK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Micha,

ich hab jetzt den Code nicht ganz durchgesehen, ABER der PORTA liegt 
meines Wissens immer noch an Adr 0x05 und nicht an 0x25.

Gruß
TK

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TK wrote:
> ABER der PORTA liegt
> meines Wissens immer noch an Adr 0x05 und nicht an 0x25.

Stimmt.
Ich würde halt immer die Definitions-Datei von Microchip includen, statt 
solch Zeugs selber schreiben/kopieren.

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PORTA equ 0x25 damit ichs mit MPLAB probieren kann!
PortA kann ich nicht verändern!

Autor: TK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK - Versuch der Zweite:

Selbst, wenn die Interrupts deaktiviert sind, würde ich trotzdem an
ORG 0x04 einen RETFIE einbauen.
Das bedeutet aber an ORG 0x00 ein GOTO init (z.B. ab ORG 0x10).
Weiterhin ist es "gute Praxis" vor dem eigentlichen Hauptablauf
erst einmal alle benutzten GPR zu löschen (man kann sich nach eigener 
Erfahrung nicht immer darauf verlassen, dass nach einem Reset alle 
Register eine 0x00 aufweisen).

Bis dann
TK

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke habs gefunden.
 Reicht für include   #include <P16f627A.INC>?

in der INC-Datei steht TRISA 0x85 / TRISB 0x86

Wenn ich das in meinem Progr. schreibe geht nichts! Wenn ich aber 05 und 
0x06 nehm gehts wunderbar! Wieso"
W                            EQU     H'0000'
F                            EQU     H'0001'

;----- Register Files------------------------------------------------------

INDF                         EQU     H'0000'
TMR0                         EQU     H'0001'
PCL                          EQU     H'0002'
STATUS                       EQU     H'0003'
FSR                          EQU     H'0004'
PORTA                        EQU     H'0005'
PORTB                        EQU     H'0006'

INTCON                       EQU     H'000B'
OPTION_REG                   EQU     H'0081'
TRISA                        EQU     H'0005'
TRISB                        EQU     H'0006'
CMCON                        EQU     H'001F'

;----- STATUS Bits --------------------------------------------------------
IRP                          EQU     H'0007'
RP1                          EQU     H'0006'
RP0                          EQU     H'0005'
NOT_TO                       EQU     H'0004'
NOT_PD                       EQU     H'0003'
Z                            EQU     H'0002'
DC                           EQU     H'0001'
C                            EQU     H'0000'

;----Variablen-------------------------------------------------------------

INSTATUS  equ    0x23
INPORTALT  equ    0  ;INSTAUS, BIT
INPORTNEU  equ    1
TINPORT     equ    PORTA
TIN      equ    0    ;Takt in Port

TEMP1    equ    0x20
TEMP2    equ    0x21
INZAEL    equ    0x22


;==========================================================================
;
;       Configuration Bits
;
;==========================================================================

_BODEN_ON                    EQU     H'3FFF'
_BODEN_OFF                   EQU     H'3FBF'
_CP_ALL                      EQU     H'03FF'
_CP_75                       EQU     H'17FF'
_CP_50                       EQU     H'2BFF'
_CP_OFF                      EQU     H'3FFF'
_DATA_CP_ON                  EQU     H'3EFF'
_DATA_CP_OFF                 EQU     H'3FFF'
_PWRTE_OFF                   EQU     H'3FFF'
_PWRTE_ON                    EQU     H'3FF7'
_WDT_ON                      EQU     H'3FFF'
_WDT_OFF                     EQU     H'3FFB'
_LVP_ON                      EQU     H'3FFF'
_LVP_OFF                     EQU     H'3F7F'
_MCLRE_ON                    EQU     H'3FFF'
_MCLRE_OFF                   EQU     H'3FDF'
_ER_OSC_CLKOUT               EQU     H'3FFF'
_ER_OSC_NOCLKOUT             EQU     H'3FFE'
_INTRC_OSC_CLKOUT            EQU     H'3FFD'
_INTRC_OSC_NOCLKOUT          EQU     H'3FFC'
_EXTCLK_OSC                  EQU     H'3FEF'
_LP_OSC                      EQU     H'3FEC'
_XT_OSC                      EQU     H'3FED'
_HS_OSC                      EQU     H'3FEE'

  __CONFIG        _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC

      ORG    0
      goto  start
      ORG   4
      retfie

;******************************** MACROS ****************************************************
movff    macro  quelle,ziel
      movf  quelle,w
      movwf  ziel
      endm


start    clrf  INSTATUS  
      clrf  TINPORT  
      clrf  TEMP1  
      clrf  TEMP2
      clrf  INZAEL  
      MOVLW  B'00000111'  ;Disable Comparator module's
      MOVWF  CMCON
    ;
      BSF    STATUS,RP0  ;RegBank 1 einschalten
      MOVLW  B'11010111'  ;Set PIC options (See datasheet).
      MOVWF  OPTION_REG  ;Write the OPTION register.
    ;
      CLRF  INTCON    ;Disable interrupts
      MOVLW  B'00000000'
      MOVWF  TRISB    ;RB7 & RB6 sind Eingänge ;RB5...RB0 sind Ausgänge.
      MOVLW  B'00001111'  ;RA0...RA3 sind Eingänge
      MOVWF  TRISA
      BCF    STATUS,RP0  ;RegBank 0 einschalten
      CLRF  PORTB    ; PortB löschen
INROUTINE  bcf    INSTATUS,INPORTALT  ;INSTATUS,INPORTNEU -> INSTATUS,INPORTALT
      btfsc  INSTATUS,INPORTNEU
      bsf    INSTATUS,INPORTALT

      movf  TINPORT,w
      movwf  TEMP1
      bcf    INSTATUS,INPORTNEU  ;TIN -> INSTATUS,INPORTNEU, TEMP1,INPORTALT
      btfsc  TEMP1,TIN
      bsf    INSTATUS,INPORTNEU
      clrf  TEMP2
      btfsc  TEMP1,TIN
      bsf    TEMP2,INPORTALT

      movf  INSTATUS,w
      xorwf  TEMP2,f

      btfss  TEMP2,INPORTALT  ;Hat sich am Pin TIN der Pegel geändert?
      goto  INROUTINE
      btfss  INSTATUS,INPORTNEU  ;ja: -> steigende oder fallende Flanke?
      goto  INROUTINE    ;fallende Flanke
INLHFLANKE  ;movf  INZAEL,w
    ;  addlw  .1
      incf  INZAEL,f    ;steigende Flanke: Zählregister +1
    ;  movwf  PORTB
      movff  INZAEL,PORTB
      goto  INROUTINE   
      end

Autor: TK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal blöd gefragt:
Was geht nicht? Die Simulation oder der richtige Hardwaretest?
Wenn TRISA/TRISB nicht an den angegebenen Adressen 0x85/0x86 liegen,
dann schaltest Du mit den Befehlen den PORTA/PORTB.
Das bedeutet aber dann, daß nach einem Reset die PORTs als INPUT 
geschaltet sind. Damnach darf nichts ausgegeben werden!
Wie sieht eigentlich die HW aus?
ext. 4MHz Quarz? MCLR-Pin über 10k an VCC? Oszi zum messen am PORTB-Pin?

Gruß
TK

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HW geht nicht, zeigt nichts an. Mit TRISA equ 5 und TRISB equ 6 gehts 
merkwürdiger weise. Eingang PORTA.0 , 4,096Mhz, soll anschließend auf 
nem Display angezeigt werden (Bin2Dec-kodiert)....

Autor: TK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>HW geht nicht, zeigt nichts an.

Das suggeriert mir, daß das nicht der gesamte SourceCode ist, da ja 
nichts zum Anzeigen da ist. Momentan wird nur ein inkrementierter 
Binärwert auf PORTB ausgegeben. Und das sollte eigentlich funktionieren 
(allerdings mit TRISA/B an 0x85/0x86).
Vielleicht noch eine Kleinigkeit:
Wie schnell kann denn eine Flankenänderung an PORTA.0 ankommen? Hier 
würde sich auch eine kleine Entprellroutine positiv auswirken. Momentan 
läuft die Abfrage in einer sehr schnellen LOOP (einige us). Und so 
schnell können Daten überhaupt nicht an eine Anzeige transferiert werden 
- geschweige denn, daß man dann noch was sehen würde.
Aber wie gesagt - der gezeigte Codeausschnitt müßte wie beschrieben 
funktionieren.

Gruß
TK

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Routine funktioniert so weit. Entprellt wird HW-mäßig. TRISA ist ja 
im Standart nach einem RESET immer Eingang (laut HB)
Bin gerade dabei das ergenis auf einem LCD zu zeigen. Komisch ist nur, 
dass die Zähl-Routine klappt, das display nach dem Initialisieren auch 
was anzeigt, beides zusammen aber nicht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.