Forum: Mikrocontroller und Digitale Elektronik Atemga32 als Inverter


von Dietmar P. (dietmar2)


Lesenswert?

Hallo,

in meiner Schaltung muss ich ein Signal aus einem Mux (74 HC4067) Pin 1 
invertieren. Da ich in der Schaltung einen Atmega32 verwende wollte ich 
damit das Signal invertieren.
PortD Pin 4 soll der Eingang und Pin 5 der Ausgang für das invertierte 
Signal sein.

Im C-Programm sieht das verkürzt auf diese Routine wie folgt aus:
1
void init(void);
2
#define IMPP PORTD 
3
#define IMPPI PIND 
4
#define IMPD DDRD 
5
6
int main(void)
7
{  
8
   init();
9
   while(1){
10
11
    if (!(PIND & (1<<PIND4))) { 
12
  IMPP |= (1<<5);  
13
  }
14
  else{
15
  IMPP &= ~(1<<5);
16
  }
17
    }
18
}
19
20
void init()
21
{
22
  DDRD = 0xff;  // PORTD auf Ausgang setzen
23
  DDRD &= (1<<PD4); // Pin 4 auf Eingang (Info <<)
24
25
  PORTD=0x00;
26
}

Das Signal aus dem Mux bricht lt. Oszi fast ganz zusammen, sobald ich es 
am Atmega anschließe.
Ist der Eingangswiderstand am Atmega so niedrig, dass das Signal getötet 
wird, oder habe ich einen grundsätzlichen (Denk-)Fehler im Programm?

Gruß
Dietmar

von Ich (Gast)


Lesenswert?

versuchs mal damit:

  DDRD &= ~(1<<PD4); // Pin 4 auf Eingang (Info <<)

statt:

  DDRD &= (1<<PD4); // Pin 4 auf Eingang (Info <<)

von Ich (Gast)


Lesenswert?

... wobei eigentlich:


  DDRD = 0xef;  // PORTD auf Ausgang setzen

sinnvoller und einfacher wäre als:

  DDRD = 0xff;  // PORTD auf Ausgang setzen
  DDRD &= ~(1<<PD4); // Pin 4 auf Eingang (Info <<)


aber jeder wie er will ;)

sry wegen doppelpost

von Dietmar P. (dietmar2)


Lesenswert?

Danke für Eure Antworten.

Habe beides probiert. Das Signal vom Mux fällt zusammen, sobald der 
Atmega angeschlossen wird.

Dann werde ich wohl in den sauren Apfel beißen und einen Inverter 
extern, z.B. NAND-Gatter verwenden müssen.

von Herr_Mann (Gast)


Lesenswert?

Dietmar P. schrieb:
> Habe beides probiert. Das Signal vom Mux fällt zusammen, sobald der
> Atmega angeschlossen wird.

Versehentlich interne Pullup-Rs beim AVR-Eingang eingeschaltet, die den 
Mux stören???

von Daniel (Gast)


Lesenswert?

Was macht denn

PORTD=0x00;

in der init()-Funktion? Ich kenn den Prozessor nicht, aber wird der Port 
dadurch hart runtergezogen?

von Crossposter (Gast)


Lesenswert?


von Dietmar P. (dietmar2)


Lesenswert?

Habe alle Vorschläge probiert.
Sobald ich aber einen Pin von Atmega an den Mux hänge ist fast kein 
Signal mehr vom Mux auf dem Oszi zu sehen.
Werde mal versuch das Signal mit mit einem Transistor zu verstärken, 
ggf. auch einen Optokoppler verwenden.

von Flo (Gast)


Lesenswert?

reduzier mal deinen Code wirklich aufs wessentliche:

int main(void)
{
  DDRD = (1<<PD5);
  while(1)
  {
    if (PIND & (1<<PIND4))  //Wenn Pin4 high
      PORTD &= ~(1<<PD5);     // -> PD5 löschen
    else
      PORTD |= (1<<PD5);      //ansonsten setzen
  }
}

Der Code sollte mit dem Mux-Ausgang an PinD4 funktionieren.
Ansonsten Schaltplan her :-)

von Dietmar P. (dietmar2)


Lesenswert?

Hy Flo,

da war ich wohl etwas zu kompliziert.
Die Schaltung geht,

Vielen Dank!

Gruß
Dietmar

von Dietmar P. (dietmar2)


Lesenswert?

Hallo,

die Lösung ist gefunden, die Schaltung läuft!

Es war nicht, oder nicht alleine das C-Programm.

Der Mux liefert als Ausgang kein sauberes Rechtecksignal, sondern nur 
einen
sauberen Übergang von high nach low. Die Flanke low nach high ist eher 
abgetreppt, sodass das Siganl eher wie einem Nadelimpuls gleicht und 
damit kommt offenbar der Atmega32 nicht zurecht.
Habe ein Gatter eines 74HC00 dazwischen geschaltet und als Ausgang ein
ordentliches Rechtecksignal erzeugt. Das erkennt jetzt der Atmega.

Ok, dann nochmals danke und bis zur nächsten Frage.

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.