havana
16.06.2012, 17:47
Hej! Hab mich die Tage hingesetzt und versucht meine alte Gameboy-Kamera auszulesen, aber es klappt nicht und wird mit der Zeit immer frustrierender :strom. Ich bekomme als Bild einen Weiß nach Schwarz Verlauf nach der ersten Auslesung, darauf folgende Auslegungen liefern nahe komplett schwarze Bilder zurück. Ich habe probeweise den AD-Wandler mit der Masse verbunden bekomme aber nicht 0 zurück. Ich denke, da stimmt irgendwas nicht. Kann man den AD-Wandler durch falsche Konfiguration kaputt machen (z.B. als Referenzspannung 2,56 V wählen, aber bis zu 5 V anschließen)? Habe nämlich irwann nach bester Try-And-Error Manier alle möglichen Spannungsreferezen durchprobiert. Anbei mein Code um den Wandler auszulesen und die Daten über RS232 an den PC zu schicken:
Ausschnitt aus main.c:
// Init UART
uart_init();
// Init AD converter (prescaler 64, AVCC, channel 0)
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1);
ADMUX = (1 << REFS0) | (1 << MUX0);
// Dummy read
ADCSRA |= (1 << ADSC);
while (ADCSRA & (1 << ADSC));
while (1) {
// Read
ADCSRA |= (1 << ADSC);
while (ADCSRA & (1 << ADSC));
uart_writec(ADCL);
uart_writec(ADCH);
// Wait 1 second
_delay_ms(2000);
}
Ausschnitt aus uart/uart.h
// Write function
static inline uint8_t uart_writec(uint8_t c) {
/* Wait until transmit buffer (UDR) is empty */
while (!(UCSRA & (1 << UDRE)));
/* Write output */
UDR = c;
return 1;
}
Ausschnitt aus uart.c:
void uart_init(void) {
uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU / (16 * UART_BAUDRATE) - 1);
UBRRH = (uint8_t) (ubrr >> 8);
UBRRL = (uint8_t) (ubrr);
/* Enable receiver and transmitter */
UCSRB = (1 << RXEN) | (1 << TXEN);
/* 8N1, no parity */
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
/* Do initial flush */
uart_flush();
}
Passt das soweit? Oder habe ich tatsächlich falsch programmiert? Als Ergebnis bekomme ich hier beispielsweise 635d, wenn ich den AD-Eingang mit der Masse verbinde, oder 357d wenn ich den Eingang mit 5V verbinde. Die Ergebnisse schwanken aber +/- 20d.
Ausschnitt aus main.c:
// Init UART
uart_init();
// Init AD converter (prescaler 64, AVCC, channel 0)
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1);
ADMUX = (1 << REFS0) | (1 << MUX0);
// Dummy read
ADCSRA |= (1 << ADSC);
while (ADCSRA & (1 << ADSC));
while (1) {
// Read
ADCSRA |= (1 << ADSC);
while (ADCSRA & (1 << ADSC));
uart_writec(ADCL);
uart_writec(ADCH);
// Wait 1 second
_delay_ms(2000);
}
Ausschnitt aus uart/uart.h
// Write function
static inline uint8_t uart_writec(uint8_t c) {
/* Wait until transmit buffer (UDR) is empty */
while (!(UCSRA & (1 << UDRE)));
/* Write output */
UDR = c;
return 1;
}
Ausschnitt aus uart.c:
void uart_init(void) {
uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU / (16 * UART_BAUDRATE) - 1);
UBRRH = (uint8_t) (ubrr >> 8);
UBRRL = (uint8_t) (ubrr);
/* Enable receiver and transmitter */
UCSRB = (1 << RXEN) | (1 << TXEN);
/* 8N1, no parity */
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
/* Do initial flush */
uart_flush();
}
Passt das soweit? Oder habe ich tatsächlich falsch programmiert? Als Ergebnis bekomme ich hier beispielsweise 635d, wenn ich den AD-Eingang mit der Masse verbinde, oder 357d wenn ich den Eingang mit 5V verbinde. Die Ergebnisse schwanken aber +/- 20d.