Currently, the 16F628A for its HPWM. Being able to do it on this would be fine, but if I could achieve it on a 12F629/75, better still.
Thanks, and I'm hoping you'd have some trick to suggest!
Regards,
Anand
Currently, the 16F628A for its HPWM. Being able to do it on this would be fine, but if I could achieve it on a 12F629/75, better still.
Thanks, and I'm hoping you'd have some trick to suggest!
Regards,
Anand
628A, OK, that should make it easy.
XOUT TRISB.3,PORTA.0,[house\lightsOff]
The idea is that the XOUT command takes a register and a bit for the output pin assignment. Normally this is something like PORTB.0 but it really doesn't matter which register and bit you use.
So by assigning TRISB.3 as the output, it should modulate the PWM by turning the pins output on and off.
PBP finds the location of the corresponding TRIS register by simply adding 80h to the PORTs address. For PORTB (06H), TRISB would be 06h + 80h = 86h. So now, if PBP thinks that TRISB.3 is a physical pin, then it will also try to set the pin to Output by clearing (106h).3 which now lines up with PORTB again in bank2. But since that pin is overriden by the Peripheral select switch, the data doesn't get thru, so all's well.
The reason I say all of that, is because if you try to do the same thing on an 18F, the registers don't line up next to each other like that, and can cause some pretty nasty problems.
As for the 12F629/75, I suppose you could set up the timer to generate the frequency using interrupts, and do the same thing with TRIS.
Should work for SEROUT(2) as well. Assuming it works at all.
HTH,
Darrel
Darrel, thanks for the detailed reply.
I tried this, and was at first delighted to see a strong(er) signal than what I was getting by the 2-pin method.
But, it did not work. I notice the waveform looked different from the 2 pin waveform as well (as seen after the transistor that combined the 2 signals).
I think the problem is, when you control the HWPM *before* and *after* the XOUT line, the spaces between the data bits that XOUT gives, which should remain low, are now consistently transitioning at 120 KHz. I suspect for this to work, like you pointed out earlier, the XOUT macro itself might have to be modified.
Is my analysis correct, or am I being too dense?
Regards,
Anand
Hmmm, what I missed was the Polarity of the XOUT signal. The PBP manual didn't really go into too much detail, but i found another document on the web that explained it better. It's description goes like this.So, 1 turns the 120khz ON, 0 turns it off.Transmit to Power Line—Output a high on this line within 200 μ of Zero Crossing
going high, and hold the line high, to output a one on the power line—that is, to turn on
the 120 kHz oscillator. Use the same timing with a low output to output a zero. The line
should be low if the interface is not to transmit data, since that keeps the oscillator off.
But with the TRIS bit, it works the other way around. 1 = INPUT (OFF), 0 = OUTPUT (ON). Just a little backwards.
I think you're right though, the only way around it is to change the XOUT command itself. Fortunately, it's an easy change if you're willing to tamper with the PBPPIC14.LIB file.
If so, be sure to make a copy of the file before editing, you might want it back the old way later on.
Your mission, should you choose to accept it, is to ...
Open the PBPPIC14.LIB file in the PBP folder, and do a search for XOUT. You should see a section that looks like thisComment out the "call LOWT". We'll handle setting the pin to the correct state manually.Code:ifdef XOUT_USED LIST XOUT2 movlw 2 ; Default to 2 cycles XOUT movwf R2 ; Save number of cycles movf RR1, W ; Get data port movwf FSR ; Put it into FSR movf RM1, W ; Get data bit mask ; call LOWT ; Set data to low, output
Then scoll down a little bit to xout1loop and change it like thisIt just reverses whether it sets the pin high or low.Code:xout1loop ; movf RM1, W ; Get data bit mask ; iorwf INDF, F ; Set the bit comf RM1, W ; Get inverted data bit mask andwf INDF, F ; Clear the bit movlw high 1000 ; Pause 1 ms movwf R0 + 1 movlw low 1000 call PAUSEUSL ; comf RM1, W ; Get inverted data bit mask ; andwf INDF, F ; Clear the bit movf RM1, W ; Get data bit mask iorwf INDF, F ; Set the bit
Now, to use it ..Fingers crossedCode:TRISB.3 = 1 ' start with output OFF XOUT TRISB.3,PORTA.0,[house\lightsOff]
P.S. Don't blame me if you don't backup the file first.
DT
Darrel, that was brilliant!
Worked the first time. If I wore a hat, i'd have raised it now.
Thanks and regards,
Anand
Darrel, whatever you suggested in the earlier messages worked perfect, and that's made me more ambitious/adventureous/greedy.
What I wonder is, can this also be achieved using your popular timer0/1 based PWM techniques (instead of the PIC's HPWM) to modulate the XOUT signal? The idea being able to use this with any pic, and on any pin.
Thanks in advance.
Regards,
Anand
Hi Anand,
I think at 120kz, the interrupts required to generate that frequency on ANY pin (250,000 per second) would interfere with the timing of the XOUT command.
I can't think of an easy way off hand.
DT
Bookmarks