PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : EUSART mit PIC18F4580



flownfluid
05.12.2005, 20:24
Hallo zusammen,

ich benütze die EUSART um Daten Seriell zwischen PIC und CAMERA zu versenden und empfangen.

Nun habe ich folgendes Problem, ich sende ein SYNC- Paket von der Länge 6Byte an die Camera. Diese Antwortet solange ein ACK- Paket von der Länge 12Byte bis ich das ACKSYNC- Paket sende.

Wenn ich nun z.B. 10 ACK- Paket empfange möchte sehen die Daten folgendermassen aus:

0xff,0xff,0xff,0xff,Ack-Paket, 12x 0xFF , 12Byte Ack-Paket,
12x 0xFF, Ack-Paket, usw.

Leider kann ich nicht erklären warum immer die 0xFF Zeichen im Buffer sind, da die Kammera nie ein 0xFF versendet.

tech. Daten
PIC18F4580 Quarz 10MHz
arbeite mit PLL -> 40MHz
UART mit 115200 Baud oder mit 14400 -> gleiches Ergebniss

mein Prog:

void main(void)
{

UINT8 ACKreceived;

init();

serialSetup14400();

ACKreceived = false;

//send sync-packet
while(ACKreceived == false)
{
write2serial(0xAA);
write2serial(0x0D);
write2serial(0x00);
write2serial(0x00);
write2serial(0x00);
write2serial(0x00);
//brak->its only a break-routine
brak(70000);
//controll received data
if( CAMERA_BUFFER[0] == 0xAA &&
CAMERA_BUFFER[1] == 0x0E &&
CAMERA_BUFFER[6] == 0xAA &&
CAMERA_BUFFER[7] == 0x0D )
{
ACKreceived = true;
}
}

//send ACKSYNC-packet
write2serial(0xAA);
write2serial(0x0E);
write2serial(0x0D);
write2serial(0x00);
write2serial(0x00);
write2serial(0x00);
}

//InterruptMethode:
void interrupt MyInterrupt(void)
{
if( (RCIF == true) )
{
CAMERA_BUFFER[gcounter] = RCREG;
gcounter++;
RCIF = 0;
}
}

stegr
07.12.2005, 17:00
Ok, ich versuch mich mal deines Problems anzunehmen, auch wenn ich keine Ahnung habe, was du genau brauchst... ;-)

Also, ich versuch das mal so zu beschreiben, wie ich es verstanden habe und du sagst mir, ob das soweit stimmt - vielleicht kommen wir ja so auf den Fehler.

Du schickst 6 Byte an die Kamera (SYNC).
Daraufhin fragst du, ob die ihre Antwort (ACK) geschickt hat.
Wenn ja, dann hör auf - wenn nein, dann bleibe in der While-Schleife.
<----
1. Frage: könnte genau das dein Problem sein? - Also dass die Kamera ein bissle braucht, bis sie ein ACK schickt und du sie währenddessen "zumüllst" und sie daraufhin einfach irgendwas antwortet?
---->
Danach schickst du das ACKSYNC-Paket, damit die aufhört ihr ACK zu schicken.
<----
Anmerkung zur Übertragungssicherheit: Das ganze ACK und ACKSYNC soll eine Fehlersicherheit darstellen, wenn einzelne Pakete verloren gehen. Dann solltest du aber auch abfragen, ob das ACKSYNC-Paket angekommen ist (also ob die CAM noch weiter ihr ACK schickt oder nicht).
---->
Die Interruptmethode schiebt neue Daten einfach in ein (wohl global definiertes) Array und setzt danach das INT-Flag zurück.

Überleg dir mal, ob ich das ganze richtig verstanden hab und ob meine 1. Frage vielleicht schon die Lösung deines Problems ist...
Wenn nicht, dann poste bitte mal ein paar mehr Infos (welchen uC, was für eine CAM, evtl. Links zu Datenblättern, ...)

MfG
Stefan