Sida 2 av 3

Re: 100% studsfri ?

Postat: 24 juli 2010, 19:01:26
av choppertony
Första bilden visar hur det såg ut i EFA3 boken. Jag la till motståndet med 10kohm som på bild nr 2 för att inte det skulle vara en öppen ingång innan jag testade. innan knappen så är det 5volt.

om man gör en flip-flop av 2 nandgrindar så måste man ha 2 knappar för att få "ett eller noll". Tanken var att ha en knapp som blir varrannan gång ett o varannan gång noll. Får jag bara knappen studsfri så bör det gå att lösa med en D-vippa med invert-Q till Dataingången. Men utan Studsfri knapp så e de inte spännande.

Re: 100% studsfri ?

Postat: 24 juli 2010, 19:04:44
av grym
icecap har rätt, fort men fel :oops:

men brukar liksom inte göra sådant utan man väljer rätt krets från början

Re: 100% studsfri ?

Postat: 24 juli 2010, 20:56:34
av prototypen
<<om man gör en flip-flop av 2 nandgrindar så måste man ha växlande knapp för att få tydliga ett och noll utan studs. Tanken var att koppla flip-flop till en D-vippa med invert-Q till Dataingången. Med Studsfri knapp som blir varannan gång ett o varannan gång noll.

Re: 100% studsfri ?

Postat: 24 juli 2010, 21:54:48
av choppertony
Nä,,, jag skulle inte göra en flip-flop.... Jag skulle göra en studsfri knapp.. Men inte med en flipfloppare.

Re: 100% studsfri ?

Postat: 24 juli 2010, 23:03:11
av Swech
Om man expanderar frågan....
Vad skall de 16 knapparna göra då? Var skall du koppla dem?
Är det en processor inblandad så kanske de inte behöver vara studsfria utan att man löser detta
i mjukvaran

Swech

Re: 100% studsfri ?

Postat: 24 juli 2010, 23:15:19
av Icecap
Faktisk är flip-flop-idéen inte dum alls men den kräver en växlande brytare, den ger å andra sidan 100% debounce utan tjafs.
Man kopplar COM till VDD (eller GND, beror på flip-flop-typ) och har pull-down (eller -up) på NO och NC.

Sedan kopplar man NC till RESET på flip-flop'en och NO till SET.

På detta vis får man en klockren stutsfri brytare som kan jobba snabbt, kruxet är bara att växlande brytare är stora och kostar en del pengar.

Re: 100% studsfri ?

Postat: 25 juli 2010, 08:35:01
av choppertony
just nu inte 16 knappar. Jag håller bara på att lära mig lite mer om logik-kretsarna. Det är ett bra sätt att få in ett sätt att tänka som kan vara bra framöver i ens små experiment. Men man kommer ofta till att knapparna måste vara studsfria. Även om man skall använda en PIC så är det ju inte fel att göra hårdvaran studsfri i stället för att programmera den. Men samtidigt så vill man att det skall vara en bra billig lösning med så få komponenter och lödningar som möjligt.

Re: 100% studsfri ?

Postat: 25 juli 2010, 09:02:47
av PeterH
Och då är ju just mjukvaru "avstuds" att föredra... (ger minst antal lödningar och är billig) :)

Re: 100% studsfri ?

Postat: 25 juli 2010, 11:17:00
av jojje
Man känner av om knappen är nere och väntar några milisekunder och känner igen.
Sen gämför man om dom är lika, då vet man att den är nertryckt och utan studs.
Billigare kan det inte bli. :D

Jag kan klistra in lite kod om du vill, men det är inte svårt att lista ut själv.
Det är också ett sätt lära sig på, som man sen lägger i bra-att-ha katalogen. :)

Re: 100% studsfri ?

Postat: 25 juli 2010, 11:24:07
av Icecap
Jag brukar koppla avläsningen av knappar till en timer-interrupt på mellan 20Hz och 100Hz.

Sedan avläsas knapp-porten (/portar) EN enda gång per interrupt, detta är just nyckeln till det hela!

Värdet som avlästes sparas sist i rutinen i en "förra avläsning" och varje gång AND'ar jag det nyss avlästa värde med det förra avlästa värde och aktiverade knappar är dom som har varit aktiva båda denna avläsning OCH den förra.

Vad man sedan gör med knapparna beror på vad man behöver.

Re: 100% studsfri ?

Postat: 25 juli 2010, 12:06:40
av prototypen
Och ska man vara säker till 100,5 % så läser man av 3 ggr

Protte

Re: 100% studsfri ?

Postat: 25 juli 2010, 12:38:41
av choppertony
Jojje ! lägg gärna en kod-remsa här så kan jag o andra titta på det när det är dags att skriva kod. Då har vi olika varianter att titta på här i denna tråd. Kanske olika språk oxå ????

Re: 100% studsfri ?

Postat: 25 juli 2010, 14:02:35
av jojje
Det följer med lite extrakod, men du ser nog vad som tillhör vad.
Det är för att ta med alla variabler o.l.
Koden är för Arduino, men kan användas ändå.

Kod: Markera allt

/*
 *  Bike light, revision 3: blinky
 */

int switchPin = 2;              // switch is connected to pin 2
int led1Pin = 12;
int led2Pin = 11;
int led3Pin = 10;
int led4Pin = 9;
int led5Pin = 8;

int val;                        // variable for reading the pin status
int val2;                       // variable for reading the delayed status
int buttonState;                // variable to hold the button state

int lightMode = 0;              // What mode is the light in?

void setup() {
  pinMode(switchPin, INPUT);    // Set the switch pin as input

  pinMode(led1Pin, OUTPUT);
  pinMode(led2Pin, OUTPUT);
  pinMode(led3Pin, OUTPUT);
  pinMode(led4Pin, OUTPUT);
  pinMode(led5Pin, OUTPUT);
  
  Serial.begin(9600);           // Set up serial communication at 9600bps
  buttonState = digitalRead(switchPin);   // read the initial state
}

void loop(){
  val = digitalRead(switchPin);      // read input value and store it in val
  delay(10);                         // 10 milliseconds is a good amount of time
  val2 = digitalRead(switchPin);     // read the input again to check for bounces
  if (val == val2) {                 // make sure we got 2 consistant readings!
    if (val != buttonState) {          // the button state has changed!
      if (val == LOW) {                // check if the button is pressed
        if (lightMode == 0) {          // light is off
          lightMode = 1;               // turn light on!
        } else {
          lightMode = 0;               // turn light off!
        }
      }
    }
    buttonState = val;                 // save the new state in our variable
  }

  // Now do whatever the lightMode indicates
  if (lightMode == 1) {
    digitalWrite(led1Pin, HIGH);
    digitalWrite(led2Pin, HIGH);
    digitalWrite(led3Pin, HIGH);
    digitalWrite(led4Pin, HIGH);
    digitalWrite(led5Pin, HIGH);
    delay(100);
    digitalWrite(led1Pin, LOW);
    digitalWrite(led2Pin, LOW);
    digitalWrite(led3Pin, LOW);
    digitalWrite(led4Pin, LOW);
    digitalWrite(led5Pin, LOW);
    delay(100);
  }
  // If lightmode is 0, we dont have to do anything because the LEDs are already off!
}

Det är det här som du kan detaljstudera. :D

Kod: Markera allt

void loop(){
  val = digitalRead(switchPin);      // read input value and store it in val
  delay(10);                         // 10 milliseconds is a good amount of time
  val2 = digitalRead(switchPin);     // read the input again to check for bounces
  if (val == val2) {                 // make sure we got 2 consistant readings!
    if (val != buttonState) {          // the button state has changed!
      if (val == LOW) {                // check if the button is pressed
        if (lightMode == 0) {          // light is off
          lightMode = 1;               // turn light on!
        } else {
          lightMode = 0;               // turn light off!
        }
      }
    }
    buttonState = val;                 // save the new state in our variable
  }
Hoppas det hjälpe nåt.

Re: 100% studsfri ?

Postat: 25 juli 2010, 16:34:46
av snigelen
Ett exempel för många knappar. För AVR. Avstudsar åtta knappar på PORTA. Fyra likadana avläsningar i rad för att trigga en tillståndsändring. Avstudsrutinerna är av Peter Dannegger (dvs inte mig) och är inte världens mest lättlästa men väldigt effektiva, särskilt för många knappar på samma port.

Kod: Markera allt

#include <avr/io.h>
#include <avr/interrupt.h>

#define BUTTON_PORT     PORTA
#define BUTTON_PIN      PINA

volatile uint8_t key_state;         // debounced and inverted key state:
uint8_t key_press;


// Return non zero if button where key_mask is 1 is pressed
uint8_t get_key_press( uint8_t key_mask )
{
        cli();                                  // read and clear atomic !
        key_mask &= key_press;                        // read key(s)
        key_press ^= key_mask;                        // clear key(s)
        sei();
        return key_mask;
}


int main(void) {
        uint8_t mode = 1, i;

        // Internal pullup on button port
        BUTTON_PORT = 0xFF;

        // Outputs on PORTB
        DDRB  = 0xFF;
        PORTB = 0xFF;

        // Timer0, normal mode, 1:256 presc. -> 122Hz @ 8MHz
        TCCR0B = (1<<CS02);
        // Overflow interrupt
        TIMSK0 = 1<<TOIE0;

        // Enable interrupts
        sei();

        while(1) {
                if (mode)
                        // PORTB is the same as PORTA, but debounced
                        PORTB = ~key_state;
                else
                {
                        // Toggle if button is pressed.
                        for (i = 0; i < 8; i++)
                                if (get_key_press(1<<i))
                                        PORTB ^= (1<<i);
                }
        }
}


// Called about every 8 ms.
ISR(TIMER0_OVF_vect)
{
        static uint8_t ct0, ct1;
        uint8_t i;

        i = key_state ^ ~BUTTON_PIN;    // key changed ?
        ct0 = ~( ct0 & i );             // reset or count ct0
        ct1 = ct0 ^ (ct1 & i);          // reset or count ct1
        i &= ct0 & ct1;                 // count until roll over ?
        key_state ^= i;                 // then toggle debounced state
        key_press |= key_state & i;     // 0->1: key press detect
}

Re: 100% studsfri ?

Postat: 25 juli 2010, 20:41:55
av 4kTRB
Om en räknare triggas som räknar ett antal klockpulser samtidigt som
triggfunktionen blockeras tills räknaren räknat klart. När räknare nått
förinställt värde så skickas infon vidare och triggfunktionen aktiveras på nytt.
Tycker det borde räcka med en sådan krets till många knappar?