- Labornetzteil AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 16 von 16

Thema: Zählen mit PIC? aaaaaaarg!?

  1. #11
    Gast
    Anzeige

    Powerstation Test
    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

  2. #12
    Gast
    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

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    23.02.2004
    Beiträge
    12

    Re: Zählen mit PIC? aaaaaaarg!?

    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:


    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

  4. #14
    Gast
    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

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    23.02.2004
    Beiträge
    12
    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:

    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

  6. #16
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    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?

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests