Forum: Compiler & IDEs Eingang direkt auf Ausgang geben


von ich (Gast)


Lesenswert?

Hallo!

ich habe ein Problem mit meinen C-code!

    if (bit_is_set(PINC,Rot_Eingang))
       {bit_on(PORTC,Rot_Ausgang);}
       else {bit_off(PORTC,Rot_Ausgang);}
    if (bit_is_set(PINC,Gruen_Eingang))
       {bit_on(PORTC,Gruen_Ausgang);}
       else {bit_off(PORTC,Gruen_Ausgang);}
    if (bit_is_set(PINC,Blau_Eingang))
       {bit_on(PORTC,Blau_Ausgang);}
       else {bit_off(PORTC,Blau_Ausgang);}
oder
               uint8_t x;
    x= PINC;
    x *=8;
    PORTC = x;

MEGA8 8MHZ;
würde gerne ein Eingangssignal direkt durch µC auf einen Ausgang
leiten um das Eingangsignal zu überwachen und dann bestimmte Aktionen
an den Ausgangspins auszugeben.

Habe aber jetzt das Problem wenn ich die Frequenz am Eingang immer 
weiter hoch drehe beginn ab einer Frequenz von 200 bis 300Hz  ein doppel 
trg
auf dem Ausgang.

ist der µC zu langsam?

hätte jemand eine Idee ob und wie das Funktionieren könnte?

Danke!

von Matthias L. (Gast)


Lesenswert?

Du willst Eingangspin => Ausgangspin?
1
if ( PIND & (1<<PD3) )
2
{
3
  PORTB |= (1<<PB7);
4
}
5
else
6
{
7
  PORTB &= (1<<PB7)
8
}

von ich (Gast)


Lesenswert?

Ja will Eingangspin gleich Ausgangspin!

                if (bit_is_set(PINC,PC0))
       {bit_on(PORTC,PC4);}
       else {bit_off(PC4);}
    if (bit_is_set(PINC,PC1))
       {bit_on(PORTC,PC5);}
       else {bit_off(PORTC,PC5);}
    if (bit_is_set(PINC,PC2))
       {bit_on(PORTC,PC6);}
       else {bit_off(PORTC,PC6);}
aber so habe ich eben doppel trg. am Ausgang bei höheren Frequenzen
hätte gerne ein sauberes Signal am Ausgang.

von nils (Gast)


Lesenswert?

asm("mov ziel, quelle");

von Matthias L. (Gast)


Lesenswert?

>doppel trg. am Ausgang

Was soll das sein?


>sauberes Signal am Ausgang

Hast du mit meinem Beispiel.


>asm("mov ziel, quelle");

Kann keine Bits kopieren

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hast du vielleicht die Endlosschleife drumrum vergessen?  Sonst wird
das ja nur ein einziges Mal abgearbeitet nach Reset.

Mach mal Nägel mit Köpfen: komplettes Programm, welcher Controller,
welcher Compiler, vielleicht auch gleich noch das Makefile mit dazu.

von SoLaLa (Gast)


Lesenswert?

ich will ja auch C lernen :-)
mein Gedankenansatz dazu sähe so aus:

PORTC=(((PINC&7)<<4)|(PINC&143))    //PC0,1,2,3,7 unverändert lassen

würde das so funktionieren?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ja.

Behalte aber mal im Hinterkopf, dass du im Ausdruck zwei 
Einleseoperationen an PINC hast und sich die Pegel zwischen den Aktionen 
ändern können.

Lesbarer kann man die Bitmanipulation mit der 1<<Bitnummer 
Schreibweise schreiben.

von Peter D. (peda)


Lesenswert?

ich wrote:

> aber so habe ich eben doppel trg. am Ausgang bei höheren Frequenzen
> hätte gerne ein sauberes Signal am Ausgang.

Dann mußt Du uns erstmal den Rest des Programms zeigen, in den gezeigten 
Zeilen liegt der Fehler jedenfalls nicht.


Aber es wird eh kaum klappen, 3 PWMs jitterfrei durch nen MC 
durchzuschleifen, wenn er auch noch was anderes machen soll.


Peter

von ich (Gast)


Lesenswert?

OK


Dann wird es wohl nicht klappen mit höheren Frequenzen ,werde dann nur 
bis 200Hz PWM gehen ums durchzuschleifen .

Das reicht mir dann aus !


Jörg Wunsch es ist eine Endlosschleife drum!soviel dazu!!!

Auszug:
int main(void)
{
   init_devices();
   uint16_t Signalpegel=0;
  bit_on(TIMSK,TOIE1);
 while(1)
 {
 //------------------------------High------------------------------------ 
---------
  if ((bit_is_set(PIND, PD2)) && (bit_is_set(PIND,PD3))) //High
  {

  RGB();
  Signalpegel = AdcWert(6);
        Summe(Signalpegel);

  }
//-------------------------------middle--------------------------------- 
--------
  if ((bit_is_clear(PIND, PD2)) && (bit_is_set(PIND,PD3))) //middle
  {

  RGB();
  Signalpegel = AdcWert(6);
        Summe(Signalpegel);

  }
//-------------------------------low------------------------------------ 
---------
  if ((bit_is_set(PIND, PD2)) && (bit_is_clear(PIND,PD3))) //low
  {
        RGB();
  Signalpegel = AdcWert(6);
        Summe(Signalpegel);
  }
//------------------------------Test------------------------------------ 
---------
  if ((bit_is_clear(PIND, PD2)) && (bit_is_clear(PIND,PD3))) //Test
  {
  Test();
  }
 }
}
//--------------------------------------------------------------------
void RGB(void)
{
    if (bit_is_set(PINC,PC0))
       {bit_on(PORTC,PC4);}
       else {bit_off(PC4);}
    if (bit_is_set(PINC,PC1))
       {bit_on(PORTC,PC5);}
       else {bit_off(PORTC,PC5);}
    if (bit_is_set(PINC,PC2))
       {bit_on(PORTC,PC6);}
       else {bit_off(PORTC,PC6);}
}

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.