Sida 1 av 2
IR Reciever till pickit2/16F690
Postat: 11 maj 2009, 15:51:11
av Xor
Hej på er!
Jag har precis startat med pic-programmering efter jag upptäckt att man nu mera kan knacka C till även mindre processorer.
Som första projekt så håller jag på med en IR-Förlängare eftersom det involverar få komponenter och jag fatiskt kan ha nytta av resultatet.
Nu har jag fått till 38kHz PWM, men mitt problem är att jag inte får ir-pulserna att registeras som input på RC5. Har förmodligen missuppfattat någonting enkelt och ber därför om hjälp. Om jag ger +Vdd med hjälp av bygel så får jag en fin diod, men ingenting via IR -Mottagaren.
Schema:
Kod:
Kod: Markera allt
/*
PIC16F690
/* STANDARD INCLUDES */
#include <stdio.h>
#include <stdlib.h>
#include <pic.h>
#include <string.h>
#include "delay.h"
/* CONFIGURATION MACRO */
__CONFIG(INTIO & WDTDIS & PWRTDIS & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS);
/* ------------------------------------ MAIN ----------------------------------------*/
/* MAIN APPLICATION */
void main (void)
{
INTCON=0; // disable the interrupts
PORTC = 0x00; // turn all PORTC off
// setup Timer0 for Clock
OPTION = 0b0000; // prescale by 2
T0IF = 0; // clear timer interrupt flag
T0IE = 1; // start timer interrupt
// setup PWM output to 38khz
CCP1CON=0;
TMR2=0;
PR2=0x18; // 38khz period
CCPR1L=0x09; // 50% duty cycle
TRISC = 0x11110000;
TRISA = 0b11111111;
TMR2ON=1;
// Enable Interrupts
PIE1 = 1;
PEIE = 1;
GIE = 1; // enable global interrupts
CCP1CON=0b00001100;
while(1){
if(RC5){
PSTRCON=0b00000000;
} else {
PSTRCON=0b00001100;
}
}
}
Re: IR Reciever till pickit2/16F690
Postat: 11 maj 2009, 16:44:47
av sodjan
Använd code-taggarna så att det går att läsa.
> // Enable Interrupts
Varför ? Var använder du interrupt ?
> Om jag ger +Vdd med hjälp av bygel så får jag en fin diod,
Fattar inget. Vad betyder "ger +Vdd" (och vart) och "fin diod" ?
Re: IR Reciever till pickit2/16F690
Postat: 11 maj 2009, 17:52:09
av Xor
sodjan skrev:Använd code-taggarna så att det går att läsa.
> // Enable Interrupts
Varför ? Var använder du interrupt ?
> Om jag ger +Vdd med hjälp av bygel så får jag en fin diod,
Fattar inget. Vad betyder "ger +Vdd" (och vart) och "fin diod" ?
Hej, visste inte om code-taggen. Nu är det fixat i orginalposten.
Interrupt-blocket är kvar sedan tidigare tester, glömde bara radera ut det.
Bygeln var ett test för att ge en signal in på RC5, motsvarande det som IR-Modulen ska ge (om jag fattat det hela rätt).
Om jag alltså manuellt ger inspänning på RC5 så får jag en PWM signal på dioderna (RC2,RC3).
Re: IR Reciever till pickit2/16F690
Postat: 11 maj 2009, 20:33:41
av sodjan
> ...men mitt problem är att jag inte får ir-pulserna att registeras...
Vilka "IR-pulser" ? Var kommer dom ifrån ?
> Interrupt-blocket är kvar sedan tidigare tester, glömde bara radera ut det.
OK, det har antagligen inte med grundfrågan att göra, men jag vill ända säga följande...
Slarva inte med kod du postar. Det var ju bara 10-20 rader att kolla innan du postade
och det signalerar bara att du sannolikt slarvar generellt vilket minskar lusten hos
alla att bry sig alls. För övrigt så är koden fortfarande kvar, det är enkelt att
rätta koden antingen i första inlägget, men helst i ett nytt inlägg så att inte
"flödet" i tråden blir helt konstigt.
Jag tänker inte kommentera citering av hela föregående inlägg, du får kolla upp vad
det står i reglerna själv (därmed inte sagt att jag bryr mig personligen om det)...
Hur som helst, nyckeln här verkar vara dina "IR-pulser". Berätta gärna mer om dom.
Re: IR Reciever till pickit2/16F690
Postat: 11 maj 2009, 23:40:43
av Samot
Hej!
Du behöver ha en konding till TSOP4838. Annars ger den bara skräp ut...
Re: IR Reciever till pickit2/16F690
Postat: 11 maj 2009, 23:50:42
av Xor
Koden nu uppstädad från oväsentligheter.
Kod: Markera allt
/*
PIC16F690
/* STANDARD INCLUDES */
#include <stdio.h>
#include <stdlib.h>
#include <pic.h>
#include <string.h>
#include "delay.h"
/* CONFIGURATION MACRO */
__CONFIG(INTIO & WDTDIS & PWRTDIS & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS);
/* ------------------------------------ MAIN ----------------------------------------*/
/* MAIN APPLICATION */
void main (void)
{
INTCON=0; // disable the interrupts
PORTC = 0x00; // turn all PORTC off
// setup Timer0 for Clock
OPTION = 0b0000; // prescale by 2
T0IF = 0; // clear timer interrupt flag
T0IE = 1; // start timer interrupt
// setup PWM output for 38khz output for 1-bit's (uses Timer2)
CCP1CON=0;
TMR2=0;
PR2=0x18; // 38khz period
CCPR1L=0x09; // about 50% duty cycle
TRISC = 0x11110000;
TRISA = 0b11111111;
TMR2ON=1;
CCP1CON=0b00001100;
while(1){
if(RC5){
PSTRCON=0b00001100;
} else {
PSTRCON=0b00000000;
}
}
}
sodjan skrev:
Vilka "IR-pulser" ? Var kommer dom ifrån ?
IR-Modulen (TSOP4838) som är inkopplad med OUT-Pinnen till RC5 på processorn. Den borde väl ge mig ett antal signaler med spänning när jag skickar en IR-Signal till den från en fjärrkontroll, eller har jag helt missuppfattat hur denna fungerar? Jag har tyvärr inte tillgång till oscilloskop hemma så jag an inte dubbelkolla detta.
ps. Jag försöker följa forums regler och etikett, men i början blir det inte alltid 100%-igt. Jag ber om ursäkt för detta och hoppas på en bra dialog framöver.

Re: IR Reciever till pickit2/16F690
Postat: 12 maj 2009, 00:02:16
av Xor
Samot skrev:
Du behöver ha en konding till TSOP4838. Annars ger den bara skräp ut...
Jag provade precis med en konding och bytte även Mottagare, men jag får fortfarande ingen signal på RC5.
Testade även att lägga 0,5s delay efter tändningen av dioderna för att se om det fungerade med gick för snabbt för att se med blotta ögat, men inte heller det gav något resultat.
Jag misstänker att jag gör något fel vid avläsningen av RC5, kan man inte göra på detta sätt vid signal från TSOP4838?
Re: IR Reciever till pickit2/16F690
Postat: 12 maj 2009, 00:08:45
av bearing
Jag gissar att det är IR-källan; fjärrkontrollen som sodjan var intresserad av att höra om den fungerar och ger signaler som mottagaren reagerar på.
Xor skrev:
Jag misstänker att jag gör något fel vid avläsningen av RC5
Prova att koppla in något annat som ger signal på pinnen. En knapp, sladdstump, typ.
Re: IR Reciever till pickit2/16F690
Postat: 12 maj 2009, 00:14:25
av Xor
bearing skrev:Jag gissar att det är IR-källan; fjärrkontrollen som sodjan var intresserad av att höra om den fungerar och ger signaler som mottagaren reagerar på.
Jag kan inte komma på något sätt att testa detta utan oscilloskop, dock så har jag provat alla fjärrkontroller som finns i lägenheten med samma dåliga resultat.
bearing skrev:
Prova att koppla in något annat som ger signal på pinnen. En knapp, sladdstump, typ.
Det var det jag gjorde med min bygling (sladdstump mellan Vdd och RC5), och det ger korrekt resultat.
Re: IR Reciever till pickit2/16F690
Postat: 12 maj 2009, 00:19:39
av sodjan
Du måste nog verifiera att din IR-mottagare fungerar med just de
"fjärrar" som du testar med. Det här är ju inget speciellt nytt område
och det finns massor av info på "nätet". Har du provat att googla
lite på just de fjärrar som du har provat med ? Är de 38 KHz fjärrar som
din mottagare lyssnar på ? Om du inte får en signal från mottagaren
så spelar det ju ingen som helst roll vad du gör i koden...
Ingången har du ju verifierat med en fast koppling, så det tror
jag inte att det är.
Re: IR Reciever till pickit2/16F690
Postat: 12 maj 2009, 00:20:21
av bearing
Vad händer om IR-dioden på kopplingsdäcket riktas mot mottageren?
ps. 0x09 är inte 50% av 0x18. ds.
ps2. Varför inte använda decimala tal? 0x18 är 24 decimalt vilket ger en period på 25 us vid 4 MHz. 26 us period är närmare 38 kHz. ds2.
Re: IR Reciever till pickit2/16F690
Postat: 14 maj 2009, 17:21:16
av Xor
Nu har jag kollat lite mer efter att hämtat hem min multimeter.
IR-Modulen ger +4,74V konstant på signalpinnen. Då jag ger den signal med fjärrkontrollen så sjunker spänningen helt enligt databladet (active low, detta missade jag tidigare). Jag har även ändrat mitt program som ett test att tända lysdioderna vid ingen signal på RC5 istället för tvärt om.
Nu är det dock så konstigt att om jag med en bygel ger RC5 +4.75V från Vdd på labbrädan då släcks dioderna som de ska.
Om jag däremot ger spänningen från signalpinnen (vilken är +4.74V enligt mätning) då händer ingenting?!?!
Ger IR-Modulen för lite ström eller vad är det som händer egentligen?
Jag har ingen aning om vad mitt nästa steg är, alla förslag tas tillvara med tacksamhet!
Re: IR Reciever till pickit2/16F690
Postat: 14 maj 2009, 17:24:37
av sodjan
> Om jag däremot ger spänningen från signalpinnen (vilken är +4.74V enligt mätning) då händer ingenting?!?!
Ligger spänningen kvar på samma nivå även med mottagaren inkopplad till RC5 ?
> Ger IR-Modulen för lite ström
Fullständigt ointressant. Det är bara spänningsnivåerna som betyder något.
Re: IR Reciever till pickit2/16F690
Postat: 15 maj 2009, 08:18:00
av Xor
Jag har hittat bekymmret, det var kodfel i alla fall!
Detta står i databladet om CCP1CON (för PWM)
If CCP1M<3:2> = 11:
00 = Single output; P1A modulated; P1B, P1C, P1D assigned as port pins
P1A är tydligen samma fysiska pinne som RC5. Jag hade otur när jag valde min input, och allt blev klart mystiskt. Jag begriper fortfarande inte riktigt hur och vad som hände, men skumt blev det.
Efter jag bytt till RB6 så fungerar allt precis som det ska, JIPPIE!

Alla 6 fjärrkontroller fungerar perfekt och jag har mottagning genom hela rummet utan bekymmer.
Här är det slutgiltiga schemat samt koden om någon skulle vara intresserad:
Kod: Markera allt
/*
PIC16F690
(c) Kalle Sandberg 2009
IR-Repeater, Reads input on RB6 from IR-Module and
outputs 38kHz modulated signal to IR-leds on RC2 & RC3
/*
/* STANDARD INCLUDES */
#include <stdio.h>
#include <stdlib.h>
#include <pic.h>
/* CONFIGURATION MACRO */
__CONFIG(INTIO & WDTDIS & PWRTDIS & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS);
/* ------------------------------------ MAIN ----------------------------------------*/
/* MAIN APPLICATION */
void main (void)
{
INTCON=0; // disable the interrupts
PORTC = 0x00; // turn all PORTC off before initiating PWM
// Setup PWM for 38kHz output
CCP1CON=0;
TMR2=0; // Turn off timer2 before setup
PR2=0x18; // 38kHz period
CCPR1L=0x09; // about 50% duty cycle
TRISC = 0x11110011; // Set RC3 & RC4 as outputs
TRISB = 0b11111111; // Set all RB as inputs
TMR2ON=1; // Turn on timer2 for PWM
CCP1CON=0b00001100; // Set up PWM as single mode
// Read input and toggle PWM on/off
while(1){
if(RB6){ // TSOP4838 = Active low
PSTRCON=0b00000000; // Turn PWM off
} else {
PSTRCON=0b00001100; // Turn PWM on
}
}
}
Edit: stavfel
Re: IR Reciever till pickit2/16F690
Postat: 15 maj 2009, 08:21:56
av Xor
Jag har två frågor till framtida projekt vilket jag inte lyckas förstå av databladet:
1) Hur väljer jag om input ska ha jord eller +V (active high/low) för att vara sanna, och är standard alltid jord?
2) Hur väljer jag om outputs ska ge jord eller +V?