C LED - Monofllop

roliver

Neues Mitglied
26. Dez. 2011
9
0
0
Sprachen
Hallo zusammen,

bin hier am Programmieren eines ATmega8, mein AVR ist auch schon super am laufen.
Doch leider hänge ich grade an eine, für mich großem, Problem!
Ok, kleine vor Geschichte, ich ab eine Programm in atmega laufen,
dass eine LED an PortD0 Blinken (timer) läst, und auch noch als I2C/TWI Slave Daten
holt und auswertet. Lieder bin ich nur ein Anfänger was die AVR Programmierung an geht.
Der TWI nur zusammen kopiert und modifiziert, aber geht super ;-)

Jetzt wollte ich gerne das ein Ausgang (PINB1), wenn ich an die Adresse 2 in TWI RAM
eine
z.B. 0x0A (10) lege, dass dann die LED am Ausgang kurze (z.B. 2 mal LED an D0) an geht
und dann wieder aus. Jetzt an die Adresse 2 eine 0xA0 (160) wieder Freigabe.

Erst jetzt kann die LED mit adr 2 wert 10 wieder an gehen (wie oben).

Wie geht man das an? (quasi RS-FlipFlop und nach geschaltetes Monoflop)


Gruß

Oliver
 
Hallo roliver!

Irgendwie verstehe ich eben nur noch Bahnhof.

Kannst Du Dein Problem etwas dataillierter beschreiben?
Du hast doch schon einen Programm entwickelt - kannst Du es bitte hier einstellen?
ohne Programmcode wird es sonst schwieriger Dir zu helfen.

MfG
FreeVEE
 
Hallo FreeVEE,

Klar,

Code:
volatile uint8_t counter;

void init_ports(void)
{
        DDRD = (1<<PD0);
	DDRB = (1<<PB1);
}

int main(void) {
    init_ports();
    int ledon = 0;
    TIMSK |= (1 << TOIE0);  
    TCCR0 |= (1 << CS02) | (1<<CS00);
    init_twi_slave(0x20);
    sei();
    PORTD &= !(1<<PD0);
    PORTB |= (1<<PB1);

    //Hilfs Vars. gebracht?
    int off = 1, h1 = 0, x = 0;
    int wert;
    wert = 30;

    // LED auf VDD -> LED aus ;-)
    PORTB |= (1<<PB1);
	
    while (1) {

    // i2c Daten?

    //Bincken von PIND0 aus?
    if (i2cdata[1] == 8) //speicher stelle 1 +++
    {
      off = 0;
    }
    if (i2cdata[1] == 2)
   {
     off = 1;
   }
   // geschwindigkeit
   if (i2cdata[3] >= 5)
   {
     wert = i2cdata[3];
   }			

   //Strobe B1 (ohne funktion, mein Prob.)
   // das hier ist auch funktiuonnal, doch die auswertung weiter unten nicht !
   if (i2cdata[2] == 8) 
   {
      h1 = 1;
   }
   if (i2cdata[2] == 2)
   {
     h1 = 0;
    }


    //Bink funktion an PIN D0 ist OK
    if (counter >= wert)
        {
            counter = 0;
			ledon++;
        }			

    if (ledon >= 2)
		{
		    ledon = 0;
		}
		
		if (ledon == 1)
		{
			if (off == 1)
			{
				PORTD &= !(1<<PD0);
			}
			else 
			{
			    PORTD |= (1<<PD0);
			}
			
		}
		else
		{
		    PORTD &= !(1<<PD0);
			
		}			
    

      // ab hier ??

      if (h1 == 1)
		{
		    h1 = 2;
            x = 1;    
		}
		
		if (h1 == 2)
		{
		
		 if (x >= 1)
		  {
		     if (counter <= 3)
			  {
			   x++;
			 }
		  }
		
	    	if ((x >= 1) && ( x <= 2))
		  {
		     PORTB &= !(1<<PB1); 
		  }
		
	    	if (x > 3)
		   {
		    x = 0;
		    PORTB |= (1<<PB1);
		  }
		  
		}
		
		 
		if (h1 == 0)
		{
		  PORTB |= (1<<PB1);
		 }
    }
    return 0; // na, ist doch unnötig !!
}


so, Ziel ist es wenn an der ADREESSE 2 (i2cdata[2]) der Wert x (8) steht, dann soll PINB1 ein mal kurz an gehen (zb. länge = 2x D0 an), und dann wieder aus.
jetzt soll an PIN b! solange nix passiern bis an der ADRESSE i2cdata[2] der wert y (2) seht. Jetzt soll das spiel mit 8 und kurz ein erst wieder gestartet werden können.

So und nu wo habe ich mich da verdacht?



Gruß

Oliver
 
ich nochmal,

habe jetzt eine lösung gebastet, doch ich glaube da kann man noch optimieren?

so sieht es jetzt aus:

Code:
if (counter >= wert)
 {
     counter = 0;
     ledon++;
     if (x == 1) 
    {
       if (y <= 2) 
      {
         y++;
      }
    }
 }
	
		
		
if (h1 == 1)
 {
    if (y == 0)
   {
      x = 1;
   }
   if ((y >= 1) && (y <= 2))
   {
     PORTB &= !(1<<PB1);
   }
   else
   {
     PORTB |= (1<<PB1);
   }
    
}
		
		 
if (h1 == 0)
 {
  PORTB |= (1<<PB1);
  x = 0;
  y = 0;
 }

jetzt wird die LED an PORTB.1 KURZ eingschaltet wenn ich an die I2C Adresse des ATmega ein 8 schicke, siehe ein betrag darüber.
Jetzt kann so oft wie will eine 8 an den AT geschickt werden, es passiert nix mehr. Erst wenn ich jetzt eine 2 schicke, kann ich das
mit der 8 wieder ein mal starten ;-)

genau so hatte ich mir das fast vorgestellt.

denn es ist noch ein Fehler drin: PortB.1 wird nicht sofort an wnn ich die 8 schicke sondern erst nach dem 1. durchlauf von count! und
bei einem wert von 255 ist das eine zeit von ca. 2s und das ist mist! ;-)

ändern, verbessern aber wie?


Gruß

Oliver
 
Du schreibst immer z.B.:
Code:
PORTB &= !(1<<PB1);

Möchtest Du nicht lieber
Code:
PORTB &= ~(1<<PB1);
schreiben ? ;)

Gruß, Manfred.
 
Danke, doch es eght auch so ist das jetzt schimm? und wie könnte man die rutine noch verbessern?

cu Oliver
 
Hallo,
Danke, doch es eght auch so ist das jetzt schimm?

es geht so definiv nicht!

PORTB &= !(1<<PB1);

Dies wirkt zwar richtig auf PB1, allerdings auch auf alle anderen PBn und das möchtest du ja sicherlich nicht.

Bei deiner eigentlichen Frage kann ich dir leider nicht helfen, da ich nicht genau verstehe, was du erreichen möchtest. Da gehts mir etwa so wie FreeVEE.

Dirk
 
Habs schon geändert, in meiner testschaltung ist zur zeit nur das eine Relay und die LED.

OK, so mal ohne den I2c mist!

ich möchte, wenn ich an PORTA.0 Schalter habe, das am PORTB.0 eine LED kurz an geht, aber der Schlter bleit auf 1.
Wenn jetzt der Schalter auf 0 geht und wieder auf ein soll an PORTB.0 nix passieren.
Erst wenn ich einen Schalter an PORTD.0 kurz auf 1 schalte, kann ich erst mit PORTA.0 einmal PORTB.0 kurzn einschalten.

dieses benötige ich dann für 8 Ausgänge ;-)

Gruß

Oliver

PS.: digital: RS-Monoflop ;-)
 
Danke, doch es eght auch so ist das jetzt schimm?
Schlimm genug ;)
Dirk hat es ja bereits erläutert, zum allgemeinen Verständnis aber noch ein Zitat aus wikipedia:
In C wird das bitweise NOT als „~“ (Tilde) dargestellt. Dieser Operator darf nicht mit dem Operator für „logisches NOT“ „!“ (Ausrufezeichen) verwechselt werden, der den gesamten Wert als Booleschen Ausdruck interpretiert und true oder false zurückgibt. Das logische "NOT“ ist keine bitweise Operation!
 
ja, das hatte ich auch verstanden, doch das ist ja nicht das problem, ist es jetzt mehr verständlich?
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)