f
Warning: Cannot modify header information - headers already sent by (output started at /home/anderian/ftp/www_forum/db/mysql4.php:1) in /home/anderian/ftp/www_forum/includes/sessions.php on line 548

Warning: Cannot modify header information - headers already sent by (output started at /home/anderian/ftp/www_forum/db/mysql4.php:1) in /home/anderian/ftp/www_forum/includes/sessions.php on line 549

Warning: Cannot modify header information - headers already sent by (output started at /home/anderian/ftp/www_forum/db/mysql4.php:1) in /home/anderian/ftp/www_forum/includes/page_header.php on line 343
And-Tech :: Zobacz temat - Czujnik SHARP , z czym to się je?

Strona korzysta z plików cookie w celu realizacji usług zgodnie z Politykš prywatnoœci.

Możesz okreœlić warunki przechowywania lub dostępu do cookie w Twojej przeglšdarce lub konfiguracji usługi.

And-Tech Strona Główna And-Tech
Forum firmy And-Tech

FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy  GrupyGrupy
RejestracjaRejestracja  ZalogujZaloguj  AlbumAlbum  DownloadDownload

Poprzedni temat «» Następny temat
Czujnik SHARP , z czym to się je?
Autor Wiadomość
PiotrekP

Dołączył: 16 Paź 2011
Posty: 7
Wysłany: Sro Lis 30, 2011 3:13 pm   Czujnik SHARP , z czym to się je?

Dzień dobry,
Posiadam płytkę startową EvB 4.3 z procesorkiem atmega644p .
Ostatnio wpadł mi w ręce czujnik odległości SHARP o oznaczeniach : 0A41SK F 15 .
Chciałbym się nim pobawić, jednak nie wiem za bardzo jak go podłączyć do płytki, ani jak napisać do niego program.
Czy mógłby ktoś mi podpowiedzieć coś w tym temacie?
Może ktoś poleciłby jakieś tutoriale do tego ?

Z góry serdecznie dziękuje.
 
     
piotr94 
Site Admin

Dołączył: 02 Lut 2010
Posty: 606
Skąd: Kraków
Wysłany: Pią Gru 02, 2011 3:06 pm   

Poszukaj karty katalogowej tego czujnika w internecie - ona wszystko wyjaśni.
Zajrzyj też na: http://www.forbot.pl/forum/
_________________
http://www.piotr94.net21.pl/
 
     
PiotrekP

Dołączył: 16 Paź 2011
Posty: 7
Wysłany: Pią Gru 02, 2011 4:38 pm   

Znalazłem jakieś tutoriale :)
Porwałem się nawet na napisanie prostego programu, którego działanie jest następujące :
Naciśnięcie przycisku podpiętego pod PD0, powoduje odczyt sygnału z czujnika. W zależności od wartości sygnału zapala się jedna bądź druga dioda. Diody podpięte są pod PC0 i PC7.
Napięcie i uziemienie czujnika podłączyłem do goldpinów GND i +5V na płytce startowej. Przewód z sygnałem od czujnika podłączam do PA1.

Kod programu wygląda tak :
Kod:

#define F_CPU   16000000UL                   // zegar procesora
#include <avr/io.h>                        //podstawowy plik definiujacy we/wy
#include <util\delay.h>                    // naglowek umozliwiajacy uzywanie _delay_ms
#include <avr/interrupt.h>

// ----------------------------------------------------------------------------------------------------
void konf_c() { // pusta funkcja konfiguracyjna
               DDRD  = 0x00;     // ustawienie kierunku (1 wyjscie, 0 wejscie) , FF ustawia 8 jedynek - caly port na wyjscie
               PORTD = 0x00;     // ustawienie wartosci
               DDRC = 0xFF;
               PORTC = 0xFF;
               DDRA  = 0x00;
               PORTA = 0x00;
   
}// koniec konf_c()

//---------------------------------------------------------------------------------------------
void konf_ADC(){
           ADCSRA |= (1 << ADEN)|(1 << ADPS2)|(1 << ADPS1)|(1 << ADPS0); //inicjacja przetwornika i ustawienie prescalera 128
           ADMUX  |= (1 << MUX0);                // REFS0 i REFS1 == 0 - zasilanie zewnetrzne ; ustawienie przetwornika na PA1
           //ADMUX = 0;
}//koniec void ADC();

//----------------------------------------------------------------------------------------------------
uint16_t pomiar(){
                  ADCSRA |= (1<<ADSC);//ADSC: Uruchomienie pojedynczej konwersji 
                  while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji
                 
                  return(ADC);
}
//--------------------------------------------------------------------------------------------------------
int main() {    // petla glowna
   
           uint16_t a;
           
            konf_c();
            konf_ADC();
            while(1) {
                      if(!(PIND & 0b00000001)){
                                               a=pomiar();
                                               
                                                if (a > 170) PORTC = 0b01111111;
                                               else PORTC = 0b11111110;   PORTC = 0b11111110;   
                                                _delay_ms(500);
                                                PORTC =0xFF;                                           
                      }                   
                       
            } //koniec while(1)
}//koniec main


piotrva: kody umieszczamy w znacznikach [ code]

Program nie działa jednak poprawnie :( ( Bez względu na to jak daleko od czujnika odległości ustawiam przeszkodę , zawsze zapala mi się dioda podpięta pod PC7.

W którym miejscu może kryć się błąd?
Ostatnio zmieniony przez piotr94 Pią Gru 02, 2011 7:35 pm, w całości zmieniany 1 raz  
 
     
piotr94 
Site Admin

Dołączył: 02 Lut 2010
Posty: 606
Skąd: Kraków
Wysłany: Pią Gru 02, 2011 7:39 pm   

1. Umieszczaj kod w odpowiednich znacznikach
2. Całego programu analizować czasu nie mam, ale tu widzę coś dziwnego:
Kod:
if (a > 170) PORTC = 0b01111111;
else PORTC = 0b11111110;
PORTC = 0b11111110;//to polecenie zawsze ustawi stan niski na jednym z pinów, niezależnie do tego co zrobi IF.

Zamień ten fragment na bardziej czytelny i pozbawiony niepotrzebnego polecenia:
Kod:

if(a>170){
PORTC = 0b01111111;
}else{
PORTC = 0b11111110;
}

Poza tym można by spróbować wyświetlać wynik pomiaru na LCD lub wysyłać go do PC po RS232 - wtedy od razu byś widział jakie masz wartości.
_________________
http://www.piotr94.net21.pl/
 
     
PiotrekP

Dołączył: 16 Paź 2011
Posty: 7
Wysłany: Pon Gru 05, 2011 12:28 pm   

Dziękuje za podpowiedź :)
Do wyświetlania wyników postanowiłem podłączyć diodę sterowaną trybem CTC ( dioda mruga z określoną częstotliwością). Będę widział jakie jest napięcie płynące z czujnika.
Jednak dioda przez cały czas mruga w ten sam sposób. Może wina czujnika ? Sprawdziłem to próbując podłączyć pod ADC potencjometr, wynik ten sam :(

Na jednej ze stron przeczytałem że należy jakoś zasilić ten przetwornik. Niczego takiego nie zrobiłem. Powinienem podpiąć +5V pod pin Vref ? W takim przypadku powinienem zmienić wartości bitów REFS0 i REFS1 ?


Co do kodu programu rzeczywiście głupio wkleiłem :oops:

Z góry dziękuje za pomoc.
 
     
PiotrekP

Dołączył: 16 Paź 2011
Posty: 7
Wysłany: Pon Gru 05, 2011 7:16 pm   

taa...

problem rozwiązany :)
nie było Vref podpięte...

cóż... kolejna cenna lekcja za mną :lol:
 
     
piotr94 
Site Admin

Dołączył: 02 Lut 2010
Posty: 606
Skąd: Kraków
Wysłany: Pon Gru 05, 2011 8:33 pm   

Możesz, zamiast Vref podpinać, ustawić je na AVCC - tak jakby podłączyć ten pin do AVCC wewnątrz procesora.
_________________
http://www.piotr94.net21.pl/
 
     
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group