Hallo zusammen, ich haben ein kleines Probelm, nämlich das eine Variable
(1 Byte) nicht in die Interrupt-Routine übergeben wird, obwohl ich sie
mit volatile definiert hab:
Mein Programm:
main.c
#include "Funktion1.h"
#include <avr/interrupts.h>
Hier rufe ich eine Funktion1 auf, diese liegt im Funktion.c. Diese
Funktion1 verändert die Variable X.
Ebenso liegt hier der ISR (vector), in diesem wird eine Funktion2
aufgerufen ( diese liegt ebefalls im Funktion.c ) in der die Variable X
verändert wird.
Funktion.c
( im Funktion.h: volatile uint8_t X; )
Funktion1: Verändere Variable X, Loop bis X von Funktion2 ( welche in
dem Interrupt aufgerufen wird ) verändert wird
Interrupt: Rufe Funktion2 auf ( oder eine andere, aber die tut nix zur
sache )
Jetzt wird die Variable in der Funktion1 gesetzt funktioniert das auch,
allerdings ist sie in der Funktion2 ( welche DANACH! vom Interrupt
aufgerufen wird ) immer 0. Das ich irgenwo einen Fehler gemacht hab ist
mir klar, nur leider finde ich den Fehler nicht, der Compiler meckert
auch nicht, also werden zumindest alle Files eingebunden.
Grüßle lightninglord
im Funktion.h: volatile uint8_t X;
wenn du in der Funktion eine neue Variabel anlegst dann ist klar das sie
anders ist. Du musst die variable Global machen.
Etwas mehr quelltext zu zeigen ist aber auch nicht falsch.
> ( im Funktion.h: volatile uint8_t X; )
Das ist eine Definition, die hat in der Headerdatei nichts verloren.
Wenn es denn überhaupt erforderlich ist, X außerhalb des Moduls
"funktion.c" anzusprechen, dann gehört in die Headerdatei ein
extern volatile uint8_t X;
und in "funktion.c"
volatile uint8_t X;
(und gegebenenfalls eine Initialisierung)
lightninglord schrieb:
> In der Main.c:>> ...> volatile uint8_t *xxxxTxData;> volatile uint8_t xxxxTxCnt;> ...
So wie du das hast, wächst sich das schnell zum Nightmare aus. (Wo ist
überhaupt xxxxStat?)
Schmeiss mal alle xxxx... überall raus.
Und dann machst du
xxxx.35
1
//==== Define Headerfile ====
2
3
#ifndef _xxxx35_h_
4
#define _xxxx35_h_
5
6
7
8
//==== Include Headerfiles =====
9
10
#include<inttypes.h>
11
#include"cyw_config.h"
12
#include<avr/interrupt.h>
13
#include<stdbool.h>
14
15
16
17
//==== Global CYWUSB Variables ====
18
19
struct{// Statusbits used by div. functions
20
21
uint8_tRx:1;// XXXX in resceiving-mode
22
uint8_tRx_Valid:1;// XXXX data is valid
23
uint8_tRx_Comp:1;// Rx is complete
24
uint8_tTx:1;// XXXX in transmitting-mode
25
uint8_tTx_Busy:1;// XXXX is transmitting
26
uint8_tTx_Comp:1;// Tx is complete
27
uint8_tPreBrustDet:1;// Prebrust detected
28
uint8_tStartConDet:1;// Startcondition detected
29
30
}cywStat;
31
32
externuint8_txxxxRxData[8];// Datapacket for rx/tx consists of 8 Bytes:
33
externuint8_txxxxRxValid[8];
34
externuint8_txxxxRxLen;
35
externuint8_t*volatilexxxxTxData;
36
externvolatileuint8_txxxxTxCnt;
37
externvolatilestructcywStatxxxxStat;
38
39
//==== Resceive Interrupt Routine ====
40
41
voidrxIsr(void);
42
43
44
45
//==== Resceive Interrupt Routine ====
46
47
voidtxIsr(void);
in alle anderen *.c includierst du lediglich xxxx35.h (und definierst
keines deiner xxxxTx... dort selber)
lediglich in xxxx35.c kommt rein
1
//==== Include Headers ====
2
3
#include"main.h"
4
#include"xxxx35.h"
5
#include"spi.h"
6
#include"hardware.h"
7
8
#include<util/delay.h>
9
#include<inttypes.h>
10
#include<avr/interrupt.h>
11
#include<avr/io.h>
12
13
uint8_txxxxRxData[8];// Datapacket for rx/tx consists of 8 Bytes:
14
uint8_txxxxRxValid[8];
15
uint8_txxxxRxLen;
16
uint8_t*volatilexxxxTxData;
17
volatileuint8_txxxxTxCnt;
18
volatilestructcywStatxxxxStat;
19
20
21
//==== Transmit Datapacket ====
22
23
voidxxxxTx(uint8_tlength,uint8_t*data){
24
25
xxxxTxData=data;
26
xxxxTxCnt=length;
27
28
...
Ob die volatile da jetzt alle stimmen bin ich mir insbesondere bei der
struct nicht ganz sicher, aber zumindest ist so erst mal ausgeschlossen,
dass du mehrere (lokale) Variablen gleichen Namens hast.
uint8_tcywRxData[8];// Datapacket for rx/tx consists of 8 Bytes:
14
uint8_tcywRxValid[8];
15
uint8_tcywRxLen;
16
uint8_t*volatilecywTxData;
17
volatileuint8_tcywTxCnt;
18
volatilestruct__StatcywStat;
19
20
//==== CYWUSB Transmit Datapacket ====
21
22
voidcywTx(uint8_tlength,uint8_t*data){
23
24
cywTxData=data;
25
cywTxCnt=length;
26
cywStat.Tx_Busy=1;
27
28
usartOut(cywTxCnt);
29
cywWriteByte(REG_TX_INT_EN,Tx_Emp);
30
31
while(cywStat.Tx_Busy==1);
32
33
cywRxTxOff();
34
35
}
36
37
38
39
//==== Resceive Interrupt Routine ====
40
41
voidrxIsr(void){
42
43
/*code*/
44
45
}
46
47
48
49
//==== Resceive Interrupt Routine ====
50
51
voidtxIsr(void){
52
53
/*code*/
54
55
cywStat.Tx_Busy=0;
56
57
/*code*/
58
59
--cywTxCnt;
60
61
/*code*/
62
}
cywusb6935.h
1
//==== Define Headerfile ====
2
3
#ifndef _cywusb6935_h_
4
#define _cywusb6935_h_
5
6
7
8
//==== Include Headerfiles =====
9
10
#include<inttypes.h>
11
#include"cyw_config.h"
12
#include<avr/interrupt.h>
13
#include<stdbool.h>
14
15
16
17
//==== Global CYWUSB Variables ====
18
19
struct__Stat{// Statusbits used by div. functions
20
21
uint8_tRx:1;// CYWUSB in resceiving-mode
22
uint8_tRx_Valid:1;// CYWUSB data is valid
23
uint8_tRx_Comp:1;// Rx is complete
24
uint8_tTx:1;// CYWUSB in transmitting-mode
25
uint8_tTx_Busy:1;// CYWUSB is transmitting
26
uint8_tTx_Comp:1;// Tx is complete
27
uint8_tPreBrustDet:1;// Prebrust detected
28
uint8_tStartConDet:1;// Startcondition detected
29
30
};
31
32
externuint8_tcywRxData[8];// Datapacket for rx/tx consists of 8 Bytes:
33
externuint8_tcywRxValid[8];
34
externuint8_tcywRxLen;
35
externuint8_t*volatilecywTxData;
36
externvolatileuint8_tcywTxCnt;
37
externvolatilestruct__StatcywStat;
38
39
40
41
//==== CYWUSB Transmit Datapacket ====
42
43
voidcywTx(uint8_tlength,uint8_t*data);
44
45
46
47
//==== Resceive Interrupt Routine ====
48
49
voidrxIsr(void);
50
51
52
53
//==== Resceive Interrupt Routine ====
54
55
voidtxIsr(void);
56
57
58
#endif
So jetzt hab ich nochmal alles so geändert wies vorgeschlagen wurde, ich
hab auch alle Variablen nochmal überarbeitet. Er Compiliert mir jetzt
alles, der rest vom Code wird alles so verarbeitet wie es soll, aber die
Variablen cywStat und cywTxCnt werden immer noch nicht übergeben. Kann
es sein das es nicht geth das die ISR und die Funktionen in
verschiedenen Files liegen?
Ja es gibt eine App mit CYWUSB6935, das kann ich ja verraten ;-) Als
grobe Vorlage dient die Cypress-Software, aber wirklich nur als grobe
Vorlage, denn deren Protokoll sind für meine Zwecke nicht verwendbar,
mir gehts hauptächlich um die Ansteuerung vom CYWUSB, der Rest
funktioniert schon fast, nur mit meiner RF erfahrung kann ich ned gerade
glänzen.
>...aber die Variablen cywStat und cywTxCnt werden immer noch nicht übergeben.
Übergeben wird da nichts, die Variablen sind global, und damit im
gesamten Programm definiert und sichtbar.
>Kann es sein das es nicht geth das die ISR und die Funktionen in>verschiedenen Files liegen?
Nein. Die beiden Variablen sind richtig deklariert, wenn es so nicht
funktioniert, liegt es nicht an diesen globalen Variablen.
Der Sourcecode zusammengezippt, kompilierbar, und als Anhang wäre
schöner gewesen.
Oliver
So ich hab mal alle relevanten Funktionen und Files in nen eigenes
Projekt gepackt und siehe da die Variable wird richtig übergeben. Das
überrascht mich nicht da ich ja sonst nix verändert hab außer nur die
Notwendigen Funktionen zu kopieren. Auf die Variable wird außer in den
Funktionen NICHT! zugegriffen. Komisch. Was könnte den das sein?
>Was könnte den das sein?
Ein Fehler in Zeile 42.
Solange die einzige Fehlerbeschreibung lautet "geht nicht", und kein
vollständiger Sourcecode (mit makefile oder Projektfiles) vorliegt, ist
das alles nur fruchtlose Raterei.
Oliver