DS18s20 i VHDL

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Beffo
Inlägg: 114
Blev medlem: 30 januari 2004, 12:00:12
Kontakt:

DS18s20 i VHDL

Inlägg av Beffo »

Håller på med ett projekt där jag använder några tempsensorer (ds18s20) för mätning. Styrning och avläsning ska göras i programmerbar logik (CPLD) och alltså programmeras med VHDL. Vet inte riktigt hur jag ska lägga upp programmet och hoppas att nån här på forumet kan ge lite tips eller dela med sig av erfarenheter...

Ge mig tips!!
pheer
EF Sponsor
Inlägg: 1283
Blev medlem: 16 januari 2005, 18:05:21

Inlägg av pheer »

Hur ska funktionen vara då? Man trycker på en knapp, tempen läses av för att sedan visas?

Du kan ju börja med att rita en tillståndsdiagram eller flödesschema så du vet hur det ska fungera från början. Sen är det bara att läsa datablad och koda.

Börja lite smått så kanske du kan ställa lite specifika frågor istället...
Användarvisningsbild
strombom
Inlägg: 3305
Blev medlem: 27 maj 2003, 10:50:20
Ort: Västra Götaland
Kontakt:

Inlägg av strombom »

Jag skulle absolut rekommendera att du har en liten enchipsdator för att läsa av de värdena...
Användarvisningsbild
babbage
Inlägg: 655
Blev medlem: 10 november 2004, 11:33:17
Ort: N-tälje

Inlägg av babbage »

Jag har aldrig använt Dallas 1-wire någon gång men ögnade igenom databladet för DS20S80 på några minuter. Om du kommer till skott kan jag kanske hjälpa till med VHDL. Vad ska du ha det till och har du någon erfarenhet av VHDL?

Har du redan en CPLD på ett kort med strömförsörjning, klocka, anslutningar osv.

Saker att fundera på till en början:
*Vad har du för klocka och hur är timingen på interfacet.
*Ska du ansluta flera 1-wire produkter till samma buss?
*Vilka av funktionerna i kretsen ska du använda? (bara läsa av temperatur?)
*CPLD eller uProcessor? Det finns nog mycket färdigt för t.ex. en Pic eller Avr (mer än för CPLD).
*Vad ska du göra med temperaturvärdet när du har läst in den till CPLD:n?

Läs databladet, fundera lite och ställ sedan mer specifika frågor.
Beffo
Inlägg: 114
Blev medlem: 30 januari 2004, 12:00:12
Kontakt:

Inlägg av Beffo »

Jag kommer använda en cpld och två sensorer (för enbart mätning). En tråd för varje sensor. Har en fungerande plattform med cpld och alla i/o. Klocka kommer ligga på 100 - 1000 KHz. Har färdiga block för skärmkontroller styrenhet osv för att presentera mätvärdena på. Så det som återstår är den byte/bitvisa kommunikationen med ds18s20. Man skickar ju byte i nästan "seriell" kommunikation. Det är just det att man ska använda olika tider för bitarna i följd som ställer till det, men nu har jag kommit på ett sätt som jag tror kan funka. Att bygga statemachines både på bit och bytenivå för att dela på svårigheterna.

Kruxet är att lyckas få plats med all kod på min begränsade cpld.

Tips på effektiv udda seriell kommunikation är välkommna :)

Som du (babbage) påpekar finns det många exempel på arbetssätt och även färdig kod för pic-processorer eller pc-interface. Men de blir inte till så myckewt hjälp för mig...
Användarvisningsbild
babbage
Inlägg: 655
Blev medlem: 10 november 2004, 11:33:17
Ort: N-tälje

Inlägg av babbage »

Ok, om du bara ska läsa underlättar det ju en aning. Jag antar att du bara behöver läsa en åt gången, så då muxar du bara in och utgångarna beroende på vilken du ska läsa och har samma tillståndsmaskin för detta. Om du har ont om plats får man försöka att optimera koden, det finns kanske lite tricks, men för det skulle jag nog behöva sätta mig och skriva koden och fundera på det. Men det fixar du säkert själv.

Du måste väl först göra en initiering ("skip rom"-command). Sedan två kommandon ("read scratchpad" och "convert T").

Börja kanske med en eller några små tillståndsmaskiner och en räknare. Det underlättar om du bestämmer dig för en klockfrekvens om du ska få timingen att gå ihop.

Hur många register har du över för att implementera detta?
Beffo
Inlägg: 114
Blev medlem: 30 januari 2004, 12:00:12
Kontakt:

Inlägg av Beffo »

Tack för hjälpen babbage.
Jag försvann från tråden häromdan när jag lyckades lösa problemen på egen hand :D

Men nu har det kört ihop sig igen. Jag har kontakt med tempgivaren och anser mig klar med den kommunikationen. Det var rätt lurigt men gick till slut.

För att kunna hantera tempvärdet och skriva ut det till en lcd vill jag göra om det 8-bitars ordet från tempsensorn (ett binärt värde) till en BCD-kod och lagra tecken-biten. Har gjort en kod med Xilinx Statecad till detta. MEN! den genererade vhdl-koden får inte plats på en CPLD (72 macroceller) som jag måste lyckas med.

Vet du hur man gör om till BCD i vhdl? eller har du nån exempelkod?
Eller någon annan som kan det? :roll:
Användarvisningsbild
babbage
Inlägg: 655
Blev medlem: 10 november 2004, 11:33:17
Ort: N-tälje

Inlägg av babbage »

Jag kan se om jag kommer på något, men det blir nog inte förrän tidigast imorgon om inte någon annan hinner före. Jag har nyss kommit hem och har lite annat att göra.

Vad menar du med ett binärt värde? Signed, unsigned, två-komplement, excess ... ? Om du inte svarar så utgår jag från det enklaste alternativet att det bara är positiva tal vilket väl "binärt värde" egentligen betyder. (jag frågar eftersom jag antar att sensorn även mäter minusgrader).
Beffo
Inlägg: 114
Blev medlem: 30 januari 2004, 12:00:12
Kontakt:

Inlägg av Beffo »

babbage skrev:Vad menar du med ett binärt värde? Signed, unsigned, två-komplement, excess ... ? Om du inte svarar så utgår jag från det enklaste alternativet att det bara är positiva tal vilket väl "binärt värde" egentligen betyder. (jag frågar eftersom jag antar att sensorn även mäter minusgrader).
Jo det är åtta bitar i binär form som representerar ett decimalt tal. Vid inläsning fås även en nionde bit som representerar tecknet.
Användarvisningsbild
babbage
Inlägg: 655
Blev medlem: 10 november 2004, 11:33:17
Ort: N-tälje

Inlägg av babbage »

Jag började med att tänka att det skulle gå rätt fort att fixa till en omvandling från binär till bcd, men det tog mer än tre timmar :shock: Hoppas att du får någon nytta av den. Eftersom det tog så lång tid har jag inte försökt att optimera den eller verifierat den så att jag kan garantera att den fungerar till 100%. Jag har gjort några godtyckliga tester och det gick bra efter vissa justeringar.

Kod: Markera allt


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
--use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity bin_till_bcd is
  Port ( binary : in std_logic_vector(7 downto 0); -- data som ska omvandlas
         hundratal : out std_logic_vector(3 downto 0); --resultat
         tiotal : out std_logic_vector(3 downto 0); -- resultat
         ental : out std_logic_vector(3 downto 0)); -- resultat
end bin_till_bcd;

architecture hmm of bin_till_bcd is

signal tmp1,tmp2,tmp3,tmp4,tmp5,tmp6,tmp7 : STD_LOGIC_VECTOR(3 downto 0);

begin

  hundratal <= "00"&tmp6(3)&tmp7(3);
  tiotal <= tmp7(2 downto 0)&tmp5(3);
  ental <= tmp5(2 downto 0)&binary(0);
			
  process (binary)
  begin  -- process ouch, det blir många såna här, inte så snyggt
      if ('0'&binary(7 downto 5) >= 5) then
        tmp1 <= '0'&binary(7 downto 5)+3;
      else
        tmp1 <= '0'&binary(7 downto 5);
      end if;
  End Process;
  
  process (binary,tmp1)
  begin  -- process, går väl att göra snyggare men det struntar jag i 
      if (tmp1(2 downto 0)&binary(4) >= 5) then
        tmp2 <= tmp1(2 downto 0)&binary(4)+3;
      else
        tmp2 <= tmp1(2 downto 0)&binary(4);
      end if;
  End Process;
  
  process (binary,tmp2)
  begin  -- process
      if (tmp2(2 downto 0)&binary(3) >= 5) then
        tmp3 <= tmp2(2 downto 0)&binary(3)+3;
      else
        tmp3 <= tmp2(2 downto 0)&binary(3);
      end if;
  End Process;

  process (binary,tmp3)
  begin  -- process
      if (tmp3(2 downto 0)&binary(2) >= 5) then
        tmp4 <= tmp3(2 downto 0)&binary(2)+3;
      else
        tmp4 <= tmp3(2 downto 0)&binary(2);
      end if;
  End Process;

  process (binary,tmp4)
  begin  -- process
      if (tmp4(2 downto 0)&binary(1) >= 5) then
        tmp5 <= tmp4(2 downto 0)&binary(1)+3;
      else
        tmp5 <= tmp4(2 downto 0)&binary(1);
      end if;
  End Process;

  process (tmp1,tmp2,tmp3)
  begin  -- process
      if ('0'&tmp1(3)&tmp2(3)&tmp3(3) >= 5) then
        tmp6 <= '0'&tmp1(3)&tmp2(3)&tmp3(3)+3;
      else
        tmp6 <= '0'&tmp1(3)&tmp2(3)&tmp3(3);
      end if;
  End Process;

  process (tmp4,tmp6)
  begin  -- process
      if (tmp6(2 downto 0)&tmp4(3) >= 5) then
        tmp7 <= tmp6(2 downto 0)&tmp4(3)+3;
      else
        tmp7 <= tmp6(2 downto 0)&tmp4(3);
      end if;
  End Process;
  
End hmm;

Beffo
Inlägg: 114
Blev medlem: 30 januari 2004, 12:00:12
Kontakt:

Inlägg av Beffo »

Tack för hjälpen!

Ska ta o titta på hur den funkar nu.
Användarvisningsbild
babbage
Inlägg: 655
Blev medlem: 10 november 2004, 11:33:17
Ort: N-tälje

Inlägg av babbage »

Tala gärna om hur det går och om du hittar några fel i koden. Den här är bara kombinatorik, jag kan tänka mig två sätt till att göra det med sekventiell logik.
Beffo
Inlägg: 114
Blev medlem: 30 januari 2004, 12:00:12
Kontakt:

Inlägg av Beffo »

Det börjar lösa sig här nu... Fick lite tips från din kod, men vi kan inte använda den eftersom den tar för stor plats.
Men tack ändå!!!
Användarvisningsbild
babbage
Inlägg: 655
Blev medlem: 10 november 2004, 11:33:17
Ort: N-tälje

Inlägg av babbage »

Hur stor plats tar den? Spontant känns det som den skulle rymmas på 72 macroceller utan problem, men jag har inte kollat. Hur stor plats tar den? Är det så att även annat ska rymmas på CPLD:n? Kanske klarar inte syntetiseringen att minimera "If - else" och "<=" på ett bra sätt. Man kan kanske göre det manuellt med "and, or" osv.

Du skulle kunna göra den till en skiftningsalgoritm, man använder då register men totalt sett mindre logik. Det kan kanske passa makrocellerna bättre.
Beffo
Inlägg: 114
Blev medlem: 30 januari 2004, 12:00:12
Kontakt:

Inlägg av Beffo »

Hallå igen!
Nu funkar min konstruktion :D
Fick tack vare babbage en del tips och idéer som jag är tacksam för. *tummen upp*

Jag kan kort och gott säga att DS18S20 är en bra givare med en del smidiga funktioner... MEN INTE!! på CPLD där man dessutom har begränsat utrymme. Programmerar man i C eller liknande verkar den däremot smidig.

Fick lite hjälp med BCD'n av en polare, så den har jag fortfarande ingen tok-koll på. 8)
Det som tog för mycket plats med BCD liknande den babbage gav mig var produkttermer. Makroceller var det rätt lungt med. Men min konstruktion krävde att rätt mycket funktioner skulle pressas in. Slutade med att jag använder 2 CPLD'er.
Skriv svar