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

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
SeniorLemuren
Inlägg: 8382
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

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

Inlägg 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;
}
Senast redigerad av MadModder 12 juli 2015, 20:30:05, redigerad totalt 2 gånger.
Anledning: Rubrikändring. Läs regel 1.1 tack.
janno
Inlägg: 430
Blev medlem: 11 oktober 2009, 07:34:45
Ort: Västerås

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

Inlägg 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);
}
bearing
Inlägg: 11670
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

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

Inlägg 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?
Användarvisningsbild
SeniorLemuren
Inlägg: 8382
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

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

Inlägg 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. :)
Användarvisningsbild
Lennart Aspenryd
Tidigare Lasp
Inlägg: 12607
Blev medlem: 1 juli 2011, 19:09:09
Ort: Helsingborg

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

Inlägg av Lennart Aspenryd »

Jag har inmundigat någon Red Ale och annat slikt, så jag kan inte va till någon nytta.
Användarvisningsbild
SeniorLemuren
Inlägg: 8382
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

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

Inlägg av SeniorLemuren »

Orkade inte vänta på morgondagen. Har nu testat OLED displayen i mikroC PRO utan delay och det funkar utmärkt.
janno
Inlägg: 430
Blev medlem: 11 oktober 2009, 07:34:45
Ort: Västerås

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

Inlägg av janno »

Så bra att du fick det att fungera.
Skriv svar