Nej nu #!@% (IR-kommunikation)
Jag har ännu inte försökt skicka hela bytes, bara 1bit. Har då haft 2 möjliga längder på pulsen. En för 1 och en för 0.
tex:
if(100<puls_längd<150) data_bit=1;
if(150<puls_längd<200) data_bit=0;
där puls_längd är värdet från timern, dock har TMR0 värdena har varierat allt för mycket för att ovanstående ska fungera..
Men jag har kommit på en sak, brukar pulsens längd vara viktig för mottagaren?
tex:
if(100<puls_längd<150) data_bit=1;
if(150<puls_längd<200) data_bit=0;
där puls_längd är värdet från timern, dock har TMR0 värdena har varierat allt för mycket för att ovanstående ska fungera..
Men jag har kommit på en sak, brukar pulsens längd vara viktig för mottagaren?
Det är ett par saker som ska skiljas på här:
* Modulationen. Den är till för att mottagaren ska kunna avgöra att det är signal samt ställa in DC-nivåer osv.
* Signalleringen. Den avgör hur du ska skicka en '1' och '0'.
Med de värden är det inte fel på Timer2, det kan däremot vara mottagaren som är för slö eller din paus mellan varje bit som är för kort.
Om pulsens längd har betydelse för mottagaren beror på hur mottagaren är byggd självklart.
Jag tycker att det är lite för många okända variabler här för att kunna hjälpa. Jag vet inte:
* Hur sändaren ser ut.
* Hur mottagaren ser ut.
* Hur puls/paus-förhållandet ser ut.
* Varför du skickar en längd puls för '0' och en annan längd för '1'.
Rent signalleringsmässigt tycker jag att du bör välja ett annat än det du verkar ha vald.
Antingen använda:
* FSK (moduleringsfrekvens 1 = '0', moduleringsfrekvens 2 = '1') eller
* ASK (AM-modulation): IR-pulser(38kHz) = '0' eller ingen pulser = '1'.
Med ASK kräver det en mottagare som är snabb på att ställa in gain och DC-offset, med FSK kräver det en mottagare med frekvensdiskriminator i.
Att sända ASK är bara att styra 38kHz'en med utsignalen från en UART och sedan skicka till IR-LED'n, mottagningen är skaplig enkel också, de flesta fjärrkontroller kör med ASK enl, vad jag vet.
ASK = "Amplitude Skift Keying" ~= AM
FSK = "Frequency Shift Keying" ~= FM
Fördel:
ASK: enkel sändning och mottagning.
FSK: bättre störsäkerhet, avkänning av OM det kommer signal möjlig.
Nackdel:
ASK: inte helt bra störsäkerhet, kan lösas med checksum, omsändning osv.
FSK: lite mer komplicerat mottagare pga. fekvensdiskriminator.
Edit: jag kom att tänka på en sak: de 38kHz man brukar använda för att pulsa IR-LED'n är mest till för att dels utesluta annat ljus men också för att köra med låg duty-cycle på LED'n, den bör alltså ha en duty-cycle på 10%.
Har du bråttom med datan som ska överföras kan du även modulera tiden mellan varje IR-puls men då börjar det bli knepigt med enkeltheten och jag tror inte att detta är din första prioritet.
* Modulationen. Den är till för att mottagaren ska kunna avgöra att det är signal samt ställa in DC-nivåer osv.
* Signalleringen. Den avgör hur du ska skicka en '1' och '0'.
Med de värden är det inte fel på Timer2, det kan däremot vara mottagaren som är för slö eller din paus mellan varje bit som är för kort.
Om pulsens längd har betydelse för mottagaren beror på hur mottagaren är byggd självklart.
Jag tycker att det är lite för många okända variabler här för att kunna hjälpa. Jag vet inte:
* Hur sändaren ser ut.
* Hur mottagaren ser ut.
* Hur puls/paus-förhållandet ser ut.
* Varför du skickar en längd puls för '0' och en annan längd för '1'.
Rent signalleringsmässigt tycker jag att du bör välja ett annat än det du verkar ha vald.
Antingen använda:
* FSK (moduleringsfrekvens 1 = '0', moduleringsfrekvens 2 = '1') eller
* ASK (AM-modulation): IR-pulser(38kHz) = '0' eller ingen pulser = '1'.
Med ASK kräver det en mottagare som är snabb på att ställa in gain och DC-offset, med FSK kräver det en mottagare med frekvensdiskriminator i.
Att sända ASK är bara att styra 38kHz'en med utsignalen från en UART och sedan skicka till IR-LED'n, mottagningen är skaplig enkel också, de flesta fjärrkontroller kör med ASK enl, vad jag vet.
ASK = "Amplitude Skift Keying" ~= AM
FSK = "Frequency Shift Keying" ~= FM
Fördel:
ASK: enkel sändning och mottagning.
FSK: bättre störsäkerhet, avkänning av OM det kommer signal möjlig.
Nackdel:
ASK: inte helt bra störsäkerhet, kan lösas med checksum, omsändning osv.
FSK: lite mer komplicerat mottagare pga. fekvensdiskriminator.
Edit: jag kom att tänka på en sak: de 38kHz man brukar använda för att pulsa IR-LED'n är mest till för att dels utesluta annat ljus men också för att köra med låg duty-cycle på LED'n, den bör alltså ha en duty-cycle på 10%.
Har du bråttom med datan som ska överföras kan du även modulera tiden mellan varje IR-puls men då börjar det bli knepigt med enkeltheten och jag tror inte att detta är din första prioritet.
Senast redigerad av Icecap 11 februari 2008, 17:19:12, redigerad totalt 1 gång.
Hårdvaran: Elfa 75-202-81(IR-mot) Ansluten precis som databladet
och Elfa 75-225-43 som IR-diod, ansluten direkt till PWM utgång på PICen och sedan till GND.
Mottagaren är ansluten till PICen som databladet säger(utan 10K resistor) till PORTB.0 som ger interuppt vid logisk 0.
Och angående signalleringen, jag trodde man skickade data genom att ha olika längder på pulsen ut från IR-dioden.
FSK, innebär det att man då byter mellan 38KHz och en anan frekvens för att skicka data?
och Elfa 75-225-43 som IR-diod, ansluten direkt till PWM utgång på PICen och sedan till GND.
Mottagaren är ansluten till PICen som databladet säger(utan 10K resistor) till PORTB.0 som ger interuppt vid logisk 0.
Och angående signalleringen, jag trodde man skickade data genom att ha olika längder på pulsen ut från IR-dioden.
FSK, innebär det att man då byter mellan 38KHz och en anan frekvens för att skicka data?
Komiskt, precis de komponenter jag tänkt använda!
Jag har en PWM-signal med frekvensen 38kHz. Denna slår jag sedan av och på så jag får en pulslängd på ca 600us, vilket verkar vara en bra pulslängde för mottagaren.
Kopplingen av mottagaren är likadan som din också. Tänkte skicka iväg 10101 där varje bit är 600us lång, och när mottagaren känner av signal mäter den på den med jämna mellanrum för att registrera vad som tagits emot. Detta här jag testat med kabel istället för IR, och det funkar bra.
Jag har en PWM-signal med frekvensen 38kHz. Denna slår jag sedan av och på så jag får en pulslängd på ca 600us, vilket verkar vara en bra pulslängde för mottagaren.
Kopplingen av mottagaren är likadan som din också. Tänkte skicka iväg 10101 där varje bit är 600us lång, och när mottagaren känner av signal mäter den på den med jämna mellanrum för att registrera vad som tagits emot. Detta här jag testat med kabel istället för IR, och det funkar bra.
InSipiD: Men du har inte testat med IR-överföring än? Om du lyckas bättre än mig, plz skicka kod!
Jobbade lite mer på UART-exprimentet som Icecap nämnde förut.
Det fungerar nästan, mottagar PICen får in data från sändaren. Men datan är koruppt, jag sänder "A" med jämna mellanrum, ca 250ms mellan varje sändning, men jag får något helt annat.
Jag sänder med hastigheten 300byte/s, men det verkar inte gå att sända långsammare, står inget i databladet om lägre hastigheter vid 4MHz, man måste sänka klockhastigheten då...
Jobbade lite mer på UART-exprimentet som Icecap nämnde förut.
Det fungerar nästan, mottagar PICen får in data från sändaren. Men datan är koruppt, jag sänder "A" med jämna mellanrum, ca 250ms mellan varje sändning, men jag får något helt annat.
Jag sänder med hastigheten 300byte/s, men det verkar inte gå att sända långsammare, står inget i databladet om lägre hastigheter vid 4MHz, man måste sänka klockhastigheten då...
Senast redigerad av net4all 12 februari 2008, 16:23:59, redigerad totalt 1 gång.
När du använder den mottagare gäller bara ASK, inget annat.
Om man körde FSK kunde det t.ex. vara 32kHz för '0' och 40kHz för '1', talen är tagit ur luften och bara som exempel, den ville alltså skicka ut pulser kontinuerligt och modulationen bestämmer frekvensen.
Men vad menar du "utan 10k resistorn"? Har du ingen pull-up? Och sedan klagar du över att den är instabil? Eller använder du intern pull-up i PIC'en?
Jag tycker att du ska kolla lite på databladet, speciellt Fig-3 som du kanske finner intressant, du bör även kolla Tl och Th som anger att pulser bör vara inom 400µs och 800µs.
Kanske inte den mest lämpliga mottagare du har vald till detta men kör du med runt 1666 baud kan det faktisk fungera.
Om man körde FSK kunde det t.ex. vara 32kHz för '0' och 40kHz för '1', talen är tagit ur luften och bara som exempel, den ville alltså skicka ut pulser kontinuerligt och modulationen bestämmer frekvensen.
Men vad menar du "utan 10k resistorn"? Har du ingen pull-up? Och sedan klagar du över att den är instabil? Eller använder du intern pull-up i PIC'en?
Jag tycker att du ska kolla lite på databladet, speciellt Fig-3 som du kanske finner intressant, du bör även kolla Tl och Th som anger att pulser bör vara inom 400µs och 800µs.
Kanske inte den mest lämpliga mottagare du har vald till detta men kör du med runt 1666 baud kan det faktisk fungera.
Uppdatering: Har nu testat med 1660kbs på UARTen, dock med samma resultat, fungerar inte.
Om man ansluter med kablar imellan istället så fungerar det, så det betyder ju att det är fel i hårdvaran. Frågan är var?
Om man ansluter en lysdiod till mottagaren ser man att det blinkar, dock funderar jag över spänningsnivåerna.
Kan det vara så att UARTen inte kan läsa av datan från mottagaren?
Använde även ett pullupmotstån på 2200ohm till mottagaren...
Om man ansluter med kablar imellan istället så fungerar det, så det betyder ju att det är fel i hårdvaran. Frågan är var?
Om man ansluter en lysdiod till mottagaren ser man att det blinkar, dock funderar jag över spänningsnivåerna.
Kan det vara så att UARTen inte kan läsa av datan från mottagaren?
Använde även ett pullupmotstån på 2200ohm till mottagaren...