Das versteh ich jetzt nicht ich hab doch
<<bsf OPTION_REG, T0CS; RA4-Takt zum Timer0
damit auf RA4 umgestellt oder stimmt die Übersicht
http://www.sprut.de/electronic/pic/g...imer/timer.htm nicht?
thx Christian
Druckbare Version
Das versteh ich jetzt nicht ich hab doch
<<bsf OPTION_REG, T0CS; RA4-Takt zum Timer0
damit auf RA4 umgestellt oder stimmt die Übersicht
http://www.sprut.de/electronic/pic/g...imer/timer.htm nicht?
thx Christian
Laut den Angaben auf der von Die genannten Seite (erste Wahl sollte IMMER das Datenblatt sein!!!) :
OPTREG:T0CS (=Bit 5) muss "1" sein für RA4->Timer
OPTREG:PSA (=Bit 3) muss "1" sein für Vorteiler OFF
Folglich sollte Dein Ini_opt so aussehen:
Ini_opt Equ B'00101xxx' x=egal
mit OPTREG:T0SE (=Bit 4) noch die richtige Flanke. die Du selektieren willst, einstellen.
Andreas
Hallo mal wieder
Also ich hab jetzt den Code geändert :
jetzt hab ich an PORTB dauernd Hi:
Ich hab das OPTREG so beschrieben
Ini_opt Equ B'00101000' wie Andreas es gesagt hat:
Zitat:
list p=16f84
#include <P16f84.INC>
;************************************************* ********
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator*
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
;************************************************* ********
Ini_con Equ B'00000000' ; TMR0 -> Intetupt disable
Ini_opt Equ B'00101000'
;************************************************* *********
Init bsf STATUS, RP0 ; Bank 1
movlw Ini_opt ; pull-up on
movwf OPTION_REG
movlw B'11111000' ; RA0 .. RA2 outputs, RA3, RA4 input
movwf TRISA ;
movlw B'00000000' ; PortB alle outputs
movwf TRISB
bcf STATUS, RP0 ; Bank 0
clrf PORTA
clrf PORTB
movlw Ini_con ; Interupt disable
movwf INTCON
;************************************************* *********
main
bcf INTCON, T0IF
movlw D'245'
movwf TMR0
movlw B'00000000'
movwf PORTB
BTFSC INTCON, T0IF
goto main
led movlw B'1111111'
movwf PORTB
end
Tja gebracht hat es nur das der PortB jetzt dauernd Hi ist ?!?
hat irgendjemand ein Beispiel wo mit einem PIC ereignisse Gezählt wurden und dann an einen oder mehrere Pins ausgegeben wurden???
Mfg
Christian
Versuchs mal so (ungetestet):
main:
bcf INTCON, T0IF ; Clear INT-Flag
movlw D'245' ; Timer preload
movwf TMR0
movlw B'00000000' ; port b auf "00000000"
movwf PORTB
loop:
BTFSC INTCON, T0IF ; Counter-Overflow?
goto port_on ; ja -> mach an
goto loop ; nein -> warten af weitere Tastendrucke
port_on:
movlw B'1111111' ; port b auf "11111111"
movwf PORTB
endlos ; und auf ewig warten
goto endloos ; (hier kommt was auch immer hin)
end
Das ganze funktioniert genau einmal - nach dem Einschalten ist PORTB auf "0", nach 10 (entprellten) Tastendrucken wird PORTB auf "1" gesetzt und auf ewig gewartet. Das entprellen kann man auch in Software machen.
Ich hoffe das funktioniert und macht es Dir aunschaulich.
Andreas
Vielen Dank an alle
besonderst an Andreas dein Code funktioniert ich finde nur bis auf die Schleife am Ende
keinen Unterschied?!?
Ich hab den Code hier noch mal gepostet, falls jemand nochmal so ein Problem hat.
Code:
Zitat:
list p=16f84
#include <P16f84.INC>
;************************************************* ********
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator*
__CONFIG _PWRTE_ON & _WDT_OFF & _XT_OSC
;************************************************* ********
Ini_con Equ B'00000000' ; TMR0 -> Interupt disable
Ini_opt Equ B'00101000'
;************************************************* *********
Init:
bsf STATUS, RP0 ; Bank 1
movlw Ini_opt ; pull-up on
movwf OPTION_REG
movlw B'11111000' ; RA0 .. RA2 outputs, RA3, RA4 input
movwf TRISA ;
movlw B'00000000' ; PortB alle outputs
movwf TRISB
bcf STATUS, RP0 ; Bank 0
clrf PORTA
clrf PORTB
movlw Ini_con ; Interupt disable
movwf INTCON
;************************************************* *********
main:
bcf INTCON, T0IF ; Clear INT-Flag
movlw D'245' ; Timer preload
movwf TMR0
movlw B'00000000' ; port b auf "00000000"
movwf PORTB
loop:
BTFSC INTCON, T0IF ; Counter-Overflow?
goto port_on ; ja -> mach an
goto loop ; nein -> warten af weitere Tastendrucke
port_on:
movlw B'1111111' ; port b auf "11111111"
movwf PORTB
endlos:
; und auf ewig warten
nop
nop
goto endlos ; (hier kommt was auch immer hin)
end
Also nochmal danke bis denne
Mfg
Christian
ich hab mal mit nem pic nen inkrementgeber auslesen müssen. d.h. ne art drehschalter. wenn man den dreht, gibt der in sehr kleinen abständen high-low-high-low-high-low......
und ich sollte halt zählen, wie oft.
ich sage im vorraus, dass das ganze nie funktioniert hat (habs irgendwann aufgegeben, lag aber mit sicherheit an was pic-intenem, der konnte die variable nicht speichern oder so..)
also aufgemerkt:
ich hatte 2 schleifen, eine für den high-zustand des inktementgebers und eine für den low-zustand. war er z.b. high, blieb er so lange in der high-schleife, bis er low wurde. dann wurde die variable um 1 incrementiert und es ging in die low-schleife. da passierte dann wieder das gleiche.
es ist ja so:
mann kann auch einfach zählen, z.b. jedes mal wenn ein high-signal anliegt einen hoch. das prob ist dann, dass der inkrementgeber auf high stehenbleiben kann und dann zählt sich der pic tot. also hab ich's gemacht wie oben beschrieben. vielleicht kannst du das auf deinen taster übertragen.
frag mich nicht nach dem code, der ist in der firma, in der ich das gemacht hab... (semesterferien) :P
edit:
mal den code verdeutlicht:
(in nem dirt-basic:)
--------------------
if port=high then goto highschleife else goto lowschleife 'start vom ganzen
highschleife:
if port=low then goto lowzähler
goto highschleife
lowschleife:
if port=high then goto highzähler
goto lowschleife
highzähler
inc variable 'zählt variable um eins hoch
goto highschleife
lowzähler
inc variable
goto lowzähler
-------------------
klar?