-         

Ergebnis 1 bis 9 von 9

Thema: IR-Abstandsmessung (von waste) und SerWrite: Problem

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    14.07.2004
    Beiträge
    23

    IR-Abstandsmessung (von waste) und SerWrite: Problem

    Anzeige

    Hallo,

    Ausro ist mittlerweile modifiziert und kann per IR Abstände bestimmen. Diese würde ich gerne per IR versenden. Dazu wandle ich den Inhalt von OCR2 um und versende ihn mittels SerWrite. Damit SerWrite noch funktioniert, setzte ich vorher wieder OCR2 = 0x91.
    Das Problem: nach SerWrite funktioniert die IR-Abstandserkennung nicht mehr! Was macht SerWrite "kaputt", bzw. was muss ich wieder setzen damit die IR-Abstandserkennung wieder funktioniert?

    Hans

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    ich vermute dass das etwas mit der konfiguration der prots zu tun hat. schau mal in die asuro.c rein was bei serwrite eigentlich passiert. soweit ich weis, wird für serwrite licht mit 36000Hz modulierung benutzt, und damit wirst du keinen abstand messen können.
    kleinschreibung ist cool!

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Und man muss wahrscheinlich den UART Transmitter und Receiver wieder deaktivieren, damit der Port per Software gesteuert werden kann.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    14.07.2004
    Beiträge
    23
    Hi,

    damaltor:
    an der Frequenz liegt es nicht, da ich ja durch beschreiben des OCR2 Registers den Original Wert wiederherstelle. Wenn ich mir die Funktion allerdings so ansehe:
    Code:
    /* function for serial communication */
    void SerWrite(unsigned char *data,unsigned char length)
    {
    	unsigned char i = 0;
    	UCSRB = 0x08; // enable transmitter
    	while (length > 0) {
    		if (UCSRA & 0x20) { // wait for empty transmit buffer
    			UDR = data[i++];
    			length --;
    		}
    	}
    	while (!(UCSRA & 0x40)); 
    	for (i = 0; i < 0xFE; i++)
    		for(length = 0; length < 0xFE; length++); 
    }
    liegt es also meiner Meinung nach "nur" an UCSRB (vgl. Datenblatt Mega8 Seite 140). Dachte das wäre unerheblich, argh.
    Werde das morgen gleich mal ausprobieren. edit: keine Besserung, wenn ich nach SerWrite ein UCSRB = 0x00 mache :=(

    linux_80:
    Genau das scheint es zu sein.

    Vielen Dank,

    Hans

    edit: keine Besserung, wenn ich am Anfang der SerWrite ein OCR2 = 0x91; DDRD &= ~(1 << PD1); mache und am Ende ein UCSRB = 0x00; DDRD |= (1 << DDD1);

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Wie schaut denn die Initialisierung der Entfernungsmessung aus, kann man die nicht einfach nochmal aufrufen nach einem SerWrite/Read ?

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    14.07.2004
    Beiträge
    23
    Moin,

    na ja, die Initialisierung ist ein "einfaches"
    Code:
    	Init();
    	DDRD |= (1 << DDD1);	// Port D1 als Ausgang
    	PORTD &= ~(1 << PD1);	// PD1 auf LOW
    	OCR2 = distance;
    Es wird also wie gewohnt die Init Routine aufgerufen, DDD1 wird auf 1 gesetzt (habe ich ja schon wieder rückgängig gemacht) und PD1 wird auf 0 gesetzt (sollte nach einem Reset/Einschalten eh auf Null sein).

    Hans

  7. #7
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    mmhh..und wenn du einfach nach dem SerWrite erneut Init() aufrufst? direkt nach Init funktioniert die messung ja...
    kleinschreibung ist cool!

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    16.05.2005
    Beiträge
    734
    Hallo Hans,

    mit einem UCSRB = 0x00; nach dem SerWrite sollte es wieder gehen. Zumindest bei mir geht es wieder.

    Gruß Waste

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    14.07.2004
    Beiträge
    23
    Hallo,

    danke für euer Tipps.
    Hatte völlig übersehen, dass ich den Pin an anderer Stelle noch mal benutzt hatte. Klappt hervorragend. Setze zur Sicherheit aber vorher immer noch das DDD1 Bit im Register.

    Danke,

    Hans

Berechtigungen

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