Forum: Mikrocontroller und Digitale Elektronik Anfänger AVR RS-Flipflop nachbilden


von Alex (Gast)


Lesenswert?

Hallo zusammen,
wollte mal hören, ob das so ok ist. Im Simulator scheint es zu 
funktionieren.
1
//Initialisation
2
void init(void)
3
  {
4
  DDRB  = 0b11111100;
5
  PORTB = 0b00000011; //Pull Up
6
  }
7
8
int main(void)
9
  {
10
  
11
  init();
12
  
13
  //Main Loop
14
  while (1)
15
    {
16
    //RS-Flip Flop
17
    if (bit_is_set (PINB,PB0) && bit_is_clear (PINB,PB1))
18
      {
19
      PORTB |= (1 << PB7) | (1 << PB6);
20
      }
21
    if (bit_is_set (PINB,PB1))
22
      {
23
      PORTB &= ~((1 << PB7) | (1 << PB6));
24
      }
25
    }
26
  
27
  return 0;
28
  }

von Michael H. (michael_h45)


Lesenswert?

Alex schrieb:
1
    if (bit_is_set (PINB,PB0) && bit_is_clear (PINB,PB1))
Lässt eine race condition zu, weil du PINB 2 mal einliest. Wenn sich 
PINB während der Zeit zwischen den Einlese-Vorgängen ändert, stimmt das 
Ergebnis nicht mehr.
Richtig wäre, PINB in einer Variable zu puffern und diese auswerten.
1
    if (bit_is_set (PINB,PB1))
Was passiert, wenn beide if-Abfragen wahr sind? Wird das Verhalten 
wirklich richtig abgebildet?

von Martin H. (Gast)


Lesenswert?

Man kanns auch übertreiben. Das oben wird durchaus für den 
normalgebrauch funktionieren. Bedenke, er/sie ist Anfänger. Da kommts 
selten auf so extreme Timings an.

Ich hätte es allerdings auch anders geschrieben:
1
   unint8_t buffer=0;
2
3
   while (1) {
4
       //RS-Flip Flop
5
       buffer = PINB;
6
       if ( buffer & PB1 )
7
           PORTB &= ~((1 << PB7) | (1 << PB6));
8
       else if ( buffer & PB0 )
9
           PORTB |= (1 << PB7) | (1 << PB6);
10
    }

Ist kürzer und für meine Augen übersichtlicher.
Man könnte auch
1
    switch( PINB & (PB0 | PB1) ) {
2
        case PB1:
3
            ; //reset
4
            break;
5
        case PB0:
6
            ; //set
7
            break;
8
    }
einbauen, das müsste es mMn auch tun, ich persönlich mag aber die 
if-else Konstruktion viel lieber!

lg Martin

von Alex (Gast)


Lesenswert?

Vielen Dank für die Antworten.
1
#define F_CPU  3680000
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
void init(void)
7
  {
8
  DDRB  = 0b11111100;
9
  }
10
11
int main(void)
12
  {
13
  uint8_t buffer=0;
14
  init();
15
16
  while (1) 
17
    {
18
    
19
         //RS-Flip Flop
20
         buffer=PINB;
21
      if ( buffer & ( 1 << PB0 ) & !(buffer & ( 1 << PB1 ) ) ) 
22
      {
23
        PORTB = 0xFF;
24
      }
25
      if ( buffer & ( 1 << PB1 ) ) 
26
      {
27
        PORTB = 0x00;
28
      }
29
30
    }
31
       
32
   return 0;
33
   }
Ist das jetzt brauchbarer?
Gruß
Alex

Beitrag #5443599 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.