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


von Micha (Gast)


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

von Severino R. (severino)


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?

von Micha (Gast)


Lesenswert?

Meine Versuche:
funktioniert in MPLAP-Sim aber nicht auf dem Board
1
W                            EQU     H'0000'
2
F                            EQU     H'0001'
3
4
;----- Register Files------------------------------------------------------
5
6
INDF                         EQU     H'0000'
7
TMR0                         EQU     H'0001'
8
PCL                          EQU     H'0002'
9
STATUS                       EQU     H'0003'
10
FSR                          EQU     H'0004'
11
PORTA                        EQU     H'0025'
12
PORTB                        EQU     H'0006'
13
14
INTCON                       EQU     H'000B'
15
OPTION_REG                   EQU     H'0081'
16
TRISA                        EQU     H'0085'
17
TRISB                        EQU     H'0086'
18
CMCON                        EQU     H'001F'
19
20
;----- STATUS Bits --------------------------------------------------------
21
IRP                          EQU     H'0007'
22
RP1                          EQU     H'0006'
23
RP0                          EQU     H'0005'
24
NOT_TO                       EQU     H'0004'
25
NOT_PD                       EQU     H'0003'
26
Z                            EQU     H'0002'
27
DC                           EQU     H'0001'
28
C                            EQU     H'0000'
29
30
;----Variablen-------------------------------------------------------------
31
32
INSTATUS  equ    0x23
33
INPORTALT  equ    0  ;INSTAUS, BIT
34
INPORTNEU  equ    1
35
TINPORT         equ    PORTA
36
TIN    equ    0    ;Takt in Port
37
38
TEMP1    equ    0x20
39
TEMP2    equ    0x21
40
INZAEL    equ    0x22
41
42
43
;==========================================================================
44
;
45
;       Configuration Bits
46
;
47
;==========================================================================
48
49
_BODEN_ON                    EQU     H'3FFF'
50
_BODEN_OFF                   EQU     H'3FBF'
51
_CP_ALL                      EQU     H'03FF'
52
_CP_75                       EQU     H'17FF'
53
_CP_50                       EQU     H'2BFF'
54
_CP_OFF                      EQU     H'3FFF'
55
_DATA_CP_ON                  EQU     H'3EFF'
56
_DATA_CP_OFF                 EQU     H'3FFF'
57
_PWRTE_OFF                   EQU     H'3FFF'
58
_PWRTE_ON                    EQU     H'3FF7'
59
_WDT_ON                      EQU     H'3FFF'
60
_WDT_OFF                     EQU     H'3FFB'
61
_LVP_ON                      EQU     H'3FFF'
62
_LVP_OFF                     EQU     H'3F7F'
63
_MCLRE_ON                    EQU     H'3FFF'
64
_MCLRE_OFF                   EQU     H'3FDF'
65
_ER_OSC_CLKOUT               EQU     H'3FFF'
66
_ER_OSC_NOCLKOUT             EQU     H'3FFE'
67
_INTRC_OSC_CLKOUT            EQU     H'3FFD'
68
_INTRC_OSC_NOCLKOUT          EQU     H'3FFC'
69
_EXTCLK_OSC                  EQU     H'3FEF'
70
_LP_OSC                      EQU     H'3FEC'
71
_XT_OSC                      EQU     H'3FED'
72
_HS_OSC                      EQU     H'3FEE'
73
74
  __CONFIG        _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC
75
76
      ORG    0
77
78
;******************************** MACROS ****************************************************
79
movff    macro  quelle,ziel
80
      movf  quelle,w
81
      movwf  ziel
82
      endm
83
84
85
      MOVLW  B'00000111'  ;Disable Comparator module's
86
      MOVWF  CMCON
87
    ;
88
      BSF    STATUS,RP0  ;RegBank 1 einschalten
89
    ;  MOVLW  B'11010111'  ;Set PIC options (See datasheet).
90
    ;  MOVWF  OPTION_REG  ;Write the OPTION register.
91
    ;
92
      CLRF  INTCON    ;Disable interrupts
93
      MOVLW  B'11000000'
94
      MOVWF  TRISB    ;RB7 & RB6 sind Eingänge ;RB5...RB0 sind Ausgänge.
95
      MOVLW  B'00001111'  ;RA0...RA3 sind Eingänge
96
      MOVWF  TRISA
97
      BCF    STATUS,RP0  ;RegBank 0 einschalten
98
      CLRF  PORTB    ; PortB löschen
99
INROUTINE  bcf    INSTATUS,INPORTALT  ;INSTATUS,INPORTNEU -> INSTATUS,INPORTALT
100
      btfsc  INSTATUS,INPORTNEU
101
      bsf    INSTATUS,INPORTALT
102
103
      movf  TINPORT,w
104
      movwf  TEMP1
105
      bcf    INSTATUS,INPORTNEU  ;TIN -> INSTATUS,INPORTNEU, TEMP1,INPORTALT
106
      btfsc  TEMP1,TIN
107
      bsf    INSTATUS,INPORTNEU
108
      clrf  TEMP2
109
      btfsc  TEMP1,TIN
110
      bsf    TEMP2,INPORTALT
111
112
      movf  INSTATUS,w
113
      xorwf  TEMP2,f
114
115
      btfss  TEMP2,INPORTALT  ;Hat sich am Pin TIN der Pegel geändert?
116
      goto  INROUTINE
117
      btfss  INSTATUS,INPORTNEU  ;ja: -> steigende oder fallende Flanke?
118
      goto  INROUTINE    ;fallende Flanke
119
INLHFLANKE  incf  INZAEL,f    ;steigende Flanke: Zählregister +1
120
      movff  INZAEL,PORTB
121
      goto  INROUTINE   
122
      end

von TK (Gast)


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

von Severino R. (severino)


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.

von Micha (Gast)


Lesenswert?

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

von TK (Gast)


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

von Micha (Gast)


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"
1
W                            EQU     H'0000'
2
F                            EQU     H'0001'
3
4
;----- Register Files------------------------------------------------------
5
6
INDF                         EQU     H'0000'
7
TMR0                         EQU     H'0001'
8
PCL                          EQU     H'0002'
9
STATUS                       EQU     H'0003'
10
FSR                          EQU     H'0004'
11
PORTA                        EQU     H'0005'
12
PORTB                        EQU     H'0006'
13
14
INTCON                       EQU     H'000B'
15
OPTION_REG                   EQU     H'0081'
16
TRISA                        EQU     H'0005'
17
TRISB                        EQU     H'0006'
18
CMCON                        EQU     H'001F'
19
20
;----- STATUS Bits --------------------------------------------------------
21
IRP                          EQU     H'0007'
22
RP1                          EQU     H'0006'
23
RP0                          EQU     H'0005'
24
NOT_TO                       EQU     H'0004'
25
NOT_PD                       EQU     H'0003'
26
Z                            EQU     H'0002'
27
DC                           EQU     H'0001'
28
C                            EQU     H'0000'
29
30
;----Variablen-------------------------------------------------------------
31
32
INSTATUS  equ    0x23
33
INPORTALT  equ    0  ;INSTAUS, BIT
34
INPORTNEU  equ    1
35
TINPORT     equ    PORTA
36
TIN      equ    0    ;Takt in Port
37
38
TEMP1    equ    0x20
39
TEMP2    equ    0x21
40
INZAEL    equ    0x22
41
42
43
;==========================================================================
44
;
45
;       Configuration Bits
46
;
47
;==========================================================================
48
49
_BODEN_ON                    EQU     H'3FFF'
50
_BODEN_OFF                   EQU     H'3FBF'
51
_CP_ALL                      EQU     H'03FF'
52
_CP_75                       EQU     H'17FF'
53
_CP_50                       EQU     H'2BFF'
54
_CP_OFF                      EQU     H'3FFF'
55
_DATA_CP_ON                  EQU     H'3EFF'
56
_DATA_CP_OFF                 EQU     H'3FFF'
57
_PWRTE_OFF                   EQU     H'3FFF'
58
_PWRTE_ON                    EQU     H'3FF7'
59
_WDT_ON                      EQU     H'3FFF'
60
_WDT_OFF                     EQU     H'3FFB'
61
_LVP_ON                      EQU     H'3FFF'
62
_LVP_OFF                     EQU     H'3F7F'
63
_MCLRE_ON                    EQU     H'3FFF'
64
_MCLRE_OFF                   EQU     H'3FDF'
65
_ER_OSC_CLKOUT               EQU     H'3FFF'
66
_ER_OSC_NOCLKOUT             EQU     H'3FFE'
67
_INTRC_OSC_CLKOUT            EQU     H'3FFD'
68
_INTRC_OSC_NOCLKOUT          EQU     H'3FFC'
69
_EXTCLK_OSC                  EQU     H'3FEF'
70
_LP_OSC                      EQU     H'3FEC'
71
_XT_OSC                      EQU     H'3FED'
72
_HS_OSC                      EQU     H'3FEE'
73
74
  __CONFIG        _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC
75
76
      ORG    0
77
      goto  start
78
      ORG   4
79
      retfie
80
81
;******************************** MACROS ****************************************************
82
movff    macro  quelle,ziel
83
      movf  quelle,w
84
      movwf  ziel
85
      endm
86
87
88
start    clrf  INSTATUS  
89
      clrf  TINPORT  
90
      clrf  TEMP1  
91
      clrf  TEMP2
92
      clrf  INZAEL  
93
      MOVLW  B'00000111'  ;Disable Comparator module's
94
      MOVWF  CMCON
95
    ;
96
      BSF    STATUS,RP0  ;RegBank 1 einschalten
97
      MOVLW  B'11010111'  ;Set PIC options (See datasheet).
98
      MOVWF  OPTION_REG  ;Write the OPTION register.
99
    ;
100
      CLRF  INTCON    ;Disable interrupts
101
      MOVLW  B'00000000'
102
      MOVWF  TRISB    ;RB7 & RB6 sind Eingänge ;RB5...RB0 sind Ausgänge.
103
      MOVLW  B'00001111'  ;RA0...RA3 sind Eingänge
104
      MOVWF  TRISA
105
      BCF    STATUS,RP0  ;RegBank 0 einschalten
106
      CLRF  PORTB    ; PortB löschen
107
INROUTINE  bcf    INSTATUS,INPORTALT  ;INSTATUS,INPORTNEU -> INSTATUS,INPORTALT
108
      btfsc  INSTATUS,INPORTNEU
109
      bsf    INSTATUS,INPORTALT
110
111
      movf  TINPORT,w
112
      movwf  TEMP1
113
      bcf    INSTATUS,INPORTNEU  ;TIN -> INSTATUS,INPORTNEU, TEMP1,INPORTALT
114
      btfsc  TEMP1,TIN
115
      bsf    INSTATUS,INPORTNEU
116
      clrf  TEMP2
117
      btfsc  TEMP1,TIN
118
      bsf    TEMP2,INPORTALT
119
120
      movf  INSTATUS,w
121
      xorwf  TEMP2,f
122
123
      btfss  TEMP2,INPORTALT  ;Hat sich am Pin TIN der Pegel geändert?
124
      goto  INROUTINE
125
      btfss  INSTATUS,INPORTNEU  ;ja: -> steigende oder fallende Flanke?
126
      goto  INROUTINE    ;fallende Flanke
127
INLHFLANKE  ;movf  INZAEL,w
128
    ;  addlw  .1
129
      incf  INZAEL,f    ;steigende Flanke: Zählregister +1
130
    ;  movwf  PORTB
131
      movff  INZAEL,PORTB
132
      goto  INROUTINE   
133
      end

von TK (Gast)


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

von Micha (Gast)


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)....

von TK (Gast)


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

von Micha (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.