Hallo an alle
Ich hab nun die A/D Routine fertig geschrieben .
Code:
#include <avr/io.h>
#include <stdlib.h>
#include "wintek2704.h"
void adc_init(void);
int get_adc (void);
void lcd_put_d(uint16_t dec);
int main (void)
{
DDRC &=~ _BV(PC0);
PINC &=~ _BV(PC0);
uint8_t balken3, balken_leer, i, j;
uint16_t ergebnis_display;
uint16_t ergebnis_neu;
adc_init();
lcd_init(LCD_DISP_ON);
lcd_puts(" ADC -- Test\n");
ergebnis_neu = 0;
while(1)
{
ergebnis_display = get_adc();
if (ergebnis_neu > ergebnis_display || ergebnis_neu < ergebnis_display)
{
lcd_gotoxy(0,1);
lcd_puts(" ");
ergebnis_neu = ergebnis_display;
}
lcd_gotoxy(0,1);
lcd_put_d(ergebnis_neu);
balken3 = ergebnis_neu / 37;
balken_leer = 27 - balken3;
lcd_gotoxy(0,2);
for(i = 0; i < balken3; i++)
lcd_puts("=");
for(j = 27; j > balken_leer; j--)
lcd_puts(" ");
}
return(0);
}
void lcd_put_d(uint16_t dec)
{
char buffer[6];
itoa(dec, buffer, 10);
lcd_puts(buffer);
}
void adc_init (void)
{
ADCSR = (1 << ADEN) | (1 << ADPS1) | (1 << ADPS2); //Prescaler = 64 TF = 125 kHz
}
int get_adc (void)
{
uint8_t i;
uint16_t ergebnis_adc;
ADMUX = 0; // Vreff = Vcc
ADCSRA |= (1 << ADSC);
while (!(ADCSRA & (1 << ADIF)));
ergebnis_adc = 0;
for(i = 0; i < 5; i++)
{
ADCSRA |= (1 << ADSC);
while(!(ADCSRA & (1 << ADIF)));
ergebnis_adc += ADC;
}
ergebnis_adc = ergebnis_adc / 5;
return ergebnis_adc;
}
Jedoch überschreibe ich jetzt immer die Zahl vor der Aktualisierung mit 4 leerzeicnen (lcd_puts" "). Denn Wenn ich eine Zahl > 1000 anzeige, bleibt die letzte Stelle hängen wenn der Wert unter 1000 sinkt. Das gleiche bei 100. Deshalb die Überschreibung mit den Leerzeichen.
Gibt es in C ein Möglichkeit die Zahlen formatiert auszugeben zB 0125, 0058, 1024
In Bascom gibt es ja die Funktion FUSING. Gibt es sowas auch in C
Danke im Voraus
Gruß Robert
Lesezeichen