Forum: Mikrocontroller und Digitale Elektronik PIC18F Structure Problem (xc8)


von Gerd B. (bertr2d2) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo,

ich arbeite gerade an einem Projekt mit einem PIC18F26K80 (mein erster 
PIC ;-) und habe ein Problem mit einer Structure. Je nachdem wie groß 
ich diese mache (34 oder 66 Byte) läuft das Programm oder es zeigt Murks 
(bei ...SIZE 64 gehts - bei 32 nicht).

Hier der Codeausschnitt:
main.h
1
#define SERIAL_BUFFER_SIZE      32
2
...
3
/* circular buffer */
4
typedef struct serial_buffer_t {
5
    unsigned char head;
6
    unsigned char tail;
7
    unsigned char data[SERIAL_BUFFER_SIZE];
8
};
main.c
1
#include "main.h"
2
#include "usart.h"
3
4
const char * s1 = "circular buffer is working!\r\n";
5
const char * s2 = "USART is working!\r\n";
6
7
volatile unsigned char timer_ticks=0;
8
struct serial_buffer_t tx_fifo, rx_fifo;
9
...
10
void main(void) {
11
...
12
    tx_fifo.head=0;
13
    tx_fifo.tail=0;
14
    rx_fifo.head=0;
15
    rx_fifo.tail=0;

Output (Size 32 Byte Data):
1
:7A
2
:7B
3
:7C
4
:7D
5
:7E

Output (Size 64 Byte Data):
1
USART is working!
2
r:01
3
USART is working!
4
r:02
5
USART is working!
6
r:03
7
USART is working!
8
r:04

Der Compiler ist: xc8 v1.30

Später soll der Ring Buffer benutzt werden um die Kommunikation über die 
serielle Schnistelle zu entzerren, aber schon bei der Deklarierung bzw. 
Speicherbelegung stimmt etwas nicht.
Hat jemand eine Idee, was ich falsch mache ?

Vielen Dank und Grüße

Gerd

von Tom W. (nericoh)


Lesenswert?

Müsste es net
1
typedef struct{
2
    unsigned char head;
3
    unsigned char tail;
4
    unsigned char data[SERIAL_BUFFER_SIZE];
5
}serial_buffer_t;

heißen? Wobei das natürlich net erklärt, warum es mit 32 klappt, mit 64 
aber net.

Tom

von Gerd B. (bertr2d2) Benutzerseite


Lesenswert?

Vielen Dank Tom für Deine Antwort. Ich habe typedef mal rausgenommen, 
wie es auch im K&R Standardwerk beschrieben ist. Es ist kein 
Unterschied; es funktioniert immer noch nicht.

Tom W. schrieb:
> Müsste es net
>
>
1
typedef struct{
2
     unsigned char head;
3
     unsigned char tail;
4
     unsigned char data[SERIAL_BUFFER_SIZE];
5
 }serial_buffer_t;
>
> heißen? Wobei das natürlich net erklärt, warum es mit 32 klappt, mit 64
> aber net.
>
> Tom

Wie gesagt, mit 64 Byte funktioniert es , mit 32 Byte Data nicht. Ich 
habe auch mal auf xc8 v 1.32 upgedated - kein Unterschied.

Gruß

Gerd

von Gerd B. (bertr2d2) Benutzerseite


Lesenswert?

Ich habe die Ursache gefunden: In der ds30loader Firmware habe ich aus 
Unwissenheit XINST auf ON gesetzt. Bei dem modifizierten ds30loader CLI 
werden die Config-Register nicht neu gesetzt.

Nachdem ich XINST auf OFF gesetzt habe läuft der Code jetzt soweit.

: Bearbeitet durch User
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.