Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

AVT5272 (arduino) i AVT1616 (moduł LED) - błąd bibl. PCF8583

webcom
-
-
Posty:6
Rejestracja:12 lip 2013, o 16:56
AVT5272 (arduino) i AVT1616 (moduł LED) - błąd bibl. PCF8583

Postautor: webcom » 12 lip 2013, o 17:39

Mam AVT5272 oraz AVT1616. Instaluję plik LED_TEMP_PIEZO_pde.pde z ftp EP7/2011, dodaję biblioteki, kompiluję w Arduino 1.0.5 i niestety pojawiają się błędy w czasie kompilacji.

Czy ktoś może mi pomóc?

Oto komunikat:
In file included from LED_TEMP_PIEZO_pde.pde:15;
..\arduino-1.0.5\libraries\PCF8583/PCF8583.h:70: error: 'byte' has not been declared
..\arduino-1.0.5\libraries\PCF8583/PCF8583.h:71: error: 'byte' does not name type

Linie 70 i 71 tego pliku to:
int bcd_to_byte(byte bcd);
byte int_to_bcd(int in);


To listing tego pliku LED_TEMP_PIEZO_pde.pde

Kod: Zaznacz cały

/* Przykład obsługi komponentów jakie zawiera moduł z wyświetlaczem LED dla Arduino UNO. Program zawiera przykład konfiguracji i obsługi: - wyświetlacza LED - zegara RTC - 2 przycisków - brzęczyka PIEZO - czujnika temperatury DS18B20 - czujnika światła */ #include "TimerOne.h" //biblioteka obslugi timera #include <Wire.h> //biblioteka i2c #include <PCF8583.h> //biblioteka RTC #include <OneWire.h> //biblioteka 1Wire OneWire ds(A3); // konfiguracja linii 1Wire byte present = 0; //definicje zmiennych uzywanych w programie byte data[12]; byte addr[8]; int wart_analog; int HighByte, LowByte, SignBit, temp, Fract, TReading, Tc_100; PCF8583 p (0xA0); //konfiguracja adresu ukladu RTC const int Buzzer = 13; //przypisanie aliasow linia portow const int DP = 12; const int SW1 = A1; const int SW2 = A2; const int sens_sw = A0; int groundPins[8] = {0, 1, 2, 3, 4, 5, 6, 7}; //linie portow wierszy LED int digitPins[4] = { 8, 9, 10, 11}; //linie portow kolumn LED int wys=0; int digit[4]; //tablica znakow dla wyswietlacza LED int kr[4]; //tablica przechowujaca zak kropki byte temp_sec; byte wsk_sek=1; int number[13][7] = { //tablica znakow dla LED {0,0,0,0,0,0,1}, //zero {1,0,0,1,1,1,1}, //jeden {0,0,1,0,0,1,0}, //dwa {0,0,0,0,1,1,0}, //trzy {1,0,0,1,1,0,0}, //cztery {0,1,0,0,1,0,0}, //piec {0,1,0,0,0,0,0}, //szesc {0,0,0,1,1,1,1}, //siedem {0,0,0,0,0,0,0}, //osiem {0,0,0,0,1,0,0}, //dziewiec {1,1,1,1,1,1,1}, //wylaczenie LED {0,0,1,1,1,0,0}, //znak stopnia {0,1,1,0,0,0,1} //znak C }; void setup() //procedura konfiguracyjna { Timer1.initialize(100); //inicjalizacja timer 1 Timer1.attachInterrupt(int_wys); //uruchomienie przerwania od timer 1 w procedurze int_wys for(int i=0; i < 8; i++) //konfiguracja linii jako wyjscia obslugujacych wiersze LED { pinMode(groundPins[i], OUTPUT); digitalWrite(groundPins[i], HIGH); } pinMode(Buzzer, OUTPUT); //konfiguracja PIEZO digitalWrite(Buzzer, HIGH); pinMode(DP, OUTPUT); //konfiguracja dwukropka wyswietlacza LED digitalWrite(DP, HIGH); for(int i=0; i < 4; i++) //konfiguracja kolumn wyswietlacza LED { pinMode(digitPins[i], OUTPUT); digitalWrite(digitPins[i], HIGH); } p.hour = 14; //wartosci poczatkowe dla ukladu RTC p.minute = 30; p.second = 0; p.year = 2011; p.month = 4; p.day = 1; p.set_time(); pinMode(SW1, INPUT); //konfiguracja linii do ktorych sa dolaczono przyciski jako wejscia pinMode(SW2, INPUT); digitalWrite(SW1, HIGH); //dolaczenie do linii do ktorych sa dolaczone przyciski rezystorow podciagajacych co wymusi na nich domyslnie stan wysoki digitalWrite(SW2, HIGH); analogReference(DEFAULT); //konfiguracja przetwornika A/C } void int_wys() { //funkcja przerwania w ktorej obslugiwany jest wyswietlacz LED for(int i=0; i < 4; i++) //petla for wykonywana dla kazdego z wyswietlaczy { digitalWrite(digitPins[i], HIGH); //wylaczenie wyswietlacza } for(int g=0; g < 7; g++) //zapisanie do wyswietlacza znaku zapisanego w tablicy digit { digitalWrite(groundPins[g], number[digit[wys]][g]); }; digitalWrite(groundPins[7], !(kr[wys])); //zapisanie stanu kropki digitalWrite(digitPins[wys], LOW); //wlaczenie obslugiwanego wyswietlacza wys++; //zwiekszenie wartosci o 1 zmiennej wys if (wys>4) wys=0; //jesli obslugiwany czwarty wyswietlacz to przejscie do obslugi pierwszego wyswietlacza }; void loop() //petla glowna programu { digitalWrite(DP, LOW); //wlaczenie calego wyswietlacza LED kr[0]=HIGH; kr[1]=HIGH; kr[2]=HIGH; kr[3]=HIGH; for(int k=0; k < 10; k++) //wyswietlenie na LED znakow od 0 do 9 { digit[0] = k; digit[1] = k; digit[2] = k; digit[3] = k; delay(200); //opoznienie 200ms }; digitalWrite(DP, HIGH); //instrukcje wylaczajace wszystkie elementy wyswietlacza LED kr[0]=LOW; kr[1]=LOW; kr[2]=LOW; kr[3]=LOW; digit[0] = 10; digit[1] = 10; digit[2] = 10; digit[3] = 10; delay(2000); while(1) //petla programu { p.get_time(); //pobranie z RTC danych o czasie i dacie digit[3]= p.minute%10; //wyswietlenie minut digit[2] = p.minute / 10; digit[1]= p.hour%10; //wyswietlenie godzin digit[0] = p.hour / 10; if (temp_sec!=p.second) //instrukcje migania dwukropka wyswietlacza co 1 sekunde { temp_sec=p.second; //zapisanie wartosci sekund if (wsk_sek==1) //jesli zmienna ma wartosc 1 to digitalWrite(DP, HIGH); //wylaczenie dwukropka else //w przeciwnym razie digitalWrite(DP, LOW); //wlaczenie dwukropka wsk_sek = !wsk_sek; //zmianna stanu zmiennej } if (digitalRead(SW1) == LOW) { //Sprawdzenie czy nacisniety przycisk S1 digit[0] = 10; //instrukcje wylaczajace wyswietlacz LED digit[1] = 10; digit[2] = 10; digit[3] = 10; digitalWrite(DP, HIGH); while(digitalRead(SW1) == LOW) //jesli przycisk nadal przycisniety to { getTemp(); //pobranie wartosci temperatury digit[1]= temp%10; //wyswietlenie wartosci temperatury digit[0] = temp / 10; digit[2] = 11; //wyswietlenie znaku stopnia digit[3] = 12; //wyswietlenie znaku C delay(500); //opoznienie 500 ms } } if (digitalRead(SW2) == LOW) { //Sprawdzenie czy nacisniety przycisk S2 digit[0] = 10; //instrukcje wylaczajace LED digit[1] = 10; digit[2] = 10; digit[3] = 10; digitalWrite(DP, HIGH); while(digitalRead(SW2) == LOW) //jesli przycisk S2 nadal nacisniety to { digit[3]= p.day%10; //wyswietlenie dnia miesiaca digit[2] = p.day / 10; digit[1]= p.month%10; //wyswietlenie miesiaca digit[0] = p.month / 10; kr[1]=HIGH; //wlaczenie kropki drugiego wyswietlacza delay(500); //opoznienie 500 ms } kr[1]=LOW; //wylaczenie kropki } if ((wart_analog = analogRead(A0))<80) //jesli wartosc odczytana z czujnika swiatla jest ponizej wartosci 80 to digitalWrite(Buzzer, LOW); //wlaczenie brzeczyka else //w przeciwnym razie digitalWrite(Buzzer, HIGH); //wylaczenie brzeczyka } } void getTemp() { //procedura odczytu temperatury z czujnika 1Wire DS18B20 int foo, bar, i; //definicje zmiennych ds.reset(); //zerowanie ukladu 1Wire ds.write(0xCC,1); //komendy startujace pomier temperatury ds.write(0x44,1); ds.reset(); //instrukcje odczytu temperatury ds.write(0xCC,1); ds.write(0xBE); for ( i = 0; i < 9; i++) { data[i] = ds.read(); } LowByte = data[0]; //instrukcje obliczajace temperature ktorej wynik jest zapisywany HighByte = data[1]; //do zmiennej temp TReading = (HighByte << 8) + LowByte; SignBit = TReading & 0x8000; //obliczenie znaku temperatury if (SignBit) { TReading = -TReading; } Tc_100 = (6 * TReading) + TReading / 4; temp = Tc_100 / 100; Fract = Tc_100 % 100; if (Fract > 49) { if (SignBit) { --temp; } else { ++temp; } } }


To listing pliku PCF8583.h

Kod: Zaznacz cały

/* Implements a simple interface to the time function of the PCF8583 RTC chip Works around the device's limited year storage by keeping the year in the first two bytes of user accessible storage Assumes device is attached in the standard location - Analog pins 4 and 5 Device address is the 8 bit address (as in the device datasheet - normally A0) Copyright (c) 2009, Erik DeBill This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /* Usage: PCF8583 pcf(0xA0); pcf.get_time(); Serial.print("year: "); Serial.println(pcf.year); pcf.hour = 14; pcf.minute = 30 pcf.second = 0 pcf.year = 2009 pcf.month = 9 pcf.day = 12 pcf.set_time(); */ #ifndef PCF8583_H #define PCF8583_H #include <WProgram.h> #include <../Wire/Wire.h> class PCF8583 { int address; public: int second; int minute; int hour; int day; int month; int year; int year_base; PCF8583(int device_address); void get_time(); void set_time(); int bcd_to_byte(byte bcd); byte int_to_bcd(int in); }; #endif //PCF8583_H


A to listing pliku PCF8583.cpp

Kod: Zaznacz cały

/* Implements a simple interface to the time function of the PCF8583 RTC chip Works around the device's limited year storage by keeping the year in the first two bytes of user accessible storage Assumes device is attached in the standard location - Analog pins 4 and 5 Device address is the 8 bit address (as in the device datasheet - normally A0) Copyright (c) 2009, Erik DeBill This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include <WProgram.h> #include <../Wire/Wire.h> #include "PCF8583.h" // provide device address as a full 8 bit address (like the datasheet) PCF8583::PCF8583(int device_address) { address = device_address >> 1; // convert to 7 bit so Wire doesn't choke Wire.begin(); } void PCF8583::get_time(){ Wire.beginTransmission(address); Wire.send(0xC0); // stop counting, don't mask Wire.endTransmission(); Wire.beginTransmission(address); Wire.send(0x02); Wire.endTransmission(); Wire.requestFrom(address, 5); second = bcd_to_byte(Wire.receive()); minute = bcd_to_byte(Wire.receive()); hour = bcd_to_byte(Wire.receive()); byte incoming = Wire.receive(); // year/date counter day = bcd_to_byte(incoming & 0x3f); year = (int)((incoming >> 6) & 0x03); // it will only hold 4 years... month = bcd_to_byte(Wire.receive() & 0x1f); // 0 out the weekdays part // but that's not all - we need to find out what the base year is // so we can add the 2 bits we got above and find the real year Wire.beginTransmission(address); Wire.send(0x10); Wire.endTransmission(); Wire.requestFrom(address, 2); year_base = 0; year_base = Wire.receive(); year_base = year_base << 8; year_base = year_base | Wire.receive(); year = year + year_base; } void PCF8583::set_time(){ Wire.beginTransmission(address); Wire.send(0xC0); // stop counting, don't mask Wire.endTransmission(); Wire.beginTransmission(address); Wire.send(0x02); Wire.send(int_to_bcd(second)); Wire.send(int_to_bcd(minute)); Wire.send(int_to_bcd(hour)); Wire.send(((byte)(year % 4) << 6) | int_to_bcd(day)); Wire.send(int_to_bcd(month)); Wire.endTransmission(); Wire.beginTransmission(address); Wire.send(0x10); year_base = year - year % 4; Wire.send(year_base >> 8); Wire.send(year_base & 0x00ff); Wire.endTransmission(); } int PCF8583::bcd_to_byte(byte bcd){ return ((bcd >> 4) * 10) + (bcd & 0x0f); } byte PCF8583::int_to_bcd(int in){ return ((in / 10) << 4) + (in % 10); }

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Re: AVT5272 (arduino) i AVT1616 (moduł LED) - błąd bibl. PCF

Postautor: pajaczek » 12 lip 2013, o 21:18

I tylko tych 2 wystąpień byte się czepia??

Nie wiem jak to jest z arduino, masz tam jakieś środowisko (IDE)? możesz podejrzeć gdzie (na któreym etapie) jest definiowane byte?
Możesz pokazać zawartość OneWire.h.

Możesz spróbować, choć to niezbyt eleganckie na przyszłość, wstawić protezkę typu

Kod: Zaznacz cały

typedef uint8_t byte;
w pliku PCF8583.h

webcom
-
-
Posty:6
Rejestracja:12 lip 2013, o 16:56

Re: AVT5272 (arduino) i AVT1616 (moduł LED) - błąd bibl. PCF

Postautor: webcom » 12 lip 2013, o 23:41

Dzięki za zainteresowanie :)
Przesyłam screen z arduino
http://www.nowodworek.krakow.pl/pliki/2 ... uino/1.jpg

wydaje mi się, że przyczyna może być w bibliotece... bo zwykle w czasie kompilacji gdy zostanie wykryty błąd to kompilator arduino zatrzymuje się i zaznacza linię z błędem, a tu nic mi nie zaznacza tylko pojawia się ten komunikat co na zdjęciu. Dobrze to widać po innym kolorze dołączonej biblioteki.

a teraz OneWire.h

Kod: Zaznacz cały

#ifndef OneWire_h #define OneWire_h #include <inttypes.h> // you can exclude onewire_search by defining that to 0 #ifndef ONEWIRE_SEARCH #define ONEWIRE_SEARCH 1 #endif // You can exclude CRC checks altogether by defining this to 0 #ifndef ONEWIRE_CRC #define ONEWIRE_CRC 1 #endif // Select the table-lookup method of computing the 8-bit CRC // by setting this to 1. The lookup table no longer consumes // limited RAM, but enlarges total code size by about 250 bytes #ifndef ONEWIRE_CRC8_TABLE #define ONEWIRE_CRC8_TABLE 0 #endif // You can allow 16-bit CRC checks by defining this to 1 // (Note that ONEWIRE_CRC must also be 1.) #ifndef ONEWIRE_CRC16 #define ONEWIRE_CRC16 0 #endif #define FALSE 0 #define TRUE 1 class OneWire { private: uint8_t bitmask; volatile uint8_t *baseReg; #if ONEWIRE_SEARCH // global search state unsigned char ROM_NO[8]; uint8_t LastDiscrepancy; uint8_t LastFamilyDiscrepancy; uint8_t LastDeviceFlag; #endif public: OneWire( uint8_t pin); // Perform a 1-Wire reset cycle. Returns 1 if a device responds // with a presence pulse. Returns 0 if there is no device or the // bus is shorted or otherwise held low for more than 250uS uint8_t reset(void); // Issue a 1-Wire rom select command, you do the reset first. void select( uint8_t rom[8]); // Issue a 1-Wire rom skip command, to address all on bus. void skip(void); // Write a byte. If 'power' is one then the wire is held high at // the end for parasitically powered devices. You are responsible // for eventually depowering it by calling depower() or doing // another read or write. void write(uint8_t v, uint8_t power = 0); // Read a byte. uint8_t read(void); // Write a bit. The bus is always left powered at the end, see // note in write() about that. void write_bit(uint8_t v); // Read a bit. uint8_t read_bit(void); // Stop forcing power onto the bus. You only need to do this if // you used the 'power' flag to write() or used a write_bit() call // and aren't about to do another read or write. You would rather // not leave this powered if you don't have to, just in case // someone shorts your bus. void depower(void); #if ONEWIRE_SEARCH // Clear the search state so that if will start from the beginning again. void reset_search(); // Look for the next device. Returns 1 if a new address has been // returned. A zero might mean that the bus is shorted, there are // no devices, or you have already retrieved all of them. It // might be a good idea to check the CRC to make sure you didn't // get garbage. The order is deterministic. You will always get // the same devices in the same order. uint8_t search(uint8_t *newAddr); #endif #if ONEWIRE_CRC // Compute a Dallas Semiconductor 8 bit CRC, these are used in the // ROM and scratchpad registers. static uint8_t crc8( uint8_t *addr, uint8_t len); #if ONEWIRE_CRC16 // Compute a Dallas Semiconductor 16 bit CRC. Maybe. I don't have // any devices that use this so this might be wrong. I just copied // it from their sample code. static unsigned short crc16(unsigned short *data, unsigned short len); #endif #endif }; #endif
Ostatnio zmieniony 13 lip 2013, o 14:24 przez webcom, łącznie zmieniany 1 raz.

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Re: AVT5272 (arduino) i AVT1616 (moduł LED) - błąd bibl. PCF

Postautor: pajaczek » 13 lip 2013, o 11:31

No to teraz zawartość inttypes.h ;) albo prościej... poprzeglądaj załączane ew. dalej pliki nagłówkowe i zobacz czy gdzieś jest wspomniana wyżej "protezka" (czyli "typedef uint8_t byte;" albo podobnie).

Ponieważ burzy się tylko do tych wystąpień, a do tych z "właściwego" kodu już nie, wygląda mi na to, że gdzieś później jest zrobiony taki typedef. Możesz go albo wykonać wcześniej, albo pozmieniać byte na np. uint8_t (choć takie podmianki odróżniające nagłówki od implementacji mogą powodować zamieszanie na przyszłość).

Co do koloru wyświetlania biblioteki, to mnie osobiście zastanawia jeszcze dlaczego w ścieżce dostępu ostatni jest slash a nie backslash.

Ps. Linie z błędem to Ci wyraźnie opisał, czegóż chcieć więcej ;)

webcom
-
-
Posty:6
Rejestracja:12 lip 2013, o 16:56

Re: AVT5272 (arduino) i AVT1616 (moduł LED) - błąd bibl. PCF

Postautor: webcom » 13 lip 2013, o 12:29

Przyznam się, że AVR i wszystko co z tym związane to na razie dla mnie czarna magia i nie bardzo zrozumiałem gdzie szukać plików nagłówkowych aby sprawdzić czy jest ta "protezka".

Ponieważ nie wiem również, w którym pliku i w które miejsce dodać typedef uint8_t byte; zrobiłem tak:

Linie 70 i 71 tego pliku wyglądały tak:

Kod: Zaznacz cały

int bcd_to_byte(byte bcd); byte int_to_bcd(int in);
teraz po zmianie linii 71 program wywala już tylko jeden błąd ten w linii 70. Próbowałem w linii 70 wstawiać uint_8_t ale robiłem to na pewno źle bo posypały się błędy w pliku cpp. Napisz proszę jak powinna wyglądać linia 70 to sprawdzę czy o to chodziło :wink:

Kod: Zaznacz cały

int bcd_to_byte(byte bcd); uint8_t int_to_bcd(int in);
A zwracając uwagę na ścieżkę dostępu, slasha i backslasha to co masz na myśli, czy zauważyłeś to na zdjęciu?

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Re: AVT5272 (arduino) i AVT1616 (moduł LED) - błąd bibl. PCF

Postautor: pajaczek » 13 lip 2013, o 13:52

Zauważyłem to dopiero a zdjęciu, choć wcześniej przecież wylistowałeś to w pierwszym poście, umknęło mi.

Chodzi o to
\arduino-1.0.5\libraries\PCF8583/PCF8583.h:70
I przyznam nie wiem skąd taki zapis w ścieżce, ale jest on dla mnie niepokojący, a przynajmniej zastanawiający. Rozumiem jednak że nie masz na to bezpośrednio wpływu w kodzie (być może gdzieś w ustawieniach środowiska).

Co do typedefa. Niech linie 70, 71+ wyglądają u Ciebie tak:

Kod: Zaznacz cały

typedef uint8_t byte; int bcd_to_byte(byte bcd); byte int_to_bcd(int in);
Czyli dodajesz 1 linijkę. Zobacz jaki to przyniesie skutek.

webcom
-
-
Posty:6
Rejestracja:12 lip 2013, o 16:56

Re: AVT5272 (arduino) i AVT1616 (moduł LED) - błąd bibl. PCF

Postautor: webcom » 13 lip 2013, o 14:19

Co do tych ścieżek, tak to mój błąd SORRY przepisywałem je ręcznie i je skróciłem. Poprawne są te na zdjęciu. Aby uniknąć ręcznego przepisywania wstawię fotkę z komunikatem o błędzie po wstawieniu tych 3 linii.

Oto link do zdjęcia z komunikatem o błędzie tym razem w pliku cpp.
http://www.nowodworek.krakow.pl/pliki/2 ... uino/2.jpg

Czy w tym pliku też coś wstawić?

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Re: AVT5272 (arduino) i AVT1616 (moduł LED) - błąd bibl. PCF

Postautor: pajaczek » 13 lip 2013, o 16:54

Wstawić taki sam typedef... gdzieś na początku, a przynajmniej przed 98 linijką ;

A co do ścieżek, nie chodziło mi o skrócenie, tylko o to, że w ścieżce kolejne podkatalogi są oddzielone przez "\" (windows style) zaś ostatnie przejście przez "/" (unix style).

webcom
-
-
Posty:6
Rejestracja:12 lip 2013, o 16:56

Re: AVT5272 (arduino) i AVT1616 (moduł LED) - błąd bibl. PCF

Postautor: webcom » 13 lip 2013, o 18:25

Wstawienie tego też na niewiele się zdało bo tym razem wywaliło znacznie więcej błędów tym razem w pliku biblioteki OnWire.
http://www.nowodworek.krakow.pl/pliki/2 ... uino/3.jpg
... choć można na to popatrzeć z innej strony... już nie ma błędów w bibliotece PCF8583.
I co o tym myślisz?

A tu do kompletu plik OnWire.cpp

Kod: Zaznacz cały

/* Copyright (c) 2007, Jim Studt Version 2.0: Modifications by Paul Stoffregen, January 2010: http://www.pjrc.com/teensy/td_libs_OneWire.html Search fix from Robin James http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1238032295/27#27 Use direct optimized I/O in all cases Disable interrupts during timing critical sections (this solves many random communication errors) Disable interrupts during read-modify-write I/O Reduce RAM consumption by eliminating unnecessary variables and trimming many to 8 bits Optimize both crc8 - table version moved to flash Modified to work with larger numbers of devices - avoids loop. Tested in Arduino 11 alpha with 12 sensors. 26 Sept 2008 -- Robin James http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1238032295/27#27 Updated to work with arduino-0008 and to include skip() as of 2007/07/06. --RJL20 Modified to calculate the 8-bit CRC directly, avoiding the need for the 256-byte lookup table to be loaded in RAM. Tested in arduino-0010 -- Tom Pollard, Jan 23, 2008 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Much of the code was inspired by Derek Yerger's code, though I don't think much of that remains. In any event that was.. (copyleft) 2006 by Derek Yerger - Free to distribute freely. The CRC code was excerpted and inspired by the Dallas Semiconductor sample code bearing this copyright. //--------------------------------------------------------------------------- // Copyright (C) 2000 Dallas Semiconductor Corporation, All Rights Reserved. // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included // in all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. // IN NO EVENT SHALL DALLAS SEMICONDUCTOR BE LIABLE FOR ANY CLAIM, DAMAGES // OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. // // Except as contained in this notice, the name of Dallas Semiconductor // shall not be used except as stated in the Dallas Semiconductor // Branding Policy. //-------------------------------------------------------------------------- */ #include "OneWire.h" #include "pins_arduino.h" extern "C" { #include "WConstants.h" #include <avr/io.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> } OneWire::OneWire(uint8_t pin) { bitmask = digitalPinToBitMask(pin); baseReg = portInputRegister(digitalPinToPort(pin)); #if ONEWIRE_SEARCH reset_search(); #endif } #define DIRECT_READ(base, mask) (((*(base)) & (mask)) ? 1 : 0) #define DIRECT_MODE_INPUT(base, mask) ((*(base+1)) &= ~(mask)) #define DIRECT_MODE_OUTPUT(base, mask) ((*(base+1)) |= (mask)) #define DIRECT_WRITE_LOW(base, mask) ((*(base+2)) &= ~(mask)) #define DIRECT_WRITE_HIGH(base, mask) ((*(base+2)) |= (mask)) // Perform the onewire reset function. We will wait up to 250uS for // the bus to come high, if it doesn't then it is broken or shorted // and we return a 0; // // Returns 1 if a device asserted a presence pulse, 0 otherwise. // uint8_t OneWire::reset(void) { uint8_t mask=bitmask; volatile uint8_t *reg asm("r30") = baseReg; uint8_t r; uint8_t retries = 125; cli(); DIRECT_MODE_INPUT(reg, mask); sei(); // wait until the wire is high... just in case do { if (--retries == 0) return 0; delayMicroseconds(2); } while ( !DIRECT_READ(reg, mask)); cli(); DIRECT_WRITE_LOW(reg, mask); DIRECT_MODE_OUTPUT(reg, mask); // drive output low sei(); delayMicroseconds(500); cli(); DIRECT_MODE_INPUT(reg, mask); // allow it to float delayMicroseconds(80); r = !DIRECT_READ(reg, mask); sei(); delayMicroseconds(420); return r; } // // Write a bit. Port and bit is used to cut lookup time and provide // more certain timing. // void OneWire::write_bit(uint8_t v) { uint8_t mask=bitmask; volatile uint8_t *reg asm("r30") = baseReg; if (v & 1) { cli(); DIRECT_WRITE_LOW(reg, mask); DIRECT_MODE_OUTPUT(reg, mask); // drive output low delayMicroseconds(10); DIRECT_WRITE_HIGH(reg, mask); // drive output high sei(); delayMicroseconds(55); } else { cli(); DIRECT_WRITE_LOW(reg, mask); DIRECT_MODE_OUTPUT(reg, mask); // drive output low delayMicroseconds(65); DIRECT_WRITE_HIGH(reg, mask); // drive output high sei(); delayMicroseconds(5); } } // // Read a bit. Port and bit is used to cut lookup time and provide // more certain timing. // uint8_t OneWire::read_bit(void) { uint8_t mask=bitmask; volatile uint8_t *reg asm("r30") = baseReg; uint8_t r; cli(); DIRECT_MODE_OUTPUT(reg, mask); DIRECT_WRITE_LOW(reg, mask); delayMicroseconds(3); DIRECT_MODE_INPUT(reg, mask); // let pin float, pull up will raise delayMicroseconds(9); r = DIRECT_READ(reg, mask); sei(); delayMicroseconds(53); return r; } // // Write a byte. The writing code uses the active drivers to raise the // pin high, if you need power after the write (e.g. DS18S20 in // parasite power mode) then set 'power' to 1, otherwise the pin will // go tri-state at the end of the write to avoid heating in a short or // other mishap. // void OneWire::write(uint8_t v, uint8_t power /* = 0 */) { uint8_t bitMask; for (bitMask = 0x01; bitMask; bitMask <<= 1) { OneWire::write_bit( (bitMask & v)?1:0); } if ( !power) { cli(); DIRECT_MODE_INPUT(baseReg, bitmask); DIRECT_WRITE_LOW(baseReg, bitmask); sei(); } } // // Read a byte // uint8_t OneWire::read() { uint8_t bitMask; uint8_t r = 0; for (bitMask = 0x01; bitMask; bitMask <<= 1) { if ( OneWire::read_bit()) r |= bitMask; } return r; } // // Do a ROM select // void OneWire::select( uint8_t rom[8]) { int i; write(0x55); // Choose ROM for( i = 0; i < 8; i++) write(rom[i]); } // // Do a ROM skip // void OneWire::skip() { write(0xCC); // Skip ROM } void OneWire::depower() { cli(); DIRECT_MODE_INPUT(baseReg, bitmask); sei(); } #if ONEWIRE_SEARCH // // You need to use this function to start a search again from the beginning. // You do not need to do it for the first search, though you could. // void OneWire::reset_search() { // reset the search state LastDiscrepancy = 0; LastDeviceFlag = FALSE; LastFamilyDiscrepancy = 0; for(int i = 7; ; i--) { ROM_NO[i] = 0; if ( i == 0) break; } } // // Perform a search. If this function returns a '1' then it has // enumerated the next device and you may retrieve the ROM from the // OneWire::address variable. If there are no devices, no further // devices, or something horrible happens in the middle of the // enumeration then a 0 is returned. If a new device is found then // its address is copied to newAddr. Use OneWire::reset_search() to // start over. // // --- Replaced by the one from the Dallas Semiconductor web site --- //-------------------------------------------------------------------------- // Perform the 1-Wire Search Algorithm on the 1-Wire bus using the existing // search state. // Return TRUE : device found, ROM number in ROM_NO buffer // FALSE : device not found, end of search // uint8_t OneWire::search(uint8_t *newAddr) { uint8_t id_bit_number; uint8_t last_zero, rom_byte_number, search_result; uint8_t id_bit, cmp_id_bit; unsigned char rom_byte_mask, search_direction; // initialize for search id_bit_number = 1; last_zero = 0; rom_byte_number = 0; rom_byte_mask = 1; search_result = 0; // if the last call was not the last one if (!LastDeviceFlag) { // 1-Wire reset if (!reset()) { // reset the search LastDiscrepancy = 0; LastDeviceFlag = FALSE; LastFamilyDiscrepancy = 0; return FALSE; } // issue the search command write(0xF0); // loop to do the search do { // read a bit and its complement id_bit = read_bit(); cmp_id_bit = read_bit(); // check for no devices on 1-wire if ((id_bit == 1) && (cmp_id_bit == 1)) break; else { // all devices coupled have 0 or 1 if (id_bit != cmp_id_bit) search_direction = id_bit; // bit write value for search else { // if this discrepancy if before the Last Discrepancy // on a previous next then pick the same as last time if (id_bit_number < LastDiscrepancy) search_direction = ((ROM_NO[rom_byte_number] & rom_byte_mask) > 0); else // if equal to last pick 1, if not then pick 0 search_direction = (id_bit_number == LastDiscrepancy); // if 0 was picked then record its position in LastZero if (search_direction == 0) { last_zero = id_bit_number; // check for Last discrepancy in family if (last_zero < 9) LastFamilyDiscrepancy = last_zero; } } // set or clear the bit in the ROM byte rom_byte_number // with mask rom_byte_mask if (search_direction == 1) ROM_NO[rom_byte_number] |= rom_byte_mask; else ROM_NO[rom_byte_number] &= ~rom_byte_mask; // serial number search direction write bit write_bit(search_direction); // increment the byte counter id_bit_number // and shift the mask rom_byte_mask id_bit_number++; rom_byte_mask <<= 1; // if the mask is 0 then go to new SerialNum byte rom_byte_number and reset mask if (rom_byte_mask == 0) { rom_byte_number++; rom_byte_mask = 1; } } } while(rom_byte_number < 8); // loop until through all ROM bytes 0-7 // if the search was successful then if (!(id_bit_number < 65)) { // search successful so set LastDiscrepancy,LastDeviceFlag,search_result LastDiscrepancy = last_zero; // check for last device if (LastDiscrepancy == 0) LastDeviceFlag = TRUE; search_result = TRUE; } } // if no device found then reset counters so next 'search' will be like a first if (!search_result || !ROM_NO[0]) { LastDiscrepancy = 0; LastDeviceFlag = FALSE; LastFamilyDiscrepancy = 0; search_result = FALSE; } for (int i = 0; i < 8; i++) newAddr[i] = ROM_NO[i]; return search_result; } #endif #if ONEWIRE_CRC // The 1-Wire CRC scheme is described in Maxim Application Note 27: // "Understanding and Using Cyclic Redundancy Checks with Maxim iButton Products" // #if ONEWIRE_CRC8_TABLE // This table comes from Dallas sample code where it is freely reusable, // though Copyright (C) 2000 Dallas Semiconductor Corporation static const uint8_t PROGMEM dscrc_table[] = { 0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65, 157,195, 33,127,252,162, 64, 30, 95, 1,227,189, 62, 96,130,220, 35,125,159,193, 66, 28,254,160,225,191, 93, 3,128,222, 60, 98, 190,224, 2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255, 70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89, 7, 219,133,103, 57,186,228, 6, 88, 25, 71,165,251,120, 38,196,154, 101, 59,217,135, 4, 90,184,230,167,249, 27, 69,198,152,122, 36, 248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91, 5,231,185, 140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205, 17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80, 175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238, 50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115, 202,148,118, 40,171,245, 23, 73, 8, 86,180,234,105, 55,213,139, 87, 9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22, 233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168, 116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53}; // // Compute a Dallas Semiconductor 8 bit CRC. These show up in the ROM // and the registers. (note: this might better be done without to // table, it would probably be smaller and certainly fast enough // compared to all those delayMicrosecond() calls. But I got // confused, so I use this table from the examples.) // uint8_t OneWire::crc8( uint8_t *addr, uint8_t len) { uint8_t crc = 0; while (len--) { crc = pgm_read_byte(dscrc_table + (crc ^ *addr++)); } return crc; } #else // // Compute a Dallas Semiconductor 8 bit CRC directly. // uint8_t OneWire::crc8( uint8_t *addr, uint8_t len) { uint8_t crc = 0; while (len--) { uint8_t inbyte = *addr++; for (uint8_t i = 8; i; i--) { uint8_t mix = (crc ^ inbyte) & 0x01; crc >>= 1; if (mix) crc ^= 0x8C; inbyte >>= 1; } } return crc; } #endif #if ONEWIRE_CRC16 static short oddparity[16] = { 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 }; // // Compute a Dallas Semiconductor 16 bit CRC. I have never seen one of // these, but here it is. // unsigned short OneWire::crc16(unsigned short *data, unsigned short len) { unsigned short i; unsigned short crc = 0; for ( i = 0; i < len; i++) { unsigned short cdata = data[len]; cdata = (cdata ^ (crc & 0xff)) & 0xff; crc >>= 8; if (oddparity[cdata & 0xf] ^ oddparity[cdata >> 4]) crc ^= 0xc001; cdata <<= 6; crc ^= cdata; cdata <<= 1; crc ^= cdata; } return crc; } #endif #endif

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Re: AVT5272 (arduino) i AVT1616 (moduł LED) - błąd bibl. PCF

Postautor: pajaczek » 13 lip 2013, o 18:57

Tych błędów jest znacznie więcej, a tylko po kilka pierwszych braków Ci wyświetla... to tak na pocieszenie ;)

Na wstępie, brak pliku nagłówkowego "WConstants.h", sprawdź czy go posiadasz i gdzie. Brak definicji kilku funkcji (być może są we wspomnianym pliku ;) ).

webcom
-
-
Posty:6
Rejestracja:12 lip 2013, o 16:56

Re: AVT5272 (arduino) i AVT1616 (moduł LED) - błąd bibl. PCF

Postautor: webcom » 13 lip 2013, o 19:53

No niestety pliku WConstants.h nie mam... :?

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty:2653
Rejestracja:24 sty 2005, o 00:39
Lokalizacja:Winny gród

Re: AVT5272 (arduino) i AVT1616 (moduł LED) - błąd bibl. PCF

Postautor: pajaczek » 13 lip 2013, o 22:12

No to musisz uzupełnić braki... ew. spróbować wyłączyć includowanie tego pliku, ale to pewnie pociągnie za sobą więcej errorów (nie wiem teraz co w tym pliku może być i do czego jest wykorzystany).

kejza
-
-
Posty:15
Rejestracja:26 gru 2009, o 15:05
Lokalizacja:ruda śląska

Re: AVT5272 (arduino) i AVT1616 (moduł LED) - błąd bibl. PCF

Postautor: kejza » 9 mar 2014, o 09:28

webcom udało ci się skompilować ten plik?
Też posiadam avtduino i mam problem z kompilacją programów dołączonych do kursu EP, między innymi z programem z 9 części kursu obsługującego bibliotekę TimerOne.

Wrzucam plik do arduino, dodaję bibliotekę kompiluję i pojawiają się same błędy
Na jednym z forów poświęconych arduino poruszyłem wątek biblioteki TimerOne i wyskakujących błędów.
Jak się okazało przyczyną tych wszystkich błędów jest to że używam klonu arduinio a nie orginalnego.
Można to w szybki sposób sprawdzić: jako płytkę wybrałem arduino Uno wrzuciłem ten sam program który chciałem wgrać do atmegi kompilacja przeszła bez problemów ale jak wróciłem do płytki której używam (Arduino NG or older w/ Atmega168) pojawiła się cała lista błędów.

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 9 gości