Flip flop schakeling

Hoi allemaal,
zou iemand mij kunnen helpen met een flip flop quizbox schakeling op maat ?
Het is de bedoeling dat die 2 leds heeft met 2 druk schakelaars.
Dus het moet snel flip floppen (het liefst regelbare snelheid)tussen led a en led b.
Gekoppeld aan de leds zijn de druk knoppen (knop a en b)
(Dus led a gekoppeld aan drukknop a en led b gekoppeld aan drukknop b)
Het begint te flip floppen en wanneer er op a wordt gedrukt moet het op led b stoppen en vice versa.
Tevens moet er ook een drukknop c zijn.
Als die word ingedrukt wordt gehouden tijdens het flip floppenen er wordt dan op drukknop a gedrukt dan moet alleen a gaan branden ... het zelfde bij b.
Tot slot nog een reset knop zodat de schakeling weer begint te flipfloppen.
Hoop dat ik het goed heb uitgelegd.

Simpeler dan dit gaat het niet worden.

Wel nog even een programma´tje schrijven voor de Tiny13.

Oops, Reset vergeten.
Dan wordt het zo:

[Bericht gewijzigd door deKees op vrijdag 10 november 2023 13:10:59 (21%)

Je kan hier vast een schema voor maken wat het met een paar flipflops en een oscillator doet.

minstens 1 flipflop om te onthouden welke knop ingedrukt is geweest en dus in welke toestand te beginnen en welke te eindigen.

En een flipflop die als ie moet flipfloppen het daadwerkelijke flipfloppen doet.

Wat je niet vertelt is wanneer het moet stoppen. Het moet beginnen als je op knop A drukt maar wanneer het stopt zeg je niets over. Dus dat zou nog steeds heel lastig zijn om te maken/ontwerpen.

Maaaaarrrrrrr..... Tegenwoordig kost een microcontroller zo weinig dat je dit alles veel beter in een microcontroller stopt. Bijvoorbeeld een arduino.


loop () 
{
  if (is_pressed (KNOPA) || 
      is_pressed (KNOPB)) {
     if (ispressed (KNOPA)) {led1 = LEDA; led2 = LEDB}
     else                   {led1 = LEDB; led2 = LEDA}
     start = time_millis ();
     // bereken stop. 
     while (time_millis () < stop) {
       LED (led1, ON);
       delay_ms (thedelay);
       LED (led1, OFF);
       LED (led2, ON);
       delay_ms (thedelay);
       LED (led2, OFF);
     } 
  }
}

Hier mist nog een klein beetje ondersteuning. En de andere knoppen. Maar het is een begin.

@dekees
Een kleine microcontroller als de tiny13 is inderdaad ruim voldoende. Ik zou voor zo'n eenmalig project "lomp" doen en een lompe 10x te grote microcontroller en bestaand printje kopen als de arduino nano met ingebouwde programmeer-faciliteiten.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Dank u heel erg voor uw reactie.
Is er geen andere mogelijkheid ?
Ik heb geen apparatuur om de tiny te programmeren.
En zou ook niet weten hoe ik zoeen prigrammatje moet schrijven.
Heb nog nooit met de tiny gewerkt.

Ik wil er wel eentje programmeren en opsturen als je wilt.

Het kan wel met losse logica maar dat wordt al snel een heel circuit.

Even voor de grap, hier is waar GPT mee komt. :)

Geen idee of het werkt, ik heb het niet getest.


const int ledPinA = 2;      // Pin voor LED A
const int ledPinB = 3;      // Pin voor LED B
const int buttonPinA = 4;   // Pin voor drukknop A
const int buttonPinB = 5;   // Pin voor drukknop B
const int buttonReset = 6;  // Pin voor reset drukknop
const int buttonHold = 7;   // Pin voor hold drukknop

enum State {
  STATE_A,
  STATE_B,
  STATE_HOLD,
};

State currentState = STATE_A; // Huidige staat van de flip-flop
int buttonStateA = 0;         // Huidige staat van drukknop A
int buttonStateB = 0;         // Huidige staat van drukknop B
int buttonStateReset = 0;     // Huidige staat van de reset drukknop
int buttonStateHold = 0;      // Huidige staat van de hold drukknop

void setup() {
  pinMode(ledPinA, OUTPUT);
  pinMode(ledPinB, OUTPUT);
  pinMode(buttonPinA, INPUT);
  pinMode(buttonPinB, INPUT);
  pinMode(buttonReset, INPUT);
  pinMode(buttonHold, INPUT);

  initializeFlipFlop();
}

void loop() {
  readButtonStates();

  if (buttonStateReset == HIGH) {
    resetFlipFlop();
  }

  flipFlop();

  // Wacht een korte periode om het flip-floppen regelbaar te maken
  delay(100);
}

void initializeFlipFlop() {
  currentState = STATE_A;
  digitalWrite(ledPinA, HIGH);
  digitalWrite(ledPinB, LOW);
}

void readButtonStates() {
  buttonStateA = digitalRead(buttonPinA);
  buttonStateB = digitalRead(buttonPinB);
  buttonStateReset = digitalRead(buttonReset);
  buttonStateHold = digitalRead(buttonHold);
}

void resetFlipFlop() {
  initializeFlipFlop();
}

void flipFlop() {
  switch (currentState) {
    case STATE_A:
      flipFlopStateA();
      break;

    case STATE_B:
      flipFlopStateB();
      break;

    case STATE_HOLD:
      flipFlopStateHold();
      break;
  }
}

void flipFlopStateA() {
  digitalWrite(ledPinA, HIGH);
  digitalWrite(ledPinB, LOW);

  if (buttonStateA == HIGH) {
    currentState = STATE_B;
  }

  if (buttonStateB == HIGH && buttonStateHold == LOW) {
    currentState = STATE_HOLD;
  }
}

void flipFlopStateB() {
  digitalWrite(ledPinA, LOW);
  digitalWrite(ledPinB, HIGH);

  if (buttonStateB == HIGH) {
    currentState = STATE_A;
  }

  if (buttonStateA == HIGH && buttonStateHold == LOW) {
    currentState = STATE_HOLD;
  }
}

void flipFlopStateHold() {
  if ((buttonStateA == HIGH && buttonStateHold == HIGH) || (buttonStateB == HIGH && buttonStateHold == HIGH)) {
    if (buttonStateA == HIGH) {
      digitalWrite(ledPinA, HIGH);
      digitalWrite(ledPinB, LOW);
    } else if (buttonStateB == HIGH) {
      digitalWrite(ledPinA, LOW);
      digitalWrite(ledPinB, HIGH);
    }
  }
}

PE2BAS

Is er geen andere mogelijkheid ?

Ja die is er.
Met een 74LS74 D-flip flop schakeling.

Daarvoor gebruik je de preset en clear ingangen welke via een pull-up weerstand van 2k2 naar de plus 5V gaan.
Met een moment schakelaar met maak contact verbind je die met de ground.
De clock en data ingangen zijn verbonden met de plus 5V.

Zoals in het schema staat is de pull-up weerstand verbonden met de ground en de moment schakelaar met verbreek contact toegepast.
Dit is dus andersom als wat ik had geschreven, maar dat komt omdat ik geen geschikte moment schakelaars had met maak contact.

Telefunken Sender Systeme Berlin

Wauw bedankt voor jullie reacties.
Mag ik u prive mailen Kees ?

@ HardBass
Geinig, dat komt een eind in de richting. Toch wel opmerkelijk dat die zover komt.

Maar
- Het is arduino code. Dat gaat waarschijnlijk niet passen in een tiny13, maar dat kun je wel oplossen door de library funkties in te vullen

En flipfloppen moet wel snel, maar deze doet > 100kHz :)
Dat lijkt me niet de bedoeling.

#Fossie
Mail is Ok, zie mijn profiel

Is dit toevallig zoeen attiny programmer ?

Op 10 november 2023 13:42:18 schreef fossie:
Is dit toevallig zoeen attiny programmer ?

Nee, dat is meer een break-out bordje. Daar kun je wel een AtTiny13 inprikken en vervolgens programmeren via de 10-pins ISP header. Maar dan moet je nog wel een ISP programmer hebben. Bijv https://nl.aliexpress.com/item/1005006004974100.html

Correctie:
Of nee, toch niet. Geen 10-pins isp header. Dan kun je beter de Tiny13 in een breadboard prikken en dan koppelen met de ISP programmer.

[Bericht gewijzigd door deKees op vrijdag 10 november 2023 20:46:13 (16%)

Koop dan idd zoals eerder hier aangegeven op Ali een arduino nano. Voor weinig geld heb je dan een simpel programmeerbare controller. Programmeren gaat met usb kabeltje.

Volg ons op arcticplus.nl in onze sponsortrip naar de Noordkaap voor KiKa

Ik heb uit een oude rommel doos deze gevonden.
Er zaten ook 2 at85 bij.
Kan ik deze ook gebruiken of moet ik perse de at13 hebben ?

Tiny85 kan ook, al is die veel te groot.

Voor de grap heb ik het in C++ geschreven. Dat gaat nog best goed, ook in zo een klein controllertje als deze Tiny13. Code size 434 bytes totaal.


/*
 * FlipFlopLed.cpp
 *
 * Created  : 2023-11-10
 * Author   : deKees
 * Purpose  : FlipFlopLed
 */

#include <avr/io.h>

// ================================================================================================

const int FlipTime = 20000;

// ================================================================================================

class PinHandler
{
public:
   PinHandler(uint8_t PinNr)
   {  MyPin = (1 << PinNr);
   }

protected:
   uint8_t MyPin;
};

// ================================================================================================

class Led : public PinHandler
{
public:
   Led(uint8_t PinNr) : PinHandler(PinNr)
   {  DDRB  |=  MyPin;   // Output
   }

   void On()
   {  PORTB |=  MyPin;   // High is on
   }

   void Off()
   {  PORTB &= ~MyPin;   // Low is Off
   }
};

// ================================================================================================

class Button : public PinHandler
{
public:
   Button(uint8_t PinNr) : PinHandler(PinNr)
   {  DDRB  &= ~MyPin;  // Input
      PORTB |=  MyPin;  // Pullup aktief
   }

   bool Pressed()
   {  return (PINB & MyPin) == 0 ? true : false;  // Low is On
   }
};

// ================================================================================================

class Timer
{
public:

   Timer()
   {  // Startup delay
      Counter = 100000;
      while(Counter)
      {  Counter -= 1;
      }
   }

   void Tick()
   {  Counter += 1;

      if(Counter >= FlipTime)
      {  Counter  = 0;
         Toggle   = !Toggle;
      }
   }

   bool FlipFlop()
   {  return Toggle;
   }

private:
   uint32_t Counter = 0;
   bool     Toggle  = true;
};

// ================================================================================================

Led     LedA(PB4);
Led     LedB(PB3);

Button  ButtonA(PB2);
Button  ButtonB(PB1);
Button  ButtonC(PB0);

Timer   T1;

int main(void)
{
   uint8_t  State = 1;

   for ( ;; )  //< EndLess loop
   {
      T1.Tick();

      switch(State)
      {
         default:
         case 1:
         {  // - Check Buttons.
            if(ButtonA.Pressed())
            {  State = ButtonC.Pressed() ? 4 : 2;
            }

            if(ButtonB.Pressed())
            {  State = ButtonC.Pressed() ? 5 : 3;
            }

            // - Both leds blinking.
            if(T1.FlipFlop())
            {  LedA.On();
               LedB.Off();
            }
            else
            {  LedA.Off();
               LedB.On();
            }
            break;
         }

         case 2:
         {  // Led A blinking
            if(T1.FlipFlop())
            {  LedA.On();
               LedB.Off();
            }
            else
            {  LedA.Off();
               LedB.Off();
            }
            break;
         }

         case 3:
         {  // Led B blinking
            if(T1.FlipFlop())
            {  LedA.Off();
               LedB.On();
            }
            else
            {  LedA.Off();
               LedB.Off();
            }
            break;
         }

         case 4:
         {  // Led A steady
            LedA.On();
            LedB.Off();
            break;
         }

         case 5:
         {  // Led B steady
            LedA.Off();
            LedB.On();
            break;
         }
      }
   }
}

Dank u wel voor uw moeite.
Heb gisteren wat spullen geleend van een medestudent.
Heb uw file geupload op een tiny85.
Heb uw schema goed gebouwd en gedubbel checked.
Spanning aangesloten en hij begon te flip floppen.
Als ik op pb a drukt gebeurd er niets.
Als ik op pb b drukt gaat led b knipperend branden.
Als ik op pb c drukt gebeurd er niets.
Als ik op reset drukt dan reset hij en begint opnieuw te flip floppen.

Het klopt dat C niks doet. Die heeft alleen effect als je tegelijkertijd ook A of B indrukt. Maar dat was blijkbaar niet de bedoeling?

A doet het bij mij wel, bij jou dus niet. Zoek de verschillen..

Kun je eens meten of Pin 7 wel hoog is en laag wordt zodra je A indrukt?

Goedemorgen Kees,
mijn excusses had de verbinding van a niet goed doorgesoldeerd.
Het is idd de bedoeling dat wanneer c tegelijketijd ingedrukt word met a of b dat hij dan naar die springt wat hij nu doet.
Alleen als er nu alleen op a wordt gedrukt gaat a knipperen ipv naar b te springen ... en als er alleen op b wordt gedrukt gaat b knipperen ipv naar a te springen.
Ben helemaal hyper dat hij bijna werkt !!!!

Klopt, als je op A drukt dan gaat Led A knipperen en Led B gaat uit. Dat was toch de bedoeling? Dus ik snap niet goed wat je bedoelt met "naar B springen".

Maar als je het gedrag wilt veranderen dan kun je de code aanpassen toch?

Sorry voor mijn verkeerde uitleg.
Het was de bedoeling dat wanneer ik zonder de c op bv a drukt b gaat branden en wanneer ik zonder de c op b drukt a gaat branden.
Mijn excusses hiervoor.
Ik xou het graag willen veranderen maar het totaal geen verstand van de code.
Nogmaals mijn excusses.

Het gedrag wordt vooral bepaald door de switch statement in de main() functie achteraan in de code.

Dat wordt dan iets als deze:


/*
 * FlipFlopLed.cpp
 *
 * Created  : 2023-11-11
 * Author   : deKees
 * Purpose  : FlipFlopLed
 */

#include <avr/io.h>

// ================================================================================================

const int FlipTime = 20000;

// ================================================================================================

class PinHandler
{
public:
   PinHandler(uint8_t PinNr)
   {  MyPin = (1 << PinNr);
   }

protected:
   uint8_t MyPin;
};

// ================================================================================================

class Led : public PinHandler
{
public:
   Led(uint8_t PinNr) : PinHandler(PinNr)
   {  DDRB  |=  MyPin;   // Output
   }

   void On()
   {  PORTB |=  MyPin;   // High is on
   }

   void Off()
   {  PORTB &= ~MyPin;   // Low is Off
   }
};

// ================================================================================================

class Button : public PinHandler
{
public:
   Button(uint8_t PinNr) : PinHandler(PinNr)
   {  DDRB  &= ~MyPin;  // Input
      PORTB |=  MyPin;  // Pullup aktief
   }

   bool Pressed()
   {  return (PINB & MyPin) == 0 ? true : false;  // Low is On
   }
};

// ================================================================================================

class Timer
{
public:

   Timer()
   {  // Startup delay
      Counter = 100000;
      while(Counter)
      {  Counter -= 1;
      }
   }

   void Tick()
   {  Counter += 1;

      if(Counter >= FlipTime)
      {  Counter  = 0;
         Toggle   = !Toggle;
      }
   }

   bool FlipFlop()
   {  return Toggle;
   }

private:
   uint32_t Counter = 0;
   bool     Toggle  = true;
};

// ================================================================================================

Led     LedA(PB4);
Led     LedB(PB3);

Button  ButtonA(PB2);
Button  ButtonB(PB1);
Button  ButtonC(PB0);

Timer   T1;

int main(void)
{
   uint8_t  State = 1;

   for ( ;; )  //< EndLess loop
   {
      T1.Tick();

      switch(State)
      {
         default:
         case 1:
         {  // - Check Buttons.
            if(ButtonA.Pressed())
            {  State = ButtonC.Pressed() ? 4 : 5;
            }

            if(ButtonB.Pressed())
            {  State = ButtonC.Pressed() ? 5 : 4;
            }

            // - Both leds blinking.
            if(T1.FlipFlop())
            {  LedA.On();
               LedB.Off();
            }
            else
            {  LedA.Off();
               LedB.On();
            }
            break;
         }

         case 4:
         {  // Led A steady
            LedA.On();
            LedB.Off();
            break;
         }

         case 5:
         {  // Led B steady
            LedA.Off();
            LedB.On();
            break;
         }
      }
   }
}


Wat super aardig van u.
Ik ga vandaag naar mijn oma toe om haar te helpen.
Als ik later thuis komt ga ik er gelijk naar kijken.
Mijn respect voor u dat u de tijd en de moeite neemt om mij te helpen.