- 3D-Druck Einstieg und Tipps         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 21

Thema: Code zum Messwert verdreifachen/ pwm ein/aus-schalten ?

  1. #11
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.05.2005
    Ort
    Wallis
    Beiträge
    137
    Anzeige

    E-Bike
    doch...!

    Nachdem du ADRESH bearbeitet hast, (verdreifachen usw.) hast du ja den gewünschten Wert. Wenn grösser als 240, dann 255 oder so ähnlich.

    Nachher musst du ja nur noch den Wert von ADRESH in CCPR1L übertragen und das wars.

    Nicht:
    MOVWF CCPR1L ; obere 8 Bit sind PWM

    Sondern:
    movf ADRESH, W
    movwf CCPR1L

  2. #12
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    äm, moment:
    ich lese eine spannung ein die maximal 1/3 von 5V ist, deswegen muß ich den wert verdreifachen..

    wenn das verdreifachen nen überlauf gibt (carry flag gesetzt wird) heißt das ja einfach nur, dass ich zb 5,1V habe, wegen dem verdreifachen,
    und damit dann der wert nicht wieder auf 0,1V fällt lese ich das carry flag aus, das sagt mir der wert ist über 5V, also vollast.

    Der wert in ADRESH !bleibt! aber ca 1/3 von 5V (der original messwert)
    deswegen muß ich den 3fachen wert aus !work! ins ccp-dingens laden (adresh wird nicht geschrieben nur gelesen),

    Wenn ich adresh übertragen würde, wäre es maximal 1/3, aber nicht vollast..

    das flag soll nur den überlauf auffangen, nicht die vollast schalten..

    das klappt ja alles, aber das ist immernoch eine taktung ein aus ein aus ein aus, also weiterhin schaltverluste.

    jetzt möchte ich aber dass von 4,9 bis 5,1V (überlauf) immer
    vollast= dauer high
    ist, ohne aus ein aus ein, also muß doch das pwm modul deaktiviert werden, damit ich keine schaltverluste mehr habe..
    das würde das ganze von maximal 10Watt verlust auf <2W Verlust runtersetzen, also deutlich Wärme sparen..

    hmmm

    jetzt klar was ich meinte ? (ich weiß net wie ichs anders sagen soll)
    Das Problem ist nicht die 4,9 bis 5,1V zu erkennen und zu nutzen, das bekomme ich irgendwie hin, nur den pin umzuschalten auf dauer ein, das klappt net.

    Vollast hab ich von 5,0V bis 9,9V =100% PWM (berechnete spannung 9,9V,gemessen=3,3V) (bei 10V doppelte überlauf => Flag wieder=0)

    ich hätte aber gerne den ausgangspin "high" von 4,9 bis 9,9V, ohne pwm, taktung oder frequenz..


    ist doof zum sagen, und in assembler noch blöder, saß an dem bisherigen verdreifachen etc auch heute einige Stunden dran..

    -evtl läufts doch auf nen zusatz-digital-pin raus

    hmpf

    Danke Trotzdem
    GrußundTschüß \/
    ~Jürgen

  3. #13
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    Zitat Zitat von Benji
    doch...!

    Nachdem du ADRESH bearbeitet hast, (verdreifachen usw.) hast du ja den gewünschten Wert. Wenn grösser als 240, dann 255 oder so ähnlich.

    Nachher musst du ja nur noch den Wert von ADRESH in CCPR1L übertragen und das wars.

    Nicht:
    MOVWF CCPR1L ; obere 8 Bit sind PWM

    Sondern:
    movfw ADRESH
    movwf CCPR1L
    Am Ende von dem Code-Teil: Nehmen wer mal an messwert = 1,7V (also ca 1/3 von 5V)

    also ist ADRESH = 1,7V
    Work ist 3x1,7V = 5,1V
    die 5,1V werden vom flag erkannt und WORK wird auf 5V = 100% Tastverhältnis=Vollast gesetzt

    ADRESH ist immernoch = 1,7V
    WORK ist 5,0V
    Dann wird WORK=5V nach CCPR1L geschrieben,
    und somit das modul auf 100% gesetzt. (immernoch getaktet)


    wenn ich stattdessen wie du vorschlägst
    adresh nach work,
    und dann
    work nach CCPR1L schreiben würde, hätte ich nur 33%


    hmmm?

    hm!

    Gut Nacht!

    vielleicht fällt mir ja noch was geniales ein.. aber dazu weiß ich zuwenig über den pic


    (den Befehl "movf Adresh, W" gibts doch garnicht, verschrieben?
    der befehl würde doch lauten (laut sprut)
    ADRESH in WORK laden:
    movf ADRESH,0
    oder
    movfw ADRESH )
    GrußundTschüß \/
    ~Jürgen

  4. #14
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.02.2006
    Alter
    60
    Beiträge
    114
    Was für einen Assembler benutzt du denn?
    Fast alle Assembler, die ich kenne, kommen mit der Syntax
    movf ADRESH,w
    klar.
    Das ist doch auch viel deutlicher als ..,0 zu schreiben.
    Besonders sinnvoll ist diese Notation, wenn man sowohl ins W-Register als auch in irgendein anderes Register (file) schreiben kann:

    addwf ADRESH,w
    oder
    addwf ADRESH,f

    Einmal wird das Ergebnis in W geschrieben, ein andernmal in ADRESH.

    Alles viel einfacher zu lesen als 0 oder 1.

    Gruß
    Phaidros

  5. #15
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    ich sag nicht mein assembler kanns nicht,
    habs ehrlich gesagt net probiert ,habs nur net bei sprut gesehen

    die anderen gehen ja auch
    ..heute hab ich in MPlab-ide getippt..und mit mpasmwin assembliert
    hab ja jetzt drei gleichwertige befehle zur auswahl..

    aaaaber , das bringt mich der Lösung nicht näher

    ich find
    movfw schon übersichtlich move f=dingensbumens nach w=work

    und movwf move w=work nach f=dingensbumens ..
    ich hab ja nicht gesagt ich schreibs mit d=0 oder 1 ..
    nur dass das bei sprut so steht..
    GrußundTschüß \/
    ~Jürgen

  6. #16
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.02.2006
    Alter
    60
    Beiträge
    114
    Zu deinem eigentlichen Problem:
    Das PWM-Modul hat zwei Parameter: Duty-Cycle und Periode. Mit dem Wert von CCPR1 stellst du den Duty-Cycle ein. Wenn der größer ist als die Periode (bestimmt durch PR2), bleibt der Pin immer auf High!
    Poste doch mal den kompletten PWM-Code.
    Gruß
    Phaidros

  7. #17
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    aaaah, ooooh, echt?

    ich hab da noch net wirklich ahnung von

    der komplette code (ab config) wie er jetzt im ic steckt (und läuft):

    Code:
    ;==========================================================================
    ;
    ;       Configuration 
    ;
    ;==========================================================================
    
    
    	__CONFIG        _CP_OFF & _DEBUG_OFF & _LVP_OFF & _WRT_OFF & _PWRTE_ON & _WDT_OFF & _BODEN_OFF & _HS_OSC
    
    
    
    ;==========================================================================
    ;
    ;       Variable Definition
    ;
    ;==========================================================================
    
    wait	EQU	0x20
    loops2	EQU 0x22
    summe	EQU 0x21
    
    ; Anfangsinitialisierung
    
    init
    ; PWM vorbereiten
    ; Vorteiler 16:1 und Timer2 einschalten
    	BSF	T2CON,T2CKPS1	; Vorteiler 16:1
    	BSF	T2CON,TMR2ON	; Timer2 ein
    
    ; Frequenz auf  ca 700Hz einstellen
    	BSF	STATUS,RP0	; Bank1
    	MOVLW	D'255'		;
    	MOVWF	PR2		; ca 700 Hz
    	BCF	STATUS,RP0	; Bank1
    
    ; Tastverhältnis auf 0% einstellen 
        MOVLW  D'0'  
        MOVWF  CCPR1L           ; 0% 
        MOVLW  D'0'  
        MOVWF  CCPR2L           ; 0% 
    
    ; RC2/CCP1 und RC1/CCP2 auf Ausgang stellen 
        BSF    STATUS,RP0       ; Bank1 
        BCF    TRISC, 2         ; RC2: output=0 
        BCF    TRISC, 1         ; RC1: output=0 
        BCF    STATUS,RP0       ; Bank 0
    
    ; PWM MODE mit CCP1 initialisieren
    	CLRF	CCP1CON		; CCP1-Modus aus
    	BSF	CCP1CON,CCP1M3	; CCP1-Modus PWM-Mode
    	BSF	CCP1CON,CCP1M2	;
    
    ; PWM MODE mit CCP2 initialisieren 
        CLRF   CCP2CON          ; CCP2-Modus aus 
        BSF    CCP2CON,CCP2M3   ; CCP2-Modus PWM-Mode 
        BSF    CCP2CON,CCP2M2	;
    
    ; ADC vorbereiten
    ; PortB vorbereiten
    	bsf	STATUS, RP0	; auf Bank 1 umschalten
    	movlw	B'00000000'	; PortB alle output
    	movwf	TRISB
    	bcf	STATUS, RP0	; auf Bank 0 zurückschalten
    	clrf	PORTB		; alle LEDs ausschalten
    
    ; ADC einschalten
    	BSF	ADCON0, 0	; ADON=1
    
    ; ADC speed für 20 MHz einstellen
    	BSF	ADCON0, 7	; ADCS1=1
    	BCF	ADCON0, 6	; ADCS0=0
    
    ; Daten linksbündig
    	BSF	STATUS,RP0	; Bank1
    	BCF	ADCON1, 7	; ADFM=0
    	BCF	STATUS,RP0	; Bank0
    
    
    ;**********************************************************
    ; Hauptprogrammschleife
    
    Main
    ; Ablauf für 1.PWM ausgang
    ; ADC-Eingang AN0 auswählen
    	BCF	ADCON0, 5	; ADCHS2=0
    	BCF	ADCON0, 4	; ADCHS1=0
    	BCF	ADCON0, 3	; ADCHS0=0
    
    ;Pause zum ADC aufladen?
    ;********************************************************** 
    ; Warteschleife 1 ms für einen 10MHz-PIC-Takt 
    Wai 
            movlw   .249           ; Zeitkonstante für 1ms 
            movwf   loops2 
    
    Wai2    nop  
            nop 
            nop 
            nop 
            nop 
            nop
    		nop 
            decfsz  loops2, F      ; 1 ms vorbei? 
            goto    Wai2           ; nein, noch nicht
     
    
    
    ;Eingangsspannung wandeln
    	BSF	ADCON0, 2	; ADC starten
    loop
    	BTFSC	ADCON0, 2	; ist der ADC fertig?
    	GOTO	loop		; nein, weiter warten
    
    ; Wert auslesen und schreiben 
    ; #### Nebenrechung
    
    ;Der Wert von ADRESH wird ausgelesen, wenn er kleiner 15 ist, soll der Ausgang ausgeschaltet bleiben
    ;dazu wird das carryflag abgefragt: wenn der messwert +240 das flag setzt,bedeutet das, er ist größer/gleich 15,
    ;also wird normal weitergemacht, wenn die flag nicht gesetzt wird, ist der wert kleiner 15, und der pwm ausgang soll "aus" bleiben
    ;dafür wird dann adresh 0 gesetzt,somit wird im folgenden code 0 + 0 + 0 = 0 und der port auf 0 gesetzt.
    
    	BCF		STATUS,C	; Carry Flag auf 0
    	movfw	ADRESH 		; wert auslesen, in work setzen
    	addlw	D'240'		; 240 mit work addieren,
    	btfss	STATUS,C	; carryflag gesetzt durch addition?
    	clrf	ADRESH		; dann wird der befehl übergangen, da wert größer 15 (sonst adresh=0 => PWM=ausschalten da wert zu klein)
    						; sonst normal weiter						
    ; #### Nebenrechnung Ende
    	BCF		STATUS,C	; Carry Flag auf 0	
    	movfw	ADRESH 		; wert auslesen (0 oder messwert), in work setzen
    	addwf	ADRESH,0	; wert verdoppelt
    	addwf	ADRESH,0	; wert verdreifacht
    	btfsc	STATUS,C	; wenn carry flag gesetzt, 
    	movlw	D'255'		; dann: wert auf maximum setzen=255=5V
    	movwf	PORTB		; sonst: normal weiter, obere 8 Bit nach PortB schreiben
    
    ; Wert an PWM1 übergeben
    	MOVWF	CCPR1L		; obere 8 Bit sind PWM
    
    ; Warten, damit der ADC sich erholen kann
    	clrf	wait
    warten
    	DECFSZ	wait, f
    	goto	warten
    
    ; Ablauf für 2.PWM ausgang
    ; ADC-Eingang AN1 auswählen
    	BCF	ADCON0, 5	; ADCHS2=0
    	BCF	ADCON0, 4	; ADCHS1=0
    	BSF	ADCON0, 3	; ADCHS0=1
    
    ;Pause zum ADC aufladen?
    ;********************************************************** 
    ; Warteschleife 1 ms für einen 10MHz-PIC-Takt 
    Waii 
            movlw   .249           ; Zeitkonstante für 1ms 
            movwf   loops2 
    
    Wai3    nop  
            nop 
            nop 
            nop 
            nop 
            nop
    		nop 
            decfsz  loops2, F      ; 1 ms vorbei? 
            goto    Wai3           ; nein, noch nicht
    
    ;Eingangsspannung wandeln
    	BSF	ADCON0, 2	; ADC starten
    loop2
    	BTFSC	ADCON0, 2	; ist der ADC fertig?
    	GOTO	loop2		; nein, weiter warten
    
    ; Wert auslesen und schreiben 
    ; #### Nebenrechung
    
    ;Der Wert von ADRESH wird ausgelesen, wenn er kleiner 15 ist, soll der Ausgang ausgeschaltet bleiben
    ;dazu wird das carryflag abgefragt: wenn der messwert +240 das flag setzt,bedeutet das, er ist größer/gleich 15,
    ;also wird normal weitergemacht, wenn die flag nicht gesetzt wird, ist der wert kleiner 15, und der pwm ausgang soll "aus" bleiben
    ;dafür wird dann adresh 0 gesetzt,somit wird im folgenden code 0 + 0 + 0 = 0 und der port auf 0 gesetzt.
    
    	BCF		STATUS,C	; Carry Flag auf 0
    	movfw	ADRESH 		; wert auslesen, in work setzen
    	addlw	D'240'		; 240 mit work addieren,
    	btfss	STATUS,C	; carryflag gesetzt durch addition?
    	clrf	ADRESH		; dann wird der befehl übergangen, da wert größer 15 (sonst adresh=0 => PWM=ausschalten da wert zu klein)
    						; sonst normal weiter						
    ; #### Nebenrechnung Ende
    	BCF		STATUS,C	; Carry Flag auf 0	
    	movfw	ADRESH 		; wert auslesen (0 oder messwert), in work setzen
    	addwf	ADRESH,0	; wert verdoppelt
    	addwf	ADRESH,0	; wert verdreifacht
    	btfsc	STATUS,C	; wenn carry flag gesetzt, 
    	movlw	D'255'		; dann: wert auf maximum setzen=255=5V
    						; sonst normal weiter
    ; Wert an PWM2 übergeben
    	MOVWF	CCPR2L		; obere 8 Bit sind PWM
    
    ; Warten, damit der ADC sich erholen kann 
            clrf    wait 
    warten2 
            DECFSZ  wait, f 
            goto    warten2 
    
          	goto	Main
    
    	end
    Alles angelehnt an spruts PWM Beispiel..inzwischen etwas erweitert..

    jetzt schau ich nochmal was du da grade gemeint hast..
    GrußundTschüß \/
    ~Jürgen

  8. #18
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    äm, moment, heißt das ich muß anstatt
    RP2 = 255
    einfach nur
    RP2=254 machen, und ich hab mein high-pin (OHNE schaltverluste am mosfet) sobald ich 255 ins CCPL1 reinschreibe?

    also aus dem hier:

    Code:
    ; Frequenz auf  ca 700Hz einstellen 
       BSF   STATUS,RP0   ; Bank1 
       MOVLW   D'255'      ; 
       MOVWF   PR2      ; ca 700 Hz 
       BCF   STATUS,RP0   ; Bank1
    das hier machen?:
    Code:
    ; Frequenz auf  ca 700Hz einstellen 
       BSF   STATUS,RP0   ; Bank1 
       MOVLW   D'254'      ; HIER 1 WENIGER
       MOVWF   PR2      ; ca 700 Hz 
       BCF   STATUS,RP0   ; Bank1
    GrußundTschüß \/
    ~Jürgen

  9. #19
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2006
    Beiträge
    1.178
    ES leeeeeeebt!

    MUAHAHAHAAA!

    jup, funktioniert ..
    oder in messwerten gesagt:
    vorher ging er gemessen mitm multimeter bis auf 99,5% duty cycle hoch
    (ohne dauerhigh)
    jetzt springt er von 98,5% direkt auf 0, bei voller helligkeit ..
    exakt bei stufe 6 aufm Drehschalter!

    Jetzt noch bissl an den Werten rumspielen, dass er ab Stufe 5 1/2 auf dauerhigh geht, und das ganze passt!
    (da werd ich einfach noch +5 zum ersten Work addieren, und dann erst übertragen, dann ist das carry flag um 5 früher dran, also insgesamt um
    5 alles höher....

    Schön!
    Sehr Schön!
    Danke!!
    Vielen Dank!

    -Als nächstes die Weltherrschaft ..
    GrußundTschüß \/
    ~Jürgen

  10. #20
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.05.2005
    Ort
    Wallis
    Beiträge
    137
    Oh Sorry

    Habe mich tatsächlich ein bisschen "verlesen". Habe gemeint du überschreibst direkt ADRESH.

    Nadann, Hauptsache es funktioniert jetzt.

    (Sorry, das ich erst jetzt zurückschreibe, aber manchmal muss ich halt auch noch arbeiten )

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

12V Akku bauen