Forum: Mikrocontroller und Digitale Elektronik PIC18F Fehler im Code finden (C)


von Tim H. (pic_fan)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich suche schon seit ein paar Stunden nach dem fehler im Code.
Was ich rausgefunden habe, dass der Fehler in den unten aufgeführten 
code stecken muss.

Zur Thematik: Ein angeschlossenes Sensor modul am Pic soll die Messwerte 
per UART an den Pc übertragen.
Zum testen nutze ich Putty ein Terminal programm.
Ich habe einen ISR programmiert der beim RX vom UART ausgelöst wird und 
die im code ersichtliche funktionen ausführen soll.

Das bild zeigt was passiert.

In Putty gebe ich eine 1 ein um den interrupt 
auszulösen.(1=temp,2=Feuchtigkeit)

Der interrupt wird ausgelöst und sendet mir das richtige ergebnis + die 
ausgabe die er eignetlich nur machen soll wen weder 1 noch die 2 
gedrückt wurden.

Danach kann ich auch keinen weitern interrupt Auslösen.(z.B. Erst die 1 
für Temp dann die 2 für Feuchtigkeit)
1
void interrupt SerialRxPinInterrupt()
2
{
3
    uint8_t i = 0;
4
    //Prüft ob der interrup von uart empfang kommt
5
    if(PIR1bits.RCIF == 1)
6
    {
7
        while(DataRdyUSART()){
8
            u_buffer[i] = ReadUSART(); //wenn ja lies datein
9
            i++;
10
        }
11
        if(u_buffer[0] == '1'){ //1= temp
12
            Uart_Send_Temp();
13
        }
14
        else if(u_buffer[0] == '2'){ //2 = Feuchtigkeit
15
            Uart_Send_Hum();
16
        }
17
        else if(u_buffer[0]== '\0' || u_buffer[0]== '\r' || u_buffer[0]== '\n' ){
18
            putsUSART("\n");
19
        }        
20
        PIR1bits.RCIF = 0; //Löschend des RX interrupt flag bit
21
    }//end if
22
}//end interrupt

Danke im Vorraus

Tim

von Max H. (hartl192)


Lesenswert?

Wie sieht Uart_Send_Hum bzw. -Temp aus?
Die ISR macht man eigentlich so kurz wie möglich und ruft darin keine 
(langen) Funktionen auf.

von Tim H. (pic_fan)


Lesenswert?

Max H. schrieb:
> Wie sieht Uart_Send_Hum bzw. -Temp aus?

UartOpen() findet in der main statt.
1
void Uart_Send_Temp(void){
2
    sprintf(buffer,"%.2f", temp()); //Übertragung für 2 nach komma stellen
3
    putsUSART(buffer);// senden des i2c convertieren wertes über usart übertragen
4
}

die hum siet genau so aus.

gruß

von Tim H. (pic_fan)


Lesenswert?

Fehler Gefudnen er wurde behoben.

Danke Aber
CLOSE

von Alex W. (a20q90)


Lesenswert?

Tim Halbach schrieb:
> Fehler Gefudnen er wurde behoben.
>
> Danke Aber
> CLOSE

Und welcher war es jetzt? Wir wollen auch was lernen!

von Tim H. (pic_fan)


Lesenswert?

Ich habe ien Konfiguration überschrieben.
1
C-Code
1
void setupUart(void){
2
    //pins auf input setzten, Pic Configuriert sich die pins nach bedarf für USART
3
    asm("BANKSEL TRISC");
4
    asm("MOVLW 0xD8"); //Tris ports auf inputstellen RX TX und SDA SCL
5
    asm("MOVWF TRISC");
6
//    asm("BSF TRISC,7"); !!!HIER DER FEHLER!! standvorher drine
7
//    asm("BSF TRISC,6");
8
9
    uartConfig = USART_RX_INT_ON & USART_TX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_BRGH_HIGH;
10
    baud = 103; // Baudrate 9600 = 51 (8Mhz), 103(16mhz)= 9615
11
12
    //Interrupt
13
    RCIF = 0; //RX pin flag auf 0 setzten (reset)
14
    RCIP = 0; //Keine hohe Priorität für den interrupt
15
    RCIE = 1; //Einschalten für RX Intereuppt
16
    PEIE = 1; //Pheripheral interuppt erlauebn (Uart ist ein Pheripharal)
17
}
1
void initI2C(void){
2
//======================= Rausgenommen da hier eine änderung des TRISC stattgefunden hat.
3
    //    asm("BANKSEL TRISC");
4
    //    asm("MOVLW 0x18"); // SCL (RC3) und SDA (RC4) Auf inputstellen
5
    //    asm("MOVWF TRISC");
6
7
    asm("BANKSEL SSPCON1");
8
    asm("MOVLW 0x28");  // Master Mode Clock einstellung (Master mode clock = FOSC/(4 * (SSPADD + 1)))
9
    asm("MOVWF SSPCON1"); //& SCL &SDA als serialport bestimmen
10
11
    asm("BANKSEL SSPSTAT"); //Slew mode dissable
12
    asm("BSF SSPSTAT,7");
13
14
    //Baudrate von I2C einstellen auf 100khz
15
    asm ("MOVLW 0x27"); // (FOSC/(4*xKhz))-1 = (4Mhz/(4*100Khz))-1 = 9 (8mhz = 19) (16mhz=  0x27)
16
    asm ("BANKSEL SSPADD");
17
    asm ("MOVWF SSPADD");
18
19
    asm("BANKSEL SSPCON2");// ack in master mode
20
    asm("bcf SSPCON2,5");
21
}

ich ahbe in 2 Funktionen eine Änderung am INput des TRISC vorgenommen 
als erste lege ich Die USART config fest wo ich die RX und TX pin auf 
input stelle(R6 & RC7 = 0xC0)

das gleiche muss icha cuuh bei der initialisierung von I2C machen dabi 
habe ich aber andere pin (RC3 & RC4 = 0x18)

Also musste ich RC6, RC7, RC3 und RC4 setzen und das ist = 0xD8

EIn blöder programmier fehler und sehr unübersichtlich das cih alles in 
verschiedenen .c Datein haben.

Gruß

Tim

von Max H. (hartl192)


Lesenswert?

Wenn der Fehler in dem Teil des Codes, den du nicht gepostet hast, war, 
können wir natürlich nichts machen...

Btw: Es ist trotzdem nicht sauber in der ISR alle möglichen Funtionen 
wie z.B. sprintf mit float aufzurufen.

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.