ADFM Setzen, Daten in Variabel schreiben ?
Dienstag, 22. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  Programmiersprache Assembler  |  AD-Wandler (Assembler)  |  ADFM Setzen, Daten in Variabel schreiben ? « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: ADFM Setzen, Daten in Variabel schreiben ?  (Gelesen 4018 mal)
 
theborg
Full Member
***
Offline Offline

Beiträge: 216



Profil anzeigen WWW
« am: September 03, 2007, 19:20:35 »

Hi ich hab nochmal einige fragen bin dabei einen ADC zum laufen zu bewegen an sich läuft er allerdings habe ich kleinere Probleme die leider im Tutorial von Mikrochip nicht beschrieben sind.

1.) Ich hab auf meinen PIC16F876 ja die Register ADRESH(ADCON0) und ADRESL(ADCON1) da es da zwei Ausgabe arten gibt muss ich ADFM entweder setzen oder Löschen leider steht im Tutorial nicht ob 0 oder 1 ich hette gerne RIGHT gesetzt dazu kommt dann noch die frage wie ich das dann setze.

2.) Das neste Problem ist dann wenn ich die daten von ADRESH nach W schibe und von W in eine Variable geht dieses dann auch nicht b.z.w. in der Variable steht dann was anderes.

3.) Ein Problem gibt es dann leider noch wie gebe ich an welcher Eingang ausgelesen werden soll.

Code: (asm)

; PORTA
banksel TRISA ; PIC16F877A alle ADC-Eingänge auf Eingang
movlw B'11111111'
movwf TRISA
banksel ADCON1 ; Alle auf Analog VREF=VDD
movlw B'00000010'
movwf ADCON1
banksel ADCON0 ; Conf. und Enable A/D
movlw B'010111111'
movwf ADCON0

ADC
banksel Count ; Wait Acquisition Time
movlw 0x06
movwf Count
ADCWait
decfsz Count,F
goto ADCWait
banksel ADCON0 ; Int A/D Conversation
bsf ADCON0,GO
banksel ADCON0
ADCTest
btfsc ADCON0,GO
goto ADCTest
banksel ADRESH ; Read Result
movlw ADRESH
movwf ADCa
banksel ADRESL
movlw ADRESL
movwf ADCb
return
Gespeichert

Edson
Globaler Moderator
Sr. Member
*****
Offline Offline

Beiträge: 373



Profil anzeigen
« Antworten #1 am: September 03, 2007, 19:35:48 »

Hallo THEBORG,

zu 3.: Mit den bits 3-5 im Register ADCON0 (CHS-bits = channel select bits))

zu 2.:

Code:
movlw ADRESH

gibt nicht den Inhalt des ADRESH-Registers nach w sondern nur die letzten 8bit der Adresse von ADRESH.

nimm mal lieber
Code:
      movf ADRESH, w

Trotzdem sei vorsichtig, ADRESL liegt nicht in Bank0! Du brauchst also noch ein banksel vor dem schreiben von ADCb.

zu 1.:
Code:
     bsf    ADCON1, ADFM

Bringt das Ergebnis 'rechtsbündig' in die ADRES-Register.


Gruss,
Edson
Gespeichert
theborg
Full Member
***
Offline Offline

Beiträge: 216



Profil anzeigen WWW
« Antworten #2 am: September 03, 2007, 19:44:25 »


gibt nicht den Inhalt des ADRESH-Registers nach w sondern nur die letzten 8bit der Adresse von ADRESH.

nimm mal lieber
Code:
      movf ADRESH, w

Trotzdem sei vorsichtig, ADRESL liegt nicht in Bank0! Du brauchst also noch ein banksel vor dem schreiben von ADCb.

Gruss,
Edson

Wi wie ist das wenn ich ADCb im register ADCON1 anlege das würde mir doch dann das Bankwekseln sparren oder ist das nicht entfolen ?
Gespeichert

Edson
Globaler Moderator
Sr. Member
*****
Offline Offline

Beiträge: 373



Profil anzeigen
« Antworten #3 am: September 04, 2007, 07:41:36 »

Hallo,

die folgende Frage ist entweder falsch gestellt oder du bist ziemlich auf dem Holzweg  Lächelnd

Zitat
wie ist das wenn ich ADCb im register ADCON1 anlege

ADCb ist doch eine Variable im RAM, die den Wert des LoByte des AD-Wandlers speichern soll, oder? Im Register ADCON1 kann man aber keine Variable 'anlegen'. In ADCON1 befinden sich nur ein Flag zur Steuerung des Datenformats der AD-Wandlung (ADFM) und  4 bit für Konfiguration der Analogeingänge(PCFG<3:0>).
Ich schätze mal du meinst den Bereich ab A0h (General Purpose Register), der eine Adresse nach ADCON1 im Speicher liegt, also das User-RAM in Bank1?

Zitat
das würde mir doch dann das Bankwekseln sparren oder ist das nicht entfolen ?

Das hätte den Nachteil dass du wahrscheinlich bei weiteren Zugriffen auf ADCb wieder die Bank wechseln musst. Du kannst aber die Variablen zwischen 70h und 7Fh ablegen, dieser Bereich ist aus allen anderen Bänken ansprechbar. (siehe Datenblatt s.13)

Gruss,
Edson
Gespeichert
theborg
Full Member
***
Offline Offline

Beiträge: 216



Profil anzeigen WWW
« Antworten #4 am: September 04, 2007, 18:21:21 »

Hi jo das register meinte ich ok damit haste mir erstmal weitergeholfen danke
Gespeichert

theborg
Full Member
***
Offline Offline

Beiträge: 216



Profil anzeigen WWW
« Antworten #5 am: September 09, 2007, 16:40:40 »

hm eine frage hab ich noch wo ich überhaupt nicht weiterkomme aus dem ADC bekomme ich ja 2x8bit (ADRESL und ADRESH) da der ADC nur 10bit hat wird der rest mit 000000 ausgefüllt nur wie bekomme ich das ganze jetzt so umgerechnet das ich den eigentlichen wert über USART verschicken kann.
Gespeichert

Edson
Globaler Moderator
Sr. Member
*****
Offline Offline

Beiträge: 373



Profil anzeigen
« Antworten #6 am: September 10, 2007, 14:51:41 »

Hallo,

Zitat
wie bekomme ich das ganze jetzt so umgerechnet das ich den eigentlichen wert über USART verschicken kann

die Frage musst du nochmal konkreter stellen, ich verstehe nicht wo du das Problem siehst.

Gruss,
Edson
Gespeichert
mogli
Hero Member
*****
Offline Offline

Beiträge: 580



Profil anzeigen
« Antworten #7 am: September 10, 2007, 16:38:12 »

Hallo

du meinst sicher das http://www.piclist.com/techref/microchip/math/radix/index.htm

ASCII Format oder ähnliches nicht :angel1:

 :mrgreen:
Gespeichert
theborg
Full Member
***
Offline Offline

Beiträge: 216



Profil anzeigen WWW
« Antworten #8 am: September 11, 2007, 04:51:31 »

hi Mogli genau das meinte ich habe es mittlerweile auch anders lösen können.

Ich rechne die Bits jetzt im Router um der die daten entfängt also müssen die nur übertragen werden das mache ich wie folgt.

   movlw   D'8'      ; Move 10 to w
   movwf   Count      ; Move w to Count
   call   SendADCbWait
   movlw   D'2'      ; Move 10 to w
   movwf   Count      ; Move w to Count
   call   SendADCaWait
   call   _NL
   return
SendADCaWait
   movf   Count,W
   btfsc   ADCa,W      ; Übergehe nachfolgenden befehl wenn bit = 0
   call   _1
   btfss   ADCa,W      ; Übergehen nachfoldenden befehl wenn bit = 1
   call   _0
   decfsz   Count,F      ; Lösche ein bit von Count wenn Count = 0 dan F = 1 und überspringe den nästen befehl
   goto   SendADCaWait   ; Gehe zu WaitWait
   return
SendADCbWait
   movf   Count,W
   btfsc   ADCb,W      ; Übergehe nachfolgenden befehl wenn bit = 0
   call   _1
   btfss   ADCb,W      ; Übergehen nachfoldenden befehl wenn bit = 1
   call   _0
   decfsz   Count,F      ; Lösche ein bit von Count wenn Count = 0 dan F = 1 und überspringe den nästen befehl
   goto   SendADCbWait   ; Gehe zu WaitWait
   return
Gespeichert

Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.044 Sekunden mit 19 Zugriffen.
 
Top! Top!