Behöver nybörjarhjälp att programmera i C

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
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

Inlägg 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å... :(
Användarvisningsbild
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

Inlägg 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++;
        }
Användarvisningsbild
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

Inlägg 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++;
}
Användarvisningsbild
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

Inlägg 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]
Senast redigerad av Magnus_K 3 oktober 2016, 01:03:36, redigerad totalt 3 gånger.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Behöver nybörjarhjälp att programmera i C

Inlägg 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)
Användarvisningsbild
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

Inlägg av Magnus_K »

Ahaaaa, vilket bra svar!
Det är alltså för att ha lite fallskärm. Smart :tumupp:
Användarvisningsbild
rvl
Inlägg: 5780
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Behöver nybörjarhjälp att programmera i C

Inlägg 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.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43176
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Behöver nybörjarhjälp att programmera i C

Inlägg 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.
Användarvisningsbild
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

Inlägg 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.
Användarvisningsbild
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

Inlägg 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.
Användarvisningsbild
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

Inlägg av Magnus_K »

Ni ska verkligen ha ett stort tack för all tid ni lägger ner.

Efter rvl:s 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 :doh: ...

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:s 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 :humm:

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
Användarvisningsbild
rvl
Inlägg: 5780
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

Re: Behöver nybörjarhjälp att programmera i C

Inlägg av rvl »

Jan Almqvists avrådan är befogad. Modulus och division är tunga.
Användarvisningsbild
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

Inlägg 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.
Användarvisningsbild
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

Inlägg 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 :tumupp:
TACK!
Nu_jävlar.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
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

Inlägg av lillahuset »

Den verkar gå nästan fyra timmar fel. :badgrin:
Skriv svar