Wünsche erst einmal ein guten Abend, Ich habe folgendes Problem: Ich möchte eine Spg. mit dem PIC messen. Diese soll mir aber jedoch nicht per display angezeigt werden. Sondern ich mit im Programm ein Wert eingeben, der einer Spg. wieder spiegelt. Und ist die Spg. überschritten soll ein Ausgang an PortB angesprochen werden. habe mir dazu eine experemntierplatine gebaut. das Programm und die anschaltung der jeweiligen Eingänge/Ausgänge habe ich nach den Informationen der Seite http://www.sprut.de/electronic/pic/programm/compadc/compadc.html gebaut. das Program habe ich probiert meinen wünschen anzupassen..aber leider ohne erfolg! meine frage ist wie kan ich das lösen bzw. was hab ich falsch gemacht? und dan noch in dem Programm soll eine 10Bit auflösung sein, kann aber nur 8Bit mit der Alu verarbeiten, wie soll das gehen?? oder hab ich das falsch verstanden? schon mal im vorraus danke und noch einen schönen Abend mfg René
rene schrieb: > was hab ich falsch gemacht? Was hältst du davon uns deinen Code zu präsentieren ?! rene schrieb: > und dan noch in dem Programm soll eine 10Bit auflösung sein, kann aber > nur 8Bit mit der Alu verarbeiten, wie soll das gehen?? Lies mal ein bisschen auf der Website weiter auf der du schon warst ... da bist du für Assembler goldrichtig ... Kannst du Assembler? C? Hast du eine Ausrüstung zum Programmieren?
sry, is ne gute idee den quellcode mit zusenden..
danke, für den hinweis
///////////////////////////////////////////////////////////////
__CONFIG _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON &
_WDT_OFF &_HS_OSC & _LVP_OFF & _MCLRE_ON & _INTRC_OSC_NOCLKOUT
;=======================================================================
===
; Variable Definition
;=======================================================================
===
; Constanten festlegen
#define LED PORTB
; Variable festlegen
counter equ 0x20 ;
result_l equ 0x22 ;
result_h equ 0x23 ;
;**************************************************************
; Programmanfang
org 0
;**************************************************************
; Initialisierung *********************************************
init
bsf STATUS, RP0 ; Bank 1
clrf OPTION_REG
clrf TRISB ; PortB alle outputs
bcf STATUS, RP0 ; Bank 0
clrf PORTB ; LEDs aus
clrf INTCON ; Interrupt disable
call InitCAdc ; ADC vorbereiten
mainloop ;HIER HABE ICH was verändert
call CAdc ; wandeln
bsf PORTB,4
movlw 625
subwf result_l,1 ; Low-8-Bit an PORTB anzeigen
btfsc STATUS,Z
bsf PORTB,2
btfss STATUS,Z
bcf PORTB,2
goto mainloop
;**************************************************************
; ADC-code aus AN700*******************************************
; initialisierung des adc**************************************
InitCAdc
bsf STATUS, RP0
movlw 0xEC ; Vref ein, Vref zu RA2
movwf VRCON ; LowRangeMode, VR = 12 = 2,5 V
bcf TRISA, 3 ; RA3 output des 'DAC'
bcf STATUS, RP0
movlw 0x06 ; 2 Komparatoren mit Referenzspannung
movwf CMCON ; Comp1 out = RA3
return
;**************************************************************
; Wandeln der spannung*****************************************
CAdc
clrf counter
clrf counter+1
clrf result_l
clrf result_h
movlw 0x03 ; 2 Komparatoren mit Referenzspannung
movwf CMCON
loop
btfsc CMCON, C1OUT ; ist Komparator High oder low
goto complow ; low
comphigh
nop ; high
bcf PORTA, 3 ; 'DAC' = 0
incfsz result_l, f ; zählen der 'Spannung'
goto eat2cycles
incf result_h, f
goto endloop
complow
bsf PORTA, 3 ; 'DAC' = 1
nop
goto eat2cycles
eat2cycles
goto endloop
endloop
incfsz counter, f ; Zahl der Zyklen Zählen
goto eat5cycles
incf counter+1, f
movf counter+1, w
andlw 0x04 ; nur Bit 2 einblenden
btfsc STATUS, Z ; Bit 2 =1 ? 1024 Zyklen vorbei?
goto loop ; nein
goto exit ; ja
eat5cycles
goto $+1
nop
goto loop
exit
movlw 0x06 ; 2 Komparatoren mit Referenzspannung
movwf CMCON ; Comp1 out = RA3
return
end
///////////////////////////////////////////////////////////////////////
hatte es mir sogedacht, ich habe ja den wert vom result_l was meine spg.
angibt. und dort ziehe ich ein wert ab um zu prüfen ob die spg. zu hoch
ist. ich teste das zero flag ob das ergebnis null wird, müsste natürlich
noch prüfen ob ich ein negativ übertrag bekomme, hab ich zwar schon
probiert (aber mein ausgang würde laufend gesetzt) ist in dem quellcode
nicht drin! und zum Z noch mal mein Ausgang kommt auch aber nicht bei
den spg. werten die ich errechnet habe. hier sollte er bei ca. 3V kommen
aber 2,68V spricht er aber an..frage dazu bin ich auf dem richtigen weg
oder habe ich irgendwo ein denk fehler gemacht??
also von können kan keine rede sein, ich stecke sozusagen in den
kinderschuhen, habe in der schule einwenig gemacht mit assambler aber
halt nur angekratzt, so das mir zumin einiges was sagt und ich ungefähr
weiß wie man was machen sollte...C++ hatte ich dagegen ausführlicher
aber würde mich nicht als crack bezeichnen..
ich habe das Bord von Vellman K8084 und habe halt zusätzlich eine selbst
gebaute testplatine
Ich habe mich mit der Problemstellung selber noch nicht auseinander gesetzt. Steht bei mir erst demnächst auf dem Plan. Allerdings ist mir in deinem mainloop die Anweisung movlw 625 aufgefallen. Damit lädst du die Zahl 625 in das Arbeitsregister W. Ich gehe jetzt mal davon aus das es sich da um eine Dezimale Zahl handelt. Da W 8 Bit Breit ist geht aber nur 0...255 Dezimal oder 0x00...0xFF Hexa usw.
rene schrieb: > und dan noch in dem Programm soll eine 10Bit auflösung sein, kann aber > nur 8Bit mit der Alu verarbeiten, wie soll das gehen?? Vergleich erst die oberen 2 Bits, und dann den Rest. BTW: >>> AnalogDigitalUmsetzer mit Comperator es ist bestenfalls ein Comp-A-rator (nix mit E)...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.