Forum Coders' city Strona Gwna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UytkownicyUytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj si, by sprawdzi wiadomociZaloguj si, by sprawdzi wiadomoci   ZalogujZaloguj 

Potrzebuj szybkiej odpowiedzi na moje pytanie... Zasady

Czujnik lm35 i lpc2138



 
Odpowiedz do tematu    Forum Coders' city Strona Gwna -> Elektronika, programowanie niskopoziomowe
Zobacz poprzedni temat :: Zobacz nastpny temat  
Autor Wiadomo
alycja



Doczy: 02 Sty 2013
Posty: 3

PostWysany: Sro Sty 02, 2013 11:10 pm  OP    Temat postu: Czujnik lm35 i lpc2138 Odpowiedz z cytatem Pisownia

Witam.
Jestem tutaj nowa i cakowicie zielona w programowaniu mikroprocesorw (moe nie do koca zielona, ale prawie e :) ), ale bardzo chciaabym si czego nauczy.
Dostaam za zadanie zaprogramowa wykrywanie temperatury za pomoc czujnika nm35- wynik ma si wywietla na lcd podczonego do procesora lpc2138 - zarwno w trybie polling, jak i wykorzystujc przerwanie. Okej, wiem, e naley wykorzysta konwerter AD , jednak nie bardzo wiem, co dalej.
Program pisz w C.
Czy kto moe mnie nakierowa, pomc, jak poradzi sobie z tym zadaniem?
Czy kto zna take jaki symulator, na ktrym mogabym testowa wyniki pracy bez posiadania w domu tego sprztu?
Byabym wdziczna za kad pomoc.
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo
biernik



Doczy: 06 Wrz 2008
Posty: 1148
Skd: 6359'39''N 2238'11''W

PostWysany: Czw Sty 03, 2013 12:02 am      Temat postu: Odpowiedz z cytatem Pisownia

Co daje na wyjciu ten czujnik? Wyszukiwarka nic mi nie zwraca na "nm35 sensor".
Ja si bawiem jak czujk ktra na wyjciu dawaa napicie rosnce liniowo z temperatur, chyba 10mV/1C to byo dosy proste z przerywaniem, co mniej wicej takiego:
Wczy przerywanie ADC;
W obsudze przerywania odczyta warto ADC, przeliczy na temperatur. Jak przeliczy, bdzie zaleao od tego co wypluwa Twoja czujka, od dokadnoci twojego ADC(mj by chyba 10bitowy), i od Twojego reference-voltage;
Wpisa na LCD;

pzdr.

_________________
I like cheese.
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo
alycja



Doczy: 02 Sty 2013
Posty: 3

PostWysany: Czw Sty 03, 2013 12:05 am  OP    Temat postu: Odpowiedz z cytatem Pisownia

ups, maa literwka lm35 xD w sumie jedna literka a kolosalne znaczenie.

(Tytu tematu zmieniem wg Twojej poprawionej informacji - Samolot)
Jednak jesli sie zarejestrowaa, to swoje posty moesz eytowa uywajc przycisku Zmie
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo
biernik



Doczy: 06 Wrz 2008
Posty: 1148
Skd: 6359'39''N 2238'11''W

PostWysany: Czw Sty 03, 2013 12:28 am      Temat postu: Odpowiedz z cytatem Pisownia

Wic to samo: 10mV/1C, czyli proste bo zaleno napicie-temperatura jest liniowa.
Gotowca Ci nie dam bo ja to robiem PICem, wic kod bdzie cakiem inny, ale z grubsza algorytm masz.
Mj niezawodny sposb na poskromienie dowolnej funkcjonalnoci mikrusa(w tym przypadku ADC+przerywania):
We data-sheeta do swojego procka, otwrz sekcj o ADC, przeczytaj. Otwrz sekcj o przerywaniach, przeczytaj. Z grubsza powinno to da pojcie o tym jak to zrobi.
Teraz we kartk, przele jeszcze raz, zrb notki co i w jakiej kolejnoci trzeba zrobi.
Napisz kod - powinno pj do sprawnie po przeczytaniu odpowiednich paragrafw i z notkami pod pach.
Ja tak zawsze robi i dla mnie ta metoda dziaa do skutecznie.

Jak ju mwiem, musisz wiedzie jak rozdzielczo ma Twj ADC, jaki masz reference-voltage i w przerywaniu odczytujesz warto ADC, kilka mnoe/dziele/dodawa i masz swoj temperatur.

pzdr.

_________________
I like cheese.
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo
alycja



Doczy: 02 Sty 2013
Posty: 3

PostWysany: Nie Sty 13, 2013 11:53 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Hm... Po przejrzeniu wielu przykadw udao mi si stworzy co takiego:
Kod:

#include <LPC214x.h>
#include "lcd.h"

#define BUTTON0 (1<<4)
#define BUTTON1 (1<<5)

int licznik;
static unsigned short ADCresult[4];


// zmienne do obslugi klawiatury 'Debouncing'
unsigned int buttonState;
unsigned int newButtonState, oldButtonState;

void ADC_Isr(void) __irq
{

    ADCR  = 0x0020780F;                // Init ADC (Pclk = 12MHz)
    ADCR |= 0x00010000;                // start burst mode now, see errata ADC.2
      
        unsigned int r,ch;
    r = ADDR;                          // Read Data Register and clear DONE flag
    ch = (r >> 24) & 0x07;             // which channel was converted
    ADCresult[ch] = (r>>6) & 0x03FF;   // bit 6:15 is 10 bit AD value
    VICVectAddr = 0;                   // reset VIC
}

static unsigned short ADC_Read(unsigned char ch)
{
    unsigned int i;
    ADCR = 0x00200300 | ch; ADCR |= 0x01000000;
    do
    {
        i = ADDR;
    } while ((i & 0x80000000) == 0);
    return (i >> 6) & 0x03FF;
}

void process_temp_sensor_adc_polling(void)
{
    unsigned short adc_value = 0;
    unsigned char buf[16] = {0};
  
    adc_value = ADC_Read(3);
    sprintf((char *)buf, "Temp:%2d", adc_value);
    LcdSetCursor(0x40);
    LcdPrint((char *)buf);
}

void process_temp_sensor_adc_interrupt(void)
{
    unsigned short adc_value = 0;
    unsigned char buf[16] = {0};
  
    adc_value = ADCresult[3];
    sprintf((char *)buf, "Temp:%2d", adc_value);
    LcdSetCursor(0x40);
    LcdPrint((char *)buf);
}


int     main(void)
{
    // Inicjalizacja zmiennych
        buttonState = newButtonState = oldButtonState = 0;
        buttonState = (BUTTON0 | BUTTON1);

      
        licznik=0;
  
        delay(20000);
        delay(20000);
        delay(20000);
        delay(20000);

        LcdInit();
        LcdClear();
        LcdSetCursor(0x0);
        LcdPrint("CZUJNIK TEMPERATURY");

        delay(20000);
        delay(20000);

        while( 1 )
        {
            // Czytaj?c IOPIN musimy zamaskowac tylko te piny ktUre nas interesuj?
            newButtonState = (~IOPIN0 & (BUTTON0 | BUTTON1));
            // negacja IOPIN ('~'), pozwala miec w zmiennej wcisniety klawisz reprezentowany 1
          
            // jeli stan klawiszy siÕ zmieni? od ostatniego razu
            if (oldButtonState != newButtonState)
            {
                // po krotkim czasie (20ms)...
                delay(20000);
                // ... ponownie sprawdzamy stan ("debouncing")
                buttonState = (~IOPIN0 & (BUTTON0 | BUTTON1));
              
                // sprawdzamy czy nowy stan jest stabilny
                if(buttonState == newButtonState)
                {
                    // jeli stan siÕ zmieni? i klawisze zosta?y oczyszczone
                    // 'debounced' (przez ponowne sprawdzenie po ustalonym czasie
                    // moona byE pewnym oe to rzeczywiste wciniecie klawisza
                    // a nie zak?Ucenie lub 'szpilka'
                  
                    //teraz obs?uga klawiatury
                    if(buttonState & BUTTON0 ) //jeli SW0 nie jest wciniÕty
                    {
                        
                        licznik++ ;
                    }
                  
                    if(buttonState & BUTTON1 ) //jeli SW1 nie jest wciniÕty
                    {
                        delay(300000);
                        process_temp_sensor_adc_interrupt();
                    }
                  
                    if(licznik ==1){
                        delay(300000);
                        LcdSetCursor(0x0);
                        LcdPrint("MANUAL");
                      
                        VICVectAddr0  = (unsigned int) &ADC_Isr; //ustawienia przrwania - ustawienie funkcji obs≥ugujacej przerwanie
                        VICVectCntl0  = 0x32;              // Channel0 on Source#18 ... enabled
                        VICIntEnable |= 0x40000;           // 18th bit is the ADC
                      
                    }
                    else if (licznik == 2){
                        delay(300000);
                        LcdSetCursor(0x0);
                        LcdPrint("AUTO");
                        process_temp_sensor_adc_polling();
                    }
                    else if (licznik>2){
                        licznik = 0;
                    }
                  
                }
              
                // przepisanie nowego stanu
                oldButtonState = buttonState;
            }
          
          
                }
      

        return 0;
}




Jednake problem polega na tym... e to nie dziaa. Nie za bardzo tylko wiem w czym polega problem - czy w programie czy w moe w jaki poczeniach, ktre robi le. Dlatego te moja ogromna proba - jakby znalaz si kto, kto mgby spojrze na ten kod i mniej wicej powiedzie, czy jest poprawny (wiem, e bez debugowania na rzeczywistym urzdzeniu moe by ciko, ale moe kto na tyle si zna, e zauway jakie race bdy, ktrych ja, kompletnie zielona osoba nie dostrzegam) byabym ogromnie, ogromnie wdziczna :)

Co wicej, nie dziaa ju sam pocztek a mianowicie wysiwtlanie menu. W sensie wyswietla si napis "czujnik temperatury" , ale po przycinieciu przyciskw nie zmieniaj si napisy na te, ktre umiescilam w programie. Wydaje mi si, e co pokrciam z warunkami, ale prbujc co zmienia.. dalej nie dziaao.
Pozdrawiam.
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo
biernik



Doczy: 06 Wrz 2008
Posty: 1148
Skd: 6359'39''N 2238'11''W

PostWysany: Pon Sty 14, 2013 4:52 pm      Temat postu: Odpowiedz z cytatem Pisownia

Ciko co powiedzie bo nie znam tego procka, ale ja bym zacz od zmiany debouncingu z softwarowego na hardwarowy - czyli po prostu zwyky kondensatorek kilkadziesit nF w poprzek przycisku.
To powinno znaczco skrci kod - bdzie Ci si atwiej poapa.
No i przynajmniej ja mam tak, e jak co nie dziaa a wydaje si, e powinno, to w 90% okazuje si, e co jest le podczone.

Aha, jeszcze jedna rzecz ze szklanej kuli:
Sprawd czy nie masz tam jaki stanw nieustalonych. Jak jest reprezentowane zero na przycisku, wysokim czy niskim stanem? Moe wystarczy dorzuci pull up/down?

pzdr.

_________________
I like cheese.
Powrt do gry
Zobacz profil autora Wylij prywatn wiadomo
Wywietl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Gwna -> Elektronika, programowanie niskopoziomowe Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Moesz pisa nowe tematy
Moesz odpowiada w tematach
Nie moesz zmienia swoich postw
Nie moesz usuwa swoich postw
Nie moesz gosowa w ankietach
Moesz dodawa zaczniki na tym forum
Moesz pobiera pliki z tego forum




Debug: strone wygenerowano w 0.18651 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |