servusssss
23.10.2006, 16:22
hallo,
ich lauf wider einmal im kreis. ich versuche die werte des adc auf der RN-control 1.4 auf die uart auszugeben . die uart funktioniert aber die wert vom adc sind irgendwie nicht richtig glaub ich zumindest?
den Port c ist nur zur kontrolle ob der atmel läuft.
Jetzt hat jemand eine ahnung wieso ich solche ergebnise bekomme wie: adcval 5c spannung 1f ? aber am PA6 1,7V sind?
liegt es an der Konvertierung?
sind die werte des ADC falsch?
wenn ja wie sollte man den ADC auswerten?
mit result = ADCH;
oder result = ADCL + (ADCH << 8 );
hier mein quellcode:
#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/signal.h>
#include <string.h>
#include "uart.h"
#ifndef F_CPU
#define F_CPU 16000000UL // 16MHz Taktfrequenz
#endif
/* 9600 baud */
#define UART_BAUD_RATE 9600
#define CR \r\n
#define DELAY_LOOPS 50 // So viele Schleifendurchgaenge lang muss erledigt werden
struct{
uint8_t bPin:1 ; // Aktuelles Signal am Pin (Taster)
uint8_t bStatus:1; // Status des Tasters ob dieser beim voriegen durchlauf gedrückt war!
} bportd;
uint8_t nCounter; // Zähler wie oft der Taster gedrückt war
uint8_t nKeyPress; // Schleifenzähler wie viele Schleifen der Taster schon gedrückt war!
//Prototypen
void init(void);
uint16_t RADCC(uint8_t mux);
int main (void){
// Uart Initalisierung
uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
//Interrupt enable
sei();
// Initialisierung der Register
DDRA = 0x00;
PORTA = 0xff;
DDRC = 0xff;
DDRD = 0x00;
PORTD = 0x01;
// Initialisierung der Varialblen
char buffer[15];
bportd.bPin =1;
bportd.bStatus =0;
nCounter =0;
uint16_t adcval ;
uint16_t spann;
uart_puts("\n\r Test Prog V1.0 RS232 Start\n\r");
for(;;){
if(bit_is_clear (PIND,PIND0)){ // wenn der knopf gedrückt ist logisch 0
if(bportd.bPin){ // wenn der knopf nicht gedrückt war dann wird alles zurückgesetzt!
nCounter =0;
bportd.bPin =0;
bportd.bStatus =0;
}
else if(!bportd.bStatus){ // wenn der knopf immer noch gedrückt
if(++nCounter > DELAY_LOOPS){
nKeyPress++; //zähler erhöhen
PORTC = nKeyPress; // ausgabe am Port c
adcval = RADCC(6); //
spann = (4,88*adcval)/255;
itoa( adcval, buffer, 16);
uart_puts("\n\r adcval ");
uart_puts(buffer);
itoa( spann, buffer, 16);
uart_puts("\n\r spannung ");
uart_puts(buffer);
bportd.bStatus=1; // status merken
}
}
}
else
{
bportd.bPin = 1;
}
}}
uint16_t RADCC(uint8_t mux){
uint8_t i;
uint16_t result =0; // Initialisierung wichtig
ADCSRA = (1<<ADEN) | (1<<ADPS1)| (1<<ADPS2)| (1<<ADPS0); //Prescaler 128 & ADC aktivieren
ADMUX = mux; //Kanalwählen
ADMUX |= (1<<REFS1) |(1<<ADLAR); //VCC = Referenz
ADCSRA |= (1<<ADSC); //adc wandlung
while(!ADCSRA & (1<<ADIF));//Warten
for(i=0;i<4;i++)
{
ADCSRA |= (1<<ADSC); // adc wandlung
while ( ADCSRA & (1<<ADSC) ); // Warten
result += ADCH; // Wandlungsergebnisse addiern
//result += ADCW; //einspricht ADCL + (ADCH <<8);
}
ADCSRA &= ~(1<<ADEN); // ADC deaktivieren
result /= 4; // arithm. Mittelwert
return result;
}
bestendank für eure mühe
sg servusssss
ich lauf wider einmal im kreis. ich versuche die werte des adc auf der RN-control 1.4 auf die uart auszugeben . die uart funktioniert aber die wert vom adc sind irgendwie nicht richtig glaub ich zumindest?
den Port c ist nur zur kontrolle ob der atmel läuft.
Jetzt hat jemand eine ahnung wieso ich solche ergebnise bekomme wie: adcval 5c spannung 1f ? aber am PA6 1,7V sind?
liegt es an der Konvertierung?
sind die werte des ADC falsch?
wenn ja wie sollte man den ADC auswerten?
mit result = ADCH;
oder result = ADCL + (ADCH << 8 );
hier mein quellcode:
#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/signal.h>
#include <string.h>
#include "uart.h"
#ifndef F_CPU
#define F_CPU 16000000UL // 16MHz Taktfrequenz
#endif
/* 9600 baud */
#define UART_BAUD_RATE 9600
#define CR \r\n
#define DELAY_LOOPS 50 // So viele Schleifendurchgaenge lang muss erledigt werden
struct{
uint8_t bPin:1 ; // Aktuelles Signal am Pin (Taster)
uint8_t bStatus:1; // Status des Tasters ob dieser beim voriegen durchlauf gedrückt war!
} bportd;
uint8_t nCounter; // Zähler wie oft der Taster gedrückt war
uint8_t nKeyPress; // Schleifenzähler wie viele Schleifen der Taster schon gedrückt war!
//Prototypen
void init(void);
uint16_t RADCC(uint8_t mux);
int main (void){
// Uart Initalisierung
uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
//Interrupt enable
sei();
// Initialisierung der Register
DDRA = 0x00;
PORTA = 0xff;
DDRC = 0xff;
DDRD = 0x00;
PORTD = 0x01;
// Initialisierung der Varialblen
char buffer[15];
bportd.bPin =1;
bportd.bStatus =0;
nCounter =0;
uint16_t adcval ;
uint16_t spann;
uart_puts("\n\r Test Prog V1.0 RS232 Start\n\r");
for(;;){
if(bit_is_clear (PIND,PIND0)){ // wenn der knopf gedrückt ist logisch 0
if(bportd.bPin){ // wenn der knopf nicht gedrückt war dann wird alles zurückgesetzt!
nCounter =0;
bportd.bPin =0;
bportd.bStatus =0;
}
else if(!bportd.bStatus){ // wenn der knopf immer noch gedrückt
if(++nCounter > DELAY_LOOPS){
nKeyPress++; //zähler erhöhen
PORTC = nKeyPress; // ausgabe am Port c
adcval = RADCC(6); //
spann = (4,88*adcval)/255;
itoa( adcval, buffer, 16);
uart_puts("\n\r adcval ");
uart_puts(buffer);
itoa( spann, buffer, 16);
uart_puts("\n\r spannung ");
uart_puts(buffer);
bportd.bStatus=1; // status merken
}
}
}
else
{
bportd.bPin = 1;
}
}}
uint16_t RADCC(uint8_t mux){
uint8_t i;
uint16_t result =0; // Initialisierung wichtig
ADCSRA = (1<<ADEN) | (1<<ADPS1)| (1<<ADPS2)| (1<<ADPS0); //Prescaler 128 & ADC aktivieren
ADMUX = mux; //Kanalwählen
ADMUX |= (1<<REFS1) |(1<<ADLAR); //VCC = Referenz
ADCSRA |= (1<<ADSC); //adc wandlung
while(!ADCSRA & (1<<ADIF));//Warten
for(i=0;i<4;i++)
{
ADCSRA |= (1<<ADSC); // adc wandlung
while ( ADCSRA & (1<<ADSC) ); // Warten
result += ADCH; // Wandlungsergebnisse addiern
//result += ADCW; //einspricht ADCL + (ADCH <<8);
}
ADCSRA &= ~(1<<ADEN); // ADC deaktivieren
result /= 4; // arithm. Mittelwert
return result;
}
bestendank für eure mühe
sg servusssss