-         

Ergebnis 1 bis 7 von 7

Thema: USART/ADC geht nichtmehr sobald etwas an Port angesteckt

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    31.03.2009
    Beiträge
    44

    USART/ADC geht nichtmehr sobald etwas an Port angesteckt

    Anzeige

    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:

    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.

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.557
    ... 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.
    Ciao sagt der JoeamBerg

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    31.03.2009
    Beiträge
    44
    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..?

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    16.03.2011
    Ort
    Dresden
    Alter
    30
    Beiträge
    1.937
    Der Gnd sollte dann ja beim ISP-Anschluss dabei sein...hmmm
    Wo liegt eigentlich dein Vref dran?

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    31.03.2009
    Beiträge
    44
    Hm, wie meinst du das?

    Also mein STK600 siehst so aus:
    http://www.mikrocontroller.net/attac...828/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?

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Geistesblitz
    Registriert seit
    16.03.2011
    Ort
    Dresden
    Alter
    30
    Beiträge
    1.937
    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.

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.186
    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.
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

Ähnliche Themen

  1. Atmega8 ADC USART
    Von Just_Indes im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 25.04.2010, 10:03
  2. Prüfungstress, Usart geht nicht
    Von SebZilla im Forum AVR Hardwarethemen
    Antworten: 21
    Letzter Beitrag: 14.06.2009, 09:06
  3. LCD geht an PORT B & C, aber nicht an PORT D?
    Von PeterJ im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 4
    Letzter Beitrag: 07.02.2006, 14:30
  4. ADC und USART über Register?!
    Von BASTIUniversal im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 29.04.2005, 14:28
  5. AD Port am Mega 8 etwas merkwürdig
    Von Frank im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 02.07.2004, 01:30

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •