Motorvärmartimer

Berätta om dina pågående projekt.
Användarvisningsbild
PaNiC
Inlägg: 2565
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Skulle någon kunna ta sig på att optimera koden lite sedan?
Har överskridit maxstorleken och har en del kvar att skriva.

Edit: Äsch, skit. Måste byta µC, koden blir på tok för stor för flashminnet :(.
Det får bli Mega48 istället. Hoppas att jag har bättre tur med dem denna gången.

Edit2: Men, den har ju helt kaiko konfiguration av portpinnarna. Ska jag behöva ta till en ännu fetare µC?

Edit3: 8535, here i come.
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Ska det verkligen behövas en sån kraftig uC för en motorvärmartimer?! Vad har den för funktioner.... realtidsklocka, tempgivare, reläutgång och lcd?
Ett tips är att bygga egna drivare istället för att använda färdiga, då kan man hålla ner storleken på koden. Det finns många fina färdiga funktioner för printf() osv, men ofta kan man klara sig utan dessa.
Vilken uC hade du från början?
Användarvisningsbild
PaNiC
Inlägg: 2565
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Nej, det ska inte behövas. Där är 1wire, reläutgång och lcd.
Klockan sköts i mjukvara.
Visst kan man bygga egna drivare, men som ni redan märkt är jag inte riktigt hemma i programmering. Då löser jag hellre mina bekymmer i hårdvara.
Jag hade Tiny2313 från början, endast 2kB flash.
Användarvisningsbild
PaNiC
Inlägg: 2565
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Någon sorts högre makt vill verkligen inte att jag ska bli klar med detta.
Något är helt kaiko sedan jag byggde om den. LCD-baklyset verkar hänga ihop med SCK och så blir µCn varm.
Suck..
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Då är du väl i princip klar?! ...bara att montera mikrokontrollern mot motorblocket och förse hela apparaturen med en strömbrytare! :D
Användarvisningsbild
PaNiC
Inlägg: 2565
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

I'm not going to dignify that with an answer. :D

Yay, jag har sparat ett nummer i en int (16 bitar). Detta är antalet sekunder som värmaren ska vara på. Hur får jag ut detta i timmar, minuter och sekunder på displayen? Har tittat på tidigare exempel av Icecap, men klarar inte riktigt att göra om dem att passa detta.
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Det här kan nog fungera. Kanske finns effektivare sätt?

Tänk på att innehållet i 'nummer' kommer vara "förstört" när koden är klar.

Kod: Markera allt

uint16_t nummer = ??????;
uint8_t tiotal, ental;

ental=tiotal=0;
while (nummer>=3600)
{
	nummer -= 3600;
	if (++ental > 9)
	{
		tiotal++;
		ental=0;
	}
}

lcd_putchar('0'+tiotal);
lcd_putchar('0'+nummer);
lcd_putchar(':');

ental=tiotal=0;
while (nummer>=60)
{
	nummer -= 60;
	if (++ental > 9)
	{
		tiotal++;
		ental=0;
	}
}

lcd_putchar('0'+tiotal);
lcd_putchar('0'+nummer);
lcd_putchar(':');

tiotal=0;
while (nummer>=10)
{
	nummer -= 10;
	tiotal++;
}
	
lcd_putchar('0'+tiotal);
lcd_putchar('0'+nummer);
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

En annan variant är denna, som jag tycker är mer lättläst (och generell):

Kod: Markera allt

uint16_t value = 5678; //sekunder
uint8_t h,m,s;

h = value / 3600;
m = (value%3600) / 60; //samma som m = (value - (3600*h)) / 60;
s = value - (3600*h) - (60*m);
h:m:s borde då bli
1:34:38
Metoden för att skriva ut det med ental och tiotal har någon (Icecap?) redan gått igenom tidigare i tråden och genom att ha den i en separat funktion så kan den nyttjas från andra ställen i programmet. Cykze's kod ger ingen möjlighet att skriva ut från andra funktioner i programmet... och jag gissar att det kommer att behövas.
Användarvisningsbild
PaNiC
Inlägg: 2565
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Tack igen, pågar. Fungerar klockrent :).
Användarvisningsbild
cykze
EF Sponsor
Inlägg: 1539
Blev medlem: 8 april 2004, 10:40:28
Ort: Uppsala

Inlägg av cykze »

Problemet med division och modulo är att det tar mer plats i µC:n. Det verkar inte vara mycket som skiljer dock. Annars är ju den metoden mycket snyggare.

> Metoden för att skriva ut det med ental och tiotal har någon (Icecap?) redan gått igenom tidigare i tråden och genom att ha den i en separat funktion så kan den nyttjas från andra ställen i programmet.

Jag tänkte att det är bättre att räkna ut tiotal och ental i looparna eftersom man ändå har looparna igång, så att säga.

> Cykze's kod ger ingen möjlighet att skriva ut från andra funktioner i programmet... och jag gissar att det kommer att behövas.

Det är jätteenkelt att ordna det om det skulle behövas. Jag gjorde så här för att försöka spara minne.
Användarvisningsbild
oJsan
EF Sponsor
Inlägg: 1541
Blev medlem: 11 november 2005, 21:36:51
Ort: Umeå
Kontakt:

Inlägg av oJsan »

Ja det är ju sant, när looparna ändå är igång.. good thinking!
Men jag funderar på hur dåligt division och modulus egentligen är?! Jag tvivlar på att det spelar någon roll i detta projekt, men en annan gång kanske det gör det..

Det skulle vara intressant att veta hur detta översätts till maskinkod/assembler:

Kod: Markera allt

while (nummer>=60)
{
   nummer -= 60;
   if (++ental > 9)
   {
      tiotal++;
      ental=0;
   }
}
Någon form av pseudokod, (där varje rad tar minst en maskincykel)
1. Är nummer >= 60?
2. Minska nummer med 1
3. öka ental med ett
4. jämför om resultatet > 9, om inte gå till rad 1
5. öka tiotal med 1
6. sätt ental till 0
7. hoppa till rad 1

Detta kommer att resultera i väldigt många klockcykler i värsta fallet (59 min). Frågan är bara hur / och % översätts till maskinkod, är det någon som vet det så är jag nyfiken att veta... lite OT-varning nu känner jag. =)
Det är för övrigt mycket effektivare att skriva do-while än vanliga while-satser!
Användarvisningsbild
PaNiC
Inlägg: 2565
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Yay, vad jag älskar att programmera.

Det senaste problemet är med 1wirekoden. När jag kör den så händer absolut ingenting på pinnen som det borde hända saker på.

Börjar bli väldigt trött på detta. Vad jag söker är kod för DS1820, 18B20 eller 18S20 som kör bitbang. Den senaste jag letade upp fungerar inte med klockfrekvensen jag kör (7,3728MHz).

Det lutar nästan åt att hänga på någon I2C-1wirepryl.
Men helst bitbang. Vet någon?
Pjoms
EF Sponsor
Inlägg: 644
Blev medlem: 24 maj 2004, 12:18:40
Ort: Ö-vik

Inlägg av Pjoms »

Vad använder du för kurva till tid/temp förhållandet? Något liknande denna som jag hittade på DEFA:s hemsida?
Användarvisningsbild
PaNiC
Inlägg: 2565
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Något som Bosse Bildoktorn skrev en gång :D.
Den är lite annorlunda än Defas. Bosses kurva är knäckt vid ca 5 grader.
Användarvisningsbild
PaNiC
Inlägg: 2565
Blev medlem: 15 augusti 2003, 22:16:15
Ort: Skånelandet

Inlägg av PaNiC »

Ja jävlar, nu har jag fått tummen loss igen och plockade nyss fram möget.
Jag sket i att försöka köra 1wire i mjukvara och skaffade mig en DS2482 och satte på TWIn istället.
Fast det är ju klart inte enkelt nog. Har aldrig använt TWI i hårdvara innan, och det var ju på sitt sätt.
Jag har räknat på TWPS och TWBR och satte TWBR till 30 och TWPS till 1. Jag fick detta till att med 7,3728MHz klocka bli 97kHz på SCL. Kan någon kolla detta?
Skriv svar