Atemga32 als Inverter

OP #1651939
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
Gast
... 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
Gast
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???
OP
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.
Gast
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 :-)
OP
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.