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.