ich weis ich weis doppelpost, aber cih hab ne neue frage
wie stelle ich den controller ein, dass er nur 8bit ADC wandelt statt 12bit ?
ich datenblatt steht, dass ich so die ADC clock höher schrauben kann , aber nicht WIE ich ihn auf 8bit reduziere
im moment häng ich bei ADC prescaler 8 fest, alles darunter ergibt keine normal berechnbare frequenz mehr, da müsste ich die werte erst eineichen!
oder kann das an der geschwindigkeit liegen, dass ich vielleicht die interrupts verschleppe ?
Code:
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned char tval;
unsigned char adcval[923];
unsigned char* end;
unsigned char* pos;
ISR(SIG_OUTPUT_COMPARE0)
{
cli();
if (tval++ > 125) {
TIMSK &= ~(1<<OCIE0);
while (!(UCSRA & (1<<UDRE)));
UDR = 'A';
while (!(UCSRA & (1<<UDRE)));
UDR = 'D';
while (!(UCSRA & (1<<UDRE)));
UDR = 'C';
while (!(UCSRA & (1<<UDRE)));
UDR = '\r';
ADCSRA |= (1<<ADIE);
}
sei();
}
ISR(SIG_ADC)
{
*pos = ((unsigned char)(ADC/16))+'!';
pos++;
if (pos > end) {
ADCSRA &= ~((1<<ADEN) | (1<<ADIE));
while (!(UCSRA & (1<<UDRE)));
UDR = 'F';
while (!(UCSRA & (1<<UDRE)));
UDR = 'I';
while (!(UCSRA & (1<<UDRE)));
UDR = 'N';
while (!(UCSRA & (1<<UDRE)));
UDR = '\r';
pos = adcval;
do {
while (!(UCSRA & (1<<UDRE)));
UDR = *pos;
while (!(UCSRA & (1<<UDRE)));
UDR = '\r';
} while (pos++ < end);
}
}
ISR(SIG_UART_RECV)
{
}
ISR(SIG_UART_TRANS)
{
}
int main()
{
end = &(adcval[922]);
pos = adcval;
tval = 1;
UBRRH = 0;
UBRRL = 25;
UCSRC = (1<<USBS) | (1<<UCSZ1) | (1<<UCSZ0) | (1<<URSEL);
UCSRB = (1<<RXEN) | (1<<TXEN);
while (!(UCSRA & (1<<UDRE)));
UDR = 'S';
while (!(UCSRA & (1<<UDRE)));
UDR = 't';
while (!(UCSRA & (1<<UDRE)));
UDR = 'a';
while (!(UCSRA & (1<<UDRE)));
UDR = 'r';
while (!(UCSRA & (1<<UDRE)));
UDR = 't';
while (!(UCSRA & (1<<UDRE)));
UDR = '\n';
while (!(UCSRA & (1<<UDRE)));
UDR = '\r';
TCNT0 = 0;
OCR0 = 124;
TCCR0 = (1<<WGM01) | (1<<CS02) | (1<<CS00);
ADMUX = (1<<REFS0);
ADCSRA = (1<<ADPS1) | (1<<ADPS0) | (1<<ADEN) | (1<<ADATE);
ADCSRA |= (1<<ADSC);
TIMSK = (1<<OCIE0);
sei();
while(1);
return 0;
}
der code ist momentan noch frickelage und auf hyperterminal abgestimmt, ich schreibe die werte in einen textdatei und importier die werte in eine excel tabelle um sie wie oben zu sehen auszuwerten
ich will den code so bauen dass ich 5 mal pro sekunde eine aufzeichnung von 923 byte mache (beim niedrigsten "unerreichbaren" prescalewert müssten das 1,5 perioden sein bei 1kHz) und dann die daten per comport versende also 5 * 923byte * 10bit = 46150Baud
das ganze dann verbunden mit nem kleinen programm wass dann die parameter für die messung festlegt und die daten grafisch auswertet, vll. setz ich das programm auf nen 2ten mega mit LCD um der es dann darstellt (quasi tragbar machen)
hat jemand verbesserungsvorschläge ?
Lesezeichen