-
        

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: UART empfangen geht nicht

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    01.10.2006
    Beiträge
    19

    UART empfangen geht nicht

    Anzeige

    Hallo Zusammen!

    Meine Funktion getch() soll ein Zeichen über die UART-Schnittstellte einlesen. Jedoch passiert nichts.
    Die Funktion putch() zum senden eines Zeichen geht einwandfrei.

    Kann den Fehler einfach nicht finden. Vielleicht hat ja einer von euch eine Idee?

    Vielen Dank!

    Code:
    #define TAKT 16000000UL
    #define BAUD 9600UL
    #define US1 0xE0
    #define IRM 0
    #define IRR 1
    #define IRL 2
    
    
    
    #include <avr/io.h>         
    #include <util/delay.h>
    #include <stdlib.h>
    #include "Motor/motor.h"
    #include "IR/irmessung.c"
    #include "US/usmessung.c"
    
    
    //----------------------------Fuktionen-----------------------------------------------------------------//
    
    
    //------------UART-Konfig---------------------//
    
    void initusart (void){
    unsigned char x;
    
    UBRRL = (TAKT / (16UL * BAUD)) -1;
    UCSRB |= (1 << TXEN) | (1 << RXEN);
    UCSRC |= (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
    
    
    x = UDR;
    }
    
    
    //------------Char senden---------------------//
    
    void putch (unsigned char x){
    
    while ( ! (UCSRA & (1 << UDRE)));
    
    UDR = x;
    }
    
    //------------Char emfangen---------------------//
    
    unsigned char getch(void){
     
        while (!(UCSRA & (1 << RXC)));
    
        return UDR;
    }
    
    //------------Befehl einlesen---------------------//
    void befehleinlesen (unsigned char *pbefehl, unsigned int anz){
    
    
    unsigned char zwbef=0;
    unsigned char zwerg=0;
    
    
    zwbef=0xFF;
    
    
    *pbefehl = zwbef >> 7;
    
    
    	//Motorbefehl
    	if(*pbefehl == 0x01){
    
    	zwerg=zwbef;
    	zwerg= zwerg & 0x60;
    	*(pbefehl+1)= zwerg >> 5;
    
    	zwerg=zwbef;
    	zwerg=zwerg & 0x10;
    	*(pbefehl+2)= zwerg >> 4;
    
    	zwerg=zwbef;
    	zwerg=zwerg & 0x0F;
    	*(pbefehl+3)= zwerg;
    
    	zwbef=0xFF;
    	*(pbefehl+4)= zwbef;
    	}
    
    	
    	
    	//Sensorbefehl
    	if(*pbefehl == 0x00){
    
    	zwerg=zwbef;
    
    	zwerg= zwerg & 0x70;
    	*(pbefehl+1)= zwerg >> 4;
    	}	
    	
    }
    
    
    
    
    
    
    
    
    //----------------------------Hauptprogramm-------------------------------------------------------------//
    
    
     int main (void){
    	
    	// Variablen
    	unsigned char i=0;
    	unsigned char vor=1;		//Motorrichtung
    	unsigned char rck=0;		//Motorrichtung
    	unsigned char wert=0;		//IR Messwert
    	unsigned char befehl[5];	//Befehlsspeicher
            unsigned char empfang
    	// Programmstart
    	initusart();
    		
    		
    		while(1){
                    empfang=getch();
                    getch();
    		befehleinlesen(befehl,5);
    		_delay_loop_2 (6000);
    		_delay_loop_2 (6000);
    		for(i=0;i<=4;i++) putch(befehl[i]);
    		
    		/*	//IR-Messen
    			wert=irmessung(1);
    			putch(wert);
    			_delay_loop_2 (6000);
    			
    		
    		*/
    			
    		}
    
    return 0;               
    }

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    48
    Beiträge
    524
    Hallo,

    beim ersten drüber schauen fällt auf, dass getch() nie aufgerufen wird.
    Hast du die Hardware geprüft.

    Gruß

    Jens

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554

    Re: UART empfangen geht nicht

    Hallo i-wizard,

    Zitat Zitat von i-wizard
    ... Funktion getch() ... passiert nichts ... putch() zum senden ... geht einwandfrei ...
    Ach wie klingt mir das vertraut. Vor ´nem halben Monat hatte ich ganz genau den gleichen Stand . Trotz meiner Einschätzung, dass mein damaliger Thread nicht lesenswert ist (der Fehler war einfach zuuuuu doof) hilft er Dir vielleicht weiter. Damit will ich nicht sagen, dass Dein Problem doof ist ! ! !
    Ciao sagt der JoeamBerg

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    01.10.2006
    Beiträge
    19
    Wenn ich am Controller den Rx Pin mt einem Oszi beobachte kommt dort ein Signal an. Es muss also ein Softwareproblem sein.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380
    wie Jenso schon bemerkt hat, WO und WIE hast du dein getch denn eingesetzt ? in deinem Quellcode jedenfalls wird es nie verwendet, dein problem ist SO nicht verständlich, poste mal bitte etwas code zu dem wie du es getestet hast

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    01.10.2006
    Beiträge
    19
    So habe mal 2 Variant wie ich getch() einsetzen will eingefügt. Wenn ich es nach der for-SChleife einfüge wird diese 1x durchlaufen.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380
    naja klar, wenn getch() da in der schleife steht wartet er jedesmal das ein byte ankommt, aber WO wertest du denn den "empfang" aus ?

    mach doch mal testhalber ne simple echoschleife

    Code:
    while(1){
       byte empfang = getch();
       putch(empfang);
    }

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    01.10.2006
    Beiträge
    19
    Es soll ja warten bis ein Byte kommt und ganau da liegt das Problem.

    Wenn ich ein Byte sende macht er nicht weiter.


    Das mit der Echo schleife habe ich schon probiert, da kommt nix.


    Das Byte kommt aber elektrisch am Port an, hab das mit dem Oszi nachgemessen.

    Die Fuktion putch() geht einwandfrei!

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    33
    Beiträge
    2.380
    mir ist grade bei deiner init() eine unstimmigkeit aufgefallen, kannst du SICHER sagen das gesendete bytes auch SO ankommen wie sie sollen ?

    Code:
    UBRRL = (TAKT / (16UL * BAUD)) -1;
    
    in 
    
    UBRR = (TAKT / (16UL * BAUD)) -1;
    
    ändern , ist schliesslich ein 16bit register und du spricht nur das low-byte an
    
    versuch auch mal alternativ
    
    UBRRH = (unsigned char)(baud>>8);
    UBRRL = (unsigned char)baud;
    so wird es im datenblatt EMPFOHLEN

    wenn jetzt nix geht, sag mir noch fix welchen prozessor du hast, dann probier ichs selber, prüfe nochmal deine hardware, by the way ... wie sieht DIE eigentlich aus ?

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    01.10.2006
    Beiträge
    19
    Es handelt sich um einen ATmega32 mit 16Mhz.
    Verdrahtungstechnisch scheint alles ok zu sein da ich die Bytes ja am RX -Pin des ATmega32 mit dem Oszi messen kann.

    UBRR geht nicht direkt zu beschreiben. Habe es dann mit deiner Idee des schiebens Probiert also URBBL und URBBH. Wie bisher senden geht immer aber empfangen nicht.

    Was ich noch nicht angemerkthabe: Es hat schon mal funktioniert!

    Danke für die Tipps!!

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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