Forum: Mikrocontroller und Digitale Elektronik PIC16F88 CC5X zu XC8 konvertieren


von Rudolph R. (rudolph)


Lesenswert?

Hi,

ich habe hier ein SparkFun SerLCD und da ist ein PIC16F88 drauf.
Und den Code finde ich eher nicht so toll.
Aber SparkFun stellt den Quellcode zur Verfügung und so wollte ich mich 
mal ein wenig mit dem Ding beschäftigen um PICs kennen zu lernen.

Na okay, einfach so neu compilieren funktioniert nicht, ich habe MPLABX 
und XC8 installiert, erstellt wurde das Projekt wohl mit CC5X.

Kann mir das hier mal bitte jemand in XC8 übersetzen?
1
//Interrupt Vectors
2
#pragma origin 4
3
interrupt serverX( void)
4
{
5
    int_save_registers
6
    char sv_FSR = FSR;  // save FSR if required
7
8
9
    if(RCIF) //If we have received something from the computer store it in the RX_Array array
10
    {
11
        
12
        RX_In++;
13
        if(RX_In == BUFFER_SIZE) RX_In = 0;
14
        
15
        RX_Array[RX_In] = RCREG;
16
    }
17
18
19
    if(T0IF) //TMR0 Overflow Interrupt - Occurs every 1024us ~1ms
20
    {
21
        backlight_counter++;
22
23
24
        if(backlight_counter == 30)
25
        {
26
            backlight_counter = 0; //30ms pulse width period
27
            
28
            if (brightness_setting > 0) BL_Control = 0; //Kick on the back light only if brightness setting is greater than 0
29
        }    
30
31
32
        //Turn off back light after its assigned duration
33
        if(backlight_counter == brightness_setting) BL_Control = 1; 
34
        
35
        T0IF = 0; //Clear Interrupt Flag
36
    }
37
    
38
    FSR = sv_FSR;               // restore FSR if saved
39
    int_restore_registers 
40
}

 #pragma origin 4

Das dürfte mit dem XC8 schlicht überflüssig sein, oder?

 interrupt serverX( void)

Wie schreibt man das korrekt für den PIC16F88?

 int_save_registers
 int_restore_registers

Sind das Makros? Sind die mit dem XC8 auch überflüssig?

 if(RCIF) //If we have

Kann man das mit dem PIC echt so machen?
RCIF ist doch nur ein Bit in einem Register.

Passt der Rest dann erstmal syntaktisch so?

 char

Als Bonus-Frage, kennt der XC8 wirklich nur die uralt Daten Typen?
Oder versteht der ohne eigene Defines dafür auch sowas wie uint8_t?
Im Handbuch vom XC8 habe ich nur die klassischen Typen gefunden.

von Max H. (hartl192)


Lesenswert?

Rudolph R. schrieb:
> #pragma origin 4
>
> Das dürfte mit dem XC8 schlicht überflüssig sein, oder?
>
>  interrupt serverX( void)
>
> Wie schreibt man das korrekt für den PIC16F88?
>
>  int_save_registers
>  int_restore_registers
Interrupts gehen beim XC8 so:
1
void interrupt myIsr(void)
2
{
3
  //...
4
}

> if(RCIF) //If we have
>
> Kann man das mit dem PIC echt so machen?
> RCIF ist doch nur ein Bit in einem Register.
Wenn RCIF irgendwo entsprechend definiert ist auf jeden Fall.
Beim XC8 spricht man bits mit
1
REGISTERNAMEbits.BITNAME
an, z.B.
1
if(PIR1bits.RCIF)

> char
Auf jeden Fall, bei einem C Compiler der "char" nicht kenn wüde ich mir 
wirklich sorgen machen.
> Als Bonus-Frage, kennt der XC8 wirklich nur die uralt Daten Typen?
Was meinst du mit "uralt Daten Typen"? Wenn du die C Basisdatentypen 
meinst, dann nein.
> Oder versteht der ohne eigene Defines dafür auch sowas wie uint8_t?
Wie immer
1
#include <stdint.h>

: Bearbeitet durch User
von Rudolph R. (rudolph)


Lesenswert?

Max H. schrieb:
>>  interrupt serverX( void)
>>
>> Wie schreibt man das korrekt für den PIC16F88?
>>
>>  int_save_registers
>>  int_restore_registers
> Interrupts gehen beim XC8 so:void interrupt myIsr(void)
> {
>   //...
> }

Wie teilt man dem Compiler mit, für welchen Interrupt Vector das ist?
Wobei der PIC16F88 ohnehin nur einen hat - ist dann der Name der 
Funktion beliebig wählbar?

>> if(RCIF) //If we have
>>
>> Kann man das mit dem PIC echt so machen?
>> RCIF ist doch nur ein Bit in einem Register.
> Wenn RCIF irgendwo entsprechend definiert ist auf jeden Fall.
> Beim XC8 spricht man bits mitREGISTERNAMEbits.BITNAMEan,
> z.B.if(PIR1bits.RCIF)

Also nein, das geht mit dem XC8 nicht direkt, danke. :-)

>> char
> Auf jeden Fall, bei einem C Compiler der "char" nicht kenn wüde ich mir
> wirklich sorgen machen.

Der Begriff "char" war nicht die Frage, so für sich. :-)

>> Als Bonus-Frage, kennt der XC8 wirklich nur die uralt Daten Typen?
> Was meinst du mit "uralt Daten Typen"? Wenn du die C Basisdatentypen
> meinst, dann nein.
>> Oder versteht der ohne eigene Defines dafür auch sowas wie uint8_t?
> Wie immer#include <stdint.h>

Okay, danke.
Seltsam nur, dass das im Handbuch nicht erwähnt wird - oder ich habs 
einfach nicht gefunden.
Stell sich nur die Frage, warum das nicht automatisch includiert wird.

von Max H. (hartl192)


Lesenswert?

Rudolph R. schrieb:
> Wie teilt man dem Compiler mit, für welchen Interrupt Vector das ist?
1
void interrupt myIsr(void)
2
void interrupt low_priority myLowIsr(void)  // Natuerlich nur bei PIC18
> Wobei der PIC16F88 ohnehin nur einen hat - ist dann der Name der
> Funktion beliebig wählbar?
Ja

> Okay, danke.
> Seltsam nur, dass das im Handbuch nicht erwähnt wird - oder ich habs
> einfach nicht gefunden.
http://ww1.microchip.com/downloads/en/DeviceDoc/50002053E.pdf Seite 21
2.4.6 Sizes of Types

> Stell sich nur die Frage, warum das nicht automatisch includiert wird.
Wieso sollte es das? Wird es das irgendwo?

: Bearbeitet durch User
von Rudolph R. (rudolph)


Lesenswert?

Max H. schrieb:
> http://ww1.microchip.com/downloads/en/DeviceDoc/50002053E.pdf Seite 21

Okay, kein Wunder, dass ich das nicht gefunden habe.

>> Stell sich nur die Frage, warum das nicht automatisch includiert wird.
> Wieso sollte es das? Wird es das irgendwo?

Natürlich, C99 sollte schon länger Standard sein und von Atmel kenne ich 
das garnicht anders als das ich die Typen direkt benutzen kann.
Hmm, okay, XC16 braucht den Include auch, gut zu wissen aber ein wenig 
enttäuschend. :-)

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.