logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATmega8][C] brak sygnalu presence czujnika Ds18B20

rozumek 10 Lis 2008 12:07 1672 10
REKLAMA
  • #1 5721547
    rozumek
    Poziom 10  
    Pomocy!!!

    powiedzcie mi co jest nie tak z moja funkcja resetująca DS18B20, juz nie wiem co robic.

    uchar init_DS18B20(void)
    {
     uchar presence = 0;
     
     _1_WIRE_DIR |= _BV(_1_WIRE);            //---ustawienie magistrali w trybie send
     _1_WIRE_OUT &= ~_BV(_1_WIRE);           //--- wysłanie sygnalu reset
     _delay_us(480);
     
     _1_WIRE_DIR &= ~_BV(_1_WIRE);          //--- ustawienie magistrali w trybie receive   
     
     _delay_us(70);                     //--- DS18B20 czeka do 60 us i ustawia 1_wire na 0 
      
     if(!(_1_WIRE_IN & _BV(_1_WIRE)))         //--- jesli wykryto ze 1_wire jest 0 zapala diode i ustawia sygnał "obecnosci"
     {
      PORTC &= ~_BV(PRESENCE);
      presence = 1;  //--- sprawdzenie czy wystapił sygnał dopstepnosci DS18B20
     }
     _delay_us(410);
     return presence;
    }


    funkcja zwraca obecnosc czujnika jesli presence = 0 i przy okazji zapala diode, nic juz nie działa. Mam zestaw uruchomieniowy ATmega8 zl2avr, czestotliwosc to 1MHz, (domyslnie, bo nie bawiłem sie fuse bitami). DS18B20 zasilam +5 V znajdujacego sie na plytce.

    dodam jeszcze ze mój rezystor podciagajacy ma wartosc: 3k3

    Wyprobowałem juz prawie wszystko i nic nie działa, prosze pomóżcie
  • REKLAMA
  • #3 5722172
    rozumek
    Poziom 10  
    a jak to sprawdzic?
  • REKLAMA
  • #4 5722494
    dawid512
    Poziom 32  
    Sprawdź czy ustawiłeś fuse bity i jak wpisałeś wartość oscylatora w make-u. Jeżeli nie zmieniałeś to w make'u zmień na 1MHz.
  • #5 5722559
    rozumek
    Poziom 10  
    a wiec a propo fusebitów... nie umiem ich jeszcze ustawic, i moja Atmega jest taktowana 1MHz który jest ustawiony fabrycznie, do pisania programów na AVR uzywam AvrSide i tam nie ma za bardzo zabawi z plikami make, wiec nie do końca wiem co mam zrobic.
    Wiem ze funkcje _delay_...() działaja dobrze, bo testowałem wielokrotnie opóźnianie czasów.

    To problem niedziałania moze tkwic w za małej czestotliwosci?

    Dodano po 5 [minuty]:

    Mam plik z taka zawartoscia, czy to bedzie to?

    Build Action :
    ================================
    F:\AvrSide\gcc-4.3.1\bin\avr-gcc.exe -gdwarf-2 -Os -mmcu=atmega8 -c -pipe -Wall -IF:\AvrSide\Myinc -DF_CPU=8000000UL -std=gnu99 funkcje.c
    .............................................
    F:\AvrSide\gcc-4.3.1\bin\avr-gcc.exe -gdwarf-2 -Os -mmcu=atmega8 -c -pipe -Wall -IF:\AvrSide\Myinc -DF_CPU=8000000UL -std=gnu99 main.c
    .............................................
    F:\AvrSide\gcc-4.3.1\bin\avr-gcc.exe -mmcu=atmega8 -Wl,-Map=czujnik_temp.map,--cref,-LF:\AvrSide\MyLib -o czujnik_temp.elf funkcje.o main.o
    .............................................
    F:\AvrSide\gcc-4.3.1\bin\avr-objdump.exe -h czujnik_temp.elf
    
    czujnik_temp.elf:     file format elf32-avr
    
    Sections:
    Idx Name          Size      VMA       LMA       File off  Algn
      0 .text         0000022e  00000000  00000000  00000094  2**0
                      CONTENTS, ALLOC, LOAD, READONLY, CODE
      1 .data         00000026  00800060  0000022e  000002c2  2**0
                      CONTENTS, ALLOC, LOAD, DATA
      2 .bss          0000000b  00800086  00800086  000002e8  2**0
                      ALLOC
      3 .noinit       00000000  00800091  00800091  000002e8  2**0
                      CONTENTS
      4 .eeprom       00000000  00810000  00810000  000002e8  2**0
                      CONTENTS
      5 .stab         000002a0  00000000  00000000  000002e8  2**2
                      CONTENTS, READONLY, DEBUGGING
      6 .stabstr      0000006b  00000000  00000000  00000588  2**0
                      CONTENTS, READONLY, DEBUGGING
      7 .debug_aranges 00000028  00000000  00000000  000005f3  2**0
                      CONTENTS, READONLY, DEBUGGING
      8 .debug_pubnames 00000145  00000000  00000000  0000061b  2**0
                      CONTENTS, READONLY, DEBUGGING
      9 .debug_info   00000782  00000000  00000000  00000760  2**0
                      CONTENTS, READONLY, DEBUGGING
     10 .debug_abbrev 00000284  00000000  00000000  00000ee2  2**0
                      CONTENTS, READONLY, DEBUGGING
     11 .debug_line   00000493  00000000  00000000  00001166  2**0
                      CONTENTS, READONLY, DEBUGGING
     12 .debug_str    000001fb  00000000  00000000  000015f9  2**0
                      CONTENTS, READONLY, DEBUGGING
    .............................................
    F:\AvrSide\gcc-4.3.1\bin\avr-nm.exe  czujnik_temp.elf
    Symbols listed in "czujnik_temp.smb" file
    .............................................
    F:\AvrSide\gcc-4.3.1\bin\avr-objdump.exe -S czujnik_temp.elf
    .............................................
    F:\AvrSide\gcc-4.3.1\bin\avr-objcopy.exe -R .eeprom -O ihex czujnik_temp.elf czujnik_temp.hex
    .............................................
    
  • #6 5722626
    Dr.Vee
    VIP Zasłużony dla elektroda
    To jest akurat log z przebiegu kompilacji programu.

    Wynika z niego, że masz zdefiniowane F_CPU na 8MHz:
    -DF_CPU=8000000UL
    No chyba, że redefiniujesz to makro we wszystkich swoich plikach *.c

    Pozdrawiam,
    Dr.Vee
  • REKLAMA
  • #7 5722715
    rozumek
    Poziom 10  
    tylko ja w zadnym pliku *.c nie mam zdefiniowanego takiego makra. Powinienem?
  • #8 5722750
    dawid512
    Poziom 32  
    Masz 2 opcje: definiujesz to w każdym pliku .c lub w make'u zmieniasz(własnym lub tworzonym przez program, poszukaj a znajdziesz te opcje)
  • #9 5723429
    rozumek
    Poziom 10  
    ustawiłem w programie F_CPU 1000000 i nie spowodowało to zadnej zmiany
  • REKLAMA
  • #10 5724618
    dawid512
    Poziom 32  
    Przyjrzyj się temu
    _1_WIRE_DIR &= ~_BV(_1_WIRE);          //--- ustawienie magistrali w trybie receive 
    a teraz temu:
    Cytat:
    The bus master then releases the bus and goes into receive mode (RX).
    When the bus is released, the 5kΩ pullup resistor pulls the 1-Wire bus high.
  • #11 5728716
    rozumek
    Poziom 10  
    No rozumiem całkowicie, chodzi ze kiedy master zwalnia magistrale rezystor podciaga, i to polecenie zwalnia magistrale, czy nie wysyła ona juz sygnałów tylko je odbiera. I z tego co rozumiem to ja mam zagwarantowac, i zwalniam magistare własnie tym poleceniem.

    Jesli cos jest nie tak to prosiłbym o jeszcze jedna podpowiedz
REKLAMA