GoZu
03.07.2013, 12:05
Hallo,
folgendes Problem:
Ich habe ein kleines Testprogramm, das sendet Daten per USART mit auf den Computer und ich möchte per ADC Analoge Werte messen und am PC dann in der Konsole sehen.
Wenn nichts an PORTA angesteckt ist (atmega32) dann bekomme ich sowas wie:
Test280\n
Test279\n
Test280\n
Test280\n
Test281\n
usw.
Also alles im Bereich 280.
Wenn ich jetzt irgendwas anstecke (ich möchte mit CNY70 Sensor den Untergrund erkennen), dann sendet er entweder gar nichts mehr oder verhält sich komisch. Also zuerst habe ich die Stromversorung +5V und GND auch angesteckt (bei meinem STK600 Board ist bei allen Ports auch ein VTG und GND), da kam dann gar nichts mehr in der Konsole an. (das kann ich mir noch dmait erklären, dass das Board vielleicht zu viel Strom zieht.)
Aber wenn ich danach dann das Board (die +5V und GND) abgesteckt habe und das Board resetet habe, kam auch wieder gar nichts. Erst nachdem ich den mikrocontroller neu programmiert habe. Warum ist das so?
Und Danach habe ich das gleiche probiert mit Pin0 angesteckt am Sensoren (Bild zur Sensor Schaltung ist am Ende) und da kam auch wieder keine Antwort bzw. wenn ich dann das stk600 neugestartet habe, kam immer nur ein einziges mal "Test1024\n" und danach kam nichts mehr. (auch wenn dann der Pin schon ausgesteckt war, es ging erst wieder nach dem neuprogrammieren des Mikrocontrollers).
Danach habe ich nochmal den Mikrocontroller neu programmiert, alles abgesteckt und gestartet. Dann kam wieder Test280\n usw. und ich habe mit dem Finger mal auf den Pin gegriffen (darf ich das machen, oder zerstört das den Mikrocontroller bzw. das Board?) da wurden die Werte dann niedriger also Test140\n usw. und als ich bisschen leichten Druck gegeben habe, wurde der Wert auf ca. 580 erhöht und ab 580 ist er wieder hängen geblieben und hat nichts mehr gemacht.
Anbei mal mein Code + Schaltung:
Schaltung:
http://www.kreatives-chaos.com/images/122.png
(Nur der rechte Teil, also ich habe es ohne dem Transistor vor VCC gemacht, müsste dementsprechend das Board anscheinend an einer externen Stromversorung anschließen (ich lasse die LEDs immer leuchten).
Code:
int main (void)
{
board_init();
char int_buffer[7]; // Int goes up to 32767 => 5 digits, 1 digit sign and 1 byte nullbyte
usart_init();
adc_init();
int i;
_delay_ms(500); // Give it some time for init
for(int i = 0; i < 500; ++i) {
usart_send_str("Test\n");
i = adc_read();
itoa( i, int_buffer, 10); // convert interger into string (decimal format)
usart_send_str(int_buffer);
usart_send_str("\n");
_delay_ms(1000);
}
}
void usart_init(void)
{
// Baudrate einstellen
UBRRH = (uint8_t) ((F_OSC / (BAUD_RATE * 16L) - 1)>>8);
UBRRL = (uint8_t) (F_OSC / (BAUD_RATE * 16L) - 1);
//Stelle Frameformat ein: 8 bit, 2 Stop, Parity ODD
UCSRC = (1 << URSEL) | (3 << UCSZ0) | (1 << UPM0) | (1 << UPM1) |(1 << USBS);
//Doppelte Geschwindigkeit
//UCSRA |= (1 << U2X);
// Schalte Senden und Empfangen ein
UCSRB = (1 << RXCIE) | (1 << TXEN) | (1 << RXEN); // Aktiviere USART Interrupt
}
void usart_send(uint8_t data)
{
// Warte bis Übertragungs-Puffer leer ist (letzte Übertragung fertig ist)
while (!(UCSRA & (1<<UDRE)));
//Übergebene Daten in Data-Register geben (Daten übertragen)
UDR = data;
}
void usart_send_str(char *str) {
for(unsigned int i = 0; i < strlen(str); ++i) {
usart_send(str[i]);
}
}
void adc_init(void) {
// Activate ADC with Prescaler 16 --> 1Mhz/16 = 62.5kHz
ADCSRA = _BV(ADEN) | _BV(ADPS2);
}
int adc_read(void) {
// Select pin ADC0 using MUX
ADMUX = 0;
//Start conversion
ADCSRA |= _BV(ADSC);
// wait until converstion completed
while (ADCSRA & _BV(ADSC) ) {}
// get converted value
return ADCW;
}
Kann mir jemand helfen?
edit:
Achja, fast vergessen zu sagen: Das board funktioniert, also wenn ich das an eine externe Stromversorgung anschließe und per Multimeter die Spannung der Sensoren messe, dann ist der Wert zwischen 0,4 und 4,4 V je nach Untergrund.
folgendes Problem:
Ich habe ein kleines Testprogramm, das sendet Daten per USART mit auf den Computer und ich möchte per ADC Analoge Werte messen und am PC dann in der Konsole sehen.
Wenn nichts an PORTA angesteckt ist (atmega32) dann bekomme ich sowas wie:
Test280\n
Test279\n
Test280\n
Test280\n
Test281\n
usw.
Also alles im Bereich 280.
Wenn ich jetzt irgendwas anstecke (ich möchte mit CNY70 Sensor den Untergrund erkennen), dann sendet er entweder gar nichts mehr oder verhält sich komisch. Also zuerst habe ich die Stromversorung +5V und GND auch angesteckt (bei meinem STK600 Board ist bei allen Ports auch ein VTG und GND), da kam dann gar nichts mehr in der Konsole an. (das kann ich mir noch dmait erklären, dass das Board vielleicht zu viel Strom zieht.)
Aber wenn ich danach dann das Board (die +5V und GND) abgesteckt habe und das Board resetet habe, kam auch wieder gar nichts. Erst nachdem ich den mikrocontroller neu programmiert habe. Warum ist das so?
Und Danach habe ich das gleiche probiert mit Pin0 angesteckt am Sensoren (Bild zur Sensor Schaltung ist am Ende) und da kam auch wieder keine Antwort bzw. wenn ich dann das stk600 neugestartet habe, kam immer nur ein einziges mal "Test1024\n" und danach kam nichts mehr. (auch wenn dann der Pin schon ausgesteckt war, es ging erst wieder nach dem neuprogrammieren des Mikrocontrollers).
Danach habe ich nochmal den Mikrocontroller neu programmiert, alles abgesteckt und gestartet. Dann kam wieder Test280\n usw. und ich habe mit dem Finger mal auf den Pin gegriffen (darf ich das machen, oder zerstört das den Mikrocontroller bzw. das Board?) da wurden die Werte dann niedriger also Test140\n usw. und als ich bisschen leichten Druck gegeben habe, wurde der Wert auf ca. 580 erhöht und ab 580 ist er wieder hängen geblieben und hat nichts mehr gemacht.
Anbei mal mein Code + Schaltung:
Schaltung:
http://www.kreatives-chaos.com/images/122.png
(Nur der rechte Teil, also ich habe es ohne dem Transistor vor VCC gemacht, müsste dementsprechend das Board anscheinend an einer externen Stromversorung anschließen (ich lasse die LEDs immer leuchten).
Code:
int main (void)
{
board_init();
char int_buffer[7]; // Int goes up to 32767 => 5 digits, 1 digit sign and 1 byte nullbyte
usart_init();
adc_init();
int i;
_delay_ms(500); // Give it some time for init
for(int i = 0; i < 500; ++i) {
usart_send_str("Test\n");
i = adc_read();
itoa( i, int_buffer, 10); // convert interger into string (decimal format)
usart_send_str(int_buffer);
usart_send_str("\n");
_delay_ms(1000);
}
}
void usart_init(void)
{
// Baudrate einstellen
UBRRH = (uint8_t) ((F_OSC / (BAUD_RATE * 16L) - 1)>>8);
UBRRL = (uint8_t) (F_OSC / (BAUD_RATE * 16L) - 1);
//Stelle Frameformat ein: 8 bit, 2 Stop, Parity ODD
UCSRC = (1 << URSEL) | (3 << UCSZ0) | (1 << UPM0) | (1 << UPM1) |(1 << USBS);
//Doppelte Geschwindigkeit
//UCSRA |= (1 << U2X);
// Schalte Senden und Empfangen ein
UCSRB = (1 << RXCIE) | (1 << TXEN) | (1 << RXEN); // Aktiviere USART Interrupt
}
void usart_send(uint8_t data)
{
// Warte bis Übertragungs-Puffer leer ist (letzte Übertragung fertig ist)
while (!(UCSRA & (1<<UDRE)));
//Übergebene Daten in Data-Register geben (Daten übertragen)
UDR = data;
}
void usart_send_str(char *str) {
for(unsigned int i = 0; i < strlen(str); ++i) {
usart_send(str[i]);
}
}
void adc_init(void) {
// Activate ADC with Prescaler 16 --> 1Mhz/16 = 62.5kHz
ADCSRA = _BV(ADEN) | _BV(ADPS2);
}
int adc_read(void) {
// Select pin ADC0 using MUX
ADMUX = 0;
//Start conversion
ADCSRA |= _BV(ADSC);
// wait until converstion completed
while (ADCSRA & _BV(ADSC) ) {}
// get converted value
return ADCW;
}
Kann mir jemand helfen?
edit:
Achja, fast vergessen zu sagen: Das board funktioniert, also wenn ich das an eine externe Stromversorgung anschließe und per Multimeter die Spannung der Sensoren messe, dann ist der Wert zwischen 0,4 und 4,4 V je nach Untergrund.