Forum: Mikrocontroller und Digitale Elektronik PIC24 Verwendung eines bestimmten Pins als GPIO


von Tony (Gast)


Lesenswert?

Hallo Leute,

ich verwende auf meinen PIC24 das SPI1-Modul und brauche davon nur SDI, 
SDO und SCK. Auf den Pin !SSI möchte ich das CS für mein SPI-Slave 
legen. Leider habe ich das Problem, dass trotz Initialisierung als 
Output des !SSI-Pins, dieser keinen Output gibt. Im Datenblatt habe ich 
gelesen, dass höher priorisierte Funktionen immer Vorang haben. Sprich 
mein SPI1 Modul verwendet den CS Pin eigentlich als !SSI. Ich habe in 
der Konfig die Verwendung des !SSI ausgeschaltet aber erhalte dennoch 
keine ordentliche Output-Funktion. Könnt ihr mir sagen, wo eventuell das 
Problem liegt? Auf dem Oszi sehe ich den Output und den Clock vom SPI 
einwandfrei. Mein Chip-Select fehlt mir leider.
1
//CS
2
__builtin_write_OSCCONL(OSCCON & 0xbf);   
3
LATCbits.LATC6 = 0;
4
ODCCbits.ODCC6 = 0;
5
TRISCbits.TRISC6 = 0;
6
__builtin_write_OSCCONL(OSCCON | 0x40);
7
8
IFS0bits.SPI1IF = 0; 
9
IEC0bits.SPI1IE = 0;
10
SPI1CON1bits.DISSCK = 0; 
11
SPI1CON1bits.DISSDO = 0; 
12
SPI1CON1bits.MODE16 = 1; 
13
SPI1CON1bits.MSTEN = 1; 
14
SPI1CON1bits.SSEN = 0;
15
SPI1CON1bits.SMP = 0; 
16
SPI1CON1bits.CKE = 0; 
17
SPI1CON1bits.CKP = 0; 
18
SPI1STATbits.SPIEN = 1; 
19
IFS0bits.SPI1IF = 0; 
20
IEC0bits.SPI1IE = 1;
21
22
PORTCbits.RC6 = 1; //Slave Select 
23
24
int main(void) {
25
26
    PORTCbits.RC6 = 0; //Slave Select
27
    DELAY_105uS;
28
29
    WRSPI1(befehl); //SPI Transmit
30
31
    DELAY_105uS;
32
33
    PORTCbits.RC6 = 1; 
34
}

Viele Grüße und Danke!

von Frank K. (fchk)


Lesenswert?

Analogfunktionen abschalten. Die haben die höchste Priorität. Das ist 
ein beliebter PIC-Anfängerfehler.

Such nach ADCON*-Registern.

fchk

von Tony (Gast)


Lesenswert?

Hallo Frank,

danke für den Tipp. Jetzt kann ich den Port einzeln Ein- und 
Ausschalten. Dennoch bleibt der Port nicht eingeschaltet, sobald ich das 
SPI Write verwende. Ich bekomme einen kurzen Einschaltimpuls und danach 
ist RB0 wieder aus. Dabei soll er die gesamte Zeit der Übertragung 
eingeschaltet bleiben.
1
int WRSPI1(int wert){
2
    
3
    SPI1BUF = wert;
4
    while( !SPI1STATbits.SPIRBF);
5
    return SPI1BUF;
6
    
7
}

von Tony (Gast)


Lesenswert?

Tony schrieb:
> Hallo Frank,
>
> danke für den Tipp. Jetzt kann ich den Port einzeln Ein- und
> Ausschalten. Dennoch bleibt der Port nicht eingeschaltet, sobald ich das
> SPI Write verwende. Ich bekomme einen kurzen Einschaltimpuls und danach
> ist RB0 wieder aus. Dabei soll er die gesamte Zeit der Übertragung
> eingeschaltet bleiben.
> int WRSPI1(int wert){
>
>     SPI1BUF = wert;
>     while( !SPI1STATbits.SPIRBF);
>     return SPI1BUF;
>
> }

Ich habe in meinem ersten Beitrag im Beispielcode RC6 verwendet. 
Eigentlich verwende ich aber RB0. Mit RC6 wollte ich nur sicherstellen, 
dass der Fehler nicht mitwandert.

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.