PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : IR-Abstandsmessung (von waste) und SerWrite: Problem



Hans Meier
03.12.2006, 16:31
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

damaltor
03.12.2006, 16:42
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.

linux_80
03.12.2006, 17:12
Und man muss wahrscheinlich den UART Transmitter und Receiver wieder deaktivieren, damit der Port per Software gesteuert werden kann.

Hans Meier
03.12.2006, 22:10
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:


/* 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);

linux_80
03.12.2006, 23:48
Wie schaut denn die Initialisierung der Entfernungsmessung aus, kann man die nicht einfach nochmal aufrufen nach einem SerWrite/Read ?

Hans Meier
04.12.2006, 07:20
Moin,

na ja, die Initialisierung ist ein "einfaches"


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

damaltor
04.12.2006, 09:15
mmhh..und wenn du einfach nach dem SerWrite erneut Init() aufrufst? direkt nach Init funktioniert die messung ja...

waste
04.12.2006, 09:48
Hallo Hans,

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

Gruß Waste

Hans Meier
04.12.2006, 11:20
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