Motorvärmartimer
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.
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.
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?
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?
I'm not going to dignify that with an answer.
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.
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.
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.
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);
En annan variant är denna, som jag tycker är mer lättläst (och generell):
hs 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.
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);
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.
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.
> 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.
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:
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!
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;
}
}
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!
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?
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?
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?
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?