Autor Thema: PWM-Auflösung von 8bit auf 10bit ändern  (Gelesen 6853 mal)

Mirko

  • Gast
PWM-Auflösung von 8bit auf 10bit ändern
« am: Juni 18, 2009, 10:09:53 Vormittag »
Hallo,

habe das Beispiel von http://www.sprut.de/electronic/pic/programm/adcpwm.htm nachgebaut. Jetzt möchte ich die schlechte Genauigkeit der PWM-Ausgabe bei 8bit (20mV) auf 10bit (5mV) verbessern! Dazu müssen aber wie am Ende des Links kurz erklärt wird, noch zwei weitere Register eingelesen und dann irgendwie ausgegeben werden!

Kann mir da bitte einer weiter helfen, bzw. mir die ASM, so umschreiben, das meine Schaltung mit 10bit funktioniert? Muss nämlich zum testen fast 70Km an die Uni fahren

Ich brauche da unbedingt hilfe, schnell!!!!

Danke

Offline Coltfisch

  • Hero Member
  • *****
  • Beiträge: 501
    • Profil anzeigen
    • BASE 32
Re: PWM-Auflösung von 8bit auf 10bit ändern
« Antwort #1 am: Juni 18, 2009, 14:36:15 Nachmittag »
Dazu müssen aber wie am Ende des Links kurz erklärt wird, noch zwei weitere Register eingelesen und dann irgendwie ausgegeben werden!
Nee. Du musst (wie z.B. hier bei sprut wunderschön beschrieben: http://www.sprut.de/electronic/pic/grund/adc.htm) einfach nur zusätzlich noch den ADRESL-Register auslesen. Dort stehen, je nachdem, ob Du das Ergebnisformat links- oder rechtsbündig eingestellt hast, die zwei restlichen Ergebnisbits an Stelle 0 und 1 bzw. 6 und 7.
Diese beiden Bits müssen zur Erhöhung der PWM-Auflösung an Stelle 4 und 5 des CCP1CON-Registers geschrieben werden. Dies steht allerdings auch alles bei Sprut auf der Seite, also wo ist genau das Problem?

Kann mir da bitte einer ... die ASM, so umschreiben, das meine Schaltung mit 10bit funktioniert? Ich brauche da unbedingt hilfe, schnell!!!!
Ich glaube nicht, dass hier jemand die Zeit hat, Deine Hausaufgaben zu machen. Ich habe leider auch nicht das Gefühl, dass Du Dich wirklich selber bereits eingehend damit beschäftigt hast, sonst könntest Du Deine Schwierigkeiten mit der Aufgabe auch etwas genauer schildern.

Gruß
Daniel

Mirko

  • Gast
Re: PWM-Auflösung von 8bit auf 10bit ändern
« Antwort #2 am: Juni 25, 2009, 12:23:44 Nachmittag »
Danke für deine Antwort.

Richig, ich habe leider nicht so das Verständnis für Mikrocontroller, aber ich bemühe mich. Damit du weißt wo mein Problem besteht, hier mal kurz die Hauptschleife mit derzeit 8bit PWM:

; Hauptprogrammschleife
Main
; Eingangsspannung wandeln
        BSF     ADCON0, 2      ; ADC starten
loop
        BTFSC   ADCON0, 2      ; ist der ADC fertig?
        GOTO    loop           ; nein, weiter warten
; Wert nach PortB schreiben
        movfw   ADRESH         ; obere 8 Bit auslesen
        movwf   PORTB          ; obere 8 Bit nach PORTB
; Wert an PWM übergeben
        MOVWF   CCPR1L         ; obere 8 Bit sind PWM
; Warten, damit der ADC sich erholen kann
        clrf    wait
warten
        DECFSZ  wait, f
        goto    warten
        goto    Main
        end

Mein Ansatz wäre nun, der Rote Text. Ist das Richtig, oder muss das Anders? Ich muss doch auch nur in der Hauptschleife was ändern, oder!?


; Hauptprogrammschleife
Main
; Eingangsspannung wandeln
        BSF     ADCON0, 2      ; ADC starten
loop
        BTFSC   ADCON0, 2      ; ist der ADC fertig?
        GOTO    loop           ; nein, weiter warten
; Wert nach PortB schreiben
        movfw   ADRESH         ; obere 8 Bit auslesen
        movwf   PORTB          ; obere 8 Bit nach PORTB
        end


        movfw   ADRESL         ; obere 2 Bit auslesen (von 10bit)
        movwf   PORTB          ; obere 2 Bit nach PORTB (von 10bit)
        end


; Wert an PWM übergeben
        MOVWF   CCPR1L         ; 10 Bit sind PWM
; Warten, damit der ADC sich erholen kann
        clrf    wait
warten
        DECFSZ  wait, f
        goto    warten
        goto    Main
        end
end



Danke für eure Hilfe.

Gruß Mirko
« Letzte Änderung: August 28, 2009, 16:35:42 Nachmittag von Edson »

Offline Coltfisch

  • Hero Member
  • *****
  • Beiträge: 501
    • Profil anzeigen
    • BASE 32
Re: PWM-Auflösung von 8bit auf 10bit ändern
« Antwort #3 am: Juni 25, 2009, 14:18:38 Nachmittag »
Mein Ansatz wäre nun, der Rote Text. Ist das Richtig, oder muss das Anders?
Nee, das ist nicht so gut. Denn damit kopierst Du nur den Inhalt des unteren ADC-Registers nach PORTB, kurz darauf landet dieser Wert dann auch noch im unteren PWM-Register. Das wird so nichts.
Abgesehen davon müssen die zwei übrigen Bits des ADC-Werts (welche im ADRESL-Register an Stelle 7&6 stehen) im CCP1CON-Register an Stelle 5&4 geschrieben werden.

Ich bin zwar nicht der Assembler-Spezialist, deshalb sind auch meine folgenden Ausführungen mit Vorsicht zu genießen, aber ich denke Du solltest:
1.) erstmal wie gehabt den oberen ADC-Register auslesen, ins CCPR1L-Register kopieren (und optional noch nach PORTB)
2.) jetzt erst den unteren ADC-Register auslesen (movfw   ADRESL)
3.) Im Arbeitsregister W sollte jetzt folgendes stehen: XX000000 (XX sind die beiden restlichen Bits des ADC-Werts)
4.) Wert aus dem Arbeitsregister in eine temporäre Variable kopieren (movwf temp)
Jetzt müssen die Bits in der Variable "temp" um 2 Stellen nach rechts geschoben werden
5.) einmal Inhalt von "temp" nach rechts schieben, Ergebnis wieder nach "temp" (RRF temp,1)
6.) nochmal Inhalt von "temp" nach rechts schieben, Ergebnis ins Arbeitsregister W (RRF temp,0)
7.) Inhalt von W mit 00110000 UND-verknüpfen (um sicherzugehen, dass alle Bits außer Bit5&4 = 0 sind) (ANDLW 0x30)
8.) Inhalt des CCP1CON-Registers mit dem Inhalt des Arbeitsregisters W ODER-Verknüpfen (dadurch werden nur die Bits 5&4 geändert) (IORWF  CCP1CON,1)

So, jetzt sollten Bit 7&6 aus ADRESL an Stelle 5&4 von CCP1CON stehen.
Könnte klappen  ::)

Gruß
Daniel

Mirko

  • Gast
Re: PWM-Auflösung von 8bit auf 10bit ändern
« Antwort #4 am: Juni 25, 2009, 15:50:05 Nachmittag »
Hallo,

danke für deine schnelle Antwort.
Das klingt sehr interessant, etwas verwirrend und wahrscheinlich Richtig.
Habe das jetzt gleich mal versucht in den Quellcode einzuarbeiten. Stimmt das soweit? oder muss noch etwas geändert werden?

; Hauptprogrammschleife
Main
; Eingangsspannung wandeln
        BSF     ADCON0, 2      ; ADC starten
loop
        BTFSC   ADCON0, 2      ; ist der ADC fertig?
        GOTO    loop           ; nein, weiter warten
; Wert nach PortB schreiben
        movfw   ADRESH         ; obere 8 Bit auslesen
        movwf   PORTB          ; obere 8 Bit nach PORTB      

; Wert an PWM übergeben
        MOVWF   CCPR1L         ; obere 8 Bit sind PWM

        movfw   ADRESL
        movwf   temp
        RRF     temp,1
        RRF     temp,0
        ANDLW   0x30
        IORWF   CCP1CON,1

; Warten, damit der ADC sich erholen kann
        clrf    wait
warten
        DECFSZ  wait, f
        goto    warten
        goto    Main

mfg Mirko

Offline Coltfisch

  • Hero Member
  • *****
  • Beiträge: 501
    • Profil anzeigen
    • BASE 32
Re: PWM-Auflösung von 8bit auf 10bit ändern
« Antwort #5 am: Juni 25, 2009, 16:05:25 Nachmittag »
So hätte ich es auch gemacht  ;)
Denk dran, Du musst die Variable "temp" am Anfang des Programms noch deklarieren...

Mirko

  • Gast
Re: PWM-Auflösung von 8bit auf 10bit ändern
« Antwort #6 am: Juni 25, 2009, 16:31:17 Nachmittag »
Tach,

werde das morgen gleich mal ausprobieren.
Wenn das klappt, dann danke ich dir vielmals.  :D

Werde dir dann schnellst möglich eine Rückmeldung geben, ob es funktioniert hat!
**Wenn dir noch was einfällt, oder du eine Ergänzung hast, lass es mich ruhig wissen!**

lg Mirko

Mirko

  • Gast
Re: PWM-Auflösung von 8bit auf 10bit ändern
« Antwort #7 am: August 28, 2009, 13:46:32 Nachmittag »
Habs heute endlich nochmal getestet und festgestellt, das es so noch nicht funktioniert.

Vielleicht lags ja an der deklaration der Variable "temp".

  temp   EQU  0x10

Aber das is denk ich okay.

Daher glaube ich bei:
       movfw   ADRESL
        movwf   temp
        RRF     temp,1
        RRF     temp,0
        ANDLW   0x30
        IORWF   CCP1CON,1
irgend ein Fehler ist.

Gruß Mirko


Edit:Code Tags eingefügt
« Letzte Änderung: August 28, 2009, 16:37:54 Nachmittag von Edson »

Offline Edson

  • Sr. Member
  • ****
  • Beiträge: 410
    • Profil anzeigen
Re: PWM-Auflösung von 8bit auf 10bit ändern
« Antwort #8 am: August 28, 2009, 17:00:56 Nachmittag »
Hallo,

durch das IOR werden keine Bits zurückgesetzt. d.h. nach kürzester Zeit werden die Bits CCP1CON<5,4> den binären Wert 11 annehmen und nicht mehr verändern. Durch eine UND Verknüpfung der Zahl 0xCF mit dem CCP1CON Register lässt sich das vermeiden. Ich habe das in deinem Code eingefügt:

        movfw   ADRESL
        movwf   temp    ;temp wird jedesmal neu geschrieben
        RRF     temp,f  ;und kann deshalb auch nach dem
        RRF     temp,f  ;Schieben den Wert behalten
        movlw   0xCF    ;Bits 4 und 5 ausmaskieren
        andwf   CCP1CON, f ;jetzt Bit 4,5 löschen
        movfw   temp
        andlw   0x30    ;unnütze Bits von der Schiebeoperation verwerfen
        IORWF   CCP1CON, f ;den Wert von temp übertragen

Grüße,
Edson

Edit: vorletzte Zeile im Code hat vorhin gefehlt
« Letzte Änderung: August 28, 2009, 17:29:26 Nachmittag von Edson »

 


* Recent Topics