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
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