www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

PIC18F2550 in TSL261 [Pomoč]

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Naloge, izpiti, seminarske
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
Lumpek1
Neznanec
Neznanec



Pridružen-a: Čet 10 Jan 2013 17:09
Prispevkov: 4
Aktiv.: 0.03
Kraj: Maribor

PrispevekObjavljeno: Čet Jan 10, 2013 5:25 pm    Naslov sporočila:  PIC18F2550 in TSL261 [Pomoč] Odgovori s citatom

Lep pozdrav.
Z prijateljem morava za projekt narediti preprosti merilnik srčnega utripa z uporabo mikrokrmilnika PIC18F2550.
To sva naredila tako, da sva na mikrokrmilnik zvezala optični senzor TSL 261.
Prilagam sliko prototipne ploščice, slikane od spredaj in odzadaj.
http://hopsasa/f/3T/pG/1i4MmlgR/cam00090.jpg
http://hopsasa/f/46/C/3IGTlkyW/1/cam00091.jpg
Zraven je vezan termistor, ki nima veze z to nalogo.
TSL261 je vezan na pin RA5. Srčni utrip se meri tako, da se postavi prst med TSL261 in IRdiodo.
Zdaj pa me zanima, kako bi programsko uspel jaz vse to usposobiti.
Trenutno sem na kodi, ki jo prilagam, v temi kar se tiče registrov ADCON0, ADCON1 in ADCON2 ADRESH ter ADRESL in nasplošno pridobivanja vrednosti.

Koda:

#include <p18f2550.h>
#include <stdio.h>
#include <string.h>
#include "usb_cdc_funkcije.h"

extern void _startup (void);  // See c018i.c in your C18 compiler dir...
#pragma code REMAPPED_RESET_VECTOR = 0x1000  // Tu se zacne program izvajat(lokacija).
// Reset vektor najprej nalozi neke zadeve iz flasha, potem pa skoci na main.
void _reset (void)
{
    _asm goto _startup _endasm
}

#pragma code
// Od tu naprej pa lahko pisemo kodo.

void main(void)
{
    char buffer[32];
    int stevec = 0;  // Counter.
    int vrednost;

    USBDeviceInit();

    ADCON0 = 0x00010101;
    // Na?telamo AN5, TSL je prikljucen na RA5 pin.
    // Zadnja dva bita sta ON in OFF.
    ADCON1 = 0b00001001;
    // 7 in 6 sta unimplemented.
    // 5 in 4 poveta voltazo(vss in vdd).
    // Zadnji stirje povedo AN0 - AN5 so analogni.
    ADCON2 = 0b10000001;
    // Zadnji bit je right justified. 6 je unimplemented.
    // Potem so 5, 4, 3 se mamo kaki delay pred conversionom.
    // 2, 1 in 0 pa so "pretvorba AD ure?" Nastavimo Fosc/8.
    TRISB = 0b00010000;  // Vhod mamo na petki.

    while(1)
    {
        USBDeviceTasks();
        if ((USBGetDeviceState() < CONFIGURED_STATE))
        {
            continue;
        }

        CDCTxService();

        stevec++;
        if (stevec == 30000)
        {
            stevec = 0;
            if (USBUSARTIsTxTrfReady())
            {
                ADCON0bits.GO = 1;  // AD modul zacne pretvarjat signal.
                while(!PIR1bits.ADIF);  // Dokler ne konca z pretvarjanjem.
                PIR1bits.ADIF = 0;  // Nastavimo interrupt flag.

                // Kako dobiti vrednosti z ADRESH in ADRESL?

                sprintf(buffer, "Vrednost:%d\n", vrednost);  // Pretvorimo v char array.
                putsUSBUSART(buffer);
            }
        }
    }
}


Če ima kdo karkšenkoli nasvet ali pomoč pri izdelavi projekta, se mu iskreno zahvaljujeva.
Hvala, LP.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.01

PrispevekObjavljeno: Čet Jan 10, 2013 7:40 pm    Naslov sporočila:   Odgovori s citatom

Recimo, da dioda fiksno oddaja IR svetlobo, fototranzistor pa jo sprejema.
Kadar ni prsta vmes bo rezultat ADC konstanten in blizu 1023 (morda zadostuje 8-bitna pretvorba, torej do 255).

Potem prst delno prekine snop in vrednost močno upade.
V nadaljevanju se ob vsakem srčnem utripu tlak v žilah poveča in žile se razširijo, kar se pozna pri deležu prosojnosti prsta in posledično pri rezultatih ADC.

Glede na to, da srce utripa s 50 do 220utripov/minuto, čas med dvema ADC meritvama pa je znan, lahko programsko iščeš maksimalne ali minimalne izmerjene vrednosti. Za samo frekvenco utripanja niti ni pomembno, kolikšne so te vrednosti, temveč le zaporedne številke meritve.
Naprimer maksimumi so pri meritvah številka 51, 192, 334, 479, 620,...
Izračunaš povprečen čas med maksimumi in iz tega frekvenco srčnih utripov.

Za začetek poskušaj na USB pošiljati ADC vrednosti, da vidiš, če se zadeva sploh obnaša tako, kot sem opisal. Ker veš, kako pogosto se izvaja meritev, lahko že na grobo oceniš, da je pri 60 utripih na minuto maksimum vsako sekundo oziroma vsakih ??? meritev.
Ni nujno, da je razmik med maksimumi konstanten, če boš število utripov na minuto zaokroževal na cela števila. Tudi pri 200 utripih na minuto bo še dovolj rezerve.

Dodano: Zgoraj sem omenjal maksimume ... nekako se mi zdi, da bi se lažje delalo z minimumi ADC meritev. Ko se žile razširijo, se prosojnost prsta zmanjša.

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Lumpek1
Neznanec
Neznanec



Pridružen-a: Čet 10 Jan 2013 17:09
Prispevkov: 4
Aktiv.: 0.03
Kraj: Maribor

PrispevekObjavljeno: Čet Jan 10, 2013 9:09 pm    Naslov sporočila:   Odgovori s citatom

Lep pozdrav.
Točno tako sem si nekako razmisljal, kako bi vse skupaj delovalo.
Da bi iz taksnih vrednosti(minimumi) izračunal neko povrečno vrednost in iz tega dobim srčni utrip.
Problem mi nastane pri tem, ko si rekel, da bi naj na USB začenjal posiljat ADC vrednosti, to mi nikakor ne uspe in nevem, kako bi naj programsko usposobil TSL261, da bi mi zacenjal vrednosti vračat na USB.
Hvala za odgovor.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
igo
Član
Član



Pridružen-a: Sre 11 Okt 2006 19:11
Prispevkov: 3641
Aktiv.: 16.01

PrispevekObjavljeno: Čet Jan 10, 2013 10:02 pm    Naslov sporočila:   Odgovori s citatom

Lumpek1 je napisal/a:
Da bi iz taksnih vrednosti(minimumi) izračunal neko povrečno vrednost in iz tega dobim srčni utrip.
Ne potrebuješ povprečne vrednosti ADC meritve!
Potrebuješ zaporedne številke meritev, pri katerih je bil izmerjen minimum.
Potem odšteješ dve takšni številki med seboj, da izračunaš, koliko meritev je bilo izvedenih med dvema minimumoma.
Ko to število pomnožiš z natanko poznanim časom med dvema ADC meritvama (število meritev na minuto), dobiš čas (tokrat že v minutah) med dvema utripoma srca.
1/DobljenČas = frekvenca utripanja srca v enoti [utripov/minuto].
Lumpek1 je napisal/a:
Problem mi nastane pri tem, ko si rekel, da bi naj na USB začenjal posiljat ADC vrednosti, to mi nikakor ne uspe in nevem, kako bi naj programsko usposobil TSL261, da bi mi zacenjal vrednosti vračat na USB.
Hvala za odgovor.
d'oh!
TSL261 se ne "usposablja" programsko!
Pripni celotno vezalno shemo, vključno s tisto malo tiskaninico s PIC-em !!!

Glede programa pa ...
Najprej v tabelo spremenljivk, ki so namenjene za USB komunikacijo (glej PIC datasheet, kje v Bankah se te spremenljivke nahajajo) vpiši znane vrednosti iz tabele konstant.
Nato usposobi USB, da ti bo ob vsakem pošiljanju podatkov poslal paket teh znanih spremenljivk!
Ko boš to usposobil, poskrbi, da se bodo v spremenljivke vpisovale vrednosti ADC meritev, da vidiš, če se sploh spreminjajo po predvidenem vzorcu.
Če se, lahko začneš z računskim delom okrog iskanja minimuma, štetja meritev,..., ki sem ga opisal zgoraj.

_________________
Teoretično je praksa posledica teorije, praktično je pa ravno obratno. (igo 2001)
LP, Igor
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Lumpek1
Neznanec
Neznanec



Pridružen-a: Čet 10 Jan 2013 17:09
Prispevkov: 4
Aktiv.: 0.03
Kraj: Maribor

PrispevekObjavljeno: Čet Jan 10, 2013 10:29 pm    Naslov sporočila:   Odgovori s citatom

Lep pozdrav.
Aha, to je pa že bolj jasno. Kolikšne vrednosti cca. pa lahko pričakujem za minimum?
Vem, da se TSL261 ne usposablja programsko, problem je samo pri teh spremenljivkah, ker nevem, kako točno pridobiti vrednosti ADC meritev.
Program, ki sem ga zgoraj napisal sem testiral, vrača na USB vrednosti cca. med 100 in 110 in ko postavim prst med IR diodo in TSL-em se ne spreminjajo vrednosti, to pa ni pravilno. Problem pa pomoje tiči v vrednosti registrov za delo z AD pretvorbami.
Zgoraj sem v program še dodal:
Koda:

PIR1bits.ADIF = 0;  // Nastavimo interrupt flag.
vrednost = ADRESH*256 + ADRESL; // Spravimo obadva zloga skupaj.
sprintf(buffer, "Vrednost:%d\n", vrednost);  // Pretvorimo v char array in posljemo.

Prilagam še shemo:
Shema
Hvala za pomoč.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Lumpek1
Neznanec
Neznanec



Pridružen-a: Čet 10 Jan 2013 17:09
Prispevkov: 4
Aktiv.: 0.03
Kraj: Maribor

PrispevekObjavljeno: Čet Jan 10, 2013 10:29 pm    Naslov sporočila:   Odgovori s citatom

Drugače sem pa zgoraj priložil tudi dve sliki, kako ploščica zgleda.
Lep pozdrav.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Naloge, izpiti, seminarske Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 493 dni


Powered by phpBB © 2001, 2005 phpBB Group