Gå til innhold

Bruk i pointer med jump


Gjest medlem-401307

Anbefalte innlegg

Gjest medlem-401307

Hvordan kan jeg programmere dette ca sånn:

          &pointer[begynnelsen];
          *pointer[255];
          PORTA = [255];
          PORTB = logic_flip_flop[255];
          &pointer[254];
          *pointer[254] + number_pointers[254];
          PORTA = 254;
          PORTB = logic_flip_flop[254];
          &pointer[253];
          *pointer[253];
          PORTA = 253;
          PORTB = logic_flip_flop[253];
          &pointer[252];

Sånn at hver &pointer[variabel] kan hoppe til en annen sted men aldri noe høyere nummer i variabel etter at den har hoppet.

f.eks begynnelsen inneholder variabel som er 255 men *pointer[254] kan være byttet ut med til *pointer[253] så ved &pointer[252]; blir variabel lavere enn 252 men høyere enn 252, dvs kun gå rett fram. Jeg vil ha det sånn uten for loop som gjør at tallet blir alltid lest hver for loop som gjør koden sannsynligvis tregere. Når denne pointere er ferdig til *pointer[0]; så blir alle variabel satt i opprinnelig plass og den første &pointer[255] blir satt til riktig tallverdi.

Jeg tenkte å putte hvert &pointer[variabel]; med

&pointer[255] -= array[255];

&pointer[254] -= array[254];

der array inneholder 0 eller så mange nummer til neste pointer; men i min teori, det er tregere.

Så jeg tenkte

&pointer[a] -= array;

Der for loop bestemmer forhånd hvilken pointer skal bli forandret på forhånd.

 

Kan dere hjelpe meg?

Det er til hobby cockpit.

Det jeg programmerer sånn for å unngå at software oppdaterer ALLE instrumenter via SPI eller latch med flip flop chip uansett. Altså når en instrument blir ikke oppdatert, så hopper pointer så langt instrumenter i rekke blir ikke oppdatert inntil den neste instrument skal bli oppdatert.

Lenke til kommentar
Videoannonse
Annonse

Kan du fortelle litt mer om hardware setup og hvilke chip du programmerer?
Gjerne ta en gang til hva du prøver å oppnå...?

Typisk med SPI, for mange noder, så bruker du en MUX eller en counter så du gjør CHIP_SELECT på en om gangen.

 

Det er også fint om du i fremtiden viser kode => Skrifttype = Curier New; :) 

Endret av Enthroner
Lenke til kommentar
Gjest medlem-401307

Kan du fortelle litt mer om hardware setup og hvilke chip du programmerer?

Gjerne ta en gang til hva du prøver å oppnå...?

 

Typisk med SPI, for mange noder, så bruker du en MUX eller en counter så du gjør CHIP_SELECT på en om gangen.

 

Det er også fint om du i fremtiden viser kode => Skrifttype = Curier New;  :)

Jeg bruker en vanlig PC til å programmere en Arduino MEGA2560 men jeg har også Arduino DUE med 84 MHz CPU og 512kB RAM. Jeg prøver å unngå at alle bits i alle LED dioder og servomotorer, og knapper og brytere som skal ikke være aktivert i spesifikke situasjoner som trenger ikke å være aktivert, å unngå å bli kontinuerlig oppdatert når det er ikke nødvendig.

 

F.eks når MEGA2560 leser en fart fra flight simulator og farten er det samme som sist, da blir hastigheten i servomotorer ikke forandret, da trenger ikke MEGA2560 skrive samme tallverdi igjen og igjen i hvert eneste minneadresse. Altså forandre kun hvis det er forskjellig variabel, dvs hvis farten er 850 km/h og arduino leser inn samme hastighet, da trenger ikke software skrive om gjenta farten til en float adresse i RAM. Altså, kun elementer som trenger å bli forandret, f.eks  2 av 100 LED dioder, 3 av 100 servomotorer som skal bli oppdatert, så skal peker peke kun til 2 LED dioder og 3 servo motorer for å forandre variabel så nullstiller pekere til opprinnelig tallverdi. 2 LED dioder kan være i samme 8-bits adresse og 3 servo motor kan være i 2 bytes hver, 6 bytes, til sammen blir 7 bytes som må bli oppdatert i stedenfor 213 bytes som blir oppdatert kontinuerlig.

Endret av medlem-401307
Lenke til kommentar

Skjønner, kan jeg spørre det om hardware setup utover Arduinoen? Jeg er med i core teamet til Wiring (det er vi som har skrevet koden for digitalWrite og SPI.tranfer) og Arduino.org så jeg føler kanskje jeg kan hjelpe deg få til det du vil.

 

Forklar setup så kan jeg gjerne komme med noen forslag til hvordan du kan få til det du vil :) Høres fett ut!

Jeg tror ikke jumps goto eller pointere er løsningen. 

 

EDIT: Før jeg glemmer det, så er SPI over lange avstander typisk ikke så lett å få stabilt. Igjen er jeg tilbake på å måtte vite mer om hardware setup. Mye power i arduinoen du har valgt så det skal ikke stå på det :)

Endret av Enthroner
Lenke til kommentar
Gjest medlem-401307

Skjønner, kan jeg spørre det om hardware setup utover Arduinoen? Jeg er med i core teamet til Wiring (det er vi som har skrevet koden for digitalWrite og SPI.transfer) og Arduino.org så jeg føler kanskje jeg kan hjelpe deg få til det du vil.

 

Forklar setup så kan jeg gjerne komme med noen forslag til hvordan du kan få til det du vil :) Høres fett ut!

Jeg tror ikke jumps goto eller pointere er løsningen. 

 

EDIT: Før jeg glemmer det, så er SPI over lange avstander typisk ikke så lett å få stabilt. Igjen er jeg tilbake på å måtte vite mer om hardware setup. Mye power i arduinoen du har valgt så det skal ikke stå på det :)

Jeg tenkte å bruke 2 stk av HEF4067BP,652 og ubestemt tall av TC74HC374APF, de finner du i www.digikey.com.

Eller kun HEF4067BP med SPI.

Du sier at goto eller pointere er ikke løsningen? Så hvordan da ?

eller jeg kan programmere sånn at:

 

array[] = { start, stopp, start, stopp };

Hvert start og stopp er det antall bytes som blir oppdatert rett etter den forrige, hvis den neste byte er lenger enn den siste stopp, da skal det putte tall høyere i neste start enn sist stopp, sånn at for loop ser hvilken byte som skal oppdateres til siste stopp så returner til neste start for å gå til neste byte for å forandre til PORT.

Lenke til kommentar

Ok, la oss se.

 

NOEN RASKE TANKER:

 

Jeg vet fortsatt ikke helt hvor mange ting du vil ha kontroll over, men la meg ta noen antakelser:

 

  • X antall digitale inputs (for brytere)
  • X antall digital outputs (for LEDs og... flere LEDs?)
  • X antall analoge inputs (for potmetere og fadere) [her ville jeg nok brukt 'rotary-encoders' om mulig]
  • X antall PWM/analoge outputs (fade LEDs, DC motor (med diode og power transistor, etc)
  • X antall SPI devicer som LCD skjermer, smarte servomotorer med mer...

Først, så burde du skille på input til systemet (inputs + SPI + data fra flight sim) og output til systemet (outputs og SPI).

 

For å få til det du tenker på, å være smart med å bestemme hva som skal oppdateres trenger du:

  • liste med alle tilstander du bryr deg om som går inn i systemet (physicalInputs, simInputs)
  • liste med alle tilstander du bryr deg om som går ut av systemet (physicalOutputs)
  • en buffer liste så du kan sjekke hva som har endret seg siden sist (physicalOutputsBuffer)

 

Kort fortalt må koden gjøre:

  1. sjekk input til systemet (sim og dine fysiske inputs)
  2. sjekk om input er endret siden forrige sjekk
  3. oppdater output til alle endrede system-inputs

CASE STUDY AND SAMPLE PSEUDO CODE:

 

Videre så kan vi se på et raskt eksempel. 
La oss si vi får moh, fart og alarm fra sim. På kontrollflaten har du et potmeter (throttle) for fart, end LED for å vise alarmer, et LCD display for fart, et LCD for moh og en knapp for å slå av alarm.

Se om denne pseudokoden er logisk:

//La oss si vi får MASL, fart og alarm fra sim. På kontrollflaten har du et potmeter (throttle) for fart, end LED for å vise alarmer, et LCD display for fart, et LCD for MASL og en knapp for å slå av alarm.
//Se om denne pseudokoden er logisk:
 
enum {
    ALARM_BUTTON,
    THROTTLE_LEVER,
    PHYSICAL_INPUTS_LEN
} PHYSICAL_INPUTS;
 
enum {
    MASL,
    SPEED,
    ALARM,
    SIM_INPUTS_LEN
} SIM_INPUTS;
 
enum {
    ALARM_LED,
    SPEED_LCD,
    MASL_LCD,
    PHYSICAL_OUTPUTS_LEN
} PHYSICAL_OUTPUTS;
 
// I chose floats here because they can be used for most things
// if you need to handle only bools or ints, please change data
float physicalInputs[PHYSICAL_INPUTS_LEN] = { 0 } //holds the actual input values
float physicalInputsBuffer[PHYSICAL_INPUTS_LEN] = { 0 } //holds the actual input values
float simInputs[SIM_INPUTS_LEN] = { 0 }; // holds actual sim values
float physicalOutputs[PHYSICAL_OUTPUTS] = { 0 }; // holds wanted output states
float physicalOutputsBuffer[PHYSICAL_OUTPUTS] = { 0 }; //just a buffer to hold copy of physicalOutputs state
 
/// DEMO CODE CONFIG
const int LED_PIN = 13;
const int ALARM_BUTTON_PIN = 12;
const int THROTTLE_PIN = 1;
 
void doOuput(PHYSICAL_OUTPUTS output, float value) {
    switch(output) {
        case ALARM_LED:
            digitalWrite(LED_PIN, value>0);
        break;
        case SPEED_LCD:
            //handle updating speed with value
            SPI.transfer(0xbadfood);
            SPI.transfer(value);
        break;
        case MASL_LCD:
            //handle updating MASL with value
            SPI.transfer(0xbadfood);
            SPI.transfer(value);
        break;
    }
}
 
void configurePhysicalIO() {
    SPI.begin();
    pinMode(ALARM_BUTTON_PIN, INPUT);
    pinMode(LED_PIN, OUTPUT);
}
 
void readSimInputs() {
    // not sure what you would do here, maybe check Serial.available() and do some parsing?
    // for now I will assume 
    simInputs[MASL] = random(100, 1500);
    simInputs[SPEED] = random(400, 600);
    if (random(0, 100) > 80) {
        simInputs[ALARM] = simInputs[ALARM] > 0 ? 0 : 1; //toggle ALARM if we strike 80% chance of doing so
    }
}
 
 
void readPhysicalInputs() {
    for (int i=0; i<PHYSICAL_OUTPUTS_LEN; i++) {
        switch(i) {
            case ALARM_BUTTON:
            physicalInputs[ALARM_BUTTON] = digitalRead(ALARM_BUTTON_PIN);
            break;
            case THROTTLE_LEVER:
            physicalInputs[THROTTLE_LEVER] = analogRead(THROTTLE_PIN);
            break;
            /* //Here's a SPI sample, could also be some MUX or shift reg
            case SOME_SPI_THINGY:
            SPI.transfer(0x0cafebabe);
            physicalInputs[SOME_SPI_THINGY] = SPI.transfer(0x10);
            break;*/
        }
    }
}
 
void setInterfaceStatusIfChanged() {
    for (int i=0; i<PHYSICAL_OUTPUTS_LEN; i++) {
        //let's check if the state has changed (if changed we need to update it)
        if (physicalOutputs[i] != physicalOutputsBuffer[i]) {
            doOuput(i, physicalOutputs[i]); //actually do update the user interface
        }
        //buffer so we detect changes next iteration
        physicalOutputsBuffer[i] = physicalOutputs[i]; 
    }
}

void setSimStatusIfChanged() {
    for (int i=0; i<PHYSICAL_INPUTS_LEN; i++) {
                //let's check if the state has changed (if changed we need to update it)
                if (physicalInputs[i] != physicalInputsBuffer[i]) {
                        // change to switch probably
                        if (i == ALARM_BUTTON && physicalInputs[ALARM_BUTTON] && simInputs[ALARM]) {
                                simInputs[ALARM] = 0; // toggle state so it updates next check
                                sendSim("ALARM=0"); // I don't know... tell SIM about changes
                        }
                }
                physicalInputsBuffer[i] = physicalInputs[i];
        }
}

void sendSim(char *msg) { Serial.print(msg); }

void setup() { configurePhysicalIO(); }
 
void loop() {
        readSimInputs();
        readPhysicalInputs();
        setInterfaceStatusIfChanged();
        handleStateChanges();
        setSimStatusIfChanged();
}

Endret av Enthroner
Lenke til kommentar

Forøvrig anbefaler jeg https://octopart.com/ for å sjekke chiper og findchips.com når du nermer deg sourcing for å finne billige kilder (særlig for litt større opplag,) for ditt prosjekt regner jeg med opplag er lavt, og vil da anbefale tme.eu/en/ og mouser.com  :)

 

Hvis du skal designe eget kretskort anbefaler jeg http://upverter.com/ for enkle design og KiCAD for mer kompliserte prosjekter. 

 

EDIT: den nekter å rendre linker rett så jeg gidder ikke bruke mer tid på det. Copy + paste. #2016

 

EDIT2: det er viktig at du ikke bruker delay()

Endret av Enthroner
Lenke til kommentar
Gjest medlem-401307

Jeg tenkte sånn:

flip_flop[a] inneholder nummer instrument som skal bli forandret og

output_de....[a] inneholder ny variabel. Det vil si hver flip_flop[a] skal inneholde hvilken logikk flip flop som skal bli endret.

 

F.eks Jeg trykker en toggle switch, hvis den er aktivert så lese en annen flip flop på grunn av denne toggle switch; hvis den toggle switch er ikke tilkoblet, så blir denne flip flop IKKE lest inntil den toggle switch er aktivert igjen.

flip_flip[a] = { instrument #255 i #flip flop #255, #254 osv, #100, #90, #89, #3, #2, #1 };

 

for ( byte a = 255; a > 0 a-- )

{

 PORTA = flip_flop[a];

 PORTB = output_de_som_skal_endres[a];

}

 

Ser dette bra ut?

Endret av medlem-401307
Fjernet megalangt sitat
Lenke til kommentar
Gjest medlem-401307

byte update_instruments[70];

        byte update_port[255];

        byte bb;

        byte ba;

        for ( ba = 255; ba > 0; ba-- )

        {

          PORTA = update_port[ba];

          if ( ba == 0 )

          {

            goto skip;

          }

          for ( bb = 70; bb > 0; bb-- )

          {

            PORTB = update_instruments[bb];

          }

        }

        skip: ;

 

Når nye oppdatering, så blir den  neste array automatisk null verdi, sånn at den neste oppdatering detekterer hvis den er null så blir den oppdatert og neste puttet null.

Endret av medlem-401307
Lenke til kommentar

Har du mulighet til å tegne en schematic av hardware setup, eller har du ikke bestemt det ennå?

Du burde absolutt kjøre en 
 

input
process
output

loop. Typisk det som brukes i realtime kernels i spill og slikt.
Forløkken din ser riktigere ut den, bortsett fra at den oppdaterer alt og ikke bare det som er endret (og går ut i fra at alle instrumenter har 8 bit state såvidt jeg forstår)?.

Jeg har laget et dashboard for FlightGear for en tid tilbake. Den baserte seg på ganske lik kode som det jeg postet. 
Alt handler om å gjøre ting i en fast rekkefølge. Den rekkefølgen er det samme i spill og andre ting som processerer data i sanntid og er gitt ovenfor.

 

En annen tanke er å kun sette status når du får noe fra SIM. Og kun sette verdier i sim når noe endres. :)

Lenke til kommentar
Gjest medlem-401307

Har du mulighet til å tegne en schematic av hardware setup, eller har du ikke bestemt det ennå?

 

Du burde absolutt kjøre en 

 

input
process
output

loop. Typisk det som brukes i realtime kernels i spill og slikt.

Forløkken din ser riktigere ut den, bortsett fra at den oppdaterer alt og ikke bare det som er endret (og går ut i fra at alle instrumenter har 8 bit state såvidt jeg forstår)?.

 

Jeg har laget et dashboard for FlightGear for en tid tilbake. Den baserte seg på ganske lik kode som det jeg postet. 

Alt handler om å gjøre ting i en fast rekkefølge. Den rekkefølgen er det samme i spill og andre ting som processerer data i sanntid og er gitt ovenfor.

 

En annen tanke er å kun sette status når du får noe fra SIM. Og kun sette verdier i sim når noe endres. :)

Bruk av demultiplexer latch 4 til 16.

 

Ja, jeg kjører først inngang så process så utgang.

 

Jeg ser at din kode ser bra ut.

Vil den slags kode gå raskere enn hvis jeg oppdaterer alle uansett om det er unødvendig?

Lenke til kommentar
Gjest medlem-401307

Hva mener du med:

//holds the actual input values

?

 

Er din kode mer effektiv enn min forslag om start stopp start stopp i array der mellom stopp og start inneholder ingen variabler som trenger å bli oppdatert?

 

Siden Arduino MEGA2560 har 54 pins så jeg tenkte å ha 32 pinner der 8 pinner for latch demultiplexer og 24 pins for tre stk flip flop hver. Det gjør mindre oppdatering for demultiplexer.

Hvis jeg trenger  f.eks 200 flip flop, så delt på 6 da blir det 34, så med resten 6 pin med 4:16 og 2:4 koblet i matrise, så er det bra. Eller bare 5 stk PORT og dermed mer plass til demultiplexer.

Schematic klarer du kanskje å forestille? Det er en enkel tankekart å se for. Resten er å lage instrumenter som har Digital to Analog med kontinuerlig servomotor med mekanisk binær teller i varierende oppløsning etter hvilken instrument det er. F.eks distanseteller i mekanisk turteller så må den ha høy oppløsning i binærteller men i instrumenter som f.eks fart som beveger seg under 360 grader så er det nok med kun 8-bit. Som sagt, varierende grad.

 

Med litt fysikkkalkulator i software eller hardware i hvert eneste servomotorer, servomotor som skal stoppe servo etter en angitt tid og tid til å skru ned PWM verdi gradvis etter hvor fort den har gått sånn at nålen stopper opp mykt. Kanskje med SPI utgang som får servomotor til å sende ut signal hvor fort PWM strøm er og hvor lenge den har gått og når den skal stoppe, tre informasjonskilder.

Høres det bra ut?

Lenke til kommentar

Jeg innså plutsleig... Du sa "Hobby cockpit". Cockpit for hva? Jeg antok at det var for dashboard for et spill, men jeg tok kanskje feil?

 

Hvis du vil tenke slik du gjør tror jeg kanskje jeg ville sjekket ut å bruke en FPGA. Virker som du har kontroll på lavnivå logikk og elektronikk?

 

Veien jeg skisserte er mye mer typisk for Arduino, og vil ikke være like effektivt mtp klokkesykluser. Men mer enn nok for å få til det du vil.

Lenke til kommentar
Gjest medlem-401307

Ja, hobby cockpit flight simulator.

Skal sjekke ut hvordan FPGA er.

Jeg kan svært lite om elektronikk men bittelitt om lavnivå logikk.

Kan du omformulere "vil ikke være like effektivt mtp klokkesykluser? Er det ment for å oppdatere instrumenter når det er nødvendig eller å detektere når det er nødvendig å oppdatere ikke effektivt?

 

Edit: tenkt mer.

Jeg tror ikke at FPGA er nødvendig og det medfører mye mer arbeid med FPGA. Det jeg har lyst, er å få til hobby cockpit flight simulator.

Det er mye som X-Plane plugin må få inn og ut.

Det går ikke at FPGA prosesserer fysikk som er essensen i instrumenter fordi X-Plane 10 flight simulator har rådata som ingen har tilgang, bortsett Software Development Kit (SDK) men den inneholder ikke HVORDAN sånn at jeg kan få tak i rådata sånn at jeg kan programmere i FPGA; så, jeg bruker Arduino til å prosessere enkelte data som f.eks navigasjon som ikke fins i X-Plane, og noen få andre ting. Men X-Plane 10 må ha tilgang til inngang fra motor, lysene, flybensin, strøm, temperatur, etc. Arduino kan ha dataregning som står spesifisert i 1500 sider fly håndbok i nøyaktig denne flytype, Ilyushin Il-62. Jeg har vært i Berlin og dratt 2 timer utenfor for besøkt denne Interflug Il-62 og tatt bilder av instrumenter og målt størrelse og med PT Il-62M addon som du finner i www.protu-154.org og www.avsim.su, så klarer jeg nok å få til. Men ingen får vite 100% hvordan system virker. Denne 1500 sider håndbok inneholder flyets aerodynamikk og system og blant annet navigasjon, hvordan autopilot er koblet sammen, osv.

Endret av medlem-401307
Lenke til kommentar

Jeg skjønner. Arduino er bedre enn FPGA med mindre du tenkte å bruke ekstremt mye logikkretser uansett... Man kan alltid få til alt med en FPGA men hopp over den til en annen gang :)

 

Har du sett dette prosjektet: http://svglobe.com/arduino

 

Start enkelt og få til kun en peripheral.

 

Jeg tror ikke du trenger å tenke på hvor effektivt koden er i første omgang. Gjør det lett for deg selv å lese og følge med på hva som skjer. Det er det viktigste.

 

 

Har du noen sensorer eller aktuatorer/skjermer/leds du vil prøve å få satt opp?

Lenke til kommentar
Gjest medlem-401307

Jeg skjønner. Arduino er bedre enn FPGA med mindre du tenkte å bruke ekstremt mye logikkretser uansett... Man kan alltid få til alt med en FPGA men hopp over den til en annen gang :)

 

Har du sett dette prosjektet: http://svglobe.com/arduino

 

Start enkelt og få til kun en peripheral.

 

Jeg tror ikke du trenger å tenke på hvor effektivt koden er i første omgang. Gjør det lett for deg selv å lese og følge med på hva som skjer. Det er det viktigste.

 

 

Har du noen sensorer eller aktuatorer/skjermer/leds du vil prøve å få satt opp?

Foretrekker å programmere selv.

Ja, tenkte på fuel tank panel, den inneholder kun 4 målere med tre valg "nøkkel"

Jeg fant noen kontinuerlig servomotor som har 6-bits oppløsning encoder på per revolusjon. Det vil si f.eks høyde, så kan den gå 64 fot per revolusjon. Så jeg må programmere sånn at hvis den går fort så blir den oppdatert hyppigere, men jeg foretrekker MYE høyere oppløsning, f.eks 4096 steg. Men sånne servomotorer er svindyre. Men 64 steg i encoder er egentlig tilstrekkelig. Det er dessuten mye mindre hyppig i input fra mekanisk binær teller og hurtigere input enn encoder i servomotor som trenger å bli oppdatert innen en tidsfrist.

 

Jeg har funnet ut hvordan å lese input når det er nødvendig med if setninger. Altså når en 8-bit inngang der hver brytere betyr en panel, en del, eller en instrument er aktivert så enda flere inputs blir lest hvis panel blir aktivert.

Lenke til kommentar
Gjest medlem-401307

 

Jeg skjønner. Arduino er bedre enn FPGA med mindre du tenkte å bruke ekstremt mye logikkretser uansett... Man kan alltid få til alt med en FPGA men hopp over den til en annen gang :)

 

Har du sett dette prosjektet: http://svglobe.com/arduino

 

Start enkelt og få til kun en peripheral.

 

Jeg tror ikke du trenger å tenke på hvor effektivt koden er i første omgang. Gjør det lett for deg selv å lese og følge med på hva som skjer. Det er det viktigste.

 

 

Har du noen sensorer eller aktuatorer/skjermer/leds du vil prøve å få satt opp?

Foretrekker å programmere selv.

Ja, tenkte på fuel tank panel, den inneholder kun 4 målere med tre valg "nøkkel"

Jeg fant noen kontinuerlig servomotor som har 6-bits oppløsning encoder på per revolusjon. Det vil si f.eks høyde, så kan den gå 64 fot per revolusjon. Så jeg må programmere sånn at hvis den går fort så blir den oppdatert hyppigere, men jeg foretrekker MYE høyere oppløsning, f.eks 4096 steg. Men sånne servomotorer er svindyre. Men 64 steg i encoder er egentlig tilstrekkelig. Det er dessuten mye mindre hyppig i input fra mekanisk binær teller og hurtigere input enn encoder i servomotor som trenger å bli oppdatert innen en tidsfrist.

 

Jeg har funnet ut hvordan å lese input når det er nødvendig med if setninger. Altså når en 8-bit inngang der hver brytere betyr en panel, en del, eller en instrument er aktivert så enda flere inputs blir lest hvis panel blir aktivert.

 

Foreløpig er min programstørrelse nøyaktig 12322 bytes i flash og 239 bytes i SRAM når den skal bli lastet til MEGA2560.

Jeg trenger noen funksjoner, blant annet sinus. I steden for å regne ut sinus hver gang, kan funksjon ta increment hver 0.000185 som er 0.01 grad i tallverdi opptil 359,59 i sirkel i heading.

En annen eksempel, fart meter per minutt (fpm) stigning kan bruke samme lede logikk som høyde stigning. Altså når høyde stigning leser inndata fra fpm så stiger høydemåler raskere eller tregere; det er for å spare datakraft i MEGA2560.

Endret av medlem-401307
Lenke til kommentar
Gjest medlem-401307

 

 

Jeg skjønner. Arduino er bedre enn FPGA med mindre du tenkte å bruke ekstremt mye logikkretser uansett... Man kan alltid få til alt med en FPGA men hopp over den til en annen gang :)

 

Har du sett dette prosjektet: http://svglobe.com/arduino

 

Start enkelt og få til kun en peripheral.

 

Jeg tror ikke du trenger å tenke på hvor effektivt koden er i første omgang. Gjør det lett for deg selv å lese og følge med på hva som skjer. Det er det viktigste.

 

 

Har du noen sensorer eller aktuatorer/skjermer/leds du vil prøve å få satt opp?

Foretrekker å programmere selv.

Ja, tenkte på fuel tank panel, den inneholder kun 4 målere med tre valg "nøkkel"

Jeg fant noen kontinuerlig servomotor som har 6-bits oppløsning encoder på per revolusjon. Det vil si f.eks høyde, så kan den gå 64 fot per revolusjon. Så jeg må programmere sånn at hvis den går fort så blir den oppdatert hyppigere, men jeg foretrekker MYE høyere oppløsning, f.eks 4096 steg. Men sånne servomotorer er svindyre. Men 64 steg i encoder er egentlig tilstrekkelig. Det er dessuten mye mindre hyppig i input fra mekanisk binær teller og hurtigere input enn encoder i servomotor som trenger å bli oppdatert innen en tidsfrist.

 

Jeg har funnet ut hvordan å lese input når det er nødvendig med if setninger. Altså når en 8-bit inngang der hver brytere betyr en panel, en del, eller en instrument er aktivert så enda flere inputs blir lest hvis panel blir aktivert.

 

Foreløpig er min programstørrelse nøyaktig 12322 bytes i flash og 239 bytes i SRAM når den skal bli lastet til MEGA2560.

Jeg trenger noen funksjoner, blant annet sinus. I steden for å regne ut sinus hver gang, kan funksjon ta increment hver 0.000185 som er 0.01 grad i tallverdi opptil 359,59 i sirkel i heading.

En annen eksempel, fart meter per minutt (fpm) stigning kan bruke samme lede logikk som høyde stigning. Altså når høyde stigning leser inndata fra fpm så stiger høydemåler raskere eller tregere; det er for å spare datakraft i MEGA2560.

 

Ingen kommentar og ytterligere diskusjoner?

Lenke til kommentar

Jeg er litt usikker på om jeg forstår helt hva du vil?

Du skal bare lage et interface til simulasjonen ikkesant? Noe ala dette:

FHVDIQ7HR0ATIHU.MEDIUM.jpg

 

Hvis ikke vil jeg gjerne at du forklarer en gang til hva du vil. For meg høres det nesten ut som du vil simulere at ting skjer?

Hva mener du her f.eks: "Det vil si f.eks høyde, så kan den gå 64 fot per revolusjon. Så jeg må programmere sånn at hvis den går fort så blir den oppdatert hyppigere,[...]"?

 

Mitt tips blir det samme. Prøv å få en ting til å fungere først. F.eks printe farten til en LCD eller noe i den gata.
Ta gjerne bilde hvis du allere har laget noe! 

Lenke til kommentar
Gjest medlem-401307

Jeg er litt usikker på om jeg forstår helt hva du vil?

 

Du skal bare lage et interface til simulasjonen ikkesant? Noe ala dette:

FHVDIQ7HR0ATIHU.MEDIUM.jpg

 

Hvis ikke vil jeg gjerne at du forklarer en gang til hva du vil. For meg høres det nesten ut som du vil simulere at ting skjer?

Hva mener du her f.eks: "Det vil si f.eks høyde, så kan den gå 64 fot per revolusjon. Så jeg må programmere sånn at hvis den går fort så blir den oppdatert hyppigere,[...]"?

 

Mitt tips blir det samme. Prøv å få en ting til å fungere først. F.eks printe farten til en LCD eller noe i den gata.

Ta gjerne bilde hvis du allere har laget noe! 

Klarte å laste opp bildet.

Disse to treplater er noen av mange jeg har laget. Som du ser, jeg har skjært huller med CNC maskin.

De skal bli festet med skall, som en prototype. Ferdigversjon skal ha aluminiumsplater når alle instrumenter, LEDs, knapper, etc er ferdig.

Jeg ønsker at mikrokontroller skal ha minst mulig regnekraft hvis mulig. Så jeg tenkte f.eks

altitude skal være avhengig av fot per minutt instrument. Altså når denne indikator fot per minutt er høyere, da går altitude raskere men konstant inntil denne indikatoren fot per minutt blir forandret til høyere eller lavere til negativ, forstår du det?

 

Kan være en logikk krets som avlaster mikrokontroller. En annen eksempel, når jeg velger tank ved toggle switch, så blir fuel indikator stoppet hvis den er ikke aktivert.

 

Alt dette ønsker jeg å avlaste mikrokontrolleren hvis mulig sånn at mikrokontrolleren har mer regnekraft til andre ting, f.eks terminal med 20 linjer og 32 bokstaver med sånne monochrome bokstaver.

F.eks dette: http://no.rs-online.com/web/p/led-displays/8635115/

 

Disse instrumenter skal simulere med X-Plane 10 som rendrer 3D-grafikk og fysikkmotoren. Så jeg vil at enkelte instrumenter kan avlaste mikrokontroller og X-Plane 10 hvis mulig fordi I/O foregår kun 14.4 kB/s så del det med f.eks 6 p.g.a bokstaver sånn at mikrokontroller kan detektere hvilken verdi skal til instrument, f.eks 'h''d''g''300.45' så blir det 7 bytes, da blir det ca 1kB til rådighet for inngang og 1kB for utgang. Hvilket er veldig lite! Så jeg må være lur med så lite.

post-401307-0-19152300-1456176037_thumb.jpg

Endret av medlem-401307
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...