-         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: RS232 Verbindung zum PC in C

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    04.04.2006
    Beiträge
    11

    RS232 Verbindung zum PC in C

    Anzeige

    Hi!
    Ich habe verzweifelt versucht mit meinem RN-Control mit Atmega32 über RS232 zu kommunizieren. Ich habe viele Möglichkeiten ausprobiert, Tutorials gelesen, aber nix zu laufen gebracht.
    wichtig ist mir, dasss das ganze in C/C++ programmiert ist. hat mir da vielleicht wer was?
    Gruß und thx
    ciruz

  2. #2
    Gast
    Versuchs mal in Bascom mit Print und Input

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    46
    Beiträge
    2.236
    Tolle Antwort Gast....

    @ciruz, was hast Du bis jetzt versucht?
    schick mal irgendein Code, dann können wir gucken, was da Faul ist.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    04.04.2006
    Beiträge
    11
    Hi!
    Leider lag das Wekzeug brach übers lange Wochenende...
    Hier ist einer der Codes mit denen ichs versucht hab:

    Code:
    /****************************************************************************
        UART.c
        ------
        Übungsprojekt zum Empfang von Daten mit dem UART.
        Eine LED an Pin 0 von Port C soll gesteuert werden beim Empfang folgender
        Zeichen:
            '1' - LED ein.
            '0' - LED aus.
    
    
        Autor:    Christian Schifferle
        Datum:    November 2002
        Software: AVR-GCC
        needed
    ****************************************************************************/
    
    #include <io.h>	// Wir brauchen Zugriff auf die I/O's des Controllers
    
    #define F_CPU            8000000      /* 8Mhz */
    #define UART_BAUD_RATE      9600      /* 9600 baud */
    
    // Berechnung des Inhalts des UBBR-Registers
    #define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16l)-1)
    
    // Datentypdefinitionen
    typedef unsigned char	BYTE;
    typedef unsigned short	WORD;
    
    
    
    int main (void)
    /****************************************************************************
        Hier ist der Programmeinstiegspunkt.
    */
    {
        /* UART Control Register laden. Wir verwenden (noch)
           keine Interrupts. Hier wollen wir nur empfangen, also wird
           nur das Receiver Enable Flag gesetzt. */
        outp ((1 << RXEN), UCSRB);
    
        /* Baudrate einstellen */
    	outp ((BYTE) 0x00, UBRRH);
        outp ((BYTE) UART_BAUD_SELECT, UBRRL);          
    
    
        // Port B als Ausgang konfigurieren
        outp (0xff, DDRC);
    	PORTC=0xff;
    	
        // Hier machen wir einmal etwas anderes zur Realisierung der
        // Endlosschleife. Wir setzen zu Beginn der Schleife ein Label.
        // Am Schleifenende springen wir direkt zu diesem Label.
        // Nicht schön, aber unheimlich schnell.
    LOOP:
        // Prüfen, ob ein Zeichen empfangen wurde.
    
        if (inp (UCSRA) & (1 << RXC)) {     // Bit RXC im USR gesetzt ?
            switch (inp (UDR)) {          // Datenregister auslesen
                case '0': // LED einschalten
                    sbi (PORTC, PINC0);
                    break;
                case '1': // LED ausschalten
                    cbi (PORTC, PINC0);
                    break;
                default:  // Bei allen anderen Zeichen nichts tun
                    break;
        }
    }
        
    goto LOOP;
    
    } /* end of main */
    Ich bin mir nicht sicher ob die Register alle korrekt benannt sind. Ansonsten hab ich kein Plan warums net läuft...
    thx schonmal
    gruz ciruz

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    32
    Beiträge
    795
    Hi,

    Hier Codes für den Mega32 UART:

    hier drei Funktionen (uart.c):

    Code:
    void UART_init(void){  
        UBRRL |= (uint8_t) UART_BAUD_SELECT; 
    	UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
    	UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    } 
    
    void UART_transmit(uint8_t c){ 
       while(!(UCSRA & (1<<UDRE)));
       UDR = c; 
    } 
    
    void UART_transmit_string(uint8_t *string){ 
        while(!(UCSRA & (1<<UDRE)));
    	while( *string){ UART_transmit (*string++); }
    }
    UART_init(); Den UART Einschalten, hier wird auch der Empfangsinterrupt aktiviert. Dein Hauptprogramm muss dann so aussehen:

    Code:
    // AVR-Includes
    #include <avr/io.h> 
    #include <avr/interrupt.h> 
    #include <avr/signal.h> 
    
    // Programm-Includes
    #include <uart.c>   // Oder die obigen Funktionen hinschreiben...
    
    SIGNAL( SIG_UART_RECV ) { /*hier was beim Enpfang geschehen soll*/ } 
    
    int main (void){
    
    sei();     // Interrups global aktivieren
    UART_init();   // UART init funktion ausführen
    
    
    while(1){
     /*HAUPTSCHLEIFE*/
    
    }
    }
    Gruß,
    Franz

  6. #6
    Gast
    Vielen Dank schonmal, aber leier kriege ich auch das nich zum laufen...

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Wo setzt du denn das Dateformat? Üblich ist 8N1, das wird nirgends eingestellt.
    Disclaimer: none. Sue me.

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    04.04.2006
    Beiträge
    11
    ok, und wie stelle ich das ein?

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    32
    Beiträge
    795
    http://www.atmel.com/dyn/resources/p...ts/doc2503.pdf


    Seite 140 bis 168 befasst sich mit dem USART (~UART);

    Auf Seite 162 und 163 ist CONTROL/STATUS Register C beschrieben.
    Gruß,
    Franz

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    04.04.2006
    Beiträge
    11
    Dank auch an dich, aber mit dem Datenblatt hatte ich michauch bereits beschäftigt.
    Hat denn keiner ein in C geschriebenes Prog für RN-Control das einfach läuft?
    Ich habe auch schon mehr als den oben geposteten Code probiert, ich kriegs aber einfach nicht auf die Reihe in C. In Bascom hab ichs zwar hinbekommen, allerdings wär mir C halt schon lieber...
    Gruß

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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