Ik zit met een probleempje. Ik wens aan de hand van 2 analoge ingeangsspanningen 2 uitgangen te schakelen.
Uit datasheet van de PIC 16F628 leid ik af dat ik hiervoor bijv CMCON met CM2:CM0 = 011 zou kunnen gebruiken. De ingangen komen dan aan pins AN0 en AN1 (resp. pinnen 17 en 18); de referentiespanning aan AN2 (pin 1)
Ik zou ook de ingebouwde referentiespanning kunnen gebruiken - en zelfs naar buiten brengen op pin 1 (= AN2).
Dit lukt echter niet.
Ik geef even m'n JAL code (met commentaar)
pragma name compare
pragma target chip 16f628
pragma target clock 4_000_000
pragma target osc hs
pragma target watchdog off
pragma target powerup on
pragma target protection off
include jpic
include jdelay
var volatile byte CMCON at 0x_1F = 0b_11110011 -- RA als 2 comparators met Vin- aan RA0 (= pinnr 17) en RA1 (= pinnr 18); uitgang in C2Vout en C1Vout, dus CMCON:7 en CMCON:6
var volatile byte VRCON at 0x_9F = 0b_10000111 -- Vref = Vdd * 2 / 24; output op RA2 (= pinnr 1) aan
var byte nul, een, twee, drie, vier, vijf, zes, zeven
pin_a0_direction = input -- pinnr 17; deze 4 pins als input gebruiken, dus output driver is afgeschakeld
pin_a1_direction = input -- pinnr 18
pin_a2_direction = input -- pinnr 1
pin_a3_direction = input -- pinnr 2
pin_b0_direction = output -- pinnr 6 = LD1; aan RB0 tot RB5 hangen LED's om de toestand te visualiseren
pin_b1_direction = output -- pinnr 7 = LD2
pin_b2_direction = output -- pinnr 8 = LD3
pin_b3_direction = output -- pinnr 9 = LD4
pin_b4_direction = output -- pinnr 10 = LD5
pin_b5_direction = output -- pinnr 11 = LD6
var bit uit_nul is pin_b0
var bit uit_een is pin_b1
var bit uit_twee is pin_b2
var bit uit_drie is pin_b3
var bit uit_vier is pin_b4
var bit uit_vijf is pin_b5
uit_nul = off -- alle LED's eerst uit
uit_een = off
uit_twee = off
uit_drie = off
uit_vier = off
uit_vijf = off
delay_1s
uit_nul = on -- alle LED's dan 1 seconde aan
uit_een = on
uit_twee = on
uit_drie = on
uit_vier = on
uit_vijf = on
delay_1s
forever loop
-- de bits uit CMCON lezen; 'nul' is minst beduidende bit, 'zeven' is meest beduidende bit
-- de uitgangen van de comparators komen in CMCON:7 en CMCON:6, dus de variabelen 'zeven' en 'zes'
nul = CMCON & 0b_00000001
een = (CMCON & 0b_00000010) / 2
twee = (CMCON & 0b_00000100) / 4
drie = (CMCON & 0b_00001000) / 8
vier = (CMCON & 0b_00010000) / 16
vijf = (CMCON & 0b_00100000) / 32
zes = (CMCON & 0b_01000000) / 64
zeven = (CMCON & 0b_10000000) / 128
-- de verschillende variabelen visualiseren mbv 6 LED's
uit_nul = (nul == 1) -- comparator mode bit
uit_een = (een == 1) -- comparator mode bit
uit_twee = (twee == 1) -- comparator mode bit
uit_drie = (vijf == 1) -- inversie-bit van comparator
uit_vier = (zes == 1) -- uitgang van eerste comparator
uit_vijf = (zeven == 1) -- uitgang van tweede comparator
end loop
Wat ik bekom is totaal onlogisch:
* de uitgangen 'uit_nul' tot 'uit_twee' die de comparator mode kiezen, staan allemaal aan. Dit komt overeen met de comparators uit. Toch heb ik de comparator mode op 011 gezet.
* Of ik die inversie-bit nu aanzet of niet, uitgang 'uit_drie' wijzigt niet.
* De gekozen referentiespanning komt niet 'naar buiten' op pin 1 (= AN2).
* Uiteraard wijzigen 'uit_vier' en 'uit_vijf' dan ook niet door de analoge inputs te veranderen.
Het is dus alsof de regel "var volatile byte CMCON at 0x_1F = 0b_11110011" gewoon genegeerd wordt en de inhoud van het CMCON register niet aangepast of door 'iets anders' overschreven wordt'.
Idem voor de regel met VRCON.
Ik heb al geprobeerd met en zonder 'volatile', maar dit verandert niks.
Wat zou hier toch kunnen mis zijn?