Willkommen,
Gast
|
THEMA:
Re:Neues zum EX Protokoll 01 Mär 2015 11:33 #25
|
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
|
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
- Aktuelle Seite:
- Home
- Sender DC24/DS24, DC16/DS16, DC14/DS14 und DS12
- Jeti Sender
- Lua für die DC/DS 16 + 24
- LUA ist schon cool