Sida 1 av 1

While(... funkar inte i mikroC Pro, eller?

Postat: 11 juli 2015, 20:15:23
av SeniorLemuren
Hur funkar detta:

Kod: Markera allt

void Oled_Command(uchar cmd){
OLED_CS = 0; OLED_DC = 0;
while(WriteSPI(cmd));
OLED_CS = 1;
}
Anledningen till frågan är att jag vill flytta detta lib från MPLAB X till mikroC Pro och det funkar inte med while(...
Tänker jag rätt om jag gör så här i stället.

Kod: Markera allt

void Oled_Command(uchar cmd){
OLED_CS = 0; OLED_DC = 0;
WriteSPI(cmd);
delay_µS(xxx) ; // där xxx är ett lagom antal µS.
OLED_CS = 1;
}

Re: För mycket öl förmodligen.

Postat: 11 juli 2015, 20:30:14
av janno
För att skicka på SPI bussen så borde detta fungera fint. Jag kan inte ta äran åt mig av koden nedan, det är den som MPLABX genererar när man aktiverar SPI på 18F46K22
Du tar ju emot data samtidigt som du sänder så vad returnerar din WriteSPI()? Det som skrevs tillbaka från slaven?
Du bör ju kolla BF istället för att vänta en viss tid.

Kod: Markera allt

#define SPI_RX_IN_PROGRESS 0x0

uint8_t SPI1_Exchange8bit(uint8_t data) {
    // Clear the Write Collision flag, to allow writing
    SSP1CON1bits.WCOL = 0;

    SSP1BUF = data;

    while (SSP1STATbits.BF == SPI_RX_IN_PROGRESS) {
    }

    return (SSP1BUF);
}

Re: För mycket öl förmodligen.

Postat: 11 juli 2015, 21:22:56
av bearing
SeniorLemuren skrev:

Kod: Markera allt

void Oled_Command(uchar cmd){
OLED_CS = 0; OLED_DC = 0;
WriteSPI(cmd);
delay_µS(xxx) ; // där xxx är ett lagom antal µS.
OLED_CS = 1;
}
Istället för delay skulle du kunna polla den flagga som säger att SPI-överföringen är klar.

Men är du säker på att WriteSPI inte redan hanterar detta?
D.v.s du behöver inte ha någon delay, bara skriva ovanstående kod, utan delay?

Re: För mycket öl förmodligen.

Postat: 11 juli 2015, 23:11:39
av SeniorLemuren
janno skrev:För att skicka på SPI bussen så borde detta fungera fint. Jag kan inte ta äran åt mig av koden nedan, det är den som MPLABX genererar när man aktiverar SPI på 18F46K22
Du tar ju emot data samtidigt som du sänder så vad returnerar din WriteSPI()? Det som skrevs tillbaka från slaven?
Du bör ju kolla BF istället för att vänta en viss tid.

Kod: Markera allt

#define SPI_RX_IN_PROGRESS 0x0

uint8_t SPI1_Exchange8bit(uint8_t data) {
    // Clear the Write Collision flag, to allow writing
    SSP1CON1bits.WCOL = 0;

    SSP1BUF = data;

    while (SSP1STATbits.BF == SPI_RX_IN_PROGRESS) {
    }

    return (SSP1BUF);
}
Jag har inte kopplat den pinnen som tar emot data från OLED. Jag skriver blint till den. Dessutom så skickas inget tillbaka vid write i mikroC enligt detta:
Prototype: void SPIx_Write(unsigned short data_);

Returns: Nothing.

Description: Writes byte via the SPI bus.
Men kanske det är som bearing föreslår att WriteSPI redan hanterar detta och ingen delay behövs. Jag får testa lite i morgon när öldimman lagt sig. :)

Re: För mycket öl förmodligen.

Postat: 11 juli 2015, 23:40:16
av Lennart Aspenryd
Jag har inmundigat någon Red Ale och annat slikt, så jag kan inte va till någon nytta.

Re: För mycket öl förmodligen.

Postat: 12 juli 2015, 02:20:49
av SeniorLemuren
Orkade inte vänta på morgondagen. Har nu testat OLED displayen i mikroC PRO utan delay och det funkar utmärkt.

Re: För mycket öl förmodligen.

Postat: 12 juli 2015, 09:08:00
av janno
Så bra att du fick det att fungera.