Behöver nybörjarhjälp att programmera i C
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: Behöver nybörjarhjälp att programmera i C
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å...
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: Behöver nybörjarhjälp att programmera i C
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.
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++;
}
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
Re: Behöver nybörjarhjälp att programmera i C
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++;
}
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: Behöver nybörjarhjälp att programmera i C
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...
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...
[/s]
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
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;
Senast redigerad av Magnus_K 3 oktober 2016, 01:03:36, redigerad totalt 3 gånger.
Re: Behöver nybörjarhjälp att programmera i C
> 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)
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)
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: Behöver nybörjarhjälp att programmera i C
Ahaaaa, vilket bra svar!
Det är alltså för att ha lite fallskärm. Smart
Det är alltså för att ha lite fallskärm. Smart
Re: Behöver nybörjarhjälp att programmera i C
Ser ut att ha blivit nån sammanblandning av heltalsdivision och modulooperatorena. Nåt i denhär stilen borde hjälpa: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
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 :)
Re: Behöver nybörjarhjälp att programmera i C
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.
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.
- Jan Almqvist
- Inlägg: 1580
- Blev medlem: 1 oktober 2013, 20:48:26
- Ort: Orust
Re: Behöver nybörjarhjälp att programmera i C
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.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?
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
Re: Behöver nybörjarhjälp att programmera i C
Här har du ett testat exempel:
Jan Almqvist: Jag hade också använt tre variabler om jag inte behövde just minuter efter midnatt på andra ställen i programmet.
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 */
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: Behöver nybörjarhjälp att programmera i C
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
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
Jan Almqvists avrådan är befogad. Modulus och division är tunga.
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
Re: Behöver nybörjarhjälp att programmera i C
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.
- Magnus_K
- EF Sponsor
- Inlägg: 5854
- Blev medlem: 4 januari 2010, 17:53:25
- Ort: Skogen mellan Uppsala-Gävle
Re: Behöver nybörjarhjälp att programmera i C
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!
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!
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping