Forum: Mikrocontroller und Digitale Elektronik Problem beim Testsender


von Fef F. (Firma: Gast) (fef)


Lesenswert?

Hallo zusammen,


Ich versuche gerade, ein Testsender via POCSAG-Normen mit einem ATMEGA32 
auf einem LCD zu implementieren.
es geht um die Übertragung der Präambel und der Codewortgruppe mit der
POCSAG-Normen wie unter steht.


|PRÄ|S| CW0a | CW0b | CW1a | CW1b |CW2a | CW2b |...| CW7a |CW7b |
    <----- 17 mal 32 Bit - Worte = 544 Bits bzw. 68 Bytes  ----->

PRÄ = Präambel ist folgendermaßen
576 Bit 10101010...
bzw.
18 Wörter 0xAAAAAAAA
bzw.
72 Bytes 0xAA

Die Ausgabe der zweien Codewortgruppen mit 136 Byte-Größe ist wie folg
[0] 7CD215D8   [17] 7CD215D8
[1] 7A89C197   [18] 7A89C197
[2] 7A89C197   [19] 7A89C197
[3] 7A89C197   [20] 7A89C197
[4] 7A89C197         .
[5] 50001F           .
[6] 7E400038         .
[7] 7A89C197
[8] 7A89C197
[9] 7A89C197
[10] 7A89C197
[11] 7A89C197
[12] 7A89C197
[13] 7A89C197
[14] 7A89C197
[15] 7A89C197
[16] 7A89C197  [135] 7A89C197

Es müssen zuerst die Präambel geschickt werden, dannach die
Codewortgruppe komplett übertragen.

ich habe folgendermaßen überlegen.
char * Packet;
uint16_t P_Msg[136];

/*first send preamble ..... 72 bytes=576 bits of 101010..... */

for (i=0; i<72; i++)
{
/*Send POCSAG_PREAMBLE_CODEWORD*/
Packet = POCSAG_PREAMBLE_CODEWORD;
}

USART_Transmit(Packet);

for (i=0; i<136; i++)
{
/*Send POCSAG-Msg[i]*/
Packet = P_Msg[i];
}
USART_Transmit(Packet);

kopieren 136 Byte in einen Charakter, den anschließend versenden

Was mache ich den da Falsch? bzw. wie könnte man es noch machen?

Gruss fef

: Bearbeitet durch User
von Stefan P. (form)


Lesenswert?

Fef F. schrieb:
> kopieren 136 Byte in einen Charakter, den anschließend versenden

Das macht keinen Sinn - Du versendest nur einen einzigen Wert.

von Fef F. (Firma: Gast) (fef)


Lesenswert?

Danke Stefan für deine schnelle Antwort.

Stefan sagt:
>Du versendest nur einen einzigen Wert.

das heißt, ich muss direkt der Inhalt der P_Msg[i]
in der Funktion USART_Tranmit() als Parameter nehmen?
Und wenn ich das ganze in der While-Schleife führe, wäre das besser?

von randy (Gast)


Lesenswert?

hallo,

also sowas:
1
for (i=0; i<136; i++)
2
{
3
  /*Send POCSAG-Msg[i]*/
4
  USART_Transmit(P_Msg[i]);
5
}

HTH,
-- randy

von Fef F. (Firma: Gast) (fef)


Lesenswert?

ich verstehe nicht warum soll ich noch ein for-schleife verwenden.
denn es wurde schon in die USART_Transmit berücksichtigt.

hier ist die zweie verwendete Übertragungsfunktionen.


/*
 *
 */
void USART_Init(uint16_t baud)
  {
         uint16_t ubrr = (((uint8_t)F_CPU+baud*8UL)/(baud*16)-1);

    /* Set baud rate */
    UBRRH = (uint8_t)(ubrr >> 8);
    UBRRL = (uint8_t)(ubrr)  ;
    /* Enable transmitter */
    UCSRB |= (1<<TXEN);
    /* Set frame format: 8data, 2stop bit */
    UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);

  }

/*
 *
 */
void USART_Transmit(char* data)
  {
    int8_t i;
    for(i=0; i<strlen(data); i++)
    {
      // Wait for      empty transmit buffer
                        while ( !( UCSRA & (1<<UDRE)) )
      {

      }
    UDR = data[i];  // Put data into buffer, sends the data
    }
  }

Bitte können Sie mir sagen, ob es sich noch nötig der For-Schleife?

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

> USART_Transmit(char* data)
> for(i=0; i<strlen(data); i++)

Diese Funktion kannst du mit einem Zeiger aufrufen, der auf einen String 
zeigt. Ein String ist ein Array von Zeichen (oder Bytes), wo das letzte 
Zeichen den Wert 0 hat.

Dein Byte-Array muss also mit 0 enden und darf mittendrin keine 0 haben.

Der korrekte Aufruf lautet:
1
USART_Transmit((char*)P_Msg);

P_Msg ist nämlich das Array von 16bit Integern, was einem Zeiger auf 
viele 16bit Integer entspricht. Durch den Typecast machen wir daraus 
einen Zeiger auf viele Zeichen.

Du wirst aber sicher schnell Probleme bekommen, sobald dein Array ein 
Null-Byte enthält, weil nur bis dahin gesendet wird. Wenn z.B. einer 
deiner 16bit Werten kleiner als 256 ist oder ein exaktes vielfaches von 
256 ist, dann hast du schon ein überwünschtes Null-Byte selbst wenn der 
16bit Integer größer als Null ist.

> USART_Transmit(P_Msg[i]);

Das passt nicht zur von Dir genannten Funktion. Das passt nur zu so 
einer Funktion:
1
void USART_Transmit(uint16_t data)
2
{
3
    while ( !( UCSRA & (1<<UDRE)) )
4
    UDR = data && 0xFF; 
5
    while ( !( UCSRA & (1<<UDRE)) )
6
    UDR = data>>8; 
7
}
Denn P_Msg[i] ergibt einen 16bit Integer.

von Fef F. (Firma: Gast) (fef)


Lesenswert?

ich bedanke mir für Zeit und Mühe, um die zahlreichen Information zu 
geben.

Nun ich habe eine Frage.
wie wird die Funktion sich ändert,
wenn die datentype der Variable P_Msg int32_t
also
int32_t P_Msg[136];

Sieht die Funktion so?

void USART_Transmit(int32_t data)
{
    while ( !( UCSRA & (1<<UDRE)) )
    UDR = data && 0xFF;
    while ( !( UCSRA & (1<<UDRE)) )
    UDR = data>>8;
}

von Dietrich L. (dietrichl)


Lesenswert?

Fef F. schrieb:
> Sieht die Funktion so?
>
> void USART_Transmit(int32_t data)
> {
>     while ( !( UCSRA & (1<<UDRE)) )
>     UDR = data && 0xFF;
>     while ( !( UCSRA & (1<<UDRE)) )
>     UDR = data>>8;
> }

Nein, sondern so:
1
void USART_Transmit(int32_t data)
2
{
3
    while ( !( UCSRA & (1<<UDRE)) )
4
    UDR = data && 0xFF;
5
    while ( !( UCSRA & (1<<UDRE)) )
6
    UDR = data>>8 && 0xFF;
7
    while ( !( UCSRA & (1<<UDRE)) )
8
    UDR = data>>16 && 0xFF;
9
    while ( !( UCSRA & (1<<UDRE)) )
10
    UDR = data>>24;
11
}
 (ohne Garantie ;-)

von Wolfgang (Gast)


Lesenswert?

Dietrich L. schrieb:
> Nein, sondern so:
> void USART_Transmit(int32_t data)
> {
>     while ( !( UCSRA & (1<<UDRE)) )
>     UDR = data && 0xFF;
>     while ( !( UCSRA & (1<<UDRE)) )
>     UDR = data>>8 && 0xFF;
>     while ( !( UCSRA & (1<<UDRE)) )
>     UDR = data>>16 && 0xFF;
>     while ( !( UCSRA & (1<<UDRE)) )
>     UDR = data>>24;
> }
>  (ohne Garantie ;-)

Oder gleich in dieser Art:
1
void USART_Transmit(int32_t data)
2
{
3
  for (int i=4;i>0;i--)
4
  {
5
    while ( !( UCSRA & (1<<UDRE)) )
6
    UDR = data && 0xFF;
7
    data = data>>8; 
8
  }
9
}

von Jay (Gast)


Lesenswert?

Hallo,

2 kurze Fragen:
a) Sicher, dass da 'data &&' stehen sollte und nicht 'data &', also nur 
ein statt zwei Ampersands?
b) Zugegeben habe ich den Text nur überflogen, aber wo wird etwas über 
Endianess von AVR und der Gegenstelle erwähnt?

CU,
Jay

von Stefan F. (Gast)


Lesenswert?

Da fehlen Klammern:
1
while ( !( UCSRA & (1<<UDRE)) )
2
{
3
    UDR = data && 0xFF;
4
    data = data>>8; 
5
}

von Stefan F. (Gast)


Lesenswert?

a) Sicher, dass da 'data &&' stehen sollte und nicht 'data &', also nur
ein statt zwei Ampersands?

Jetzt, wo du nachfragst... Ich bin sicher, dass es & heissen muss. && 
ist falsch.

b) Zugegeben habe ich den Text nur überflogen, aber wo wird etwas über
Endianess von AVR und der Gegenstelle erwähnt?

Nirgendwo. Das sollte man natürlich auch noch hinterfragen.

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.