PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : USART/ADC geht nichtmehr sobald etwas an Port angesteckt



GoZu
03.07.2013, 11: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.

oberallgeier
03.07.2013, 11:56
... Wenn ich jetzt irgendwas anstecke ... sendet er entweder gar nichts mehr oder verhält sich komisch ...Klingt mir erstmal ziemlich nach fehlendem GND: Sensorik, Controller(platine) etc. UND RS232-Empfänger müssen einen gemeinsamen GND haben - sonst reagieren die (IMMER!) komisch.

GoZu
03.07.2013, 12:22
Hm naja, ich benutze das STK600, dort ist die RS232 Schnittstelle integriert. Ich habe nur die PINs für ISP und für RX und TX verbunden, aber kein GND oder so, weil das ja schon am STK600 verbunden ist..?

Geistesblitz
03.07.2013, 17:06
Der Gnd sollte dann ja beim ISP-Anschluss dabei sein...hmmm
Wo liegt eigentlich dein Vref dran?

GoZu
03.07.2013, 17:20
Hm, wie meinst du das?

Also mein STK600 siehst so aus:
http://www.mikrocontroller.net/attachment/46828/stk600.jpg

Wie auf dem Bild oben ist ein 8 pol Stecker (2*4) oben (im Bild über Mikrocontroller) bei ISP Programming angesteckt.
Außerdem habe ich noch so ein 2pol Stecker verbunden (wäre auf dem Bild rechts).
Ich glaube von PordD (dort wo RX und TX ist) zu den 2 PINs die ebenfalls rechts sind.

Ansonsten hab ich nirgends was verbunden, auch kein Vref. Meinst du Vref für ADC? Ehrlich gesagt habe ich danach kurz im datenblatt gesucht, konnte es im ersten Moment aber nicht finden und wollte es mal "nur so" probieren, aber kann das daran schuld sein? Bzw. was hat das mit USART zu tun?

Bzw. was ich überhaupt nicht verstehe ist: Warum funktioniert es zuerst, sobald ich etwas verbinde nicht mehr und danach nach einem Mikrocontroller reset immer noch nicht? Warum muss ich den Mikrocontroller dazwischen Neustarten, der kann das doch nicht speichern?

Ich hatte Anfangs auch öfters Probleme mit USART, zuerst habe ich nämlich Strings übertragen und danach eine Zahl und bei der Zahl wurdne immer wieder falsche Zeichen übertragen. Danach habe ich ein sleep von 10ms nach dem Send eingefügt, dann war es weg. Da ich das nicht immer haben wollte habe ich von 1 Stopp-Bit auf 2 Stopp-Bits und von kein parity auf even Parity geändert. baudrate ist 19200. Danach ging die Übertragung (ohne sleep) ohne Fehler.

Kann das wirklich an Vref liegen?

Geistesblitz
03.07.2013, 18:01
Nein, Vref ist nur für die ADCs interessant, weil sich die Spannungsmessung halt auf diese Referenzspannung bezieht. Das mit der USART hört sich tatsächlich ein wenig seltsam an, ich hab keine Ahnung, woran das liegen könnte.

Hubert.G
03.07.2013, 22:12
Du solltest mal ein Poti anstelle des CNY anschließen.
Das du auch nur 500 Messungen machst ist doch auch klar?
Allerdings müsste es nach einem Strom aus oder Reset wieder von vorne beginnen.