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?
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.
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å.
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.
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.
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
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
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.