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

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
rvl
Inlägg: 5782
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

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

Inlägg av rvl »

Lättast kanske att lagra just de värden man vill ha i en tabell?

När det gäller att ställa klockor så kan man ju ställa minuternas tio- och ental skilt, så är det maximalt rätt kort väg dit man vill, speciellt om man har möjlighet att stega både fram och back. Samma för timmar, men då måste man passa sig för "olagliga" värden > 23.

Sen tycker jag att det är synd att det är alltför vanligt att sekunderna nollas när man rör minuterna. I den första digitalklocka jag hade gick sekunderna till närmaste helminut i en skild funktion och minuterna kunde ställas utan att störa sekunderna.
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

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

Inlägg av Icecap »

Jag brukar ha autorepeat när jag ska ställa tiden. Först 0,5 sek vänttid, sedan repetering med 10Hz.

Sedan ställer man timmer, minuter och sekunder var för sig.
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 »

Zkronk skrev:0, 2, 6, 14, 30, 62, 126 kanske..? :)
Satt och funderade på om du drev med mig för jag fick inte alls samma siffror men med lite sömn så inser jag nu att det är helt rätt :wink:

rvl skrev:Lättast kanske att lagra just de värden man vill ha i en tabell?

När det gäller att ställa klockor så kan man ju ställa minuternas tio- och ental skilt, så är det maximalt rätt kort väg dit man vill, speciellt om man har möjlighet att stega både fram och back. Samma för timmar, men då måste man passa sig för "olagliga" värden > 23.

Sen tycker jag att det är synd att det är alltför vanligt att sekunderna nollas när man rör minuterna. I den första digitalklocka jag hade gick sekunderna till närmaste helminut i en skild funktion och minuterna kunde ställas utan att störa sekunderna.
Ett väldigt bra förslag! Eftersom det inte direkt behöver vara "steglös" justering så räcker det säkert med 5-6 värden.
Sekunderna kommer inte påverkas alls när man ställer klockan. När man vrider vredet till "ställa tid" så fryser sekunderna och tidsbasen och man ställer HH:MM som man vill. När vredet ställs tillbaka på "normalgång" och trycker till på knappen så börjar sekunderna ticka igen.

@rvl & Icecap: Designen är tyvärr redan klar och jag har bara en knapp att tillgå. Bäst hade givetvis varit att ställa var siffra för sig men kan jag få till funktionen med "exponentiell ökning" så ska det nog gå lika bra, hoppas jag.
Förstår jag dig rätt Icecap om du menar att väntiden alltså minskas likt 0,5s, 0,45s, 0,405s osv?
Användarvisningsbild
Icecap
Inlägg: 26139
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

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

Inlägg av Icecap »

Nix.
Första knapptryckningen registreras direkt, nästa (autorepeat) registreras efter 500ms, sedan kommer de var 100ms.

Men med bara en knapp hade jag haft en annan approach:
Ett kort tryck = nästa funktion.
Ett långt tryck = börja ställa värdet. Autorulla med lagom hastighet.
Ett kort tryck = använd värdet & stega till nästa funktion.
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 »

Ahaa, nu förstår jag.

Har haft såna tankar med knappen också men är rädd för att instruktionen blir lite väl lång. Vi får se vart det slutar. Ska ha det här i åtanke. :tumupp:
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 »

Jag fortsätter att bara vräka ur mig tankar och idéer.
Tänker jag rätt att "i" ska vara static då den ska behålla sitt värde tills nästa gång funktionen körs? Och sen nollas i när man släpper knappen.

Kod: Markera allt


         const char INCREMENT[12] = {

            1,1,1,1,2,2,2,4,4,8,8,20
         };

         if(ADC_value > 170){
          
            static unsigned short i;
            
            if(!pushButton_status){
              i = 0;
            }
            if(pushButton_status) {
              i++;
              timeCounter += INCREMENT[i];
              segmentCalc();                      
            }                                       
          }
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 »

Måste fråga. När man slår upp något i en tabell enligt nedan. Fortsätter programmet där anropet (eller vad det kallas) gjordes eller börjar loopen om?
Det beter sig väldigt konstigt efter jag införde den arrayen. Nedan kommer uppdaterad kod.

Kod: Markera allt

const unsigned short INCREMENT[12] = {

      1,1,1,1,2,2,2,4,4,8,8,20
};

          if(ADC_value > 170){

            static unsigned short i;

            if(pushButton_status){
              i = 0;
            }                                                 // Function to set digital clock
            if(!pushButton_status) {
              slaveRUNNING = 0;
              if(i>=12){
                i = 11;
              }
              timeCounter += INCREMENT[i];
              i++;
            }
          }
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 »

Personligen vill jag deklarera alla variabler i början av en funktion. Jag vet att många anser att man ska deklarera variabeln precis innan den används.
Är det där en del av en loop? Det borde fungera ändå men jag är inte säker.

Jag skulle kombinera rad 10, 12 och 13 till if () { } else { }. Vad sätter pushButton_status?

Har du bestämt dig för någon namngivningsstrategi? Verkar inte riktigt så. Eller så förstår jag den inte bara.
Användarvisningsbild
rvl
Inlägg: 5782
Blev medlem: 5 april 2016, 14:58:53
Ort: Helsingfors

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

Inlägg av rvl »

Hur ofta körs loopen? Hade också gillat else bättre än if !<föregående if>.
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 »

Jo, förutom arrayen så är resten en del av en loop. Just den här funktionen "slår upp" i tabellen.

Det låter som ett bra förslag att slå ihop dom. Har det såhär nu för att jag tycker jag kan läsa det lite lättare.
Det är en debounce-funktion som sätter pushButton_status och bara för att röra till det mer är denna funktion "felvänd" så !pushButton_status innebär att knappen är tryckt. Tänkt ändra det här så fort jag fått ordning på den här funktionen.
Njae, har försökt hålla så god rutin som möjligt med namngivningen men det är svårt. :(

Programmet är så stort och rörigt nu så jag har svårt att förklara vad som går fel men tanken med den här funktionen är i alla fall att när man trycker på knappen (och ADC_value > 170) så ska timeCounter stega upp varje gång med samma värde som i i tabellen.
När jag trycker på knappen nu så tickar inte tiden alls utan den börjar köra slaven istället. Rörigt?

EDIT: Hmm, vet inte hur ofta den körs. Det är en while(1)-loop så antar det blir så många gånger dom kvarvarande resurserna tillåter.
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 »

Men är pushButton_status pollad eller interruptdriven?
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 »

Interrupt. Så här ser den ut:
(Det är du som "lärt" mig :) )

EDIT: Sidofråga: Visst blir väl inte påståendet nedanför "debounce-funktionen" sann, om ADC_value = 255?

Kod: Markera allt

     if(PIR1.TMR2IF) {

        PIR1.TMR2IF = 0;                        // Reset interruptflag
        debounceCtr <<= 1;                      // Shift all bits one step up
        debounceCtr |= pushButton;              // OR:a in värdet från RB4

        if (debounceCtr == 0xff) {              // Om byte:n endast innehåller 1:or så sätt status till 1
            pushButton_Status = 1;
        }
        else if (debounceCtr == 0x00) {         // Om byte:n endast innehåller 0:or så sätt status till 0
                 pushButton_Status = 0;
        }
        adcCOUNTER++;
    }

Kod: Markera allt

(ADC_value > 85) && (ADC_value < 170)
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 »

Ser rimligt ut. Men med ditt if !if kan det bli träff i båda "halvorna". Tror jag.
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 »

Jag får be så hemskt mycket om ursäkt. Blir bara så frustrerad när jag tycker jag har flyt för en gångs skull med sånt här och sen tar det klubb-stopp.

Efter lite paus så började jag från början och insåg då att jag aldrig flyttade över ADC-registret till ADC_value. Tabbade mig när jag använde displayen och gjorde ctrl+x istället för ctrl+c.
Med andra ord stod ADC_value hela tiden på 0 och då ska programmet istället ställa om slavuret och inte det digitala uret.

Ska genast ändra if-satserna. Ledsen att jag tog er tid i onödan :(

Ps. Det fungerar förresten utmärkt med tabellen. Blev skitbra verkligen! Ds
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 »

Ingen anledning att vara ledsen. Ett tack och en beskrivning av felet är mycket mer välkommet. Iallafall hos mig och troligen hos de flesta andra som hjälper till. :)
Skriv svar