Forum: Mikrocontroller und Digitale Elektronik PIC18F1230 Assembler ersetzten oder Header?


von Tobias W. (wintertime)


Angehängte Dateien:

Lesenswert?

Hallo an alle,

ich war schon lange nicht mehr in der C-Programmierung tätig und dann 
auch nur mit AVR.
Jetzt bin ich allerdings beruflich in einen Bereich gekommen bei dem es 
Bestandteil ist allerdings mit Microchip PIC. Um da wieder rein zu 
kommen hab ich mir ein kleines Projekt ausgedacht, das allerdings 
ausbaufähig sein soll.
benutzt wird
-MPLAP X
-ein PIC18F1230
Projekt sind 7 LED's als Lauflicht, die später allerdings als LED 
Laufschrift mit evtl. einigen Register usw ausgebaut werden.

Mein Problem ist sozusagen eine Wartezeit "ordentlich" zu Programieren, 
und diese als Funktion oder dergleichen aufzurufen.

Habe schon einiges ausprobiert ala Timer0, Timer1 oder auch einer 
Zählfunktion was aber soz. bescheiden ist. Mit dem Rest hats auch nich 
funktioniert. Nun bin ich auf die Idee gekommen ein kleines Assembler 
Progrämmchen zu machen. Am besten als eine Header-Datei oder dies sonst 
irgendwie einzubinden, am liebsten wäre mir etwas ohne Assembler.

Bin für alles offen, wie gesagt ich brauch halt ne ordentliche 
Grundlage.
1
/* PIC18f1230 tw 02.05.2013 LED  */
2
3
4
5
6
#include <p18cxxx.h>     //Header File für PIC18F1230
7
8
#pragma config OSC = INTIO2 //interner OSC wählen
9
//#pragma config FOSC=HS   //Taktbereich
10
#pragma config PWRT=ON   //Power on timer
11
#pragma config BOR=OFF   //Brown out reset
12
#pragma config WDT=OFF   //Watchdog timer
13
//#pragma config LVP=OFF   //Low voltage progr.
14
#pragma config MCLRE=ON  //Master clear reset
15
//#pragma config FOSC = INTOSC_EC    // internal oscillator
16
17
/*TRISA = 0x50;      //Port RA5 als Eingang gesetzt für MCLR
18
19
TRISB = 0x20;      //Port RB1 als Eingang gesetzt für LVP
20
TRISB = 0x70;      //Port RB6 als Eingang gesetzt für PGC
21
TRISB = 0x80;*/      //Port RB7 Als Eingang gesetzt für PGD
22
23
// oder auch:
24
25
26
27
//Macht evtl. das Leben einfacher ?!
28
29
#define LED1 LATAbits.LATA0
30
#define LED2 LATAbits.LATA1
31
#define LED3 LATAbits.LATA2
32
#define LED4 LATAbits.LATA3
33
#define LED5 LATAbits.LATA4
34
#define LED6 LATBbits.LATB5
35
#define LED7 LATBbits.LATB4
36
37
#define LED1_ON()     (LED1 = 1);
38
#define LED1_OFF()    (LED1 = 0);
39
#define LED1_Toggle()   (LED1 = !LED1);
40
41
#define LED2_ON()     (LED2 = 1);
42
#define LED2_OFF()    (LED2 = 0);
43
#define LED2_Toggle()   (LED2 = !LED2);
44
45
#define LED3_ON()     (LED3 = 1);
46
#define LED3_OFF()    (LED3 = 0);
47
#define LED3_Toggle()   (LED3 = !LED3);
48
49
#define LED4_ON()     (LED4 = 1);
50
#define LED4_OFF()    (LED4 = 0);
51
#define LED4_Toggle()   (LED4 = !LED4);
52
53
#define LED5_ON()     (LED5 = 1);
54
#define LED5_OFF()    (LED5 = 0);
55
#define LED5_Toggle()   (LED5 = !LED5);
56
57
#define LED6_ON()     (LED6 = 1);
58
#define LED6_OFF()    (LED6 = 0);
59
#define LED6_Toggle()   (LED6 = !LED6);
60
61
#define LED7_ON()     (LED7 = 1);
62
#define LED7_OFF()    (LED7 = 0);
63
#define LED7_Toggle()   (LED7 = !LED7);
64
65
66
void ALLON()
67
{
68
  LED1_ON();
69
  Wait();
70
  LED2_ON();
71
  Wait();
72
  LED3_ON();
73
  Wait();
74
  LED4_ON();
75
  Wait();
76
  LED5_ON();
77
  Wait();
78
  LED6_ON();
79
  Wait();
80
  LED7_ON();
81
  Wait();
82
}
83
84
void ALLOFF()
85
{
86
  LED7_OFF();
87
  Wait();
88
  LED6_OFF();
89
  Wait();
90
  LED5_OFF();
91
  Wait();
92
  LED4_OFF();
93
  Wait();
94
  LED3_OFF();
95
  Wait();
96
  LED2_OFF();
97
  Wait();
98
  LED1_OFF();
99
  Wait();
100
}
101
102
void Lauflicht()
103
{
104
        LED1_ON();
105
    Wait();
106
        LED1_Toggle();
107
        Wait();
108
    LED2_ON();
109
    Wait();
110
        LED2_Toggle();
111
        Wait();
112
    LED3_ON();
113
    Wait();
114
        LED3_Toggle();
115
        Wait();
116
    LED4_ON();
117
    Wait();
118
        LED4_Toggle();
119
        Wait();
120
    LED5_ON():
121
    Wait();
122
        LED5_Toggle();
123
        Wait()
124
    LED6_ON();
125
    Wait();
126
        LED6_Toggle();
127
        Wait();
128
    LED7_ON();
129
    Wait();
130
        LED7_Toggle();
131
        Wait();
132
}
133
134
void OC()
135
{
136
    OSCCON = 0xF2;       // internal oscillator, 8MHz
137
}
138
/*******************************************************************************************************/
139
void Wait()    //100ms
140
{
141
142
        movlw   .221;
143
        movwf   mytime;
144
145
Loop    nop;nop;nop;nop;nop;nop;
146
147
        decfsz  mytime, F;
148
        goto    Loop;
149
}
150
151
/*******************************************************************************************************/
152
}
153
void main()
154
{
155
    TRISB = 0xC2;      //RB 1,6,7 als Eingang 1100 0010 ??????
156
157
// PORT A
158
LATAbits.LATA0 = 1;    //Port RA0 als Ausgang gesetzt für LED1
159
LATAbits.LATA1 = 1;    //Port RA1 als Ausgang gesetzt für LED2
160
LATAbits.LATA2 = 1;    //Port RA2 als Ausgang gesetzt für LED3
161
LATAbits.LATA3 = 1;    //Port RA3 als Ausgang gesetzt für LED4
162
LATAbits.LATA4 = 1;    //Port RA4 als Ausgang gesetzt für LED5
163
164
//PORT B
165
LATBbits.LATB4 = 1;    //PORT RB4 als Ausgang gesetzt für LED7
166
LATBbits.LATB5 = 1;    //PORT RB5 als Ausgang gesetzt für LED6
167
    OC();
168
    int i,j;
169
    for (i=0; i<=5; i++)
170
    {
171
        ALLON();
172
    ALLOFF();
173
    }
174
    for (j=0; j<=5; i++)
175
    {
176
        Lauflicht();
177
    }
178
179
    return();
180
}

Hier der Assembler code den ich erst als fFunktion eingebunden habe, 
aber da meckert er.
1
void Wait()    //100ms
2
{
3
4
        movlw   .221;
5
        movwf   mytime;
6
7
Loop    nop;nop;nop;nop;nop;nop;
8
9
        decfsz  mytime, F;
10
        goto    Loop;
11
}

von Chris B. (dekatz)


Lesenswert?

Tobias W. schrieb:
> movlw   .221;
>
>         movwf   mytime;
>
>
>
> Loop    nop;nop;nop;nop;nop;nop;
>
>
>
>         decfsz  mytime, F;
>
>         goto    Loop;

Das ist sicher nicht die richtige Schreibweise für Inline-Assembler beim 
XC8!  Siehe XC8-manual Seite 202ff !
Und eine Lösung mit einem Timer würde ich dem auch vorziehen bzw. gibt 
es beim XC8 auch ein __delay_ms() u.ä. Funktionen. Auch dafür siehe 
XC8-manual bzw. Help-Funktion im MPLABX.

von Tobias W. (wintertime)


Lesenswert?

Wie gesagt Timer würde mir auch besser gefallen, da ich ihn später 100% 
noch brauche.

Hab da mal angefangen, weis jedoch nicht weiter :
1
/*
2
3
    Timer 1 Initialisierung
4
    
5
*/
6
7
void timer_1()
8
{
9
  RD = 1 ;          // 16-Bit
10
  T1RUN = 1;          // Timer 1 OSC (intern)
11
  T1CKPS1, T1CKPS0 = 1;    // Vorteiler 1:8 
12
  T1=SCEN = 1;        // Timer 1 OSC enabled
13
  //T1SYNC = 1;        // Nur bei externem OSC
14
  TMR1CS = 0;          // Internal clock (FOSC/4)
15
  TMR1ON = 1;          // Start Timer 1
16
}

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.