HF SHOOTER
10.05.2008, 19:55
Hi,
Ich habe ein Problem. Ich gebe den Wert des ADC auf einem LCD aus.
#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>
#include "adc.h"
#define XTAL 1000000 /**< clock frequency in Hz, used to calculate delay timer */
#include "lcd.h"
#include "lcd.c"
int main()
{
DDRA = 0b11111110; // Nur PA0 Ausgang
adc_init();
lcd_init(LCD_DISP_ON);
uint16_t wert;
char buffer[16];
lcd_puts("Hallo Benny!\n");
while(1)
{
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
lcd_gotoxy(0,1);
lcd_puts(" ");
wert = adc_lesen(2); // PA2 ist Analog
itoa(wert,buffer,10);
lcd_gotoxy(0,1);
lcd_puts(buffer);
}
}
void adc_init (void)
{
ADCSR = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // ADC aktivieren, Vorteiler 8
}
/* AD-Wandlung mit 10bit Genauigkeit durchführen und Mittelwert zurückgeben */
/* Kanal 0 = Poti, 1 = Temp, 2 = Licht und 3 = extern */
uint16_t adc_lesen(uint8_t kanal)
{
uint8_t i;
uint16_t wert;
ADMUX = kanal & 0b00011111; // Kanal waehlen und Bit 7 + 6
// sicher auf 0 setzen, da diese
// für die Referenzspg. zuständig
// sind und bei falsche Einstellung
// kann der MC sonst schaden nehmen!
// Bit 5 immer 0 weil, dieses Bit
// bestimmt ob der Wert verdreht
// abgespeichert wird oder nicht.
/* Mittelwert aus 5 aufeinanderfolgenden Wandlungen bilden */
wert = 0;
for( i=0; i<5; i++ )
{
ADCSR |= (1<<ADSC);
while ( ADCSR & (1<<ADSC) )
{
; // auf Abschluss der Konvertierung warten,
// Alternative zu: asm volatile ("nop");
// und leichter zu erklären ;-)
}
wert += ADCW; // nach jeder Wandlung hinzuaddieren
}
wert /= 5; // Mittelwert bilden
return (wert); // Mittelwert aus den 5 Messungen zurückgeben
}
Wenn ich PA2 an Vcc hänge dann zeigt es auf dem Display einen schwankenden Wert, entweder 1201 oder 2201. Eigentlich müsste doch die Obergrenze bei 1023 liegen.
Hänge ich den PA2 an den Reset (verbunden über 100k mit Vcc, ISP Stecker abgezogen) dann bleibt das Display leer (keine 0).
An Vcc habe ich 4,99V, An Reset habe ich 4,60V.
AVcc und beide GNDs sind angeschlossen. Meiner Meinung nach ist der Code auch richtig.
Was könnte die Ursache sein?
mfg
Benny
Ich habe ein Problem. Ich gebe den Wert des ADC auf einem LCD aus.
#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>
#include "adc.h"
#define XTAL 1000000 /**< clock frequency in Hz, used to calculate delay timer */
#include "lcd.h"
#include "lcd.c"
int main()
{
DDRA = 0b11111110; // Nur PA0 Ausgang
adc_init();
lcd_init(LCD_DISP_ON);
uint16_t wert;
char buffer[16];
lcd_puts("Hallo Benny!\n");
while(1)
{
_delay_ms(100);
_delay_ms(100);
_delay_ms(100);
lcd_gotoxy(0,1);
lcd_puts(" ");
wert = adc_lesen(2); // PA2 ist Analog
itoa(wert,buffer,10);
lcd_gotoxy(0,1);
lcd_puts(buffer);
}
}
void adc_init (void)
{
ADCSR = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // ADC aktivieren, Vorteiler 8
}
/* AD-Wandlung mit 10bit Genauigkeit durchführen und Mittelwert zurückgeben */
/* Kanal 0 = Poti, 1 = Temp, 2 = Licht und 3 = extern */
uint16_t adc_lesen(uint8_t kanal)
{
uint8_t i;
uint16_t wert;
ADMUX = kanal & 0b00011111; // Kanal waehlen und Bit 7 + 6
// sicher auf 0 setzen, da diese
// für die Referenzspg. zuständig
// sind und bei falsche Einstellung
// kann der MC sonst schaden nehmen!
// Bit 5 immer 0 weil, dieses Bit
// bestimmt ob der Wert verdreht
// abgespeichert wird oder nicht.
/* Mittelwert aus 5 aufeinanderfolgenden Wandlungen bilden */
wert = 0;
for( i=0; i<5; i++ )
{
ADCSR |= (1<<ADSC);
while ( ADCSR & (1<<ADSC) )
{
; // auf Abschluss der Konvertierung warten,
// Alternative zu: asm volatile ("nop");
// und leichter zu erklären ;-)
}
wert += ADCW; // nach jeder Wandlung hinzuaddieren
}
wert /= 5; // Mittelwert bilden
return (wert); // Mittelwert aus den 5 Messungen zurückgeben
}
Wenn ich PA2 an Vcc hänge dann zeigt es auf dem Display einen schwankenden Wert, entweder 1201 oder 2201. Eigentlich müsste doch die Obergrenze bei 1023 liegen.
Hänge ich den PA2 an den Reset (verbunden über 100k mit Vcc, ISP Stecker abgezogen) dann bleibt das Display leer (keine 0).
An Vcc habe ich 4,99V, An Reset habe ich 4,60V.
AVcc und beide GNDs sind angeschlossen. Meiner Meinung nach ist der Code auch richtig.
Was könnte die Ursache sein?
mfg
Benny