mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atemga32 als Inverter


Autor: Dietmar P. (dietmar2)
Datum:

Bewertung
0 lesenswert
nicht 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:
void init(void);
#define IMPP PORTD 
#define IMPPI PIND 
#define IMPD DDRD 

int main(void)
{  
   init();
   while(1){

    if (!(PIND & (1<<PIND4))) { 
  IMPP |= (1<<5);  
  }
  else{
  IMPP &= ~(1<<5);
  }
    }
}

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

  PORTD=0x00;
}

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

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
versuchs mal damit:

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

statt:

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

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dietmar P. (dietmar2)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Herr_Mann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was macht denn

PORTD=0x00;

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

Autor: Crossposter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Dietmar P. (dietmar2)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Dietmar P. (dietmar2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hy Flo,

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

Vielen Dank!

Gruß
Dietmar

Autor: Dietmar P. (dietmar2)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.