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
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?
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
|
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
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.
PORTA equ 0x25 damit ichs mit MPLAB probieren kann! PortA kann ich nicht verändern!
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
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
|
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
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)....
>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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.