pic 12F 675 mit 2xADC macht merkwürdiges Problem
Montag, 21. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  PIC Mikrocontroller Allgemein  |  AD-Wandler (Allgemein)  |  pic 12F 675 mit 2xADC macht merkwürdiges Problem « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: pic 12F 675 mit 2xADC macht merkwürdiges Problem  (Gelesen 2739 mal)
 
xorwf_!
Gast
« am: Mai 20, 2008, 07:50:49 »

Ich habe den PiC 12F675 so verplant:

An pin7 und pin6 werden 0...5V analoge Werte eingelesen. Dann wird verglichen.
Ist pin7 größer als pin6, dann soll auf pin2 (genau gegenüber) eine LED eingeschaltet werden.
Ist pin6 größer als pin7, dann LED auf pin3 ein....

ADC-Sache funktioniert schon einigermassen.
ADC-Wert von pin7 wird ax genannt, ADC-Wert von pin6 ist ux.

Ich habe jedoch im Simulatorprogramm (.. oshsoft..?) und auf meinem Brotbrett das Problem, dass hier ax größer als ein sinnvolles maximum maximum wird, sobald ich ux einlese... Und nur wenn pin6 auf 0V gehalten wird, kann ax in etwa realistische Werte einlesen...

Die Vergleichsroutine ist noch völlig unausgereift, diese werde ich, sobald die ADC-Problematik erkannt und gelöst habe, weiterbearbeiten.

Bitte an das Forum:

Könnt ihr mir sagen ob etwa in der ADC-schleife nicht korrekt deklariert ist?
Ist der V-Ref-Wert durch ANSEL auch auf Vdd ?
Kann es sein dass die Warteintervalle während der ADC zu kurz sind?
Kann es sein dass die ADRESH-Werte nicht korrekt ausgelesen werden?

Mir würde es sehr viel helfen wenn ich dass im Laufe der Woche hinkriegen könnte... Dank im voraus.
Gespeichert
xorwf
Newbie
*
Offline Offline

Beiträge: 7


Profil anzeigen
« Antworten #1 am: Mai 20, 2008, 07:54:33 »

Die ASM-Datei habe ich hier angehängt... sorry.

* light-sense-7.asm (9.97 KB - runtergeladen 156 Mal.)
Gespeichert
Stampede
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 969



Profil anzeigen WWW
« Antworten #2 am: Mai 20, 2008, 09:48:16 »

Hallo,

ich habe nur kurz drüber geschaut, der Fehler befindet sich wohl hier:
Code:
; move loop to do movement
decide
movlw pin7x ; put pin7x into w         // FEHLER !!!!!
subwf pin6x,0 ; subtract pin7x from  pin6x

btfss status,c ; carry flag
; carry = 1 : pin7x greater than pin6x
; carry = 0 : pin6x greater than pin7x
bsf gpio,pin2 ; if pin7x is greater than pin6x
nop

clrw
movwf pin7x
clrw
movwf pin6x

retlw 00

Statt
Code:
movlw pin7x ; put pin7x into w         // FEHLER !!!!!
muss es
Code:
movfw pin7x ; put pin7x into w       
Durch das movlw wird konstant die Adresse von pin7x geladen, und nicht der Wert.

Paar Anmerkungen:
Die ADC kannst du deutlich verkürzen. Bis auf den Eingang sind die nahezu identisch. Ausserdem kannst du ADCON0 in einem beschreiben, nur zum Starten des ADC musst du bsf verwenden.

Anstatt bsf STATUS, PR1 etc. kann man überlicherweise banksel "registername" verwenden.
Du beendest deine Funktionen immer mit einem retlw 0. Da du den Wert aber nicht weiter benutzt tut es hier auch ein einfaches return.

Anstatt
Code:
clrw
movwf pin7x
solltest du
Code:
clrf pin7x
verwenden. Das ist schneller da es  einen Befehl weniger braucht.

Den Teil:
Code:
call rest ; wait a while
clrw
movwf adresh
call rest ; wait a while
call rest ; wait a while
kannst du dir sparen.

Sonst sind die ADC Routinen in Ordnung.

Welchen Compiler nutzt du eigentlich? Mich wundert es, dass die ganzen Kleinschreibungen der Registernamen keine Fehler verursachen.

Gruß
Stefan
« Letzte Änderung: Mai 20, 2008, 10:03:29 von Stampede » Gespeichert

xorwf
Newbie
*
Offline Offline

Beiträge: 7


Profil anzeigen
« Antworten #3 am: Mai 20, 2008, 15:51:15 »

Danke schon einmal dafür.
Das ist das, wie oft, das Problem mit dem Baum, der sich dann im Wald nicht mehr blicken lässt...
oder so.

Ich werde deine Vorschläge nun heute Abend mal einpflegen.
Dann werde ich mal die Information zum Compiler und dergleichen notieren.

Danke.
Gespeichert
xorwf
Newbie
*
Offline Offline

Beiträge: 7


Profil anzeigen
« Antworten #4 am: Mai 21, 2008, 07:17:15 »

Ich habe nur diese Änderungen gemacht, und schon hat es geklappt ! Danke !

Ich habe leider die asm nun nicht dabei, aber im Prinzip wurde in der "decide"-Schleife noch einmal die "subtract" action genau umgekehrt gemacht, um den anderern pin zu aktivieren... Läuft prima.

Danke dafür.


@ stefan : Ich asm-hex-e mit MPSAM v03.20.02. Vielleicht liegt es daran das ich den bei [ ] case sensitive nicht "
  • " (sprich "ja" ) gesagt habe. Ich finde das mit Gross- und Kleinschreibung jedenfalls für mich übersichtlicher... Fehler, ausser 302, sind dann meistens keine, ausser einer wie den den du bemerkt hast.
Gespeichert
xorwf
Newbie
*
Offline Offline

Beiträge: 7


Profil anzeigen
« Antworten #5 am: Mai 23, 2008, 07:13:56 »

Ich habe nun mein Programm hier zur Verfügung gestellt, damit es dem einen oder anderen hilft.

Früher habe ich einfache Programme gesucht.
Außer in diesem Forum, habe ich kaum Information zum 12F675 gefunden.

Wenn irgendjemand meine recht "unproffesionelle" Programmierung verbessern möchte - gerne !
Aber bitte stellt es dann auch der Öffentlichkeit zur Verfügung...

Ich danke Euch für eufe Hilfe.



ps : Moderator / Irgendjemand, bitte setzt hier doch bitte mal das "gelöst-Fläg"...

* 12F675__2_x_ADC__2_x_LED.asm (9.86 KB - runtergeladen 166 Mal.)
« Letzte Änderung: Mai 23, 2008, 07:18:05 von xorwf » 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.041 Sekunden mit 19 Zugriffen.
 
Top! Top!