Toon posts:

[assambly] pwm frequentie doorgeven via wifi

Pagina: 1
Acties:
  • 468 views

  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
ik ben bezig met het maken van een robot (een rupsbandvoertuig), die aangestuurd wordt door een pic microcontroller die aan een omgebouwde linksys router hangt.

Je kunt hem nu al de richting doorgeven, maar nog niet de snelheid. Ik zou dit graag via pwm doen maar ik kom er niet uit hoe ik dit het beste kan doen. Omdat het een rubsbanvoertuig is lijkt mij dat je twee getallen moet voorstellen die dan beiden een pwm persentage vertegenwoordigen (één voor elke motor, dus elke rubsband). Op dit moment stuurt de software gewoon een 1 (links) 2 (rechts) 4 (naar voren) 8 (naar achteren). Hoe kan ik het beste ook de pwm percentages doogeven?

Anoniem: 180316

Hoe bedoel je percentages doorgeven? Via de WiFi verbinding? Want dat kan je toch gewoon als (bijvoorbeeld) twee hexadecimale getallen doen. Bijv: 0x0F en 0xF0 voor om de as draaien...

Ik weet niet wat de schaal van je controller is, maar met een 8 bits register kan je het zo oplossen.

  • voodooless
  • Registratie: Januari 2002
  • Laatst online: 19-03 10:57

voodooless

Sound is no voodoo!

Waarom links en rechts, voor en achter hebben, als je de twee motoren op een bepaalde snelheid en richting kan laten draaien?

Gewoon snelheid L en snelheid R doorgeven, en dan kun je alles wat je maar wil. Hoeveel bits je daar voor nodig hebt weet ik niet, is afhankelijk van je PWM implementatie en de noodzaak voor detail in de aansturing.

Do diamonds shine on the dark side of the moon :?


  • huub8
  • Registratie: Maart 2009
  • Laatst online: 28-06-2021
ik dacht inderdaad veel te ingewikkeld, maar ik heb nu via deze website een stuk code gevonden dat twee motoren via pwm kan aansturen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
; 16F876 PWM example code
;
; Device 16F876
    LIST P=16F876, W=2, X=ON, R=DEC
    #INCLUDE P16F876.INC
    __CONFIG    0x393A

    cblock  0x20            ;start of general purpose registers
        count           ;used in delay routine
        count1          ;used in delay routine
        counta          ;used in delay routine
        countb          ;used in delay routine
        temp            ;temp storage
    endc



RL  Equ 0x00    ;pin for left motor reverse
FL  Equ 0x03    ;pin for left motor forward
RR  Equ 0x04    ;pin for right motor reverse
FR  Equ 0x05    ;pin for right motor forward

;pins 1 and 2 are the 2 PWM channels



        ORG 0x0000
        NOP ;for bootloader compatibility
        NOP
        NOP
        GOTO    START
        ORG 0x0010
    
START   CALL    Initialise


###############################################################################
MainLoop:
    MOVLW   d'64'
    CALL    SpeedL      ;both half speed forwards
    CALL    SpeedR
    CALL    Long_Delay

    MOVLW   d'64'
    CALL    SpeedL      ;left half speed forwards
    MOVLW   d'192'
    CALL    SpeedR      ;right half speed reverse
    CALL    Long_Delay

    MOVLW   d'10'
    CALL    SpeedL      ;slow speed forwards
    MOVLW   d'228'
    CALL    SpeedR      ;fast speed reverse
    CALL    Long_Delay

    MOVLW   d'228'
    CALL    SpeedL      ;fast speed reverse
    MOVLW   d'10'
    CALL    SpeedR      ;slow speed forwards
    CALL    Long_Delay

    GOTO    MainLoop[/b]

###############################################################################



Initialise:
        BANKSEL  ADCON1     ;turn off A2D
        MOVLW    0x06
        MOVWF    ADCON1
        BANKSEL  PORTA
        BANKSEL  TRISC
        MOVLW    0      ;set PORTC as all outputs
        MOVWF    TRISC
        BANKSEL  PORTC

    MOVF     CCP1CON,W  ;set CCP1 as PWM
        ANDLW    0xF0
        IORLW    0x0C
        MOVWF    CCP1CON

        MOVF     CCP2CON,W  ;set CCP2 as PWM
        ANDLW    0xF0
        IORLW    0x0C
        MOVWF    CCP2CON

        MOVLW    126        ;set highest PWM value
        BANKSEL  PR2        ;over this (127) is permanently on
        MOVWF    PR2
        BANKSEL  TMR2

        MOVF     T2CON,W    ;set prescaler to 16
        ANDLW    0xF8       ;PWM at 2500HZ
        IORLW    0x02
        MOVWF    T2CON

        MOVF     T2CON,W    ;set postscaler to 1
        ANDLW    0x07
        IORLW    0x00
        MOVWF    T2CON
        
        CLRF    CCPR1L      ;set PWM to zero
        CLRF    CCPR2L

        BSF      T2CON, TMR2ON  ;and start the timer running
    RETURN

SpeedL:             ;use value in W to set speed (0-127)
        MOVWF   temp
    BTFSC   temp, 7     ;if more than 128 set speed in reverse
    CALL    ReverseL    ;so '1' is very slow forward
    BTFSS   temp, 7     ;and '129' is very slow reverse
    CALL    ForwardL
    ANDLW   0x7F
        MOVWF   CCPR1L
    RETURN

SpeedR:
        MOVWF   temp
    BTFSC   temp, 7
    CALL    ReverseR
    BTFSS   temp, 7
    CALL    ForwardR
    ANDLW   0x7F
        MOVWF   CCPR2L
    RETURN

ReverseL:
    BSF PORTC, RL   ;set pins for reverse
    BCF PORTC, FL
    RETURN

ReverseR:
    BSF PORTC, RR
    BCF PORTC, FR
    RETURN

ForwardL:
    BCF PORTC, RL   ;set pins for forward
    BSF PORTC, FL
    RETURN

ForwardR:
    BCF PORTC, RR
    BSF PORTC, FR
    RETURN

;Delay routines

Long_Delay              
        movlw   d'50'       ;delay 5 seconds
        call    Delay100W
        return

Delay100W   movwf   count       ;delay W x 100mS
d2      call    Delay100    ;maximum delay 25.5 seconds
        decfsz  count   ,f
        goto    d2
        return

Delay255    movlw   0xff        ;delay 255 mS
        goto    d0
Delay100    movlw   d'100'      ;delay 100mS
        goto    d0
Delay50     movlw   d'50'       ;delay 50mS
        goto    d0
Delay20     movlw   d'20'       ;delay 20mS
        goto    d0
Delay10     movlw   d'10'       ;delay 10mS
        goto    d0
Delay1      movlw   d'1'        ;delay 1mS
        goto    d0
Delay5      movlw   0x05        ;delay 5.000 ms (4 MHz clock)
d0      movwf   count1
d1      movlw   0xE7
        movwf   counta
        movlw   0x04
        movwf   countb
Delay_0     decfsz  counta, f
        goto    $+2
        decfsz  countb, f
        goto    Delay_0

        decfsz  count1  ,f
        goto    d1
        return

;end of Delay routines

        END


deze code is voor een 16F876, ik heb ook een stuk code dat van iemand anders is die een bestuurbare auto via de linksys router aanstuurt, net als ik, die code is als volgt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
;*******************************************************************
; Function:  Wifi Robot Controller
; Processor: pic16f628 at 4 MHz using internal RC oscillator
; Filename:  car_pic.asm
; Author:    Jon Bennett
; Website:   www.jbprojects.net/projects/wifirobot
; Credit:    Based on UART Test Program
;            http://www.oz1bxm.dk/PIC/628uart.htm
;*******************************************************************

#define DEBUG 0
greenLED    equ b'10000000' ;128,RB7
redLED      equ b'01000000' ;64, RB6
horn        equ b'00100000' ;32, RB5


right       equ b'00001000' ;8,  RA3
left        equ b'00000100' ;4,  RA2
back        equ b'00000010' ;2,  RA1
forward     equ b'00000001' ;1   RA0


        LIST P=16F628, R=DEC    ; Use the pic16f628 and decimal system

        #include "P16F628.INC"  ; Include header file

            __config _INTRC_OSC_NOCLKOUT & _LVP_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_ON & _MCLRE_OFF

        CBLOCK 0x20             ; Declare variable addresses starting at 0x20
        dataL
        in_char
        temp
        d1
        d2  
        ENDC

        ORG    0x000            ; Program starts at 0x000
;
; --------------------------------
; set ANALOG/DIGITAL INPUTS PORT A
; --------------------------------
;
        movlw 7
        movwf CMCON             ; CMCON=7 set comperators off
;
; ----------------
; INITIALIZE PORTS
; ----------------
;
        movlw b'00000000'       ; set up portA
        movwf PORTA

        movlw b'00000100'       ; RB2(TX)=1 others are 0
        movwf PORTB

        bsf STATUS,RP0          ; RAM PAGE 1

        movlw 0x00
        movwf TRISA             ; portA all pins output

        movlw b'00000010'       ; RB1(RX)=input, others output
        movwf TRISB

; ------------------------------------
; set BAUD RATE TO COMMUNICATE WITH PC
; ------------------------------------
; Boot Baud Rate = 9600, No Parity, 1 Stop Bit
;
        movlw 0x19              ; 0x19=9600 bps (0x0C=19200 bps)
        movwf SPBRG
        movlw b'00100100'       ; brgh = high (2)
        movwf TXSTA             ; enable Async Transmission, set brgh

        bcf STATUS,RP0          ; RAM PAGE 0

        movlw b'10010000'       ; enable Async Reception
        movwf RCSTA
;
; ------------------------------------
; PROVIDE A setTLING TIME FOR START UP
; ------------------------------------
;
        clrf dataL
settle  decfsz dataL,F
        goto settle

        movf RCREG,W
        movf RCREG,W
        movf RCREG,W            ; flush receive buffer
;
; ---------
; MAIN LOOP
; ---------
;
        clrf PORTA
        movlw redLED
        movwf PORTB

        call message            ; prints out a message if DEBUG is 1
        call check_init ; wait for INIT message from WRT54GL
        bsf PORTB,7
loop    call receive_delay            ; wait for a char     
        call add_green                ;set greenLED on
        call process_input            ;make sure that forward and backward aren't both high! or that greenLED and redLED aren't both high! or that left and right aren't both high!
        call send               ; send the char
        goto loop

process_input
; Make sure that Forward & Backward cannot be ON at the same time
; Make sure that Left & Right cannot be ON at the same time
; Output result to PORTB
    MOVWF temp
    BTFSC temp,0 ;//Execute next line if temp,0 is HIGH
        BCF temp,1
    BTFSC temp,2 ;//Execute next line if temp,2 is HIGH
        BCF temp,3
    BTFSC temp,6 ;//Execute next line if temp,6 is HIGH
        BCF temp,7
    MOVF temp,0
    andlw b'00001111'
    movwf PORTA
    movf temp,0
    andlw b'11110000'
    movwf PORTB
    movf temp,0
    return

add_green
    movwf temp
    btfss temp,7  ;If greenLED is LOW execute next line
        bsf temp,7
    movf temp,0
    return

;
; -------------------------------------------
; RECEIVE CHARACTER FROM RS232 AND STORE IN W
; -------------------------------------------
; This routine does not return until a character is received.
;
receive btfss PIR1,RCIF         ; (5) check for received data
        goto receive
data_received
        movf RCREG,W            ; save received data in W
        return


check_init
; waits to receive 'jbpro' from the router meaning that the software is up and running
; after the message is received, the greenLED is turned on and microcontroller can drive the car
    call receive_delay
    sublw 'j'
    btfss STATUS, Z
       goto check_init
    call receive_delay
    sublw 'b'
    btfss STATUS, Z
       goto check_init
    call receive_delay
    sublw 'p'
    btfss STATUS, Z
       goto check_init
    call receive_delay
    sublw 'r'
    btfss STATUS, Z
       goto check_init
    call receive_delay
    sublw 'o'
    btfss STATUS, Z
       goto check_init

#if DEBUG
;prints message and goes in to an endless loop of flashing greenLED
    call message

Loop    
;   movlw   greenLED
    movlw 0xff
    movwf   PORTA           ;set all bits on
    call    Delay           ;this waits for a while!
    movlw   0x00
    movwf   PORTA
    call    Delay
    goto    Loop            ;go back and do it again
#endif

return


receive_delay
            ;299993 cycles
    movlw   0x5E
    movwf   d1
    movlw   0xEB
    movwf   d2
delay_0
    btfsc PIR1,RCIF ;check for serial data
        goto got_data ;if we do, goto got_data!
    decfsz  d1, f
    goto    $+2
    decfsz  d2, f
    goto    delay_0

    movlw 0x00
    return

got_data ;move data in to W
    btfsc PIR1,RCIF
    movf RCREG,W
return

#if DEBUG
Delay   movlw   d'250'          ;delay 250 ms (4 MHz clock)
    movwf   temp
d11 movlw   0xC7
    movwf   d1
    movlw   0x01
    movwf   d2
Delay_0
    decfsz  d1, f
    goto    $+2
    decfsz  d2, f
    goto    Delay_0

    decfsz  temp    ,f
    goto    d11
    retlw   0x00
#endif



;
; -------------------------------------------------------------
; SEND CHARACTER IN W VIA RS232 AND WAIT UNTIL FINISHED SENDING
; -------------------------------------------------------------
;
send    
#if DEBUG
movwf TXREG             ; send data in W

TransWt bsf STATUS,RP0          ; RAM PAGE 1
WtHere  btfss TXSTA,TRMT        ; (1) transmission is complete if hi
        goto WtHere

        bcf STATUS,RP0          ; RAM PAGE 0
#endif
        return
;
; -------
; MESSAGE
; -------
;
message 
#if DEBUG
        movlw  '1'
        call send
        movlw  '6'
        call send
        movlw  'F'
        call send
        movlw  '6'
        call send
        movlw  '2'
        call send
        movlw  '8'
        call send
        movlw  ' '
        call send
        movlw  'a'
        call send
        movlw  'l'
        call send
        movlw  'i'
        call send
        movlw  'v'
        call send
        movlw  'e'
        call send
        movlw  0x0D ; CR
        call send
        movlw  0x0A ; LF
        call send
#endif
        return

        END


deze code is alleen niet voor een 16F876 maar voor een 16f628. Wat ik nu graag zou doen is deze twee samenvoegen en laten functioneren op een 16F876 9doordat deze de mogelijkheid heeft twee motoren via pwm aan te sturen). Ik dacht zelf dat ik gewoon dat ik het stuk tussen de "#" in de eerste code kan vervangen door de hele tweede code waarna ik dit krijg:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
; 16F876 PWM example code
;
; Device 16F876
    LIST P=16F876, W=2, X=ON, R=DEC
    #INCLUDE P16F876.INC
    __CONFIG    0x393A

    cblock  0x20            ;start of general purpose registers
        count           ;used in delay routine
        count1          ;used in delay routine
        counta          ;used in delay routine
        countb          ;used in delay routine
        temp            ;temp storage
    endc


&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

#define DEBUG 0
greenLED    equ b'10000000' ;128,RB7
redLED      equ b'01000000' ;64, RB6
horn        equ b'00100000' ;32, RB5


right       equ b'00001000' ;8,  RA3
left        equ b'00000100' ;4,  RA2
back        equ b'00000010' ;2,  RA1
forward     equ b'00000001' ;1   RA0[/i]

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&



RL  Equ 0x00    ;pin for left motor reverse
FL  Equ 0x03    ;pin for left motor forward
RR  Equ 0x04    ;pin for right motor reverse
FR  Equ 0x05    ;pin for right motor forward

;pins 1 and 2 are the 2 PWM channels



        ORG 0x0000
        NOP ;for bootloader compatibility
        NOP
        NOP
        GOTO    START
        ORG 0x0010
    
START   CALL    Initialise



;
; --------------------------------
; set ANALOG/DIGITAL INPUTS PORT A
; --------------------------------
;
        movlw 7
        movwf CMCON             ; CMCON=7 set comperators off
;
; ----------------
; INITIALIZE PORTS
; ----------------
;
        movlw b'00000000'       ; set up portA
        movwf PORTA

        movlw b'00000100'       ; RB2(TX)=1 others are 0
        movwf PORTB

        bsf STATUS,RP0          ; RAM PAGE 1

        movlw 0x00
        movwf TRISA             ; portA all pins output

        movlw b'00000010'       ; RB1(RX)=input, others output
        movwf TRISB

; ------------------------------------
; set BAUD RATE TO COMMUNICATE WITH PC
; ------------------------------------
; Boot Baud Rate = 9600, No Parity, 1 Stop Bit
;
        movlw 0x19              ; 0x19=9600 bps (0x0C=19200 bps)
        movwf SPBRG
        movlw b'00100100'       ; brgh = high (2)
        movwf TXSTA             ; enable Async Transmission, set brgh

        bcf STATUS,RP0          ; RAM PAGE 0

        movlw b'10010000'       ; enable Async Reception
        movwf RCSTA
;
; ------------------------------------
; PROVIDE A setTLING TIME FOR START UP
; ------------------------------------
;
        clrf dataL
settle  decfsz dataL,F
        goto settle

        movf RCREG,W
        movf RCREG,W
        movf RCREG,W            ; flush receive buffer
;
; ---------
; MAIN LOOP
; ---------
;
        clrf PORTA
        movlw redLED
        movwf PORTB

        call message            ; prints out a message if DEBUG is 1
        call check_init ; wait for INIT message from WRT54GL
        bsf PORTB,7
loop    call receive_delay            ; wait for a char     
        call add_green                ;set greenLED on
        call process_input            ;make sure that forward and backward aren't both high! or that greenLED and redLED aren't both high! or that left and right aren't both high!
        call send               ; send the char
        goto loop

process_input
; Make sure that Forward & Backward cannot be ON at the same time
; Make sure that Left & Right cannot be ON at the same time
; Output result to PORTB


###############################################################################

    MOVWF temp
    BTFSC temp,0 ;//Execute next line if temp,0 is HIGH
        BCF temp,1
    BTFSC temp,2 ;//Execute next line if temp,2 is HIGH
        BCF temp,3
    BTFSC temp,6 ;//Execute next line if temp,6 is HIGH
        BCF temp,7
    MOVF temp,0
    andlw b'00001111'
    movwf PORTA
    movf temp,0
    andlw b'11110000'
    movwf PORTB
    movf temp,0[/b] return

add_green
    movwf temp
    btfss temp,7  ;If greenLED is LOW execute next line
        bsf temp,7
    movf temp,0
    return

###############################################################################



;
; -------------------------------------------
; RECEIVE CHARACTER FROM RS232 AND STORE IN W
; -------------------------------------------
; This routine does not return until a character is received.
;
receive btfss PIR1,RCIF         ; (5) check for received data
        goto receive
data_received
        movf RCREG,W            ; save received data in W
        return


check_init
; waits to receive 'jbpro' from the router meaning that the software is up and running
; after the message is received, the greenLED is turned on and microcontroller can drive the car
    call receive_delay
    sublw 'j'
    btfss STATUS, Z
       goto check_init
    call receive_delay
    sublw 'b'
    btfss STATUS, Z
       goto check_init
    call receive_delay
    sublw 'p'
    btfss STATUS, Z
       goto check_init
    call receive_delay
    sublw 'r'
    btfss STATUS, Z
       goto check_init
    call receive_delay
    sublw 'o'
    btfss STATUS, Z
       goto check_init

#if DEBUG
;prints message and goes in to an endless loop of flashing greenLED
    call message

Loop    
;   movlw   greenLED
    movlw 0xff
    movwf   PORTA           ;set all bits on
    call    Delay           ;this waits for a while!
    movlw   0x00
    movwf   PORTA
    call    Delay
    goto    Loop            ;go back and do it again
#endif

return


receive_delay
            ;299993 cycles
    movlw   0x5E
    movwf   d1
    movlw   0xEB
    movwf   d2
delay_0
    btfsc PIR1,RCIF ;check for serial data
        goto got_data ;if we do, goto got_data!
    decfsz  d1, f
    goto    $+2
    decfsz  d2, f
    goto    delay_0

    movlw 0x00
    return

got_data ;move data in to W
    btfsc PIR1,RCIF
    movf RCREG,W
return

#if DEBUG
Delay   movlw   d'250'          ;delay 250 ms (4 MHz clock)
    movwf   temp
d11 movlw   0xC7
    movwf   d1
    movlw   0x01
    movwf   d2
Delay_0
    decfsz  d1, f
    goto    $+2
    decfsz  d2, f
    goto    Delay_0

    decfsz  temp    ,f
    goto    d11
    retlw   0x00
#endif



;
; -------------------------------------------------------------
; SEND CHARACTER IN W VIA RS232 AND WAIT UNTIL FINISHED SENDING
; -------------------------------------------------------------
;
send    
#if DEBUG
movwf TXREG             ; send data in W

TransWt bsf STATUS,RP0          ; RAM PAGE 1
WtHere  btfss TXSTA,TRMT        ; (1) transmission is complete if hi
        goto WtHere

        bcf STATUS,RP0          ; RAM PAGE 0
#endif
        return
;
; -------
; MESSAGE
; -------
;
message 
#if DEBUG
        movlw  '1'
        call send
        movlw  '6'
        call send
        movlw  'F'
        call send
        movlw  '6'
        call send
        movlw  '2'
        call send
        movlw  '8'
        call send
        movlw  ' '
        call send
        movlw  'a'
        call send
        movlw  'l'
        call send
        movlw  'i'
        call send
        movlw  'v'
        call send
        movlw  'e'
        call send
        movlw  0x0D ; CR
        call send
        movlw  0x0A ; LF
        call send
#endif
        return





Initialise:
        BANKSEL  ADCON1     ;turn off A2D
        MOVLW    0x06
        MOVWF    ADCON1
        BANKSEL  PORTA
        BANKSEL  TRISC
        MOVLW    0      ;set PORTC as all outputs
        MOVWF    TRISC
        BANKSEL  PORTC

    MOVF     CCP1CON,W  ;set CCP1 as PWM
        ANDLW    0xF0
        IORLW    0x0C
        MOVWF    CCP1CON

        MOVF     CCP2CON,W  ;set CCP2 as PWM
        ANDLW    0xF0
        IORLW    0x0C
        MOVWF    CCP2CON

        MOVLW    126        ;set highest PWM value
        BANKSEL  PR2        ;over this (127) is permanently on
        MOVWF    PR2
        BANKSEL  TMR2

        MOVF     T2CON,W    ;set prescaler to 16
        ANDLW    0xF8       ;PWM at 2500HZ
        IORLW    0x02
        MOVWF    T2CON

        MOVF     T2CON,W    ;set postscaler to 1
        ANDLW    0x07
        IORLW    0x00
        MOVWF    T2CON
        
        CLRF    CCPR1L      ;set PWM to zero
        CLRF    CCPR2L

        BSF      T2CON, TMR2ON  ;and start the timer running
    RETURN

SpeedL:             ;use value in W to set speed (0-127)
        MOVWF   temp
    BTFSC   temp, 7     ;if more than 128 set speed in reverse
    CALL    ReverseL    ;so '1' is very slow forward
    BTFSS   temp, 7     ;and '129' is very slow reverse
    CALL    ForwardL
    ANDLW   0x7F
        MOVWF   CCPR1L
    RETURN

SpeedR:
        MOVWF   temp
    BTFSC   temp, 7
    CALL    ReverseR
    BTFSS   temp, 7
    CALL    ForwardR
    ANDLW   0x7F
        MOVWF   CCPR2L
    RETURN

ReverseL:
    BSF PORTC, RL   ;set pins for reverse
    BCF PORTC, FL
    RETURN

ReverseR:
    BSF PORTC, RR
    BCF PORTC, FR
    RETURN

ForwardL:
    BCF PORTC, RL   ;set pins for forward
    BSF PORTC, FL
    RETURN

ForwardR:
    BCF PORTC, RR
    BSF PORTC, FR
    RETURN

;Delay routines

Long_Delay              
        movlw   d'50'       ;delay 5 seconds
        call    Delay100W
        return

Delay100W   movwf   count       ;delay W x 100mS
d2      call    Delay100    ;maximum delay 25.5 seconds
        decfsz  count   ,f
        goto    d2
        return

Delay255    movlw   0xff        ;delay 255 mS
        goto    d0
Delay100    movlw   d'100'      ;delay 100mS
        goto    d0
Delay50     movlw   d'50'       ;delay 50mS
        goto    d0
Delay20     movlw   d'20'       ;delay 20mS
        goto    d0
Delay10     movlw   d'10'       ;delay 10mS
        goto    d0
Delay1      movlw   d'1'        ;delay 1mS
        goto    d0
Delay5      movlw   0x05        ;delay 5.000 ms (4 MHz clock)
d0      movwf   count1
d1      movlw   0xE7
        movwf   counta
        movlw   0x04
        movwf   countb
Delay_0     decfsz  counta, f
        goto    $+2
        decfsz  countb, f
        goto    Delay_0

        decfsz  count1  ,f
        goto    d1
        return

;end of Delay routines

        END


naar mijn idee moet ik nu alleen nog het stuk tussen de "#" hierboven vervangen door iets dat steeds speedl en speedr aanroept met de eerste en tweede byte die de router heeft ontvangen, en ik moet nog zorgen dat het stuk hierboven tussen de "&" wordt vervangen door de juiste adressen.

Nu is mijn vraag of dit ook maar enigszins klopt, want dit is de eerste keer dat ik zoiets ingewikkelds maak in assambly.

  • RobIII
  • Registratie: December 2001
  • Laatst online: 20:21

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Het is dat je assembly nou niet bepaald makkelijk "kort" kunt schrijven, maar zeg nou eens eerlijk: verwacht je nu van ons dat we ~900 regels assembly even voor je op 't oog gaan debuggen?
Jij hebt de code, jij hebt de pic, jij hebt de debug mogelijkheden etc. etc. Ik zie eerlijk gezegd niet helemaal wat je nu van ons verwacht; al helemaal niet als je niet concreet een probleem aangeeft.

Als je dan ook nog eigenlijk niets zelf geprogrammeerd hebt maar alles bij elkaar hebt "geleend" zonder te snappen waar je mee bezig bent dan zie ik al helemaal niet meer wat je dan van ons verwacht; je weet dat we hier niet zitten om voor jou je klusjes op te knappen en je kant-en-klare code aan te leveren?

Voor support op code van derden kun je bij die derden aankloppen en als het goed is heb je als je met dit soort zaken bezig bent voldoende kennis/besef hoe je iets eenvoudigs als "iets dat steeds speedl en speedr aanroept met de eerste en tweede byte die de router heeft ontvangen" zelf schrijft. Je zou op z'n minst een poging kunnen wagen en aangeven waar je precies strandt.

edit:
En het is assembly...

[Voor 48% gewijzigd door RobIII op 14-01-2011 17:39]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-05 17:03

NMe

Quia Ego Sic Dico.

Ja hallo, we gaan even duizend regels assembly voor jou debuggen. Zo vaak als jij op de regels bent gewezen zou je ze onderhand wel eens van buiten mogen kennen. Dit nog naast het feit dat we jouw specifieke hardware niet kennen en dus niet weten op welke poort of welk adres jij welke data moet versturen... Overigens kun je je misschien beter niet bezig houden met assembly als je het al niet kan spellen.

Check je mail.

[Voor 13% gewijzigd door NMe op 14-01-2011 17:34]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1

Dit topic is gesloten.


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee