kommunikation zwischen camera und avr

#1300986
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
}
Angehängte Dateien:
Gast #1300998
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
Gast #1301035
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.
#1301763
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
    }
Persönliche Seite #1301872
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.
#1301882
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ß
#1301918
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)
#1302246
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
}
#1303163
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
}
#1303336
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
#1309310
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren