Sida 7 av 9
Re: Behöver nybörjarhjälp att programmera i C
Postat: 2 oktober 2016, 17:28:02
av Magnus_K
Det löste sig genom att stega upp vilken siffra som skulle visas
efter jag hade latchat ut ny data (i ISR:en); med andra ord ett räknefel. Tog bara 2 kvällar att förstå...

Re: Behöver nybörjarhjälp att programmera i C
Postat: 2 oktober 2016, 19:55:36
av Magnus_K
Om
secPulse är en inkommande 1Hz-signal med 50% pulskvot. Blir resultatet av nedan att
timeCounter ökar med 1 varje minut?
Det är i alla fall vad jag försöker uppnå, men det bara bläddrar på displayen, så något måste vara tok och misstänker det ligger i nedan.
Kod: Markera allt
if(secPulse && newPulse) {
secCtr++;
newPulse = 0;
}
if(!secPulse && !newPulse) {
newPulse = 1;
}
if(secCtr >= 60) {
secCtr = 0;
timeCounter++;
}
Re: Behöver nybörjarhjälp att programmera i C
Postat: 2 oktober 2016, 20:15:21
av lillahuset
Jag skulle göra något i stil med följande:
Kod: Markera allt
switch (state) {
case 0:
if (newPulse) {
secCtr++;
state = 1;
}
break;
case 1:
if (!newPulse) {
state = 0;
}
break;
}
if (60 <= secCtr) {
secCtr = 0;
timeCounter++;
}
Re: Behöver nybörjarhjälp att programmera i C
Postat: 2 oktober 2016, 23:31:39
av Magnus_K
Ja det där var tjusigt. Får man fråga sig hur det kommer sig att du skriver tex
60 <= secCtr? Dvs sätter siffran först. Är det någon annan anledning än att du vant dig vid det?
Både min och din version fungerade fint, visade det sig. Det var ett efterliggande steg som var tokig (det nedan).
Hur hade ni gjort för att dela upp antal minuter i 10-tals timmar, 1-tals timmar, 10-minuter och 1-minut?
Jag har en variabel som räknar minuter och dessa vill jag sen dela upp för att skicka till displayen.
I nuläget har jag nog provat ca 30 olika varianter men får inte alla att lira.
Tänk er en display med 4 siffror. D1 tv och D4 th. Minuterna tickar från 1 till 1440 och dessa ska delas upp. Så här ser mitt förslag ut nu (vilket inte fungerar) men jag jobbar vidare. Får nog ihop det under veckan...
Kod: Markera allt
D1 = MINUTES % 600; // Show tens of hours
D2 = (MINUTES % 60) - (D1 * 10); // Show hours
D3 = (MINUTES / 60) % 10; // Show tens of minutes
D4 = MINUTES - (D3 * 10); // Show minutes
EDIT: Minuter löst tror jag. Det blev raderna nedan. Nu är det bara timmarna kvar....
EDIT2: Löste inte ett skit. Funkar så länge man inte går över en timma...
Kod: Markera allt
D3 = MINUTES / 10; // Show tens of minutes
D4 = MINUTES % 10;
[/s]
Re: Behöver nybörjarhjälp att programmera i C
Postat: 2 oktober 2016, 23:42:57
av sodjan
> Får man fråga sig hur det kommer sig att du skriver tex 60 <= secCtr? Dvs sätter siffran först.
Det är en klassisk metod för att undvika ett av de allra vanligaste C skitfelen...
Båda dessa är OK C-syntax men det ena gör inte vad som antagligen var meningen:
if (secCtr == 60)
if (secCtr = 60)
Medan en av dessa ger ett hårt kompileringsfel:
if (60 == secCtr)
if (60 = secCtr)
Re: Behöver nybörjarhjälp att programmera i C
Postat: 2 oktober 2016, 23:46:24
av Magnus_K
Ahaaaa, vilket bra svar!
Det är alltså för att ha lite fallskärm. Smart

Re: Behöver nybörjarhjälp att programmera i C
Postat: 3 oktober 2016, 12:41:44
av rvl
Magnus_K skrev:Tänk er en display med 4 siffror. D1 tv och D4 th. Minuterna tickar från 1 till 1440 och dessa ska delas upp. Så här ser mitt förslag ut nu (vilket inte fungerar) men jag jobbar vidare. Får nog ihop det under veckan...
Kod: Markera allt
D1 = MINUTES % 600; // Show tens of hours
D2 = (MINUTES % 60) - (D1 * 10); // Show hours
D3 = (MINUTES / 60) % 10; // Show tens of minutes
D4 = MINUTES - (D3 * 10); // Show minutes
Ser ut att ha blivit nån sammanblandning av heltalsdivision och modulooperatorena. Nåt i denhär stilen borde hjälpa:
Kod: Markera allt
D1 = MINUTES / 600; // Show tens of hours
D2 = (MINUTES / 60) - (D1 * 10); // Show hours ,eller (MINUTES / 60) % 10
D3 = (MINUTES % 60) / 10; // Show tens of minutes
D4 = (MINUTES % 60) - (D3 * 10); // Show minutes ,eller (MINUTES % 60) % 10, dvs MINUTES % 10 :)
Eller fick jag med nåt tankefel? Har inte
testat koden.
Re: Behöver nybörjarhjälp att programmera i C
Postat: 3 oktober 2016, 13:07:47
av sodjan
Ja, det är mer i linje med hur jag såg det också.
Men, eftersom det inte ens verkade vara testat med "papper
och penna" (det är ju skitenkelt med lite exempelvärden)
så struntade jag i att kommentera det.
Re: Behöver nybörjarhjälp att programmera i C
Postat: 3 oktober 2016, 13:14:16
av Jan Almqvist
Magnus_K skrev:
Hur hade ni gjort för att dela upp antal minuter i 10-tals timmar, 1-tals timmar, 10-minuter och 1-minut?
Jag hade redan från början delat upp timmar och minuter i var sin variabel där minuter räknar 0 till 59 och timmar 0 till 23. Med en klen CPU hade jag försökt undvika division och modulus och gjort på något annat sätt t.ex. en tabellslagning, använt BCD, provat multiplikativa inverser etc.
Re: Behöver nybörjarhjälp att programmera i C
Postat: 3 oktober 2016, 13:26:45
av lillahuset
Här har du ett testat exempel:
Kod: Markera allt
#include <stdlib.h>
#include <stdio.h>
void display(int minute);
int main(int argc, char **argv)
{
int minute;
if (2 == argc) {
minute = atoi(argv[1]);
if ((0 <= minute) && (minute <= 1439)) { /* intuitivt med värden från låg till hög */
display(minute);
} else {
printf("ERROR: bad input %d (valid 0..1439)\n", minute);
}
} else {
printf("usage: %s <minute 0..1439>\n", argv[0]);
}
return 0;
} /* main */
void display(int minute)
{
int d1, d2, d3, d4;
d1 = minute / 600;
minute -= (d1 * 600);
d2 = minute / 60;
minute -= (d2 * 60);
d3 = minute / 10;
minute -= (d3 * 10);
d4 = minute;
printf("%d %d %d %d\n", d1, d2, d3, d4);
} /* display */
Jan Almqvist: Jag hade också använt tre variabler om jag inte behövde just minuter efter midnatt på andra ställen i programmet.
Re: Behöver nybörjarhjälp att programmera i C
Postat: 3 oktober 2016, 20:05:18
av Magnus_K
Ni ska verkligen ha ett stort tack för all tid ni lägger ner.
Efter
rvl
förslag så fick jag ändå inte ihop siffrorna. Gjorde en sökning på "modulus" och jag hade ju fattat det fel.
32 % 10 resulterar i 2, dvs vad som "blir över" när man delat ner 32 med 10-delar. Jag hade fått för mig att det resulterade i 3, dvs hur många gånger det högra värdet går i det vänstra, vilket blir samma som division

...
Glad i vågen testade jag koden men displayen visade inget. Provade då att ge D1-D4 värdet 0 och visst visade displayen 00:00.
Efter mer googling pga
Jan Almqvist avrådan till modulus i långsamma CPU:er så förstår jag vad som menas; det är en
tung operation!
Ok, kan det då vara så det helt enkelt går för långsamt så jag inte kan göra uträkningen och skicka över datan med 625Hz?
Testade
lillahuset
tjusiga omvandlig (i.o.m att den inte innehöll någon modulus) och nu bläddrar displayen lite ryckande men man kan urskilja 16:40 (1000 minuter vilket är mitt test-tal).
Uträkningen ser verkligen ut att stämma men det är något annat
Kod: Markera allt
D1 = MINUTES / 600; // D1 = 1
MINUTES -= (D1 * 600); // MINUTES = 400
D2 = MINUTES / 60; // D2 = 6
MINUTES -= (D2 * 60); // MINUTES = 40
D3 = MINUTES / 10; // D3 = 4
MINUTES -= (D3 * 10); // MINUTES 0
D4 = MINUTES; // D4 = 0
Re: Behöver nybörjarhjälp att programmera i C
Postat: 3 oktober 2016, 20:12:47
av rvl
Jan Almqvists avrådan är befogad. Modulus och division är tunga.
Re: Behöver nybörjarhjälp att programmera i C
Postat: 3 oktober 2016, 20:16:29
av lillahuset
Om du verkligen behöver skicka data med 625Hz från en Arduino bör du nog överväga att bara räkna ut d1..d4 varje gång sekunden ändras.
Re: Behöver nybörjarhjälp att programmera i C
Postat: 3 oktober 2016, 20:36:13
av Magnus_K
Jaaaaaaaaaaaa, ni hade rätt!
Hade inte tänkt mig för utan placerat denna funktion så den kördes en gång per loop. Sedan sker överföringen till displayen med 625Hz.
Nu ändrat så uträkningen görs enbart om en ny minut räknats upp
TACK!
Nu_jävlar.jpg
Re: Behöver nybörjarhjälp att programmera i C
Postat: 3 oktober 2016, 20:50:34
av lillahuset
Den verkar gå nästan fyra timmar fel.
