1 | list p=16F1788
|
2 | #include <p16F1788.inc>
|
3 |
|
4 | Errorlevel -302
|
5 | org 0x00 ;beginne mit flashadresse 0
|
6 |
|
7 | ;******************************************************
|
8 | ;**********Oszillator Konfiguration********************
|
9 | BANKSEL OSCCON
|
10 | MOVLW B'11111011' ;intosc auf 32MHz
|
11 | MOVWF OSCCON
|
12 | ;************Konfig des PSMC****************************
|
13 | BANKSEL PSMC1CON
|
14 | bsf PSMC1PRS, 0 ;bit 0 setzen für Timermatch als Periodenstart
|
15 | bsf PSMC1PHS, 0 ;bit 0 setzen für Timermatch als high puls start
|
16 | bsf PSMC1DCS, 0 ;bit 0 setzen für Timermatch als low puls (ende high)
|
17 | movlw b'00110001' ;prescaler auf 8 und 64MHz PLL gewählt
|
18 | movwf PSMC1CLK
|
19 | movlw b'10001111' ;low Byte vom 16bit PWM Perioden-Register
|
20 | movwf PSMC1PRL
|
21 | movlw b'00000001' ;high Byte von 16bit PWM Peride
|
22 | movwf PSMC1PRH ;entspricht 20kHz PWM-Frequenz
|
23 | clrf PSMC1PHH ;Highpuls soll bei 0 beginnen
|
24 | clrf PSMC1PHL ;high und low byte auf 0
|
25 | movlw b'01100100' ;dezimal 100, entspricht 25% DutyCycle
|
26 | movwf PSMC1DCL ;Registerinhalt (Timer) 100 kommt die fallende Flanke bzw. Lowimpuls
|
27 | clrf PSMC1DCH ;high byte wird nicht benötigt
|
28 | movlw b'10000000'
|
29 | movwf PSMC1MDL ;Modulationsquelle etc. WTF?
|
30 | clrf PSMC1POL ;aktiv high pegel wählen (5V entspr. log 1)
|
31 | bsf PSMC1INT, 5 ;5. bit enspricht dem DC interrupt (-> für comparator zum auslesen!!)
|
32 | ;1. bit vom PSMC1INT abfragen/löschen für kommutierung
|
33 | bsf PSMC1INT, 6 ;Interrupt bei start vom highpegel des PWM
|
34 | ;bsf PSMC1STR1, 7 ;PWM synchron zur periode
|
35 | bsf PSMC1STR1, 0 ;highside wird mit pwm beaufschlagt (lowside nicht)
|
36 | movlw b'00111111'
|
37 | movwf PSMC1OEN ;pins auf PSMC umschalten ...?!
|
38 | movlw b'11001100' ;PSMC an und auf 3phasen modus + updates der Reg. einschalten
|
39 | movwf PSMC1CON
|
40 | BANKSEL TRISC
|
41 | ; xx-+-+-+
|
42 | ; xxFEDCBA
|
43 | movlw b'11101101' ;alle Pins die benötigt werden als Output beim PortC
|
44 | movwf TRISC
|
45 | ;**********************************************************
|
46 | ;****************Ende der Config***************************
|
47 |
|
48 |
|
49 | movlw 0x10 ;B und E anschalten
|
50 | movwf PSMC1STR0
|
51 |
|
52 | Main
|
53 | goto Main
|
54 |
|
55 |
|
56 |
|
57 | delay_2ms ;31,25ns * 255*255 -> 2ms bei 32Mhz
|
58 | MOVLW 255 ;255 ins Wreg
|
59 | MOVWF 0x20 ;255 in den RAM schreiben
|
60 | loopi
|
61 | call hilf_delay
|
62 | DECFSZ 0x20, 1 ;Inhalt in 0x20 um 1 dekrementieren
|
63 | goto loopi ;übersprungen wenn 0x20 = 0
|
64 | return
|
65 |
|
66 | hilf_delay
|
67 | MOVLW 255 ;20 ins Wreg
|
68 | MOVWF 0x28 ;20 in den RAM schreiben
|
69 | DECFSZ 0x28, 1 ;Inhalt in 0x20 um 1 dekrementieren
|
70 | goto $-1 ;programcursor eine Instruktion zurück; übersprungen wenn 0x20 = 0
|
71 | return
|
72 |
|
73 | end
|