Programvelger for valg av underprogram

Jobber fortsatt med mitt hi-speed dråpe-foto prosjekt

Jeg har nå laget flere programmer med forskjellige settinger på delay-parametrene og hvert av disse programmene resulterer i forskjellige type dråpebilder. Disse småprogrammene er egentlig helt like, men det er satt inn forskjellige verdier på delay-parametrene.

Nå tenker jeg å lage et program som inneholder flere (gjerne 12) av mine beste delay-valg og legge disse valgmuligheten tilgjengelig via en programvelger. Tenkte tidligere å benytte en blokk med flere DIP-brytere som programvelger, men finner det nå mer ønskelig å heller bruke en vribryter med 1 inngang og 12 utganger. Dette fordi en vrifryter er enklere å montere inn i et kabinett på en pen måte.

Kan jeg for eksempel lodde på en serie med motstander på vribryteren slik at Arduinoen (via en analog inngang) leser verdiene 1K ohm for programvalg 1, 2K ohm for programvalg 2.......12K ohm for programvalg 12. Og så lime sammen 12 av mine småprogram til ett stort fellesprogram hvor verdien på programvelgeren er den som styrer hvilket underprogram som er aktivt?

Tenker til slutt å flytte hele programmet over på en Atiny85 chip som bare har 5-6 innganger, så derfor må jeg spare på portene. Har allerede brukt 3-4 innganger for kamera, blits og 1-2 magnetventiler (samt muligens et POT-meter).

Ideen med en vrideomskifter kan sagtens bruges, du kan så lægge dine forskellige programversioner i hver sin funktion.
Jeg prøvede lige at teste ideen med et potmeter på A0:

 int val;
  
  void setup() {                
  
    Serial.begin(9600);
  }
  
  void loop() {
    val=analogRead(A0);
    Serial.print("Loop");
    Serial.println(val);
    if(val>100&val<300){
      func1();
    }
  
    if(val>301&val<400){
      func2();
    }
  
    delay(200);
  
    }//Loop
  
  void func1(){
    Serial.println("funk1");
  }
  
  void func2(){
    Serial.println("funk2");
  
  }

Nu er en Atmel chip ikke en Ohm-måler, men spænding, men jeg forstår hvad du mener at gøre :slight_smile: Hvis 12 modstande har 2% nøjagtighed, så kan en worst case være 24% forkert ... ehr... jeg har ikke tænkt det igennem, men det kan du sikkert. Jeg har ikke kigget på Atiny85 spec sheet hvad område/nøjagtighed dens analog indgang er.

Nåh, til programmering som jeg til gengæld ved mere om. 8) Jeg vil nok skrive det som

void loop() {
 val = analogRead(pin) ;
 // delay debug print og andet sjov
 if      ( val <  86 ) func1() ;
 else if ( val < 170 ) func2() ;
 else if ( val < 260 ) func3() ;
  :
 else if ( val < 937 ) func11() ;
 else                  func12() ;
}

Her er man garanteret at en, og kun en, af funktionerne bliver brugt, og man skal kun angive skifteværdierne een (1) gang. Den anden metode kan man nemmere lave et overlap eller have en værdi der ikke matcher nogen if. (Hvad sker ved værdien 300 i det forrige eksempel?)

Og bare for at blære mig :stuck_out_tongue: (undskyld, det er ikke ment sådan ) så er

val>301&val<400

ikke helt rigtigt - det virker men det er ikke det du beder om. Et enkelt "&" er BitWise-AND som virker hvis de to udtryk er logiske. Det vil være mere korrekt at bruge "&&" som er en logisk operation AND. Det gør ingen forskel i dette eksempel, men hvis udtrykket er mere komplekst kan compileren optimere det logiske udtryk, det kan den ikke når der er bit-wise operatører i midten.

Jeg fortrækker at skrive "between" som

301 <= val && val <= 400

jeg synes det ser smukkere ud (smag og behag) og viser mere tydeligt at val ligger "mellem 301 og 400".

val>301&val<400

Ups ja, det var en smutter :blush:, iøvrigt er jeg helt enig i dine betragtninger, jeg kastede det bare hurtigt sammen for at vise at princippet med vrideomskifteren var godt nok.
Jeg havde nu heller ikke tænkt over det med tolerancen på modstandene, men det kan man jo løse ved at justere intervallerne.

En Attiny85 har 10bit opløsning på ADC'en

Supert. Er kjempeimponert over hva disse mikrochipene kan brukes til og hvor dyktige dere er. Jeg har bestilt meg 4 stk. ATtiny85 (og en Arduino Nano), samt noen vri-omkoplere med 12stepp.

Ser imidlertid at ATtiny85 bare støtter disse Arduino komandoene. "If, then" kan derfor ikke brukes. Mulig det betyr at jeg må bruke Arduini Nano alikavel?

•pinMode()
•digitalWrite()
•digitalRead()
•analogRead()
•analogWrite()
•shiftOut()
•pulseIn()
•millis()
•micros()
•delay()
•delayMicroseconds()

http://hlt.media.mit.edu/?p=1229

jo, jo da if..then og alle de andre fungerer skam udmærket på att85, den eneste forskel er at mange af bibliotekerne til arduino ikke kan bruges.

Der er vist almindlig enighed om at denne core er mere stabil end HLT som du linker til

http://code.google.com/p/arduino-tiny/

Den er lavet af Coding Badly her på forum