mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MUX Ansteuerung mit AVR


Autor: Helge Böhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Ich will gerne mit einen Multiplexer (den 74HC151N) acht Signaleingänge

zu den Komparator-Eingang eines MEGA 32 durchschalten. Ich will also
die 3 Steuereingänge des MUX über den AVR ansteuern, also am
Portausgang soll ein Signal anliegen, dass die einzelnen Kanäle
nacheinander durchschaltet.
Das Programm dazu (hier für 16 Eingänge ausgelegt):

#include <io.h>
#include <delay.h>
//...bla...
#define ACO ACSR.5
//...blabla...
void main(void)
{
    unsigned char ntc_mux; //Zählvariable f. ext. Mux
    //Initialisierung
    //...blablabla...
while(1)
{
    for(ntc_mux = 0; ntc_mux < 16; ntc_mux++)
    {
        PORTB &= 0xf0; //Mux Kanal setzen
        PORTB |= ntc_mux & 0x0f;
        delay_us(10000); //kurz warten
        if(ntc_mux < 8)
        {
            if(ACO) //Wenn Komparator-Ausgang 1
                PORTD &= ~(1 << ntc_mux); //LED ein
            else    //Komparator-Ausgang 0
                PORTD |= 1 << ntc_mux; //LED aus
        }
        else
        {
            if(ACO) //Kommentar siehe oben
                PORTC &= ~(1 << (ntc_mux - 8));
            else
                PORTC |= 1 << (ntc_mux - 8);
        }
    }
}
}

Es liegt ein schönes Rechtecksignal an den 3 Portausgängen des AVR's
an , aber der Multiplexer tut immer so, als ob die drei Steuereingänge
alle drei auf high sind, also der MUX schaltet immer nur den achten
Signaleingang durch, und nicht nacheinander die einzelnen Kanäle.
Ich kann mit meinem Uralt-Oszi nur die einzelnen Kanäle ansehen (danach
müsste es eigentlich funzen), aber ich weiß eben nicht ob die Signale
zeitlich richtig am MUX ankommen.
Ich hoffe ich hab das jetzt verständlich erlärt.
Wie krieg ich das hin, dass die Kanäle einzeln durchgeschaltet werden
?

Gruß Helge

Autor: Hartmut Gröger (hardygroeger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Der 151 ist ein digitaler Multiplexer,der zudem noch die Ausgänge
negiert. Wenn du analoge Signale multiplexen willst brauchst du
Analogmultiplexer aus der 4000-der Baureihe (CD40.., 74HC40..).
Der 151 hat übrigens noch einen Freigabeeingang der ebenfalls
beschaltet werden muss damit das Teil spielt.

MfG HG

Autor: Helge Böhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Die Signale sind schon digital, d.h. es geht hier um so NTC Sensoren,
die vorher über einen Komparator gelaufen sind.
Ich frag mich nur, warum der MUX die Kanäle nicht nacheinander
durchschaltet, sondern immer nur den Eingang I7 (I0-I7) durchässt.
Vielleicht mach ich da mit den Programm einen prinzipiellen Fehler; ich
 hab so einen MUX noch nie angesteuert...

Gruß Helge

Autor: Hartmut Gröger (hardygroeger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Wie hast du den Strobeeingang beschaltet?

MfG HG

Autor: Helge Böhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den hab ich auf ground gelegt. Damit wird der MUX Ausgang überhaupt erst
aktiv, wenn ich das richtig verstanden hab.

Autor: Hartmut Gröger (hardygroeger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

@Helge: Ist Korrekt.
Veruche erst mal den Multiplexer ohne AVR anzusteuern.

MfG HG

Autor: Egon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DDRB |= 0x07 muß die Ausgänge aktivieren; ich finde die Anweisung nicht.

Autor: Helge Böhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo.

Stimmt, die Anweisung steht hier nicht im Programm, das hab ich noch
eingefügt, Entschuldigung.

Ich versuch jetzt mal zu erklären, was an dem Port vom AVR anliegt, der
das Steuersignal anliegt:
an S0: Rechtecksignal mit 3,33 Hz
an S1: Rechtecksignal mit 6,66 Hz
ab S2: Rechtecksignal mit 9,99 Hz
Ich glaub ich hab im Programm beim delay-Befehl noch eine 0 vergessen.
Das Steuersignal hab ich Bewusst ziemlich niederfrequent gewählt, weil
ich dachte, dass schnelleres der Mux nicht checkt.
Wenn die 3 Rechtecksignale zeitlich richtig kommen, dann müsste doch
der Mux die Kanäle einzeln durchschalten. Aber mit meinem alten Oszi
kann ich das schlecht darstellen. Da seh ich eben nur die
Rechtecksignale.

Gruß Helge

Autor: Laeubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich glaube das problem liegt dadran, das STROBE eine HIGHT to LOW
transition braucht um die anliegende Addresse zu übernehmen, zumindest
war das bei den MUXen die ich bisher verwendet habe so.
Damit verhindert man, das wenn die Adressen noch nicht stabil anliegen
irgenwelche Kanäle wild durcheinader geschaltet werden.
Versuchs einfach mal, den Strobe an nen Pin zu hängen, Strobe auf HIGH,
Adresse anlegen, Strobe auf LOW. VIeleicht hilft das.

(ggf braucht er en Vollen Takt, also Strobe auf High, Low, High, Low
das Datenblatt sollte AUskunft geben)

Autor: Helge Böhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also einfach mal auf das Rechtecksignal S0 mit den 3,3 Hz ?
Im Datenblatt steht hierzu nur:
"The strobe input must be taken low to enable this device, when the
strobe is high W output is forced high and consequently Y output goes
low."

Autor: Laeubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ne seh grad das ist Blödsinn.
Ich würds mal ohne Rechtecksignal probieren, und einfach vom AVR feste
Pegel an die Leitungen anlegen, und das dann mit nem Multimeter
nachmessen, ob das auch so beim Chip ankommt.
Eventuell mußt du auch erst JTAG deaktivieren (ist beim Mega16
zumindest immer standardmäßig an)...

Autor: Helge Böhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, ich glaub ich versuch den Mux mal ohne Avr anzusteuern, vielleicht
stimmt ja was mit den Mux nicht.
Warum JTAG deaktivieren ? (und was macht der JTAG eigentlich genau ?)
Das Steuersignal müsste ja eigentlich passen um den Mux anzusteuern. Es
liegt wohl eher am Mux.

Autor: Laeubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nene mit AVR geht das schon, aber sezt doch mal z.B. A = 1 B = 0 C = 1
in der SOftware ohne zu wechseln, dann guckst du ob die Pegel stimmen
am MUX und ob der richtige Kanal an ist.
JTAG ist ne DEBUG Interface an PORTC des AVRs wodurch wenn es aktviert
ist nicht der ganze PortC verwendet werden kann als IO

Autor: Helge Böhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab das mit den Avr jetzt nicht aufgegeben, aber ich kann doch auch
die Steuersignale "manuell" anlegen, dann muß ich nicht gleich das
ganze Programm verändern (ich bin da nicht so fit...), also bloß mal zu
überprüfen, ob der Mux funtioniert.

Autor: Helge Böhr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die Steuereingänge "manuell" anlege, dann schaltet der Mux
tatsächlich nur den ausgewählten Kanal durch. Das hab ich gerade
ausprobiert.
Zu schnell kann das Steuersignal im Hz-Bereich doch auch nicht sein,
oder ? Und am strobe kann es auch nicht liegen, oder ?
Keine Ahnung was da los ist.

Autor: Laeubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde sagen dann ist das Programm falsch ;)

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.