SMT160-30 + ASM

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Användarvisningsbild
Limen
EF Sponsor
Inlägg: 1195
Blev medlem: 23 november 2006, 18:34:28
Ort: En bit utanför Karlstad

SMT160-30 + ASM

Inlägg av Limen »

Hejsan!

Har en SMT160 temperatursensor liggandes här som jag vill använda ihop med en AT90S8515. Men fattar inte riktigt hur jag ska jobba med PWM och ASM. Har hittat några exempel till sensorn men de har alla varit skrivna i C, vilket är ett språk jag inte behärskar :)
Hade tänkt att min lärare i "microprocessorer och assembleringsprogrammering" skulle hjälpa mig med detta men han hade inte en aning *suck*.
Är det någon som kan knuffa mig lite i rätt rikting?
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Inlägg av Andax »

Beror lite på hur avancerat du vill göra...

Den enklaste lösningen vore att mäta t.ex X ggr på ingången du kopplat in SMT160-30 på och räkna upp en räknare för varje gång den är hög.
Se bara till att varje varv i loopen tar lika lång tid och att X är hyffsat stort (och gärna en 2-potens).

Annars går det att mäta dutycykeln med hjälp av timers mm på ett "bättre" sätt... men det kräver att man sätter sig in i databladet över AT90S8515 bättre.
Användarvisningsbild
Limen
EF Sponsor
Inlägg: 1195
Blev medlem: 23 november 2006, 18:34:28
Ort: En bit utanför Karlstad

Inlägg av Limen »

Okej, se om jag hänger med här nu då.
Så loopen skulle ungefär se ut såhär:

-------------------------
Är sensorn hög?
Nej, kolla igen.
Ja, +1 på räknare.
Är räknaren = 128?
Nej, kolla sensorn igen.
Ja, hoppa ur loop.
-------------------------

Men vad gör jag sen? :S
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Inlägg av Andax »

Du har två räknare, en som räknar hur många gånger du kollar pinnen, och en räknare med hur många gånger den var "1".

Dividerar du den andra räknaren med antalet mätningar får man duty cykeln...
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Inlägg av thepirateboy »

Jag skulle nog använda ICP dvs. Input Capture och ställa in så den triggar på t ex positiv flank (register TCCR1B). Ställ också in så du får interrupt varje gång du får en positiv flank. Vid interrupt sparar du undan timervärdet. Räkna ut värdet mellan två flanker genom att ta värdet vid interrupt minus det förra värdet vid interrupt. Eftersom du vet klockfrekvensen kan du räkna ut tiden mellan två flanker och således duty cycle.

Exakt hur detta går till i Assembler har jag mindre koll på.
Användarvisningsbild
Limen
EF Sponsor
Inlägg: 1195
Blev medlem: 23 november 2006, 18:34:28
Ort: En bit utanför Karlstad

Inlägg av Limen »

thepirateboy> Fördel med ditt förslag jämfört med Andax förslag?
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

thepirateboy's förslag är inte helt rätt: pulsbredden och pulsfrekvensen kan ändras lite hursomhelst, alltså är det inte en fullgiltig mätning.

Bättre är att fånga båda flanker och räkna ut tiden och när man han en hög + låg puls ska man lägga undan de värden och räkna på dom.

Jag hade ju gjort en interruptstyrd lösning men man kan även kolla nivån och läsa av en timer när den ändras, detta gör att man inte är beroende av att få instruktionslängden helt exakt lika vid båda '0' och '1' från sensorn, timern går rätt iaf.
thepirateboy
EF Sponsor
Inlägg: 2109
Blev medlem: 27 augusti 2005, 20:57:58
Ort: Borlänge

Inlägg av thepirateboy »

Den största skillnaden blir ju att om man använder interrupt använder man nästan ingen cpu-kraft, så det beror ju på om du vill göra nåt annat när du läser av sensorn.
Användarvisningsbild
Limen
EF Sponsor
Inlägg: 1195
Blev medlem: 23 november 2006, 18:34:28
Ort: En bit utanför Karlstad

Inlägg av Limen »

Processorn gör inget annat medans den läser av temp så CPU-kraft är inget problem.

Icecap> Förklara gärna lite mer ingående hur struktureringen av ett sådant program skulle kunna se ut.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Kod: Markera allt

word High_B, High_E, Low_E;

0: Start 16-bit timer 
1: Vänta på att nivån blir låg
2: Vänta på att nivån blir hög
3: Spara Timervärde i High_B
4: Vänta på att nivån blir låg
5: Spara Timervärde i High_E
6: Vänta på att nivån blir hög
7: Spara Timervärde i Low_E
8: Räkna:
  Pulse_High = High_E - High_B
  Pulse_Low = Low_E - High_E
  Temp = Pulse_High / Pulse_Low * factor
  Gör vad som ska göras med detta tal
9: Gå till punkt 1
Användarvisningsbild
Limen
EF Sponsor
Inlägg: 1195
Blev medlem: 23 november 2006, 18:34:28
Ort: En bit utanför Karlstad

Inlägg av Limen »

Stort tack Icecap! Då ska jag bara lära mig att sammanfoga register till word så ska jag vara redo att köra sen.
Användarvisningsbild
Limen
EF Sponsor
Inlägg: 1195
Blev medlem: 23 november 2006, 18:34:28
Ort: En bit utanför Karlstad

Inlägg av Limen »

Nu har jag nog fått ordning på hur jag ska jobba med 16-bitars-register. Det som krånglar nu är att jag inte lyckas få igång den inbyggda 16-bitars räknaren. Har hittat en mängd exempel men alla använder sig av interrupts, vilket jag inte vill göra.
Är det någon som har koll på hur man initierar denna så säg gärna till :)
Seven11
Inlägg: 547
Blev medlem: 13 maj 2004, 23:43:33

Inlägg av Seven11 »

varför vill du inte använda dig av interrupts?
Användarvisningsbild
Limen
EF Sponsor
Inlägg: 1195
Blev medlem: 23 november 2006, 18:34:28
Ort: En bit utanför Karlstad

Inlägg av Limen »

Främsta anledningen är helt enkelt att jag ännu inte kan med interrupts. Den andra anledningen är att jag inte ser nyttan med det i detta projekt...
Användarvisningsbild
SvenPon
Utsparkad, på semester
Inlägg: 724
Blev medlem: 26 augusti 2004, 10:53:39
Ort: Haninge

Loop:a många ggr.

Inlägg av SvenPon »

Refererar till din Loop. Är räknaren 128 kan du skipa
Är sensorn hög?
Nej, kolla igen.
Ja, +1 på räknare. (cntHigh)
Är räknaren = 128?
Nej, kolla sensorn igen.
Ja, hoppa ur loop.


Kör kontrollerad loop dvs bestäm antal ~ 10 000 gr. TotNumOfSamples.
räkna alla som var höga som du gör nu cntHigh

Efter antal loopar ~10 000 räknar du ut tempC enl nedan.

tempC = (cntHigh/TotNumOfSamles - 0.32) / 0.0047
Skriv svar