-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Wert < 255 teilen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    08.06.2006
    Beiträge
    8

    Wert < 255 teilen

    Anzeige

    Hi,

    Ich versuche verzweifelt einen gemessenen Spannungswert (<255)
    mit dem PIC16F819 zu teilen ( / 1,2)

    Der Wert ist so in dem Bereich 200 - 300 mV und wird in 2 Speicherzellen gespeichert.

    Untere 8 Bit und obere 2 Bit (Vom 10Bit AD Wandler)

    Ich will nun die Spannung durch 1,2 teilen und wieder in 2 Speicherzellen speichern.

    Wie kann ich in Assembler soetwas lösen?
    Assembler ist die einzige Programmiersprache, die ich nutzen kann.
    Nicht c oder andere Sprachen.


    Gruß
    Lennart

    Edit: Vref= 1V

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    67
    Beiträge
    2.063
    Hallo Lennart,
    in der AN617 und AN526 gibt es Mathematik-Routinen in Assembler.
    Du müßtest zuerst eine 16 mal 8/16-Bit-Multiplikation mit 10 durchführen und anschließend das Ergebnis mit einer 16 durch 8-Bit-Division (UDIV1608L) durch 12 teilen (U=unsigned = vorzeichenlos).
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    08.06.2006
    Beiträge
    8
    Vielen Dank für deine Hilfe
    Hab jetzt mal dort reingeschaut aber die PICs sind ja nicht 16F sondern 16C.. ist das nicht ein Unterschied?

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.12.2005
    Ort
    Euskirchen-Großbüllesheim
    Alter
    67
    Beiträge
    2.063
    Ja, der 16F hat ein F wie Flash-Speicher, den Du einige tausend mal löschen und wieder 'brennen' kannst, den 16C kannst Du nur ein mal 'brennen'.
    MfG Karl-Heinz
    HobbyElektronik hier klicken ....

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Wozu willst du das dividieren?

    Eine Division durch 1.2 entspricht einer Multiplikation mit (etwa) 213 und danach einer Division durch 256. Die Division durch 256 ist trivial und mit 213 multiplizieren kannst du wahrscheinlich schon.

    Falls es noch genauer sein muss (genauer zu sein als die Genauigkeit deiner Darstellung (Ganzzahl) ist Käse), geht es auch mit
    54613 / 63356, also nach der Mult mit 54613 noch 16 Rechts-Shifts.

    << n bedeute hier links-Schieben um n Positionen (also Multiplikation mit 2^n).

    Dann ist
    213*x = (x << 7) + 5*x + ((5*x) << 4)
    5*x = (x << 2) + x

    Du Brauchst also nur 13 Links-Shifts, 8 Rechts-Shifts und 3 Additionen!
    Noch einfacher geht's wohl kaum
    Disclaimer: none. Sue me.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    08.06.2006
    Beiträge
    8
    Noch einfacher geht's wohl kaum
    .........mit zahlen zu arbeiten die größer als 255 sind...
    Ich sitz irgendwie fest

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Schieben und Addieren/Subtrahieren geht warscheinlich über das Carry.

    z.B. shift left: (HI und LOW-Teil)

    HHHHHHHH LLLLLLLL
    76543210 76543210

    Erst wirl der LOW-Teil nach Links geschoben und rechs eine 0 nachgefüttert, Carry = L7

    LLLLLLL0
    6543210

    Dann wird HI mit Carry nach links geschoben, danach ist Carry=H7

    HHHHHHHL
    65432107

    Addition etc geht analog

    Falls die Architektur kein Carry hat, dann musst du es selber ausrechnen.
    Disclaimer: none. Sue me.

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    08.06.2006
    Beiträge
    8
    Code:
    LIST P=16F84A R=DEC       ; Auswahl des PIC-Typs                
    
    	#include <P16f84A.INC>
    	#include <MATH16.INC>
    
    	
    
    	bsf     STATUS, RP0	; Bank 1
    	movlw	B'00000000'	; PortA und PortB alle outputs 
    	movwf   TRISB
    	movwf   TRISA
    	bcf     STATUS, RP0	; Bank 0	
    
    	movlw D'10' 
    	movwf AARG
    	movlw D'10' 
    	movwf BARG
    	
    	call UDIV1608L
    
    self 	
    		goto self
    
    		INCLUDE <FXD68.A16>
    
    
    end
    So sieht mein Programm jetzt aus.. es kommen aber 100.000 fehlermeldungen das die variablen undefined sind.. aber sie sind doch in den entsprechenden INC dateien definiert oder nicht?

    Häng wieder fest

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    27.01.2006
    Beiträge
    44
    Hallo,

    heissen die Variablen nicht AARGBx und BARGBx (x=0..3)?
    Vergleich das mal mit den werten inder INC-Datei. Dann checke bei den Fehlermeldungen ob er die *.inc Datei überhaupt einbindet.

    Ach ja, oben weiter schreibst Du dass Du einen 16F819 benutzen willst. Im Programm bist Du der Meinung dass es ein 16F84A ist. Das sollte schon auch zusammenpassen!

    Ciao
    Mario

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    08.06.2006
    Beiträge
    8
    Ja, benutz zum testen den 16F84A.. aber sollte ja bei beiden funktionieren.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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