- 3D-Druck Einstieg und Tipps         
Seite 4 von 5 ErsteErste ... 2345 LetzteLetzte
Ergebnis 31 bis 40 von 44

Thema: RP6_M32 - M32 soll das was per uart geschick wird im Display ausgeben !?!

  1. #31
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Anzeige

    Praxistest und DIY Projekte
    Der USART kann einen Interrupt auslösen, wenn er ein Zeichen empfangen hat:
    http://www.rn-wissen.de/index.php/UA...Mit_Interrupts
    http://www.tschallener.net/AVR/intr_usart.pdf

    Der RP6 verwendet das offensichtlich schon in seiner Lib:
    Code:
    /**
     * UART receive ISR.
     * Handles reception to circular buffer.
     */
    ISR(USART_RXC_vect)
    {	
    	static volatile uint8_t dummy;
    	if(((uint8_t)(write_size - read_size)) < UART_RECEIVE_BUFFER_SIZE) {
    		uart_receive_buffer[write_pos++] = UDR;
    		write_size++;
    		if(write_pos > UART_RECEIVE_BUFFER_SIZE) 
    			write_pos = 0;
    	}
    	else {	
    		dummy = UDR;
    		uart_status = UART_BUFFER_OVERFLOW;
    	}
    }
    (Aus RP6uart.c)

    In RP6RobotBaseLib.c wird in initRobotBase() der entsprechende Receive-Interrupt freigegeben:

    UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE);
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  2. #32
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.04.2009
    Beiträge
    523
    Naja, das ist simple Stringverarbeitung... Das hat erstmal nichts mit dem RP6 zu tun sondern ist einfach Grundlagenwissen in C#.
    Guck dir mal die Methoden an, die ein String bereitstellt...

  3. #33
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.07.2010
    Ort
    Aachen ---- NRW
    Beiträge
    251
    @radbruch

    Senden tuht er jetzt ununterbrochen (soll ja auch so sein!)
    Aber er "hört" nicht auf mich... und die Servos gehen in die MAX stellung?!?

    Code:
        void task_befehle(void)
        {
            char uart_receive_buffer[UART_RECEIVE_BUFFER_SIZE+1];
    
            uint8_t uart_status;
            uint8_t read_pos = 0;
            uint8_t write_pos = 0; 
            uint8_t read_size = 0;
            uint8_t write_size = 0;
    
            static  uint8_t dummy;
            if(((uint8_t)(write_size - read_size)) < UART_RECEIVE_BUFFER_SIZE) 
            {
                uart_receive_buffer[write_pos++] = UDR;
                write_size++;
                if(write_pos > UART_RECEIVE_BUFFER_SIZE) 
                write_pos = 0;
                uart_status = UART_BUFFER_OK;
            }        
            else
            {    
            dummy = UDR;
            uart_status = UART_BUFFER_OVERFLOW;
            }
    
    
            long pos = atoi(uart_receive_buffer);
    
    
                if(pos < 180 && pos > 0)
                {
                    servo1_position =  pos;
                }        
                else
                    if(pos < 360 && pos > 180)
                    {
                        servo2_position =  pos - 180;
                    }
                    else
                        if(pos < 540 && pos > 360)
                        {
                            servo3_position =  pos - 360;
                        }
                        else
                            if(pos == -1)
                            {
                                I2CTWI_transmitByte(PCF, 0);
                            }
                            else
                                if(pos == -2)
                                {
                                    I2CTWI_transmitByte(PCF, 3);
                                }
            }

  4. #34
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.04.2009
    Beiträge
    523
    Okay, was soll das denn mal werden? Das sieht mir irgendwie schwer kompliziert aus...
    Aber du hast meinen Tipp imernoch nicht berücksichtigt. Du liest immer nur das erste Zeichen aus.
    Dann stellst du sofort deinen Servo auf dieses erste Zeichen. Du musst erst warten, bis die komplette Zahl übertragen wurde.

  5. #35
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.07.2010
    Ort
    Aachen ---- NRW
    Beiträge
    251
    Das sieht mir irgendwie schwer kompliziert aus...
    Ja, finde ich auch!

    Du liest immer nur das erste Zeichen aus.
    Dann stellst du sofort deinen Servo auf dieses erste Zeichen. Du musst erst warten, bis die komplette Zahl übertragen wurde.
    Das ist das Problem, wenn ich "while(!Eingabe());" schreibe blockiert das solange die while-schleife bis ich was vom Pc schicke!

  6. #36
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.04.2009
    Beiträge
    523
    Nur mal so als Anregung... Aus meinem eigenen Code...
    Code:
    if(getBufferLength()) 
        {
            char tmp = readChar(); 
            if (tmp =='#') 
            {
                mSleep(10); 
                counter = 0; 
            }
            text[counter] = tmp; 
            text[counter + 1] = '\0';
            counter++;
        }
        int cmd = getCommand();     
        if(cmd)
        {     
              [..]
        }

  7. #37
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.07.2010
    Ort
    Aachen ---- NRW
    Beiträge
    251
    Also muss man nur
    Code:
      if(cmd)     {                [..]     }
    dahintermachen?

    So klappt es nicht:

    Code:
        void lesen(void)
        {
                char text[50];
                int counter = 0;
    
            if(getBufferLength()) 
            {
                char tmp = readChar(); 
                if (tmp =='\n') 
                {
                    mSleep(10); 
                    counter = 0; 
                }
                text[counter] = tmp; 
                text[counter + 1] = '\0';
                counter++;
                }
                 long cmd = atoi(text);
                if(cmd)
                {     
                      if(cmd == -1)
                            {
                                I2CTWI_transmitByte(PCF, 0);
                            }
                            else
                                if(cmd == -2)
                                {
                                    I2CTWI_transmitByte(PCF, 3);
                                }
                }
        }

  8. #38
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    Ganz allgemeiner Tipp (ohne den Code nachvollzogen zu haben):
    Sinnvolle TEXTAUSGABEN zum debuggen in den Code reinmachen damit Du sehen kannst was wo wie passiert.
    Auch die Werte ausgeben lassen mit writeInteger und writeString ...

    MfG,
    SlyD

  9. #39
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    21.04.2009
    Beiträge
    523
    Nein, du hast einen ganz wichtigen (eigentlich den WICHTIGSTEN) Teil des Codes gerade gelöscht :P
    Du must nun eine Funktion getCommand() schreiben, die den übertragenen String in einen Befehl umwandelt

  10. #40
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.07.2010
    Ort
    Aachen ---- NRW
    Beiträge
    251
    Zitat Zitat von Fabian E. Beitrag anzeigen
    Du must nun eine Funktion getCommand() schreiben, die den übertragenen String in einen Befehl umwandelt
    Ich brauche doch nur die Zahl, die ich per UART schicke!

    Habs so versucht, klappt nicht:

    Code:
        char Buffer[UART_RECEIVE_BUFFER_SIZE + 1];
    
        uint32_t Eingabe(void){
    
                static buffer_pos = 0;
                
                if(getBufferLength())
                {
                    Buffer[buffer_pos]=readChar();
    
                if(Buffer[buffer_pos]=='\n')
                {
                    buffer_pos = 0;
    
                return 1;
                }
            
                else if(buffer_pos >= UART_RECEIVE_BUFFER_SIZE) 
                {
                    buffer_pos = 0;
    
                return 2;
                }
                
                buffer_pos++;
                }    
        return 0;
    }
    
        void task_befehle(void)
        {
            Eingabe();
            if(Eingabe())
            {
                long pos = atoi(Buffer);
    
        
                    if(pos < 180 && pos > 0)
                    {
                        servo1_position =  pos;
                    }
                    else
                        if(pos < 360 && pos > 180)
                    {
                        servo2_position =  pos - 180;
                    }
                        else
                            if(pos < 540 && pos > 360)
                        {
                            servo3_position =  pos - 360;
                        }
                            else
                                if(pos == -1)
                                {
                                    I2CTWI_transmitByte(PCF, 0);
                                }
                                else
                                    if(pos == -2)
                                    {
                                        I2CTWI_transmitByte(PCF, 3);
                                    }
            }
            
        }
    Edit:
    hab mir mal den wert von pos anzeigen lassen, ist wenn ich eine zahl sende, sendet er mir das zurück! Wenn ich mehrer Zahlen sende macht er nicht!

    Edit2: Vielleicht mache ich es doch wie Fabian! @Fabian E. was sendes du denn von pc aus?
    Geändert von AsuroPhilip (05.06.2011 um 12:31 Uhr)

Seite 4 von 5 ErsteErste ... 2345 LetzteLetzte

Ähnliche Themen

  1. Asuro soll an Matlab ausgeben
    Von blueyo im Forum Asuro
    Antworten: 1
    Letzter Beitrag: 05.03.2011, 19:14
  2. Antworten: 75
    Letzter Beitrag: 12.12.2010, 21:34
  3. Antworten: 13
    Letzter Beitrag: 21.11.2010, 18:41
  4. Crash Bobby soll Text auf Monitor ausgeben
    Von palermo im Forum Sonstige Roboter- und artverwandte Modelle
    Antworten: 7
    Letzter Beitrag: 11.12.2006, 14:09
  5. Asuro soll Text ausgeben :D
    Von R3ð_BuLL© im Forum Asuro
    Antworten: 4
    Letzter Beitrag: 09.11.2006, 10:26

Berechtigungen

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

Labornetzteil AliExpress