Willkommen, Gast
Benutzername: Passwort: Angemeldet bleiben:

THEMA:

Re:Neues zum EX Protokoll 01 Mär 2015 11:33 #25

  • Höllenhund
  • Höllenhunds Avatar
  • Offline
  • Fresh Boarder
  • Fresh Boarder
  • Beiträge: 4
  • Dank erhalten: 0
Behandel jetzt das 9te Bit wie in der Dokumentation angegeben, aber es tut sich leider noch immer nichts.
Habe zur Kontrolle einen zweiten AVR aufgebaut, der nur an der TX-Leitung lauscht. Dieser nimmt auf der ersten UART alle 9Bit Datenpakete entgegen, wandelt sie in 2x 8Bit um und schickt sie über die zweite UART an den PC. So kann ich auch ohne Oszi oder Logikanalysator überprüfen was auf der Leitung passiert.
Was mich momentan auch etwas verwundet, das laut Doku der Sensor Master sein soll. Der Empfänger gibt ständig seine Kennung aus und macht immer nach ein paar direkt aufeinanderfolgenden Sendungen eine Pause. Das sieht mir nicht nach einem *Slave* sondern nach *Master* aus.
Muß man den Empfänger noch irgendwie in einen *Slavemodus* bringen?
Habe es erst einmal so probiert immer nach dem 0x00FF vom Empfänger meine Datenpakete zu senden. Das bewirkt aber leider nichts.

Hier der angepasste Code vom ATMega 644:
#include <avr/io.h>
#include <avr/interrupt.h>
 
#define F_CPU 7372800UL  			//Systemtakt in Hz
#define BAUD0 9600UL				//Baudrate Telemetrie
#include <util/delay.h>
 
volatile uint8_t frameende_empfangen;  // globale Variable für Sendefreigabe	
 
void USART0_senden(uint8_t data)
{
	/* Wait for empty transmit buffer */
	while ( !( UCSR0A & (1<<UDRE0)) )
	;
 
	UCSR0B |= (1<<TXB80);
 
	UDR0 = data;
}
 
void USART0_separator_senden(uint8_t data)
{
	/* Wait for empty transmit buffer */
	while ( !( UCSR0A & (1<<UDRE0)) )
	;
 
	UCSR0B &= ~(1<<TXB80);
 
	UDR0 = data;
}
 
void jeti_beispiel_data()
{
	// EX Data
	USART0_separator_senden(0x7E);
	USART0_senden(0x9F);
	USART0_senden(0x4C);			// Message type = Data
	USART0_senden(0xA1);			// Upper Serial
	USART0_senden(0xA8);			//
	USART0_senden(0x5D);			// Lower Serial
	USART0_senden(0x55);			//
	USART0_senden(0x00);			// Reserved
	USART0_senden(0x11);			// Identifier
	USART0_senden(0xE8);			// Position of decimal point
	USART0_senden(0x23);			// 
	USART0_senden(0x21);			// Identifier
	USART0_senden(0x1B);			// Position of decimal point
	USART0_senden(0x00);			//
	USART0_senden(0xF4);			// CRC
 
	//simple Text
	USART0_separator_senden(0xFE);
	USART0_senden(0x20);
	USART0_senden(0x20);
	USART0_senden(0x20);
	USART0_senden(0x2A);
	USART0_senden(0x4D);
	USART0_senden(0x53);
	USART0_senden(0x50);
	USART0_senden(0x45);
	USART0_senden(0x45);
	USART0_senden(0x44);
	USART0_senden(0x20);
	USART0_senden(0x20);
	USART0_senden(0x20);
	USART0_senden(0x6D);
	USART0_senden(0x2F);
	USART0_senden(0x73);
	USART0_senden(0x20);
	USART0_senden(0x20);
	USART0_senden(0x3E);
	USART0_senden(0x3E);
	USART0_senden(0x3E);
	USART0_senden(0x3E);
	USART0_senden(0x3E);
	USART0_senden(0x3E);
	USART0_senden(0x3E);
	USART0_senden(0x3E);
	USART0_senden(0x20);
	USART0_senden(0x31);
	USART0_senden(0x30);
	USART0_senden(0x30);
	USART0_senden(0x2E);
	USART0_senden(0x30);
	USART0_separator_senden(0xFF);
}
 
void jeti_beispiel_text(){
	USART0_separator_senden(0x7E);	// Protokoll EX-TExt
	USART0_senden(0x9F);
	USART0_senden(0x0F);	// Messagetype
	USART0_senden(0xA1);	// Upper Serial
	USART0_senden(0xA8);	//
	USART0_senden(0x5D);	// Lower Serial
	USART0_senden(0x55);	//
	USART0_senden(0x00);	// Reserved
	USART0_senden(0x02);	// Identifier
	USART0_senden(0x2A);	// Length
	USART0_senden(0x54);	// T
	USART0_senden(0x65);	// e
	USART0_senden(0x6D);	// m
	USART0_senden(0x70);	// p
	USART0_senden(0x2E);	// .
	USART0_senden(0xB0);	// °
	USART0_senden(0x43);	// C
	USART0_senden(0x28);	// CRC
 
	USART0_separator_senden(0xFE);	// Protokoll simple Text
	USART0_senden(0x20);	//
	USART0_senden(0x20);	//
	USART0_senden(0x20);	//
	USART0_senden(0x2A);	// *
	USART0_senden(0x4D);	// M
	USART0_senden(0x53);	// S
	USART0_senden(0x50);	// P
	USART0_senden(0x45);	// E
	USART0_senden(0x45);	// E
	USART0_senden(0x44);	// D
	USART0_senden(0x20);	//
	USART0_senden(0x20);	//
	USART0_senden(0x20);	//
	USART0_senden(0x6D);	// *
	USART0_senden(0x2F);	// m
	USART0_senden(0x73);	// /
	USART0_senden(0x20);	// s
	USART0_senden(0x20);	//
	USART0_senden(0x3E);	// >
	USART0_senden(0x3E);	// >
	USART0_senden(0x3E);	// >
	USART0_senden(0x3E);	// >
	USART0_senden(0x3E);	// >
	USART0_senden(0x3E);	// >
	USART0_senden(0x3E);	// >
	USART0_senden(0x3E);	// >
	USART0_senden(0x20);	//  
	USART0_senden(0x31);	// 1
	USART0_senden(0x30);	// 0
	USART0_senden(0x30);	// 0
	USART0_senden(0x2E);	// .
	USART0_senden(0x30);	// 0
	USART0_separator_senden(0xFF);
}
 
void jeti_beispiel_alarm(){
	USART0_separator_senden(0x7E);	// Protokoll Alarm
	USART0_senden(0x92);	// Länge
	USART0_senden(0x23);	// Akustischer Alarm
	USART0_senden(0x59);	// Ascii *Y* für Morsealarm
 
	USART0_separator_senden(0xFE);	//Protokoll simple Text
	USART0_senden(0x20);
	USART0_senden(0x20);
	USART0_senden(0x20);
	USART0_senden(0x2A);
	USART0_senden(0x4D);
	USART0_senden(0x53);
	USART0_senden(0x50);
	USART0_senden(0x45);
	USART0_senden(0x45);
	USART0_senden(0x44);
	USART0_senden(0x20);
	USART0_senden(0x20);
	USART0_senden(0x20);
	USART0_senden(0x6D);
	USART0_senden(0x2F);
	USART0_senden(0x73);
	USART0_senden(0x20);
	USART0_senden(0x20);
	USART0_senden(0x3E);
	USART0_senden(0x3E);
	USART0_senden(0x3E);
	USART0_senden(0x3E);
	USART0_senden(0x3E);
	USART0_senden(0x3E);
	USART0_senden(0x3E);
	USART0_senden(0x3E);
	USART0_senden(0x20);
	USART0_senden(0x31);
	USART0_senden(0x30);
	USART0_senden(0x30);
	USART0_senden(0x2E);
	USART0_senden(0x30);
	USART0_separator_senden(0xFF);
}
 
int main(void)
{
	// Port C0 als Eingang
	DDRC  &= ~(1<<PC0);  /* Pin PC0 als Eingang */
	PORTC |= (1<<PC0);    /* internen Pull-Up an PC0 aktivieren */
 
	// Register für USART0 setzen (Telemtrie)
	// 9 Datenbits
	// 2 Stopbit
	// Odd Parity
	UCSR0A = 0x00;
	UCSR0B = (1<<RXCIE0)|(1<<RXEN0)|(1<<UCSZ02);
	UCSR0C = (1<<UPM01)|(1<<UPM00)|(1<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00);
 
	UBRR0  = (F_CPU / (BAUD0 * 16L) - 1);
 
	frameende_empfangen = 0x00;
	sei();
	while(1)
	{
		if (frameende_empfangen == 0x01) {
			// Bei erkanntem Frameende den Empfangsbetrieb einstellen und Sendebetrieb aufnehmen
			UCSR0B &= ~(1<<RXEN0);	// Empfang deaktiveren
			UCSR0B |= (1<<TXEN0);	// Senden aktivieren
 
			jeti_beispiel_data();
			//jeti_beispiel_text();
			//jeti_beispiel_alarm();
 
			// Sendebetrieb einstellen, wieder den Empfangsbetrieb aufnehmen und 20ms warten
			UCSR0B &= ~(1<<TXEN0);	// Senden deaktivieren
			UCSR0B |= (1<<RXEN0);	// Empfang aktivieren
			_delay_ms(20);	// 20ms warten
 
			frameende_empfangen = 0x00; // globale Variable zurücksetzen
		}
		else {
		}
	}
}
 
ISR(USART0_RX_vect)
{
	unsigned char status, resh, resl;
 
	/* Get status and 9th bit, then data */
	/* from buffer */
	status = UCSR0A;
	resh = UCSR0B;
	resl = UDR0;
 
	if (status & ((1<<FE0)|(1<<DOR0)|(1<<UPE0))) {
		/* Fehlerfall */
	}
	else {
		resh = (resh>>1) & 0x01;
	}
 
	if (resh == 0x00 && resl == 0xFF) //Wenn Frameende erkannt wird, globale Variable setzen!
	{
		frameende_empfangen = 0x01;
	}
	else
	{
		/* nichts */
	}
}

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Re:Neues zum EX Protokoll 14 Jun 2017 11:30 #26

  • McFly2000
  • McFly2000s Avatar
  • Offline
  • Senior Boarder
  • Senior Boarder
  • Beiträge: 61
  • Dank erhalten: 22
Ich habe mal probiert die Telemetriedaten von meinem MVario auszulesen und mit dem Arduino auf meinen PC zu übertragen. Dies ist mir leider nur zum Teil gelungen.
Die Daten für die Jetibox werden sauber übertragen und die EX-Daten passen bis zum siebten Byte, also bis zur Seriennummer, zum EX-Protokoll.
Das achte Byte müsste laut Protokoll dann 0x00 sein, ist es aber bei mir nicht.

Beispiel:
FE202020306D204D566172696F206D2F7320205F5F5F5F5F5F5F5F202D20302E31FF
FE202020306D204D566172696F206D2F7320205F5F5F5F5F5F5F5F202D20302E32FF
7E 9F 58 21A8FB5B E6 9A1B0ADE16F695CA8BFD95B6F48AF4A79FD40A
FE202020306D204D566172696F206D2F7320205F5F5F5F5F5F5F5F202D20302E32FF
FE202020306D204D566172696F206D2F7320205F5F5F5F5F5F5F5F202D20302E32FF
7E 9F 58 21A8FB5B 2E 52D3C216DE3E5D0243355D7E3C423C6F571C15

Hat jemand eine Ahnung wie ich die Daten entschlüsseln kann, oder liegt der Fehler bei der Übertragung auf den PC?

Dirk

Bitte Anmelden oder Registrieren um der Konversation beizutreten.

Ladezeit der Seite: 0.187 Sekunden
Powered by Kunena Forum