Forum: Mikrocontroller und Digitale Elektronik kommunikation zwischen camera und avr


von Penie L. (peniely)


Angehängte Dateien:

Lesenswert?

Hey,

Ich möchte mit meinem Kamera (54g10) (Als Anhang Dadenblatt) über mein 
microcontroller steuern.
Von Anfang an, als test wollte ich prüfen ob die Kamera überhaupt die 
Kommunikation  akzeptiert!!
leider klapp nicht.

device: atmega 8
quarz: 4Mhz
Kamera BAud: 9600

kann jemand mir weiter helfen.
1
#ifndef F_CPU
2
/* In the new version of the WinAVR/Mfile Makefile guideline One can defined F_CPU in the Makefile, a repeated 
3
   definition here would lead to a compiler warning . therefore "prevention" through    #ifndef/#endif
4
5
   This "Prevention" can lead to Debugger, if AVRStudio use a another, not the hardware fitting Clock rate: 
6
   Then the    following definition doesn't use, but instead the default value (1 MHz?) of AVRStudio - hence 
7
   the Output of a warning if F_CPU yet does not define:*/ 
8
#warning "F_CPU was not defined yet, now make up with 4000000"
9
#define F_CPU 4000000L   // Systemtakt in Hz - define as  long>> Without    errors in the computation 
10
#endif
11
12
13
#define BAUD 9600L
14
#define UBRR_VAL ((F_CPU+BAUD * 8)/(BAUD*16)-1)     //clever round
15
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))         //real baud rate
16
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000)     //Error per thousand
17
18
19
#if ((BAUD_ERROR>10)||(BAUD_ERROR<-10))
20
#error Systematic error in the baud rate more than 1% and thus too high!
21
#endif
22
23
/* Private define ------------------------------------------------------*/
24
#define TxBufferSize   0xFF
25
#define RxBufferSize   0xFF
26
27
#include <avr/io.h>
28
#include <string.h> // Für "strcmp"
29
#include <stdlib.h>
30
#include <inttypes.h>
31
#include <util/delay.h>
32
33
34
void setup_uart()
35
{
36
  // Baudrate einstellen 
37
  UBRRH = (unsigned char)(UBRR_VAL>>8);  // Set baud rate
38
  UBRRL = (unsigned char)UBRR_VAL;
39
40
  // Empfänger und Sender einschalten 
41
  UCSRB = (1<<RXEN) | (1<<TXEN);
42
43
  // Asynchron, 8N1 
44
  UCSRC = (1<<URSEL) | (3<<UCSZ0);
45
}
46
47
void uart_putchar(char c)
48
{
49
  // Warten bis Buffer bereit ...
50
  while (!(UCSRA & (1 << UDRE)));
51
52
  // Senden...
53
  UDR = c;
54
  _delay_ms(10);  
55
}
56
57
void uart_putstring(char *str)
58
{
59
  unsigned char i;
60
61
  for (i=0;i<255;i++) // Maximal 255 Zeichen ausgeben ...
62
  {
63
  if (str[i] != 0)
64
    uart_putchar(str[i]);
65
  else
66
    break; // Ende des Strings erreicht
67
  }
68
}
69
70
char uart_getchar()
71
{
72
  // Ist schon ein Zeichen im Buffer?
73
  while( !(UCSRA & (1<<RXC)) );
74
  return UDR;
75
}
76
77
void uart_readline(char *str)
78
{
79
  char c;
80
  unsigned char index;
81
  
82
  index = 0;
83
84
  while (1)
85
  {
86
    c = uart_getchar();
87
    if (c != -1)
88
    {    
89
  if (c == 13) // ASCII: NewLine
90
  {
91
    // Ende der Zeile erreicht,
92
    //  also String abschließen
93
    str[index] = 0;
94
95
    // Funktion beenden
96
    return;
97
  }
98
  else // Normales Zeichen, anhängen an die Zeichenkette
99
  {
100
    str[index] = c;
101
    index++;
102
  }
103
    }
104
  }
105
}
106
107
int main(void)
108
{
109
 char kommando[255];
110
 //char s[20];
111
 
112
 // RS232 einschalten ... 
113
 setup_uart();
114
115
 // Willkommensnachricht senden ... 
116
 while (1)
117
 {
118
    // Auf komplettes Kommando warten ... 
119
    uart_readline(kommando);  
120
121
    // Welcher Befehl wurde geschickt? ============ 
122
123
    // ==== BEFEHL: "ack"
124
    if (strcmp(kommando, "06")==0)
125
    {
126
       //uart_putstring("OK:\r\n");
127
       DDRB = 0x0F; // define as output 
128
       //itoa( kommando, s, 2 );
129
       PORTB = kommando;
130
       _delay_ms(1000);    
131
    }
132
 }
133
 return 0;
134
}

von Oliver (Gast)


Lesenswert?

>leider klapp nicht.

Was klappt nicht? Kommen gar keine Zeichen an? Kommen die falschen 
Zeichen an?

Hast du die Kamera mal an einen PC mit Terminal-Programm angeschlossen, 
um zu prüfen, ob die überhaupt was sendet?

Oliver

von holger (Gast)


Lesenswert?

> // Willkommensnachricht senden ...
> while (1)
> {
>    // Auf komplettes Kommando warten ...
>    uart_readline(kommando);

Da kannst du lange warten.
Die Kamera sendest NICHTS ohne Aufforderung.
Das heisst: DU musst ein Kommando senden.

Siehe Datenblatt Seite 2.

von Penie L. (peniely)


Lesenswert?

vielen Dank für die Antworten.

>holger
>Das heisst: DU musst ein Kommando senden.

Du hast recht, ich hatte vergessen ein Kommando zu senden.
ich möchte den AES Auto level auf AES setzen (s. seite 5)
und dann möchte ich überprüfen ob einem Kamera den Befehl bekommen hat.
leider kommt kein zeichen auf dem portB, für mich bedeutet, dass es 
keinen Befehl bekommst!?!?! oder senden ich den Befehl falsch!?!?

ich danke Ihr im voraus für ihre hilfe
1
while (1)
2
 {
3
    //AES setting
4
    uart_putstring("02");
5
6
    // Auf komplettes Kommando warten ... 
7
    uart_readline(kommando);  
8
9
    // Welcher Befehl wurde geschickt? ============ 
10
11
    // ==== BEFEHL: "ack"
12
    if (strcmp(kommando, "06")==0)
13
    {
14
       //uart_putstring("OK:\r\n");
15
       DDRB = 0x0F; // define as output 
16
       //itoa( kommando, s, 2 );
17
       PORTB = kommando;
18
       _delay_ms(1000);    
19
    }

von Penie L. (peniely)


Lesenswert?

Hey,

ich möchte gern AES AUTO (Seite 5, siehe datenblatt) auf 0x02 setzen, 
aber es ist mir nicht klar wie ich das machen muss.
Hat jemand schon so was programmiert!?!? und wie!?!?

von Einhart P. (einhart)


Lesenswert?

Hallo,

in deinem Code sehe ich weder die Steuerzeichen noch die Prüfsumme. Die 
Mintron Kameras benötigen das im Datenblatt beschriebene Protokoll. Ohne 
dieses reagiert die Kamera nicht.

Gruß
Einhart

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Könnte es sein, daß Du da etwas ganz grundlegendes nicht verstanden 
hast?

uart_readline liest eine Textzeile, deren Inhalt Du mit strcmp mit einer 
Textkonstanten vergleichst. Soweit, so gut.

Dann aber versuchst Du, diese Textzeile an PORTB auszugeben ...

Außerdem: Kommuniziert die Kamera im Klartext? D.h., will sie wirklich 
die Zeichen "0" und "2" nacheinander empfangen, um AES zu konfigurieren?

Da hast Du wohl die Beschreibung nicht so ganz verstanden.

Die Kamera will das Steuerzeichen 0x02 sehen - das ist EIN Zeichen, 
keine Zeichenkette.

von Penie L. (peniely)


Lesenswert?

> Könnte es sein, daß Du da etwas ganz grundlegendes nicht verstanden
>hast?

leider ja,
ich bin total anfängerin, ich habe mir zuerst einem Program geschrieben, 
wo ich ADC werte über meine serielle schnittstelle zugeschikt habe, das 
hat funktioniert, danach wollte ich meinem Kamera über rs232 auch 
steuen.
Habe ich dann vom Hersteller dieses Datenblatt bekommen. Aber wie fänt 
ich damit an weiss ich nicht.
Ich verstehe nicht so ganz wie ich das Datenblatt benutzen muss.
gruß

von Penie L. (peniely)


Lesenswert?

>in deinem Code sehe ich weder die Steuerzeichen noch die Prüfsumme. Die
>Mintron Kameras benötigen das im Datenblatt beschriebene Protokoll. Ohne
>dieses reagiert die Kamera nicht.

Bitte kannst du mir gut beibringen, ich verstehe nicht gut das 
Datenblatt

danke im voraus

von Einhart P. (einhart)


Lesenswert?

OK noch etwas detaillierter:

Du schreibst z.B. zwei Unterprogramme

1. Routine SendCommand

 bringt ein Kommando in die passende Form
Ein Kommando an die Kamera oder eine Antwort von der Kamera hat immer 19 
ASCII Zeichen, die Form:

   STX, 15 Zeichen, ETX, CRC msb, CRC lsb

Dein Kommando wäre

0x02  STX
0x48  command group
0x02  AES
0x00  Auto/Fix
0x00  Set auto
0x00  not used
0x00   not used
0x00  not used
0x00   not used
0x00  not used
0x00   not used
0x00  not used
0x00   not used
0x00  not used
0x00   not used
0x00   not used
0x03  ETX
0xxx     CRC16 msb
0xxx  CRC16 lsb


2. Routine TransferCommand

 macht den Handshake mit der Kamera

  sendet Anforderung (ENQ)
  wartet auf Bestätigung (ACK)
  sendet das Kommando
  wartet auf Bestätigung (ACK)
  wartet gegebenenfalls auf Antwort (auch 19 Zeichen)
  sendet Bestätigung (ACK)

von Penie L. (peniely)


Lesenswert?

vielen Dank
ich versuche es jetzt mit deinen Vorschlägen
gruß

von Penie L. (peniely)


Lesenswert?

ok, jetzt verstehe ich noch besser, und deswegen habe ich einigen fragen

1. frage:

.Buf[1] = 0x21/0x31 vergessen oder!!!

2. frage: CRC
ich hab schon viel darüber gelesen, ich komme einfach nicht weiter.
Viele hier hatten bereits das selbe problem, aber ich komme nicht klar 
mit den Antworten. Ich will meinen CRC händisch berechnen, dabei sind
folgende Daten gegeben:

Generatorpolynom: X¹⁶ + X¹⁵ + X² +1

Daten: 0x1FC01
GARANTIERT Richtiges Ergebnis: ????


ich habe sogar folgenden Bespielcode für die CRC- Berechnung gefunden.
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <inttypes.h>
4
#define CRC32POLY 0x04C11DB7 /* CRC-32 Polynom */
5
 
6
int datastream[]={1,0,0,0,1,1,0,0};
7
int databits=8;
8
uint32_t crc32 = 0; /* Schieberegister */
9
/*__int32 crc32 = 0; => für MS VS  */
10
 
11
int main(void)
12
{   int i;
13
    for (i=0; i<databits; ++i)
14
        if (((crc32 & 0x80000000) ? 1 : 0) != datastream[i]) 
15
             crc32=(crc32<<1) ^ CRC32POLY;
16
        else 
17
             crc32<<=1;
18
    printf("0x%08X\n",crc32);
19
    return EXIT_SUCCESS;
20
}

von Penie L. (peniely)


Lesenswert?

X hoch16 + X hoch15 +X hoch2 +1

von Einhart P. (einhart)


Lesenswert?

Zu 1)
  Sorry, die 0x21 habe ich vergessen.

Zu 2)
  Ich probiere 'mal ob meine Kamera den Befehl kennt. Dann poste ich 
heute abend die kompletten 19 bytes inclusiv CRC.

Zu 3)
Fertige CRC16 Routinen sollte es im Netz in großer Menge geben.

von Penie L. (peniely)


Lesenswert?

vielen dank

von Einhart P. (einhart)


Lesenswert?

OK, die Kamera reagiert auf:

0x02
0x21
0x48
0x02
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x00
0x03
0xBD
0xD3

von Penie L. (peniely)


Lesenswert?

>Antwort an  Einhart

Hey Einhart,
danke erst mal für deien Mühe,

aber seit heute morgen versuche ich mit dem code ( andere formel habe 
ich auch probiert) CRC zu berechnen leider sind meine erwartungen 
falsch.

Generatorpolynom: X¹⁶ + X¹⁵ + X² +1 => 1 1000 0000 0000 0101 => grade 16

Rahmen: 0x1E001 => 1 1110 0000 0000 0001
Rahmen mit Anhang => 1 1110 0000 0000 0001 0000 0000 0000 0000

Nun wird der Rahmen mit Anhang von links her durch das Generatorpolynom 
dividiert dabei ist:
der Rest => 100 0000 0001 1110

An den Rahmen ohne Anhang wird nun der Rest angehängt:
übertragener Rahmen => 1 1110 0000 0000 0001 100 0000 0001 1110

Der Rest der Division ist ungleich null. => 1111 0000 0000 1010
Warum????
 Wie bist du zum:
0xBD
0xD3 gekommen??

vielen dank für deinen Hilfe
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <inttypes.h>
4
#define CRC32POLY 0x04C11DB7 /* CRC-32 Polynom */
5
 
6
int datastream[]={1,0,0,0,1,1,0,0};
7
int databits=8;
8
uint32_t crc32 = 0; /* Schieberegister */
9
/*__int32 crc32 = 0; => für MS VS  */
10
 
11
int main(void)
12
{   int i;
13
    for (i=0; i<databits; ++i)
14
        if (((crc32 & 0x80000000) ? 1 : 0) != datastream[i]) 
15
             crc32=(crc32<<1) ^ CRC32POLY;
16
        else 
17
             crc32<<=1;
18
    printf("0x%08X\n",crc32);
19
    return EXIT_SUCCESS;
20
}

von Einhart P. (einhart)


Lesenswert?

Die crc16 (nicht crc32!) Routine läuft über 16 Zeichen, das STX (0x02) 
am Anfang gehört nicht dazu. Im Beispiel sind das 16 bytes ab 0x21.

Ich habe einfach einen tabellenbasierten Algorithmus aus dem Web 
gesucht. Den oder einen andern solltest du auch für gnu c finden können.

Such 'mal nach Easy Hash 1.3. Damit kannst du alle möglichen Prüfsummen 
auf dem PC rechnen.

Gruß
Einhart

von Penie L. (peniely)


Lesenswert?

Hey einhart,
ich habe endlich verstanden wie man CRC berechnet und habe eine 
Algorithmus dafur geschrien.
aber mit meinem untere Codereagiert die Kamera nicht, ichbin neueling 
und versteht immer noch nicht gut wie ich meine code schreiben muss

Ich habe durst auf hilfe!!!
1
unsigned char data[16] = {1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1};
2
  unsigned int Length = 16;
3
  int Control_Item_Iris [18] ={
4
  //0  1  2  3  4  5
5
  0x02,  0x21,  0x48,  0x02,  0x00,  0x00, 
6
  0x00,  0x00,  0x00,  0x00,  0x00,  0x00, //6 non-use
7
  0x00,  0x00,  0x00,  0x00,  0x03,  0xBD, //12  
8
        0xD3  //18
9
  };
10
11
  char kommando; //[255];
12
  //char temp[10];
13
  char s[20];
14
  //unsigned char zahl=0;
15
16
  // RS232 einschalten ... 
17
  setup_uart();
18
19
  //ENQ setting
20
   //sendet Anforderung (ENQ)
21
   uart_putstring("0x05");
22
  // wartet auf Bestätigung (ACK)...
23
  while(1) uart_getchar();
24
  //sendet das Kommando
25
  uart_putstring("Control_Item_Iris");
26
  //wartet auf Bestätigung (ACK)
27
  while(1) uart_getchar();
28
  //wartet auf response
29
  _delay_ms(1000);    
30
  //sendet Bestätigung (ACK)
31
  uart_putstring("06");


vielen dank

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.