Avläsa temperatur från Dallas DS18B20 till en Teensy 2.0
Avläsa temperatur från Dallas DS18B20 till en Teensy 2.0
Jag har tidigare skapat en tråd i det här underforumet där jag frågade om köpråd när det gällde en AVR-baserad mikrokontroller. Efter lite fundering valde jag att köpa en Teensy 2.0 http://www.pjrc.com/teensy/ som rekommenderades i tråden och har nu kommit igång med utvecklingen.
Jag har efter lite forskning lyckats att skriva C-kod för att skriva till en LCD-display. Efter att ha klarat av detta funderade jag lite kring att prova och se om jag kunde koppla in någon annan enhet för att på så vis få mer kännedom om hur mikrokontrollern fungerar.
Jag har därför nu införskaffat en temperatursensor - närmare bestämt följande: http://www.kjell.com/sortiment/el/elekt ... ino-p87883 - och tänkte nu försöka avläsa temperaturen från sensorn. Observera att jag är intresserad av att skriva koden i C och inte använda mig av några av de färdiga biblioteken. Vad jag kan se och vad som angavs på både hemsidan (http://www.kjell.com/sortiment/el/elekt ... ino-p87883) och på enheten bygger denna sensorn på Dallas DS18B20 (http://www.kjell.com/.mvc/Document/File ... f10121cedb).
Vad jag kan se i databladet för Dallas DS18B20 så behöver det anslutas en pull-up resistor men efter att ha hittat lite information om den enhet jag köpt - trots i princip obefintlig dokumentation - så kunde jag utifrån den andra bilden på hemsidan http://www.kjell.com/sortiment/el/elekt ... ino-p87883 och på följande sida http://www.dx.com/p/ds18b20-digital-tem ... MpriMYo6V4 utifrån kommentarerna, komma fram till att pull-up resistorn förmodligen redan är integrerad i enheten. Har jag rätt eller måste det anslutas en resistor till?
Det som egentligen är den stora frågan är hur jag ska skicka och ta emot signaler från sensorn. Jag har studerat databladet för Dallas DS18B20 noga och förstår hur de olika tidsdiagrammen hänger ihop men jag blir lite förvirrad när det gäller användandet av pull-up resistorn. Efter att ha läst på följande sida: https://learn.sparkfun.com/tutorials/pull-up-resistors förstår jag syftet och att databussen är som standard 'hög' och att man vid kommunikationen med sensorn antingen drar bussen till 'ground' eller tillbaka till 'högt' tillstånd.
Så min egentliga fråga är egentligen hur jag konfigurerar portarna på min 'Teensy' på bästa sätt för att utföra kommunikationen med sensorn. Det vill säga, på vilket sätt ska DDRx, PORTx och PINx på bästa sätt användas? Känner lite att det brister när det gäller att förstå hur portarna internt arbetar och vet inte riktigt var i databladet jag ska titta för att på så vis få större inblick i hur det hänger ihop. Vad jag har lyckats utläsa i databladet är att det finns inbyggda pull-up resistorer i portarna på min 'Teensy' men eftersom det finns en extern pull-up resistor så borde väll dessa avaktiveras? Ja som ni förstår skulle jag behöva lite guidning i hur jag kan gå vidare.
Jag har efter lite forskning lyckats att skriva C-kod för att skriva till en LCD-display. Efter att ha klarat av detta funderade jag lite kring att prova och se om jag kunde koppla in någon annan enhet för att på så vis få mer kännedom om hur mikrokontrollern fungerar.
Jag har därför nu införskaffat en temperatursensor - närmare bestämt följande: http://www.kjell.com/sortiment/el/elekt ... ino-p87883 - och tänkte nu försöka avläsa temperaturen från sensorn. Observera att jag är intresserad av att skriva koden i C och inte använda mig av några av de färdiga biblioteken. Vad jag kan se och vad som angavs på både hemsidan (http://www.kjell.com/sortiment/el/elekt ... ino-p87883) och på enheten bygger denna sensorn på Dallas DS18B20 (http://www.kjell.com/.mvc/Document/File ... f10121cedb).
Vad jag kan se i databladet för Dallas DS18B20 så behöver det anslutas en pull-up resistor men efter att ha hittat lite information om den enhet jag köpt - trots i princip obefintlig dokumentation - så kunde jag utifrån den andra bilden på hemsidan http://www.kjell.com/sortiment/el/elekt ... ino-p87883 och på följande sida http://www.dx.com/p/ds18b20-digital-tem ... MpriMYo6V4 utifrån kommentarerna, komma fram till att pull-up resistorn förmodligen redan är integrerad i enheten. Har jag rätt eller måste det anslutas en resistor till?
Det som egentligen är den stora frågan är hur jag ska skicka och ta emot signaler från sensorn. Jag har studerat databladet för Dallas DS18B20 noga och förstår hur de olika tidsdiagrammen hänger ihop men jag blir lite förvirrad när det gäller användandet av pull-up resistorn. Efter att ha läst på följande sida: https://learn.sparkfun.com/tutorials/pull-up-resistors förstår jag syftet och att databussen är som standard 'hög' och att man vid kommunikationen med sensorn antingen drar bussen till 'ground' eller tillbaka till 'högt' tillstånd.
Så min egentliga fråga är egentligen hur jag konfigurerar portarna på min 'Teensy' på bästa sätt för att utföra kommunikationen med sensorn. Det vill säga, på vilket sätt ska DDRx, PORTx och PINx på bästa sätt användas? Känner lite att det brister när det gäller att förstå hur portarna internt arbetar och vet inte riktigt var i databladet jag ska titta för att på så vis få större inblick i hur det hänger ihop. Vad jag har lyckats utläsa i databladet är att det finns inbyggda pull-up resistorer i portarna på min 'Teensy' men eftersom det finns en extern pull-up resistor så borde väll dessa avaktiveras? Ja som ni förstår skulle jag behöva lite guidning i hur jag kan gå vidare.
Re: Avläsa temperatur från Dallas DS18B20 till en Teensy 2.0
Det finns ingen inbyggd pull-up i en DS18B20, den ska adderas externt. På kretskortet ser det dock ut som att den redan finns på plats.
Jag har jobbat en hel del med 1-Wire® och det är egentligen enkelt. Jag använder alltid 3-ledare för enkelhetens skull.
Data-pinnen på processorn ska man starta med att ställa till input. Sedan ska man ställa utgångsregistret till '0'.
Ska man sända en '0' slår man på pinnen som utgång, ska man sända en nolla slår man pinnen till ingång. Man använder alltså riktningsregistret enbart och utgångsregistret är alltid '0'. På detta vis fungerar portpinnen som en open-collector.
Ofta gör jag det på ett annat sätt pga. störkänslighet men detta ovan fungerar bra.
Jag har jobbat en hel del med 1-Wire® och det är egentligen enkelt. Jag använder alltid 3-ledare för enkelhetens skull.
Data-pinnen på processorn ska man starta med att ställa till input. Sedan ska man ställa utgångsregistret till '0'.
Ska man sända en '0' slår man på pinnen som utgång, ska man sända en nolla slår man pinnen till ingång. Man använder alltså riktningsregistret enbart och utgångsregistret är alltid '0'. På detta vis fungerar portpinnen som en open-collector.
Ofta gör jag det på ett annat sätt pga. störkänslighet men detta ovan fungerar bra.
Re: Avläsa temperatur från Dallas DS18B20 till en Teensy 2.0
Tack för ett snabbt svar. Kom dock på ett antal följdfrågor.
Är följande bild korrekt för att förstå hur portarna fungerar internt?
http://www.embedds.com/wp-content/uploa ... O_port.jpg
Jag är då utifrån den bilden med på hur du resonerar när det gäller att skicka bitar. Men hur gör jag när jag vill avläsa data som sensorn skickar? Tittar jag då på värdet av PINx? Det vill säga, när sensorn skickar en '1' (Drar bussen låg) så är PINx '1 på porten (DDRx == '1' , PORTx == '0')'? Och då den skickar en '0' (släpper bussen) är PINx '0' (DDRx == '0' , PORTx == '0')'?
Är jag helt ute och cyklar?
Är följande bild korrekt för att förstå hur portarna fungerar internt?
http://www.embedds.com/wp-content/uploa ... O_port.jpg
Jag är då utifrån den bilden med på hur du resonerar när det gäller att skicka bitar. Men hur gör jag när jag vill avläsa data som sensorn skickar? Tittar jag då på värdet av PINx? Det vill säga, när sensorn skickar en '1' (Drar bussen låg) så är PINx '1 på porten (DDRx == '1' , PORTx == '0')'? Och då den skickar en '0' (släpper bussen) är PINx '0' (DDRx == '0' , PORTx == '0')'?
Är jag helt ute och cyklar?
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
Re: Avläsa temperatur från Dallas DS18B20 till en Teensy 2.0
Inbyggda pull-uper är nog bra men använd en extern.
Jag minns inte vad Atmel kallar det men du ska konfigurera pinnen som "open drain" eller som det var förr, "open collector".
Sedan har jag för mig att man kan läsa nivån från ett register som avspeglar nivån på pinnen.
Edit: Icecap verkar ha full koll.
Jag minns inte vad Atmel kallar det men du ska konfigurera pinnen som "open drain" eller som det var förr, "open collector".
Sedan har jag för mig att man kan läsa nivån från ett register som avspeglar nivån på pinnen.
Edit: Icecap verkar ha full koll.
Re: Avläsa temperatur från Dallas DS18B20 till en Teensy 2.0
PINx,n är statusläsning, alltså nivån. Helt korrekt.
PORTx,n ska alltid vara '0'!!!
Och sensorn sänder inte '1', den låta bli att sända '0' vilket får pull-up motståndet att få ingången att bli '1'. Detta är nog lite hårklyveri men det har stor betydelse om man har fler sensorer på samma bus.
Ska µC'n skicka en '0' ska man sätta DDRx,n till att göra portpinnen till output, ska den sända en '1' ska man slå DDRx,n till att göra portpinnen till input.
Så rutinen ska sätta PORTx,n till '0' under initieringen - och sedan ska PORTx,n inte användas mer!
Resten är timing och avläsning av PINx,n samt pulsande av DDRx,n.
PORTx,n ska alltid vara '0'!!!
Och sensorn sänder inte '1', den låta bli att sända '0' vilket får pull-up motståndet att få ingången att bli '1'. Detta är nog lite hårklyveri men det har stor betydelse om man har fler sensorer på samma bus.
Ska µC'n skicka en '0' ska man sätta DDRx,n till att göra portpinnen till output, ska den sända en '1' ska man slå DDRx,n till att göra portpinnen till input.
Så rutinen ska sätta PORTx,n till '0' under initieringen - och sedan ska PORTx,n inte användas mer!
Resten är timing och avläsning av PINx,n samt pulsande av DDRx,n.
Re: Avläsa temperatur från Dallas DS18B20 till en Teensy 2.0
Tack för alla bra svar. Jag har nu fått rätt på sensorn och kan nu avläsa värden och mäta temperatur.
Re: Avläsa temperatur från Dallas DS18B20 till en Teensy 2.0
Här får man också komma ihåg att det man skriver på utporten påverkar de interna pullupmotstånden när pinnen används som ingång.Icecap skrev:Så rutinen ska sätta PORTx,n till '0' under initieringen - och sedan ska PORTx,n inte användas mer!
En nolla på utporten = ingen intern pullup på ingången.
Resistansen på interna pullupen kan variera kraftigt, så ett externt motstånd är nog bra.