PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schaltermatrix



Banzai
18.03.2007, 22:48
Hallo Leutz,

der "Naiv unwissende" stellt mal wieder eine Frage.

Die Schaltung im Attachment soll eine Schaltermatrix darstellen. Wenn ich an dem unteren Anschluss in einen A/D-Port des µC gehe, sollte sich doch dort unterschiedliche Spannungen messen lassen, oder?

Jedenfalls misst das Multimeter bei unterschiedlichen Tasterbetätigungen, unterschiedliche Volt. Bei Normalstellung eingehende 5V.

Allerdings reagiert der Port nicht darauf?!?


#include <stdlib.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

uint16_t ReadChannel(uint8_t mux)
{
uint8_t i;
uint16_t result;

ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS0); // Frequenzvorteiler
// setzen auf 32 (1) und ADC aktivieren (1)

ADMUX = mux; // Kanal waehlen
ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen

/* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
result = ADCW; // ADCW muss einmal gelesen werden,
// sonst wird Ergebnis der nächsten Wandlung
// nicht übernommen.

/* Eigentliche Messung - Mittelwert aus 8 aufeinanderfolgenden Wandlungen */
result = 0;
for( i=0; i<4; i++ )
{
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while ( ADCSRA & (1<<ADSC) ) {
; // auf Abschluss der Konvertierung warten
}
result = ADCW; // Wandlungsergebnisse aufaddieren
}
ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)

result /= 4; // Summe durch 8 teilen = arithm. Mittelwert

return result;
}

int main( void )
{
DDRA = 0x00; // alle auf Eingang
PORTA = 0x80; // interner PullUp?!?

uint16_t adcval;

while(1)
{
adcval = ReadChannel(0); /* MUX-Bits auf 0b0000 -> Channel 0 */
}

return 0;
}


Ich hatte noch Code drin, um mir adcval auf UART ausgeben zu lassen. Der kürze wegen hier rausgeschmissen!

Einem angeschlossenen Sharp-IR-Sensor konnte ich damit Werte entlocken, mit der Schaltung kam nur 0......

Wo ist mein Denkfehler?

thx

Banzai

bax
18.03.2007, 23:17
Sieh Dir Deine Schaltung noch mal genau an, Du schaltest entweder den Ground direkt oder über einen Widerstand auf den Port. Ein Spannungsteiler ergibt sich aber nie bei Deiner Schaltung, da Dein R1 direkt abgeerdet ist.

greetz Rajko

Banzai
19.03.2007, 01:28
thx Bax,

da ich aber von Elektronik so viel Ahnung habe, wie ein Hund vom Eierlegen, würde ich einen Änderungsvorschlag sehr begrüssen.

Ob das jetzt ein Spannungsteiler ist, kann ich somit (bis jetzt) garnicht beurteilen....

Der R1 (so hat's mir irgendjemand mal irgendwann irgendwo erklärt), soll als Pull-Up(?) dienen. Sinn des ganzen war's ja, bei unterschiedlichen Schalterbetätigungen, verschiedene Spannungen am A/D zu kriegen.

Warum zeigt das Multimeter unterschiedliche Spannungen, wenn ich +5 und Port anklemme?

Hat jemand eine Schaltung dafür parat? Wäre toll.....

Banz

PICture
19.03.2007, 01:50
Hallo Banzai!

Ich habe eine Skizze für Dich.

MfG


1k
___
+5V o---|___|-+-------+-------+------> zum ADC
| | |
.-. .-. .-.
| |1k | |470 | |220
| | | | | |
'-' '-' '-'
| | |
\ o \ o \ o
\ \ \
T1 \. T2 \. T3 \.
o o o
| | |
0V o---------+-------+-------+
|
===
GND

Banzai
19.03.2007, 22:52
thx4answer

Die Skizze hat mir weitergeholfen, obwohl ich den 0V-Strang irgendwie...vermisse (siehe Attachement).

Damit liefert die Matrix folgende Werte (mit obigen Code ):


T1 T2 T3 Wert
0 0 0 255
1 0 0 82
0 1 0 128
0 0 1 175
1 1 0 62
0 1 1 104
1 0 1 71
1 1 1 56

Damit kann ja mal was anfangen.

Thx4Help

Banzai[/list]

steep
19.03.2007, 23:55
So wie in deinem Bild "Schaltung02" funktioniert es wiederum nicht. Du hast so immer GND am Ausgang.
Du must den GND separat schalten wenn 0V haben willst. Ich habe Dein Schaltbild mal ergänzt.

Banzai
21.03.2007, 00:47
thx steep,

ja ne is klar...

Ich hab anscheinend mit Absicht bei keinem gedrückten Schalter die Referenz-Spannung am Port anliegen (deswegen 255 bei keinem Schalter).

Was ist denn sinniger? Wenn ich es mir recht überlege, eigentlich 0 wenn kein Schalter gedrückt und bei allen drei die Referenzspannung, oder?

Mein Beispiel funktioniert zwar, aber der Vorschlag von PICture scheint ja eher dem 0-Standard zu entsprechen (obwohl ich bei steep den 4.Schalter nicht verstehe, weil ich den a. nicht habe und b. eigentlich garnicht will... ).

Für weitere Anregungen wäre ich dankbar...

Banz

steep
21.03.2007, 01:15
Bei Deinem Schaltbid hast Du ja immer GND am Ausgang, egal welche Taste Du drückst.
Wenn am Ausgang nicht immer 0V(GND) sein soll, dann die GND Leitung zum Ausgang wegmachen (siehe die korrekte Schaltung von PICture).
Solltest Du aber auch 0V(GND) am Ausgang benötigen, dann musst Du einen zusätzlichen Schalter wie ich ihn Dir eingezeichnet hab verwenden.