mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik kommunikation zwischen camera und avr


Autor: Penie Lydos (peniely)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

#ifndef F_CPU
/* In the new version of the WinAVR/Mfile Makefile guideline One can defined F_CPU in the Makefile, a repeated 
   definition here would lead to a compiler warning . therefore "prevention" through    #ifndef/#endif

   This "Prevention" can lead to Debugger, if AVRStudio use a another, not the hardware fitting Clock rate: 
   Then the    following definition doesn't use, but instead the default value (1 MHz?) of AVRStudio - hence 
   the Output of a warning if F_CPU yet does not define:*/ 
#warning "F_CPU was not defined yet, now make up with 4000000"
#define F_CPU 4000000L   // Systemtakt in Hz - define as  long>> Without    errors in the computation 
#endif


#define BAUD 9600L
#define UBRR_VAL ((F_CPU+BAUD * 8)/(BAUD*16)-1)     //clever round
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))         //real baud rate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000)     //Error per thousand


#if ((BAUD_ERROR>10)||(BAUD_ERROR<-10))
#error Systematic error in the baud rate more than 1% and thus too high!
#endif

/* Private define ------------------------------------------------------*/
#define TxBufferSize   0xFF
#define RxBufferSize   0xFF

#include <avr/io.h>
#include <string.h> // Für "strcmp"
#include <stdlib.h>
#include <inttypes.h>
#include <util/delay.h>


void setup_uart()
{
  // Baudrate einstellen 
  UBRRH = (unsigned char)(UBRR_VAL>>8);  // Set baud rate
  UBRRL = (unsigned char)UBRR_VAL;

  // Empfänger und Sender einschalten 
  UCSRB = (1<<RXEN) | (1<<TXEN);

  // Asynchron, 8N1 
  UCSRC = (1<<URSEL) | (3<<UCSZ0);
}

void uart_putchar(char c)
{
  // Warten bis Buffer bereit ...
  while (!(UCSRA & (1 << UDRE)));

  // Senden...
  UDR = c;
  _delay_ms(10);  
}

void uart_putstring(char *str)
{
  unsigned char i;

  for (i=0;i<255;i++) // Maximal 255 Zeichen ausgeben ...
  {
  if (str[i] != 0)
    uart_putchar(str[i]);
  else
    break; // Ende des Strings erreicht
  }
}

char uart_getchar()
{
  // Ist schon ein Zeichen im Buffer?
  while( !(UCSRA & (1<<RXC)) );
  return UDR;
}

void uart_readline(char *str)
{
  char c;
  unsigned char index;
  
  index = 0;

  while (1)
  {
    c = uart_getchar();
    if (c != -1)
    {    
  if (c == 13) // ASCII: NewLine
  {
    // Ende der Zeile erreicht,
    //  also String abschließen
    str[index] = 0;

    // Funktion beenden
    return;
  }
  else // Normales Zeichen, anhängen an die Zeichenkette
  {
    str[index] = c;
    index++;
  }
    }
  }
}

int main(void)
{
 char kommando[255];
 //char s[20];
 
 // RS232 einschalten ... 
 setup_uart();

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

    // Welcher Befehl wurde geschickt? ============ 

    // ==== BEFEHL: "ack"
    if (strcmp(kommando, "06")==0)
    {
       //uart_putstring("OK:\r\n");
       DDRB = 0x0F; // define as output 
       //itoa( kommando, s, 2 );
       PORTB = kommando;
       _delay_ms(1000);    
    }
 }
 return 0;
}

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht 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

while (1)
 {
    //AES setting
    uart_putstring("02");

    // Auf komplettes Kommando warten ... 
    uart_readline(kommando);  

    // Welcher Befehl wurde geschickt? ============ 

    // ==== BEFEHL: "ack"
    if (strcmp(kommando, "06")==0)
    {
       //uart_putstring("OK:\r\n");
       DDRB = 0x0F; // define as output 
       //itoa( kommando, s, 2 );
       PORTB = kommando;
       _delay_ms(1000);    
    }


Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht 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!?!?

Autor: Einhart Pape (einhart)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Einhart Pape (einhart)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen Dank
ich versuche es jetzt mit deinen Vorschlägen
gruß

Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht 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.

#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#define CRC32POLY 0x04C11DB7 /* CRC-32 Polynom */
 
int datastream[]={1,0,0,0,1,1,0,0};
int databits=8;
uint32_t crc32 = 0; /* Schieberegister */
/*__int32 crc32 = 0; => für MS VS  */
 
int main(void)
{   int i;
    for (i=0; i<databits; ++i)
        if (((crc32 & 0x80000000) ? 1 : 0) != datastream[i]) 
             crc32=(crc32<<1) ^ CRC32POLY;
        else 
             crc32<<=1;
    printf("0x%08X\n",crc32);
    return EXIT_SUCCESS;
}



Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
X hoch16 + X hoch15 +X hoch2 +1

Autor: Einhart Pape (einhart)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen dank

Autor: Einhart Pape (einhart)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#define CRC32POLY 0x04C11DB7 /* CRC-32 Polynom */
 
int datastream[]={1,0,0,0,1,1,0,0};
int databits=8;
uint32_t crc32 = 0; /* Schieberegister */
/*__int32 crc32 = 0; => für MS VS  */
 
int main(void)
{   int i;
    for (i=0; i<databits; ++i)
        if (((crc32 & 0x80000000) ? 1 : 0) != datastream[i]) 
             crc32=(crc32<<1) ^ CRC32POLY;
        else 
             crc32<<=1;
    printf("0x%08X\n",crc32);
    return EXIT_SUCCESS;
}


Autor: Einhart Pape (einhart)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Penie Lydos (peniely)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

unsigned char data[16] = {1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1};
  unsigned int Length = 16;
  int Control_Item_Iris [18] ={
  //0  1  2  3  4  5
  0x02,  0x21,  0x48,  0x02,  0x00,  0x00, 
  0x00,  0x00,  0x00,  0x00,  0x00,  0x00, //6 non-use
  0x00,  0x00,  0x00,  0x00,  0x03,  0xBD, //12  
        0xD3  //18
  };

  char kommando; //[255];
  //char temp[10];
  char s[20];
  //unsigned char zahl=0;

  // RS232 einschalten ... 
  setup_uart();

  //ENQ setting
   //sendet Anforderung (ENQ)
   uart_putstring("0x05");
  // wartet auf Bestätigung (ACK)...
  while(1) uart_getchar();
  //sendet das Kommando
  uart_putstring("Control_Item_Iris");
  //wartet auf Bestätigung (ACK)
  while(1) uart_getchar();
  //wartet auf response
  _delay_ms(1000);    
  //sendet Bestätigung (ACK)
  uart_putstring("06");



vielen dank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.