Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,045
1

Демоблок GPIO на основе PIC16F877A

21.06.2019, 16:23. Просмотров 1156. Ответов 10
Метки нет (Все метки)

gpiobrd877a.asm

Assembler
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
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
; data aquisition GPIO board
;
 ;   https://social.microsoft.com/Forums/mvpforum/en-US/0b6379d0-87db-4c45-afbf-0e5f86d9d6a8/virtual-uart-io-for-pic16f877a?forum=projectoz
 ;
 list p=16f877A ; list directive to define processor
 
 #include <P16F877a.inc> ; processor specific variable definitions
 
 
 __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
 
;***************************************
 
  W_TEMP      equ 0x71      
  STATUS_TEMP equ 0x72 
  PCLATH_TEMP equ 0x73 
  adcloopbreak  equ 0x20
         rxbuffer1  equ 0x21
 rxbuffer2  equ rxbuffer1+1
 rxbuffer3  equ rxbuffer1+2
 rxstart    equ 0x27
 del3 equ 0x24
 load1 equ 0x25
 loadcount equ 0x26
        spbrgval  equ 0x30
        adcon0val equ 0x31
        adcon1val equ 0x32
        txstaval  equ 0x33
        rcstaval  equ 0x34
        
        pr2val    equ 0x40 
        t2conval   equ   0x42
        ccp1conval equ   0x43
        ccpr1lval   equ   0x44
        ccpr1hval   equ   0x45
        ccp2conval equ   0x46
        ccpr2lval   equ   0x47
        ccpr2hval   equ   0x48
        nocomm equ 0x50
 
;**********************************************************************
 
 ORG     0x000             ; processor reset vector
 nop      ; nop required for icd
  goto    main              ; go to beginning of program
 ORG     0x004             ; interrupt vector location
 goto interrupt
 
 
 
main:
        clrf nocomm
 call initconst
        call clrports 
        call nointerrupt 
 call USART_initialize
        call ADC_initialize
        call pwm_defaultval
        call USARToutReady
        call prompt
 
 
 
menu:    call clrrx
         call initint 
         goto menu
 
 
 
 
 
;*********************SUBROUTINES************************
 
 
clrports
        bcf STATUS, RP0
 bcf STATUS, RP1
 clrf    PORTA
        clrf    PORTB
        clrf    PORTC
        clrf    PORTD
 clrf    PORTE
 bsf STATUS, RP0
 movlw 0xFF
        movwf TRISA
 movwf TRISB
        movwf TRISC
        movwf TRISD
        movlw b'00000111'
 movwf TRISE
        movlw b'10000000'
        movwf OPTION_REG
 bcf STATUS, RP0
  
        
        return 
 
initconst
     movlw  0x24
     movwf txstaval
     movlw  0x90
     movwf rcstaval 
     movlw  0x20
     movwf spbrgval
     movlw b'10000001'
     movwf adcon0val
     movlw b'00000000'
     movwf adcon1val  
     return
 
 
;settle decfsz load1
 
;       goto settle
;       movf RCREG,W
;       movf RCREG,W
;       movf RCREG,W
;       clrw
;       return
 
 
 
initint
 
 bsf STATUS,RP0
        movlw b'11000000'
        movwf INTCON
        movlw 0x20
        movwf PIE1
 bcf STATUS,RP0
 RETURN
 
 
 
interrupt 
        
        bcf INTCON,7
        MOVWF W_TEMP ;Copy W to TEMP register
 SWAPF STATUS,W ;Swap status to be saved into W
 CLRF STATUS ;bank 0, regardless of current bank, Clears IRP,RP1,RP0
 MOVWF STATUS_TEMP ;Save status to bank zero STATUS_TEMP register
 MOVF PCLATH, W ;Only required if using pages 1, 2 and/or 3
 MOVWF PCLATH_TEMP ;Save PCLATH into W
 CLRF PCLATH ;Page zero, regardless of current page
        
        bsf adcloopbreak,0 
        call readusart
 
        MOVF PCLATH_TEMP, W ;Restore PCLATH
 MOVWF PCLATH ;Move W into PCLATH
 SWAPF STATUS_TEMP,W ;Swap STATUS_TEMP register into W
 ;(sets bank to original state)
 MOVWF STATUS ;Move W into STATUS register
 SWAPF W_TEMP,F ;Swap W_TEMP
 SWAPF W_TEMP,W ;Swap W_TEMP into W
        retfie
 
nointerrupt
 bsf STATUS,RP0
 bcf STATUS, RP1
 bcf INTCON,GIE
 bcf INTCON,PEIE
 bcf PIE1,RCIE
 bcf STATUS,RP0
 RETURN
 
 
USART_initialize
    
    movf     txstaval,w
    BSF      STATUS, RP0       ; Bank1 
    MOVWF    TXSTA             ; 
    BCF      STATUS, RP0       ; Bank 0
    MOVf     rcstaval,w   
    MOVWF    RCSTA
    BCF      STATUS, RP0       ; Bank 0
    MOVf     spbrgval,w            
    BSF      STATUS, RP0       ; Bank1    
    MOVWF    SPBRG
    BCF      STATUS, RP0 
    RETURN
 
ADC_initialize
 bcf    STATUS, RP0  ; Bank0
 bcf STATUS, RP1
 bcf STATUS, RP0  ; Bank0
        movf adcon0val,w 
        movwf ADCON0
        movf adcon1val ,w 
        bsf  STATUS, RP0; Bank1
        movwf ADCON1 
        bcf  STATUS, RP0; Bank0
        RETURN
 
 
 
 
 
 
 
ADCtoUART
        bcf adcloopbreak,0
 CALL ADC_initialize
 call initint
        BSF    ADCON0, 0    ; ADON=1 
         bcf STATUS, RP0
adcloop
          btfsc adcloopbreak,0
          goto menu
 BSF ADCON0, 2      ; ADC start  
        btfsc    ADCON0, 2     ; is the ADC finished? 
        goto     $-1          ; no, continue to wait  
        btfss   PIR1, TXIF       ; is transmitter empty? 
        goto    $-1              ; no, not yet empty 
        movf   ADRESH,w           ; ADRESH byte get 
        movwf   TXREG            ; and into the RS232-Sender write
        goto adcloop
 
unadcuart
        bsf adcloopbreak,0
        BCF    ADCON0, 0    ; ADON=0
        call prompt
        RETURN 
 
nstart:
       call serr
       goto ru0
 
 
 
readusart
        bcf INTCON,GIE
ru0:    btfss PIR1,RCIF ; check for receive data
 goto $-1
        movf RCREG,W
        xorlw 's'
        btfss STATUS, Z
        goto nstart
        clrf RCREG        
ru1 btfss PIR1,RCIF ; check for receive data
 goto $-1
        movf RCREG, W
        movwf rxbuffer1
        clrf RCREG
ru2 btfss PIR1,RCIF
 goto $-1
 movf RCREG, W 
        movwf rxbuffer2
 clrf RCREG
ru3 btfss PIR1,RCIF
 goto $-1
 movf RCREG, W 
        movwf rxbuffer3
 clrf RCREG
 
 
label1:     
            
        btfsc nocomm,0
        goto label2
  call USARTCMD
 movf rxbuffer1,w
 call Send
 movf rxbuffer2,w
 call Send
 movf rxbuffer3,w
 call Send
        movf rxbuffer3,w
label2: goto usartdataok         
        return
 
 
clrrx   clrf rxbuffer1
        clrf rxbuffer2
        clrf rxbuffer3
        RETURN
 
 
 
usartdataok: 
        movf rxbuffer3,w
        xorlw ';'
        btfsc STATUS,Z
 goto oksort
        call nointerrupt
        call clrrx
        call USARToutErr
        goto menu
 
oksort: call USARToutOK
        call nointerrupt
        goto Chartest  
 
 
 
Chartest:
        movf rxbuffer1,w
        xorlw 'A'        ; b=b then 0
 btfsc STATUS,Z    ; 0-Z=1
 goto  WritePortA         
 movf rxbuffer1,w
        xorlw 'a'        ; b=b then 0
 btfsc STATUS,Z    ; 0-Z=1
 goto  ReadPortA 
 movf rxbuffer1,w
        xorlw 'b'        ; b=b then 0
 btfsc STATUS,Z    ; 0-Z=1
 goto  ReadPortB 
 movf rxbuffer1,w
 xorlw 'B'
 btfsc STATUS,Z
        goto  WritePortB        
 movf rxbuffer1,w
 xorlw 'd'
 btfsc STATUS,Z  ; =1-skip , w='d'
        goto  ReadPortD 
        movf rxbuffer1,w
 xorlw 'D'
 btfsc STATUS,Z  ; =1-skip , w='d'
        goto  WritePortD        
        movf rxbuffer1,w
 xorlw 'c'
 btfsc STATUS,Z  ; =1-skip , w='d'
        goto  ReadPortC                 
        movf rxbuffer1,w
 xorlw 'E'
 btfsc STATUS,Z
        goto  WritePortE
 movf rxbuffer1,w
 xorlw 'e'
 btfsc STATUS,Z
        goto  ReadPortE  
        movf rxbuffer1,w
 xorlw 'q'
 btfsc STATUS,Z
        goto unadcuart
        movf rxbuffer1,w
 xorlw 'v'
 btfsc STATUS,Z
        goto ADCtoUART
 
        movf rxbuffer1,w
 xorlw 'T'
 btfsc STATUS,Z
        goto pwm_setup_period
        movf rxbuffer1,w
 xorlw 't'
 btfsc STATUS,Z
        goto pwm_setup_dutycycle1
        movf rxbuffer1,w
 xorlw 'y'
 btfsc STATUS,Z
        goto pwm_setup_dutycycle2
 
        movf rxbuffer1,w
 xorlw 'x'
 btfsc STATUS,Z
        goto pwm_setup_t2conval
 
        movf rxbuffer1,w
 xorlw 'n'
 btfsc STATUS,Z
        goto pwm_setup_ccp1conval
        
        movf rxbuffer1,w
 xorlw 'N'
 btfsc STATUS,Z
        goto pwm_setup_ccp2conval
 
        movf rxbuffer1,w
 xorlw 'w'
 btfsc STATUS,Z
        goto pwm_menu
        movf rxbuffer1,w
 xorlw 'o'
 btfsc STATUS,Z
        goto pwm1_outUART
        
        movf rxbuffer1,w
 xorlw 'O'
 btfsc STATUS,Z
        goto pwm2_outUART
 
 
        movf rxbuffer1,w
 xorlw 'P'  
 btfsc STATUS,Z 
 goto  SetupADCHS
 movf rxbuffer1,w
 xorlw 'p'
 btfsc STATUS,Z
 goto SetupPCFG
 
 movf rxbuffer1,w
 xorlw 'f'
 btfsc STATUS,Z
 goto USART_Baud_rate_change
        movf rxbuffer1,w
 xorlw 'I'
 btfsc STATUS,Z
 goto ADCset
        movf rxbuffer1,w
 xorlw 'i'
 btfsc STATUS,Z
 goto UartSet
        movf rxbuffer1,w
 xorlw 'm'
 btfsc STATUS,Z
 call modeout
        movf rxbuffer1,w
 xorlw 'Z'
 btfsc STATUS,Z
 goto NoComment
        movf rxbuffer1,w
 xorlw 'z'
 btfsc STATUS,Z
 goto EnableComment
        movf rxbuffer1,w
 xorlw 'r'
 btfsc STATUS,Z
        goto 0
 
        call prompt
        call initint
 goto menu
 
UartSet
  call USART_initialize
        call prompt
        goto menu
 
NoComment:
         movlw 0xff
         movwf nocomm
         goto menu
EnableComment:
     clrf nocomm
     goto menu
 
ADCset  call ADC_initialize
        call prompt
        goto menu
 
WritePortA:
 
 bcf STATUS, RP1
 bsf STATUS,RP0
        movlw 0x06
        movwf ADCON1
        movlw 0x00
 movwf TRISA        
 bcf STATUS,RP0
 movf  rxbuffer2,W
 movwf PORTA
        call USARToutDB
        movf  PORTA,W
        call Send
        call prompt
 goto menu
 
 
WritePortB:
 
 bcf STATUS, RP1
 bsf STATUS,RP0
 clrf TRISB
 bcf STATUS,RP0
 movf  rxbuffer2,W
 movwf PORTB
        call USARToutDB
        movf  PORTB,W
        call Send
        call prompt
 goto menu
 
WritePortD:
        
 bsf STATUS,RP0
        bcf TRISE,4
        bcf TRISE,5
        bcf TRISE,6
        bcf TRISE,7
 clrf TRISD
 bcf STATUS,RP0
 movf  rxbuffer2,W
 movwf PORTD
        call USARToutDB
        movf  PORTD,W
        call Send
        call prompt
 goto menu
 
 
WritePortE:
 bsf STATUS,RP0
 clrf TRISE
 bcf STATUS,RP0
        movf  rxbuffer2,W   
        movwf PORTE
        call USARToutDB 
        movf  PORTE,W
        call Send
        call prompt
 goto menu
 
 
ReadPortA:
 
        call unadcuart
 bcf STATUS, RP1
 bsf STATUS,RP0
        movlw 0xff
 movwf TRISA
 bcf STATUS,RP0
        call USARToutDB
        movf  PORTA,W
 call Send
        call prompt
 goto menu
 
ReadPortB:
 
 bsf STATUS,RP0
        movlw 0xff
 movwf TRISB
 bcf STATUS,RP0
        call USARToutDB
        movf  PORTB,W
 call Send
        call prompt
 goto menu
 
ReadPortC:
 
 bsf STATUS,RP0
        movlw 0xff
 movwf TRISC
 bcf STATUS,RP0
        call USARToutDB
        movf  PORTC,W
 call Send
        call prompt
 goto menu
 
ReadPortD:
 bsf STATUS,RP0
        movlw 0xff
 movwf TRISD
        bcf TRISE,4
        bcf TRISE,5
        bcf TRISE,6
        bcf TRISE,7
 bcf STATUS,RP0
        call USARToutDB
        movf  PORTD,W
 call Send
        call prompt
 goto menu
 
 
 
ReadPortE:
 bsf STATUS,RP0
        bsf TRISE,0
        bsf TRISE,1
        bsf TRISE,2
        bcf TRISE,4
        bcf TRISE,5
        bcf TRISE,6
        bcf TRISE,7
 bcf STATUS,RP0
        call USARToutDB
        movf  PORTE,W
 call Send
 call prompt
 goto menu
 
        
SetupADCHS:
        call USARToutDB
 movf rxbuffer2,W
 movwf adcon0val
        movf adcon0val,w
        call Send
        call USARToutOK
 call prompt
 goto menu
 
SetupPCFG:
        call USARToutDB
 movf rxbuffer2,W
 movwf adcon1val 
        movf adcon1val,w
        call Send
        call USARToutOK
 call prompt  
 goto menu
 
 
 
USART_Baud_rate_change: 
    call USARToutDB
    movf   rxbuffer2,W          
    MOVWF  spbrgval
    movf spbrgval,w  
    call   Send
    call   USARToutOK
    call prompt
    goto menu
 
 
 
send_lfcr
    btfsc nocomm,0
    RETURN
        movlw 0x0D; CR
 call Send
 movlw 0x0A; LF 
 call Send
        
 return
 
 
 
Send    btfss   PIR1, TXIF
 goto    $-1
 movwf   TXREG
        btfss   PIR1, TXIF
 goto    $-1
      RETURN  
 
USARToutOK
    btfsc nocomm,0
    RETURN
    movlw   ' '              ; 
    call   Send
    movlw   'O'              ; 
    call   Send 
    movlw   'k' 
    call   Send 
    movlw   ' ' 
    call   Send 
    RETURN
 
USARToutDB
    btfsc nocomm,0
    RETURN 
    movlw   ' '              ; 
    call   Send
    movlw   'D'              ; 
    call   Send 
    movlw   'B' 
    call   Send 
    movlw   '=' 
    call   Send 
    RETURN
 
 
 
USARToutErr:
    btfsc nocomm,0
    RETURN
    call    send_lfcr
    movlw   'E'               
    call   Send             
    movlw   'r'               
    call   Send            
    movlw   'r' 
    call   Send
    movlw   'o' 
    call   Send
    movlw   'r' 
    call   Send
    call   send_lfcr
    RETURN
 
 
 
USARToutReady:
    call    send_lfcr
    movlw   'R'               
    call   Send 
    movlw   'e'             
    call   Send
    movlw   'a' 
    call   Send
    movlw   'd' 
    call   Send
    movlw   'y' 
    call   Send
 
    RETURN
 
 
 
USARTCMD
    btfsc nocomm,0
    RETURN
    movlw   ' ' 
    call   Send 
    movlw   'R' 
    call   Send
    movlw   'X' 
    call   Send
    movlw   ':' 
    call   Send
    RETURN
 
 
 
prompt 
    btfsc nocomm,0
    RETURN
       call    send_lfcr
       movlw   '>' 
       call   Send
       movlw   ':' 
       call   Send
       return
 
serr    
       movlw '*' 
       call   Send
       return
 
modeout
      call    send_lfcr
      movlw   'S'
      call  Send
      movlw   'P'
      call  Send
      movlw   'B'
      call  Send
      movlw   'R'
      call  Send
      movlw   'G'
      call  Send
      movlw   ':'
      call  Send
      movf    spbrgval,w
      call  Send            
      call    send_lfcr
      
      movlw   'T'
      call  Send
      movlw   'X'
      call  Send
      movlw   'S'
      call  Send
      movlw   'T'
      call  Send
      movlw   'A'
      call  Send
      movlw   ':'
      call  Send
      movf    txstaval,w
      call  Send 
      call    send_lfcr
      movlw   'R'
      call  Send
      movlw   'C'
      call  Send
      movlw   'S'
      call  Send
      movlw   'T'
      call  Send
      movlw   'A'
      call  Send
      movlw   ':'
      call  Send
      movf    rcstaval,w
      call  Send
      call    send_lfcr
      movlw   'A'
      call  Send
      movlw   'D'
      call  Send
      movlw   'C'
      call  Send
      movlw   'O'
      call  Send
      movlw   'N'
      call  Send
      movlw   '0'
      call  Send
      movlw   ':'
      call  Send
      movf    adcon0val,w
      call  Send
      call    send_lfcr
      movlw   'A'
      call  Send
      movlw   'D'
      call  Send
      movlw   'C'
      call  Send
      movlw   'O'
      call  Send
      movlw   'N'
      call  Send
      movlw   '1'
      call  Send
      movlw   ':'
      call  Send
      movf    adcon1val,w
      call  Send
      call prompt
      return
 
 
pwm_clear
         bcf STATUS,RP0
         clrf TMR2
         clrf CCPR1L
         clrf CCPR1H
         clrf CCP1CON
         clrf CCPR2L
         clrf CCPR2H
         clrf CCP2CON
         return
 
pwm_setup_period:
             movf rxbuffer2,w
             movwf pr2val
             movf pr2val,w  
             call   Send
             call   USARToutOK
             call prompt
             goto menu
pwm_setup_t2conval:
             movf rxbuffer2,w
             movwf t2conval
             movf t2conval,w  
             call   Send
             call   USARToutOK
             call prompt
             goto menu  
 
pwm_setup_dutycycle1:
             movf rxbuffer2,w
             movwf ccpr1lval
             movf ccpr1lval,w  
             call   Send
             call   USARToutOK
             call prompt
             goto menu
pwm_setup_dutycycle2:
             movf rxbuffer2,w
             movwf ccpr2lval
             movf ccpr2lval,w  
             call   Send
             call   USARToutOK
             call prompt
             goto menu
 
pwm_setup_ccp1conval:
             movf rxbuffer2,w
             movwf ccp1conval
             movf ccp1conval,w  
             call   Send
             call   USARToutOK
             call prompt
             goto menu
 
pwm_setup_ccp2conval:
             movf rxbuffer2,w
             movwf ccp2conval
             movf ccp2conval,w  
             call   Send
             call   USARToutOK
             call prompt
             goto menu 
 
pwm_menu: bcf INTCON,7
        movf rxbuffer2,w
        xorlw '1'
        btfsc STATUS,Z
        goto getpwm1
        movf rxbuffer2,w
        xorlw '2'
        btfsc STATUS,Z
        goto getpwm2
        movf rxbuffer2,w
        xorlw 'l'
        btfsc STATUS,Z
        goto loadpwm1
        movf rxbuffer2,w
        xorlw 'L'
        btfsc STATUS,Z
        goto loadpwm2
        movf rxbuffer2,w
        xorlw 'c'
        btfsc STATUS,Z
        goto loadpwmcommon
        movf rxbuffer2,w
        xorlw 'm'
        btfsc STATUS,Z
        goto getpwmmode
        movf rxbuffer2,w
        xorlw 'q'
        btfsc STATUS,Z
        goto pwm1_disable
        movf rxbuffer2,w
        xorlw 'Q'
        btfsc STATUS,Z
        goto pwm2_disable
        movf rxbuffer2,w
        xorlw 'd'
        btfsc STATUS,Z
        call pwm_defaultval
        movf rxbuffer1,w
 xorlw 'o'
 btfsc STATUS,Z
        goto pwm1_out
        movf rxbuffer1,w
 xorlw 'O'
 btfsc STATUS,Z
        goto pwm2_out
        movf rxbuffer2,w
        xorlw 'r'
        btfsc STATUS,Z
        call pwm_clear
        call prompt
        goto menu
 
pwm_defaultval
         movlw 0xff
         movwf pr2val   ; period register
        ;T2CON : -;TOUTPS3:TOUTPS0 0000 = 1:1 postscale;TMR2ON ;T2CKPS1:T2CKPS0;
   ;;T2CKPS1:T2CKPS0;00 = Prescaler is 1
   ;;T2CKPS1:T2CKPS0;01 = Prescaler is 4
   ;;T2CKPS1:T2CKPS0;1x = Prescaler is 16
 
 
         bcf t2conval,0  ;T2CKPS0=0
         bcf t2conval,1  ;T2CKPS0=0 ->prescaler=1  
 
                         ; dutycycle= (CCPRxL:CCPxCON<5:4>)*Tosc/TMR2PrescalVal
 
         movlw 0x7f
         movwf ccpr1lval ; dutycycle 1 val 
  movwf ccpr2lval ; dutycycle 2 val
         movlw b'00001100'  ; -;-;CCPxX;CCPxY;  CCPxM3:CCPxM0  1100/0000
         movwf ccp1conval
  movwf ccp2conval
         return 
 
loadpwmcommon:
        movf  pr2val,w
        bsf STATUS,RP0   
        movwf 0x92
        bcf STATUS ,RP0
        movf  t2conval,w
        movwf T2CON
        call prompt
        goto menu
 
 
loadpwm1:    
        movf  ccpr1lval,w
        movwf CCPR1L
        movf  ccp1conval,w
        movwf CCP1CON
        call prompt
        goto menu
 
loadpwm2:    
        movf  ccpr2lval,w
        movwf CCPR2L
        movf  ccp2conval,w
        movwf CCP2CON
        call prompt
        goto menu
 
 
getpwm1:
        movf  pr2val,w
        bsf STATUS,RP0   
        movwf 0x92
        bcf TRISC,2
        bcf STATUS ,RP0
        movf  t2conval,w
        movwf T2CON
        movf  ccpr1lval,w
        movwf CCPR1L
        movf  ccp1conval,w
        movwf CCP1CON
     
      bsf T2CON,TMR2ON
      btfss PIR1,TMR2IF
      goto  $-1
      bcf PIR1,TMR2IF
      call prompt
      goto menu
 
getpwm2:
        movf  pr2val,w
        bsf STATUS,RP0   
        movwf 0x92
        bcf TRISC,1
        bcf STATUS ,RP0
        movf  t2conval,w
        movwf T2CON
        movf  ccpr2lval,w
        movwf CCPR2L
        movf  ccp2conval,w
        movwf CCP2CON
     
      bsf T2CON,TMR2ON
      btfss PIR1,TMR2IF
      goto  $-1
      bcf PIR1,TMR2IF
      call prompt
      goto menu
 
pwm1_outUART:
           movf rxbuffer2,w
           movwf CCPR1L
           bsf T2CON,TMR2ON
           call prompt
           goto menu
pwm2_outUART:
           movf rxbuffer2,w
           movwf CCPR2L
           bsf T2CON,TMR2ON
           call prompt
           goto menu
 
pwm1_out:
 
pwm_1:  
        bcf INTCON,GIE
        btfss PIR1,RCIF ; check for receive data
 goto $-1
        movf RCREG,W
        movwf CCPR1L
        bsf T2CON,TMR2ON
        goto pwm_2
 
       
pwm2_out:
 
pwm_2:  bcf INTCON,GIE
        btfss PIR1,RCIF ; check for receive data
 goto $-1
        movf RCREG,W
        movwf CCPR2L
        bsf T2CON,TMR2ON
        goto pwm_2
 
 
pwm1_disable
  clrf CCP1CON
  bcf PORTC,2 
  return
 
pwm2_disable
  clrf CCP2CON
  bcf PORTC,1 
  return
 
getpwmmode:
      bcf INTCON,GIE
      call    send_lfcr
      movlw   'P'
      call  Send
      movlw   'R'
      call  Send
      movlw   '2'
      call  Send
      movlw   ':'
      call  Send
      movf    pr2val,w
      call  Send
      call    send_lfcr
      movlw   'T'
      call  Send
      movlw   '2'
      call  Send
      movlw   'C'
      call  Send
      movlw   'O'
      call  Send
      movlw   'N'
      call  Send
      movlw   ':'
      call  Send
      movf    t2conval,w
      call  Send 
      call    send_lfcr
      movlw   'C'
      call  Send
      movlw   'C'
      call  Send
      movlw   'P'
      call  Send
      movlw   'R'
      call  Send
      movlw   '1'
      call  Send
      movlw   'L'
      call  Send
      movlw   ':'
      call  Send
      movf    ccpr1lval,w
      call  Send
      call    send_lfcr
      movlw   'C'
      call  Send
      movlw   'C'
      call  Send
      movlw   'P'
      call  Send
      movlw   '1'
      call  Send
      movlw   'C'
      call  Send
      movlw   'O'
      call  Send
      movlw   'N'
      call  Send
      movlw   ':'
      call  Send
      movf    ccp1conval,w
      call  Send
      call    send_lfcr
      movlw   'C'
      call  Send
      movlw   'C'
      call  Send
      movlw   'P'
      call  Send
      movlw   'R'
      call  Send
      movlw   '2'
      call  Send
      movlw   'L'
      call  Send
      movlw   ':'
      call  Send
      movf    ccpr2lval,w
      call  Send
      call    send_lfcr
      movlw   'C'
      call  Send
      movlw   'C'
      call  Send
      movlw   'P'
      call  Send
      movlw   '2'
      call  Send
      movlw   'C'
      call  Send
      movlw   'O'
      call  Send
      movlw   'N'
      call  Send
      movlw   ':'
      call  Send
      movf    ccp2conval,w
      call  Send
      call    send_lfcr 
      call prompt
      goto menu
 
          
 
 
 END                       ; directive 'end of program'




[/ASM]
Кварцевый резонатор на 20 МГц, UART -выводы МК PIC16F877A подключаются к COM-порту (можно на FT232BL/CP2102+ MAX232) через преобразователь на MAX232 .
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.06.2019, 16:23
Ответы с готовыми решениями:

PIC16F877A
Здравствуйте, помогите пожалуйста дописать программу для светодиодной матрицы. Нужно написать код,...

Работа с таймером PIC16F877A
Мне необходимо реализовать систему автополива, у меня есть 5 выходов RA каждый из которых отвечает...

Дисплей MT-20S4A+PIC16F877a
По даташиту заверяют что контроллер дисплея MT-20S4A HD44780. В протеусе с типичным дисплеем...

Работа с USART PIC16F877A
Написал прогу для приёма одного байта...в mplab Ide 8.46 работает...а в mplab x IDE 2.2 не работает...

10
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,045
21.06.2019, 16:26  [ТС] 2
Альтернативная старая редакция программы

databoard877a.asm

Assembler
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
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
 ; data aquisition GPIO board
 
 
 
 list p=16f877A ; list directive to define processor
 
 #include <P16F877a.inc> ; processor specific variable definitions
 
 
 __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
 W_TEMP      equ 0x71      
 STATUS_TEMP equ 0x72 
 PCLATH_TEMP equ 0x73 
 adcloopbreak  equ 0x20
        rxbuffer1  equ 0x21
 rxbuffer2  equ rxbuffer1+1
 rxbuffer3  equ rxbuffer1+2
 rxstart    equ 0x27
 del3 equ 0x24
 load1 equ 0x25
 loadcount equ 0x26
        spbrgval  equ 0x30
        adcon0val equ 0x31
        adcon1val equ 0x32
        txstaval  equ 0x33
        rcstaval  equ 0x34
        
        pr2val    equ 0x40 
        t2conval   equ   0x42
        ccp1conval equ   0x43
        ccpr1lval   equ   0x44
        ccpr1hval   equ   0x45
        ccp2conval equ   0x46
        ccpr2lval   equ   0x47
        ccpr2hval   equ   0x48
        nocomm equ 0x50
 
;**********************************************************************
 
 ORG     0x000             ; processor reset vector
 nop      ; nop required for icd
  goto    main              ; go to beginning of program
 ORG     0x004             ; interrupt vector location
 goto interrupt
 
 
 
main:
        clrf nocomm
 call initconst
        call clrports 
        call nointerrupt 
 call USART_initialize
        call ADC_initialize
        call pwm_defaultval
        call USARToutReady
        call prompt
 
 
 
menu:    call clrrx
         call initint 
         goto menu
 
 
 
 
 
;*********************SUBROUTINES************************
 
 
clrports
        bcf STATUS, RP0
 bcf STATUS, RP1
 clrf    PORTA
        clrf    PORTB
        clrf    PORTC
        clrf    PORTD
 clrf    PORTE
 bsf STATUS, RP0
 movlw 0xFF
        movwf TRISA
 movwf TRISB
        movwf TRISC
        movwf TRISD
        movlw b'00000111'
 movwf TRISE
        movlw b'10000000'
        movwf OPTION_REG
 bcf STATUS, RP0
  
        
        return 
 
initconst
     movlw  0x24
     movwf txstaval
     movlw  0x90
     movwf rcstaval 
     movlw  0x20
     movwf spbrgval
     movlw b'10000001'
     movwf adcon0val
     movlw b'00000000'
     movwf adcon1val  
     return
 
 
;settle decfsz load1
 
;       goto settle
;       movf RCREG,W
;       movf RCREG,W
;       movf RCREG,W
;       clrw
;       return
 
 
 
initint
 
 bsf STATUS,RP0
        movlw b'11000000'
        movwf INTCON
        movlw 0x20
        movwf PIE1
 bcf STATUS,RP0
 RETURN
 
 
 
interrupt 
        
        bcf INTCON,7
        MOVWF W_TEMP ;Copy W to TEMP register
 SWAPF STATUS,W ;Swap status to be saved into W
 CLRF STATUS ;bank 0, regardless of current bank, Clears IRP,RP1,RP0
 MOVWF STATUS_TEMP ;Save status to bank zero STATUS_TEMP register
 MOVF PCLATH, W ;Only required if using pages 1, 2 and/or 3
 MOVWF PCLATH_TEMP ;Save PCLATH into W
 CLRF PCLATH ;Page zero, regardless of current page
        
        bsf adcloopbreak,0 
        call readusart
 
        MOVF PCLATH_TEMP, W ;Restore PCLATH
 MOVWF PCLATH ;Move W into PCLATH
 SWAPF STATUS_TEMP,W ;Swap STATUS_TEMP register into W
 ;(sets bank to original state)
 MOVWF STATUS ;Move W into STATUS register
 SWAPF W_TEMP,F ;Swap W_TEMP
 SWAPF W_TEMP,W ;Swap W_TEMP into W
        retfie
 
nointerrupt
 bsf STATUS,RP0
 bcf STATUS, RP1
 bcf INTCON,GIE
 bcf INTCON,PEIE
 bcf PIE1,RCIE
 bcf STATUS,RP0
 RETURN
 
 
USART_initialize
    
    movf     txstaval,w
    BSF      STATUS, RP0       ; Bank1 
    MOVWF    TXSTA             ; 
    BCF      STATUS, RP0       ; Bank 0
    MOVf     rcstaval,w   
    MOVWF    RCSTA
    BCF      STATUS, RP0       ; Bank 0
    MOVf     spbrgval,w            
    BSF      STATUS, RP0       ; Bank1    
    MOVWF    SPBRG
    BCF      STATUS, RP0 
    RETURN
 
ADC_initialize
 bcf    STATUS, RP0  ; Bank0
 bcf STATUS, RP1
 bcf STATUS, RP0  ; Bank0
        movf adcon0val,w 
        movwf ADCON0
        movf adcon1val ,w 
        bsf  STATUS, RP0; Bank1
        movwf ADCON1 
        bcf  STATUS, RP0; Bank0
        RETURN
 
 
 
 
 
 
 
ADCtoUART
        bcf adcloopbreak,0
 CALL ADC_initialize
 call initint
        BSF    ADCON0, 0    ; ADON=1 
 bcf STATUS, RP0
adcloop btfsc adcloopbreak,0
        goto menu
 BSF ADCON0, 2      ; ADC start  
        btfsc    ADCON0, 2     ; is the ADC finished? 
        goto     $-1          ; no, continue to wait  
        btfss   PIR1, TXIF       ; is transmitter empty? 
        goto    $-1              ; no, not yet empty 
        movf   ADRESH,w           ; ADRESH byte get 
        movwf   TXREG            ; and into the RS232-Sender write
        goto adcloop
 
unadcuart
 bsf adcloopbreak,0
        BCF    ADCON0, 0    ; ADON=0
        call prompt
        RETURN 
 
nstart:
       call serr
       goto ru0
 
 
 
readusart
        bcf INTCON,GIE
ru0:    btfss PIR1,RCIF ; check for receive data
 goto $-1
        movf RCREG,W
        xorlw 's'
        btfss STATUS, Z
        goto nstart
        clrf RCREG        
ru1 btfss PIR1,RCIF ; check for receive data
 goto $-1
        movf RCREG, W
        movwf rxbuffer1
        clrf RCREG
ru2 btfss PIR1,RCIF
 goto $-1
 movf RCREG, W 
        movwf rxbuffer2
 clrf RCREG
ru3 btfss PIR1,RCIF
 goto $-1
 movf RCREG, W 
        movwf rxbuffer3
 clrf RCREG
 
 
label1:     
            
        btfsc nocomm,0
        goto label2
  call USARTCMD
 movf rxbuffer1,w
 call Send
 movf rxbuffer2,w
 call Send
 movf rxbuffer3,w
 call Send
        movf rxbuffer3,w
label2: goto usartdataok         
        return
 
 
clrrx   clrf rxbuffer1
        clrf rxbuffer2
        clrf rxbuffer3
        RETURN
 
 
 
usartdataok: 
        movf rxbuffer3,w
        xorlw ';'
        btfsc STATUS,Z
 goto oksort
        call nointerrupt
        call clrrx
        call USARToutErr
        goto menu
 
oksort: call USARToutOK
        call nointerrupt
        goto Chartest  
 
 
 
Chartest:
        movf rxbuffer1,w
        xorlw 'A'        ; b=b then 0
 btfsc STATUS,Z    ; 0-Z=1
 goto  WritePortA         
 movf rxbuffer1,w
        xorlw 'a'        ; b=b then 0
 btfsc STATUS,Z    ; 0-Z=1
 goto  ReadPortA 
 movf rxbuffer1,w
        xorlw 'b'        ; b=b then 0
 btfsc STATUS,Z    ; 0-Z=1
 goto  ReadPortB 
 movf rxbuffer1,w
 xorlw 'B'
 btfsc STATUS,Z
        goto  WritePortB        
 movf rxbuffer1,w
 xorlw 'd'
 btfsc STATUS,Z  ; =1-skip , w='d'
        goto  ReadPortD 
        movf rxbuffer1,w
 xorlw 'D'
 btfsc STATUS,Z  ; =1-skip , w='d'
        goto  WritePortD        
        movf rxbuffer1,w
 xorlw 'c'
 btfsc STATUS,Z  ; =1-skip , w='d'
        goto  ReadPortC                 
        movf rxbuffer1,w
 xorlw 'E'
 btfsc STATUS,Z
        goto  WritePortE
 movf rxbuffer1,w
 xorlw 'e'
 btfsc STATUS,Z
        goto  ReadPortE  
        movf rxbuffer1,w
 xorlw 'q'
 btfsc STATUS,Z
        goto unadcuart
        movf rxbuffer1,w
 xorlw 'v'
 btfsc STATUS,Z
        goto ADCtoUART
 
        movf rxbuffer1,w
 xorlw 'T'
 btfsc STATUS,Z
        goto pwm_setup_period
        movf rxbuffer1,w
 xorlw 't'
 btfsc STATUS,Z
        goto pwm_setup_dutycycle1
        movf rxbuffer1,w
 xorlw 'y'
 btfsc STATUS,Z
        goto pwm_setup_dutycycle2
 
        movf rxbuffer1,w
 xorlw 'x'
 btfsc STATUS,Z
        goto pwm_setup_t2conval
 
        movf rxbuffer1,w
 xorlw 'n'
 btfsc STATUS,Z
        goto pwm_setup_ccp1conval
        
        movf rxbuffer1,w
 xorlw 'N'
 btfsc STATUS,Z
        goto pwm_setup_ccp2conval
 
        movf rxbuffer1,w
 xorlw 'w'
 btfsc STATUS,Z
        goto pwm_menu
        movf rxbuffer1,w
 xorlw 'o'
 btfsc STATUS,Z
        goto pwm1_outUART
        
        movf rxbuffer1,w
 xorlw 'O'
 btfsc STATUS,Z
        goto pwm2_outUART
 
 
        movf rxbuffer1,w
 xorlw 'P'  
 btfsc STATUS,Z 
 goto  SetupADCHS
 movf rxbuffer1,w
 xorlw 'p'
 btfsc STATUS,Z
 goto SetupPCFG
 
 movf rxbuffer1,w
 xorlw 'f'
 btfsc STATUS,Z
 goto USART_Baud_rate_change
        movf rxbuffer1,w
 xorlw 'I'
 btfsc STATUS,Z
 goto ADCset
        movf rxbuffer1,w
 xorlw 'i'
 btfsc STATUS,Z
 goto UartSet
        movf rxbuffer1,w
 xorlw 'm'
 btfsc STATUS,Z
 call modeout
        movf rxbuffer1,w
 xorlw 'Z'
 btfsc STATUS,Z
 goto NoComment
        movf rxbuffer1,w
 xorlw 'z'
 btfsc STATUS,Z
 goto EnableComment
        movf rxbuffer1,w
 xorlw 'r'
 btfsc STATUS,Z
        goto 0
 
        call prompt
        call initint
 goto menu
 
UartSet
  call USART_initialize
        call prompt
        goto menu
 
NoComment:
         movlw 0xff
         movwf nocomm
         goto menu
EnableComment:
     clrf nocomm
     goto menu
 
ADCset  call ADC_initialize
        call prompt
        goto menu
 
WritePortA:
 
 bcf STATUS, RP1
 bsf STATUS,RP0
        movlw 0x06
        movwf ADCON1
        movlw 0x00
 movwf TRISA        
 bcf STATUS,RP0
 movf  rxbuffer2,W
 movwf PORTA
        call USARToutDB
        movf  PORTA,W
        call Send
        call prompt
 goto menu
 
 
WritePortB:
 
 bcf STATUS, RP1
 bsf STATUS,RP0
 clrf TRISB
 bcf STATUS,RP0
 movf  rxbuffer2,W
 movwf PORTB
        call USARToutDB
        movf  PORTB,W
        call Send
        call prompt
 goto menu
 
WritePortD:
        
 bsf STATUS,RP0
        bcf TRISE,4
        bcf TRISE,5
        bcf TRISE,6
        bcf TRISE,7
 clrf TRISD
 bcf STATUS,RP0
 movf  rxbuffer2,W
 movwf PORTD
        call USARToutDB
        movf  PORTD,W
        call Send
        call prompt
 goto menu
 
 
WritePortE:
 bsf STATUS,RP0
 clrf TRISE
 bcf STATUS,RP0
        movf  rxbuffer2,W   
        movwf PORTE
        call USARToutDB 
        movf  PORTE,W
        call Send
        call prompt
 goto menu
 
 
ReadPortA:
 
        call unadcuart
 bcf STATUS, RP1
 bsf STATUS,RP0
        movlw 0xff
 movwf TRISA
 bcf STATUS,RP0
        call USARToutDB
        movf  PORTA,W
 call Send
        call prompt
 goto menu
 
ReadPortB:
 
 bsf STATUS,RP0
        movlw 0xff
 movwf TRISB
 bcf STATUS,RP0
        call USARToutDB
        movf  PORTB,W
 call Send
        call prompt
 goto menu
 
ReadPortC:
 
 bsf STATUS,RP0
        movlw 0xff
 movwf TRISC
 bcf STATUS,RP0
        call USARToutDB
        movf  PORTC,W
 call Send
        call prompt
 goto menu
 
ReadPortD:
 bsf STATUS,RP0
        movlw 0xff
 movwf TRISD
        bcf TRISE,4
        bcf TRISE,5
        bcf TRISE,6
        bcf TRISE,7
 bcf STATUS,RP0
        call USARToutDB
        movf  PORTD,W
 call Send
        call prompt
 goto menu
 
 
 
ReadPortE:
 bsf STATUS,RP0
        bsf TRISE,0
        bsf TRISE,1
        bsf TRISE,2
        bcf TRISE,4
        bcf TRISE,5
        bcf TRISE,6
        bcf TRISE,7
 bcf STATUS,RP0
        call USARToutDB
        movf  PORTE,W
 call Send
 call prompt
 goto menu
 
        
SetupADCHS:
        call USARToutDB
 movf rxbuffer2,W
 movwf adcon0val
        movf adcon0val,w
        call Send
        call USARToutOK
 call prompt
 goto menu
 
SetupPCFG:
        call USARToutDB
 movf rxbuffer2,W
 movwf adcon1val 
        movf adcon1val,w
        call Send
        call USARToutOK
 call prompt  
 goto menu
 
 
 
USART_Baud_rate_change: 
    call USARToutDB
    movf   rxbuffer2,W          
    MOVWF  spbrgval
    movf spbrgval,w  
    call   Send
    call   USARToutOK
    call prompt
    goto menu
 
 
 
send_lfcr
    btfsc nocomm,0
    RETURN
        movlw 0x0D; CR
 call Send
 movlw 0x0A; LF 
 call Send
        
 return
 
 
 
Send    btfss   PIR1, TXIF
 goto    $-1
 movwf   TXREG
        btfss   PIR1, TXIF
 goto    $-1
      RETURN  
 
USARToutOK
    btfsc nocomm,0
    RETURN
    movlw   ' '              ; 
    call   Send
    movlw   'O'              ; 
    call   Send 
    movlw   'k' 
    call   Send 
    movlw   ' ' 
    call   Send 
    RETURN
 
USARToutDB
    btfsc nocomm,0
    RETURN 
    movlw   ' '              ; 
    call   Send
    movlw   'D'              ; 
    call   Send 
    movlw   'B' 
    call   Send 
    movlw   '=' 
    call   Send 
    RETURN
 
 
 
USARToutErr:
    btfsc nocomm,0
    RETURN
    call    send_lfcr
    movlw   'E'               
    call   Send             
    movlw   'r'               
    call   Send            
    movlw   'r' 
    call   Send
    movlw   'o' 
    call   Send
    movlw   'r' 
    call   Send
    call   send_lfcr
    RETURN
 
 
 
USARToutReady:
    call    send_lfcr
    movlw   'R'               
    call   Send 
    movlw   'e'             
    call   Send
    movlw   'a' 
    call   Send
    movlw   'd' 
    call   Send
    movlw   'y' 
    call   Send
 
    RETURN
 
 
 
USARTCMD
    btfsc nocomm,0
    RETURN
    movlw   ' ' 
    call   Send 
    movlw   'R' 
    call   Send
    movlw   'X' 
    call   Send
    movlw   ':' 
    call   Send
    RETURN
 
 
 
prompt 
    btfsc nocomm,0
    RETURN
       call    send_lfcr
       movlw   '>' 
       call   Send
       movlw   ':' 
       call   Send
       return
 
serr    
       movlw '*' 
       call   Send
       return
 
modeout
      call    send_lfcr
      movlw   'S'
      call  Send
      movlw   'P'
      call  Send
      movlw   'B'
      call  Send
      movlw   'R'
      call  Send
      movlw   'G'
      call  Send
      movlw   ':'
      call  Send
      movf    spbrgval,w
      call  Send            
      call    send_lfcr
      
      movlw   'T'
      call  Send
      movlw   'X'
      call  Send
      movlw   'S'
      call  Send
      movlw   'T'
      call  Send
      movlw   'A'
      call  Send
      movlw   ':'
      call  Send
      movf    txstaval,w
      call  Send 
      call    send_lfcr
      movlw   'R'
      call  Send
      movlw   'C'
      call  Send
      movlw   'S'
      call  Send
      movlw   'T'
      call  Send
      movlw   'A'
      call  Send
      movlw   ':'
      call  Send
      movf    rcstaval,w
      call  Send
      call    send_lfcr
      movlw   'A'
      call  Send
      movlw   'D'
      call  Send
      movlw   'C'
      call  Send
      movlw   'O'
      call  Send
      movlw   'N'
      call  Send
      movlw   '0'
      call  Send
      movlw   ':'
      call  Send
      movf    adcon0val,w
      call  Send
      call    send_lfcr
      movlw   'A'
      call  Send
      movlw   'D'
      call  Send
      movlw   'C'
      call  Send
      movlw   'O'
      call  Send
      movlw   'N'
      call  Send
      movlw   '1'
      call  Send
      movlw   ':'
      call  Send
      movf    adcon1val,w
      call  Send
      call prompt
      return
 
 
pwm_clear
         bcf STATUS,RP0
         clrf TMR2
         clrf CCPR1L
         clrf CCPR1H
         clrf CCP1CON
         clrf CCPR2L
         clrf CCPR2H
         clrf CCP2CON
         return
 
pwm_setup_period:
             movf rxbuffer2,w
             movwf pr2val
             movf pr2val,w  
             call   Send
             call   USARToutOK
             call prompt
             goto menu
pwm_setup_t2conval:
             movf rxbuffer2,w
             movwf t2conval
             movf t2conval,w  
             call   Send
             call   USARToutOK
             call prompt
             goto menu  
 
pwm_setup_dutycycle1:
             movf rxbuffer2,w
             movwf ccpr1lval
             movf ccpr1lval,w  
             call   Send
             call   USARToutOK
             call prompt
             goto menu
pwm_setup_dutycycle2:
             movf rxbuffer2,w
             movwf ccpr2lval
             movf ccpr2lval,w  
             call   Send
             call   USARToutOK
             call prompt
             goto menu
 
pwm_setup_ccp1conval:
             movf rxbuffer2,w
             movwf ccp1conval
             movf ccp1conval,w  
             call   Send
             call   USARToutOK
             call prompt
             goto menu
 
pwm_setup_ccp2conval:
             movf rxbuffer2,w
             movwf ccp2conval
             movf ccp2conval,w  
             call   Send
             call   USARToutOK
             call prompt
             goto menu 
 
pwm_menu: bcf INTCON,7
        movf rxbuffer2,w
        xorlw '1'
        btfsc STATUS,Z
        goto getpwm1
        movf rxbuffer2,w
        xorlw '2'
        btfsc STATUS,Z
        goto getpwm2
        movf rxbuffer2,w
        xorlw 'l'
        btfsc STATUS,Z
        goto loadpwm1
        movf rxbuffer2,w
        xorlw 'L'
        btfsc STATUS,Z
        goto loadpwm2
        movf rxbuffer2,w
        xorlw 'c'
        btfsc STATUS,Z
        goto loadpwmcommon
        movf rxbuffer2,w
        xorlw 'm'
        btfsc STATUS,Z
        goto getpwmmode
        movf rxbuffer2,w
        xorlw 'q'
        btfsc STATUS,Z
        goto pwm1_disable
        movf rxbuffer2,w
        xorlw 'Q'
        btfsc STATUS,Z
        goto pwm2_disable
        movf rxbuffer2,w
        xorlw 'd'
        btfsc STATUS,Z
        call pwm_defaultval
        movf rxbuffer1,w
 xorlw 'o'
 btfsc STATUS,Z
        goto pwm1_out
        movf rxbuffer1,w
 xorlw 'O'
 btfsc STATUS,Z
        goto pwm2_out
        movf rxbuffer2,w
        xorlw 'r'
        btfsc STATUS,Z
        call pwm_clear
        call prompt
        goto menu
 
pwm_defaultval
         movlw 0xff
         movwf pr2val   ; period register
                        ;T2CON : -;TOUTPS3:TOUTPS0 0000 = 1:1 postscale;TMR2ON ;T2CKPS1:T2CKPS0;
   ;;T2CKPS1:T2CKPS0;00 = Prescaler is 1
   ;;T2CKPS1:T2CKPS0;01 = Prescaler is 4
   ;;T2CKPS1:T2CKPS0;1x = Prescaler is 16
 
 
         bcf t2conval,0  ;T2CKPS0=0
         bcf t2conval,1  ;T2CKPS0=0 ->prescaler=1  
 
                         ; dutycycle= (CCPRxL:CCPxCON<5:4>)*Tosc/TMR2PrescalVal
 
         movlw 0x7f
         movwf ccpr1lval ; dutycycle 1 val 
  movwf ccpr2lval ; dutycycle 2 val
         movlw b'00001100'; -;-;CCPxX;CCPxY;  CCPxM3:CCPxM0  1100/0000
         movwf ccp1conval
  movwf ccp2conval
         return 
 
loadpwmcommon:
        movf  pr2val,w
        bsf STATUS,RP0   
        movwf 0x92
        bcf STATUS ,RP0
        movf  t2conval,w
        movwf T2CON
        call prompt
        goto menu
 
 
loadpwm1:    
        movf  ccpr1lval,w
        movwf CCPR1L
        movf  ccp1conval,w
        movwf CCP1CON
        call prompt
        goto menu
 
loadpwm2:    
        movf  ccpr2lval,w
        movwf CCPR2L
        movf  ccp2conval,w
        movwf CCP2CON
        call prompt
        goto menu
 
 
getpwm1:
        movf  pr2val,w
        bsf STATUS,RP0   
        movwf 0x92
        bcf TRISC,2
        bcf STATUS ,RP0
        movf  t2conval,w
        movwf T2CON
        movf  ccpr1lval,w
        movwf CCPR1L
        movf  ccp1conval,w
        movwf CCP1CON
     
      bsf T2CON,TMR2ON
      btfss PIR1,TMR2IF
      goto  $-1
      bcf PIR1,TMR2IF
      call prompt
      goto menu
 
getpwm2:
        movf  pr2val,w
        bsf STATUS,RP0   
        movwf 0x92
        bcf TRISC,1
        bcf STATUS ,RP0
        movf  t2conval,w
        movwf T2CON
        movf  ccpr2lval,w
        movwf CCPR2L
        movf  ccp2conval,w
        movwf CCP2CON
     
      bsf T2CON,TMR2ON
      btfss PIR1,TMR2IF
      goto  $-1
      bcf PIR1,TMR2IF
      call prompt
      goto menu
 
pwm1_outUART:
           movf rxbuffer2,w
           movwf CCPR1L
           bsf T2CON,TMR2ON
           call prompt
           goto menu
pwm2_outUART:
           movf rxbuffer2,w
           movwf CCPR2L
           bsf T2CON,TMR2ON
           call prompt
           goto menu
 
pwm1_out:
 
pwm_1:  
        bcf INTCON,GIE
        btfss PIR1,RCIF ; check for receive data
 goto $-1
        movf RCREG,W
        movwf CCPR1L
        bsf T2CON,TMR2ON
        goto pwm_2
 
       
pwm2_out:
 
pwm_2:  bcf INTCON,GIE
        btfss PIR1,RCIF ; check for receive data
 goto $-1
        movf RCREG,W
        movwf CCPR2L
        bsf T2CON,TMR2ON
        goto pwm_2
 
 
pwm1_disable
  clrf CCP1CON
  bcf PORTC,2 
  return
 
pwm2_disable
  clrf CCP2CON
  bcf PORTC,1 
  return
 
getpwmmode:
      bcf INTCON,GIE
      call    send_lfcr
      movlw   'P'
      call  Send
      movlw   'R'
      call  Send
      movlw   '2'
      call  Send
      movlw   ':'
      call  Send
      movf    pr2val,w
      call  Send
      call    send_lfcr
      movlw   'T'
      call  Send
      movlw   '2'
      call  Send
      movlw   'C'
      call  Send
      movlw   'O'
      call  Send
      movlw   'N'
      call  Send
      movlw   ':'
      call  Send
      movf    t2conval,w
      call  Send 
      call    send_lfcr
      movlw   'C'
      call  Send
      movlw   'C'
      call  Send
      movlw   'P'
      call  Send
      movlw   'R'
      call  Send
      movlw   '1'
      call  Send
      movlw   'L'
      call  Send
      movlw   ':'
      call  Send
      movf    ccpr1lval,w
      call  Send
      call    send_lfcr
      movlw   'C'
      call  Send
      movlw   'C'
      call  Send
      movlw   'P'
      call  Send
      movlw   '1'
      call  Send
      movlw   'C'
      call  Send
      movlw   'O'
      call  Send
      movlw   'N'
      call  Send
      movlw   ':'
      call  Send
      movf    ccp1conval,w
      call  Send
      call    send_lfcr
      movlw   'C'
      call  Send
      movlw   'C'
      call  Send
      movlw   'P'
      call  Send
      movlw   'R'
      call  Send
      movlw   '2'
      call  Send
      movlw   'L'
      call  Send
      movlw   ':'
      call  Send
      movf    ccpr2lval,w
      call  Send
      call    send_lfcr
      movlw   'C'
      call  Send
      movlw   'C'
      call  Send
      movlw   'P'
      call  Send
      movlw   '2'
      call  Send
      movlw   'C'
      call  Send
      movlw   'O'
      call  Send
      movlw   'N'
      call  Send
      movlw   ':'
      call  Send
      movf    ccp2conval,w
      call  Send
      call    send_lfcr 
      call prompt
      goto menu
 
          
 
 
 END                       ; directive 'end of program'
Добавлено через 2 минуты
Пример программы работы с портом и платой сбора данных (GPIO) в архиве аттача предыдущего поста (редакция на DevC, переведена с Borland C FreeCommandLineTools и TinyC tcc-0.9.25-win32 ).
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,045
21.06.2019, 16:28  [ТС] 3
Аттач плохо загрузился, загружаю еще раз
0
Вложения
Тип файла: zip demoboard.zip (12.31 Мб, 1 просмотров)
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,045
21.06.2019, 18:42  [ТС] 4
Плохо ввелся закрывающий смарттег.

Можно доработать программу для работы с аналоговыми компараторами, заменить заголовок данных 's' (send) на '@', '*' , '$', или '#' , а ограничитель данных с ';' на '\r'+'\n' , '\r' или '\n' , изменив программу и исходник на ассемблере, скомпилировав новый . Баг с зависимостью порта PORTD (он же еще и PSP ) от порта PORTE (он же и управление для PORTD) пофиксать , добавив дополнительные инструкции .

Добавлено через 13 секунд
http://ww1.microchip.com/downl... 39582b.pdf

Добавлено через 1 минуту
https://www.mikroe.com/ebooks/... y/io-ports

Добавлено через 2 минуты
https://www.microchip.com/forums/m273357.aspx

Добавлено через 33 секунды
http://ww1.microchip.com/downl... 31010a.pdf

Добавлено через 1 минуту
https://www.edaboard.com/showt... as-digital

Добавлено через 1 минуту
https://forum.mikroe.com/viewt... 88&t=46561

Добавлено через 56 секунд
http://www.inf.ufrgs.br/pet/ro... cao_serial

Добавлено через 4 минуты
https://www.exploreembedded.co... figuration

Добавлено через 3 минуты
https://embetronicx.com/tutori... -tutorial/

Добавлено через 1 минуту
http://katzen.me.uk/Books/Chap... 11_10.html

Добавлено через 46 секунд
https://www.microchip.com/forums/m76861.aspx

Добавлено через 38 секунд
http://microsim99.blogspot.com... 7a_15.html

Добавлено через 4 минуты
Проверить ReadPortD, ReadPortE , WritePortD, WritePortE на правильность отключения PSP, при необходимости ввести режим с PSP.
Assembler
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
ReadPortD:
 bsf STATUS,RP0
        movlw 0xff
 movwf TRISD
        bcf TRISE,4
        bcf TRISE,5
        bcf TRISE,6
        bcf TRISE,7
 bcf STATUS,RP0
        call USARToutDB
        movf  PORTD,W
 call Send
        call prompt
 goto menu
 
 
 
ReadPortE:
 bsf STATUS,RP0
        bsf TRISE,0
        bsf TRISE,1
        bsf TRISE,2
        bcf TRISE,4
        bcf TRISE,5
        bcf TRISE,6
        bcf TRISE,7
 bcf STATUS,RP0
        call USARToutDB
        movf  PORTE,W
 call Send
 call prompt
 goto menu

Assembler
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
WritePortD:
        
 bsf STATUS,RP0
        bcf TRISE,4
        bcf TRISE,5
        bcf TRISE,6
        bcf TRISE,7
 clrf TRISD
 bcf STATUS,RP0
 movf  rxbuffer2,W
 movwf PORTD
        call USARToutDB
        movf  PORTD,W
        call Send
        call prompt
 goto menu
 
 
WritePortE:
 bsf STATUS,RP0
 clrf TRISE
 bcf STATUS,RP0
        movf  rxbuffer2,W   
        movwf PORTE
        call USARToutDB 
        movf  PORTE,W
        call Send
        call prompt
 goto menu
Добавлено через 7 минут
При использовании PIC16F877 вместо PIC16F877A (у них разные фьюзы ) и при проблемах с перцепциенй фьюзов в некоторых старых версиях ICPROG уточнить фьюзы, обеспечить им то же шестнадцатеричное значение в соответствующем регистре (с точки зрения байтов в прошивке), учитывая конфигурацию, тип кварца, распределение тактовых частот , защиту, назначение выводов .

Добавлено через 13 минут
https://electrosome.com/analog... ontroller/ про компараторы (перевести на ассемблер ).

Добавлено через 49 секунд
https://www.microchip.com/forums/m197894.aspx

Добавлено через 1 минуту
http://blog.nawaratne.com/2010... ogram.html

Добавлено через 2 минуты
https://electrosome.com/analog... erter-pic/

Добавлено через 1 минуту
http://microsim99.blogspot.com... in_28.html

Добавлено через 1 минуту
http://microsim99.blogspot.com... in_74.html

Добавлено через 58 секунд
https://forum.allaboutcircuits... 7a.148776/

Добавлено через 51 секунду
https://www.edaboard.com/showt... ic-16f877a

Добавлено через 3 минуты
https://www.ccsinfo.com/forum/... hp?t=41172

Добавлено через 31 секунду
https://electronics.stackexcha... pic16f877a

Добавлено через 28 секунд
https://www.electro-tech-onlin... ds.145153/

Добавлено через 7 минут
http://ww1.microchip.com/downl... 31014a.pdf

Добавлено через 16 минут
https://www.microchip.com/forums/m631294.aspx аналог

https://www.ccsinfo.com/forum/... hp?t=41172 по теме захвата фронта и среза , измерения периода и частоты

Добавлено через 3 минуты
https://www.teachmemicro.com/c... ic16f877a/

Добавлено через 8 минут
https://academic.csuohio.edu/s... 16F877.pdf
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,045
21.06.2019, 20:28  [ТС] 5
Старый рабочий вариант прошивки и программа на Хайасме для чтения данных с АЦП, управления и программирования ШИМ .
0
Вложения
Тип файла: rar PortDAB.rar (5.61 Мб, 2 просмотров)
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,045
21.06.2019, 20:34  [ТС] 6
Исходники для линукса
//LUARTDAB.c

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h> 
 #include "macros.h"
 
 
 int main(void) 
{
 
 int data;
  OpenComPort();
  menu ();
   
  CloseComPort();
  usleep(10000);
 
 return 0;
 }
macros.h
C++
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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
 #include "devcommands.h"
void SendByteEcho(void)
{
int j1;
 
unsigned char ch = 0;
int db;
 
for(j1=0;j1<4; j1++)
{
 
 printf ("Token %d: ",j1);
  scanf("%x",  &db);
  ch=(unsigned char)db;
   PortWrite (ch);
 
}
 
 ReadDump(5);
 
}
 
 
void SendBytePB(int n)
{
    int i;
int byte;
for (i=0;i<n;i++)
{
printf ("Input byte %d ",i);
scanf("%d", &byte); 
SendTXBytePB(byte);
}
    
}
void SendBytePD(int n)
{
int byte,i;
for (i=0;i<n;i++)
{
printf ("Input byte %d ",i);
scanf("%d", &byte); 
SendTXBytePD(byte);
}
    
}
 
void SendBytePE(int n)
{
int byte,i;
for (i=0;i<n;i++)
{
printf ("Input byte %d ",i);
scanf("%d", &byte); 
SendTXBytePE(byte);
}
    
}
 
unsigned char GetBytePB(void)
{
 
int i;
unsigned char preamble[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} ;
unsigned char arr[15] ={0x20, 0x52, 0x58, 0x3a, 0x62, 0x30, 0x3b, 0x20, 0x4f, 0x6b, 0x20, 0x20, 0x44, 0x42, 0x3d};  
unsigned char d;
PurgeRXBuffer();    
SendRXBytePB(); 
printf ("\n Sended sb0; ")  ;
ReadnBytesSilent(15, &preamble);
 for (i=0;i<15;i++)
 if (preamble[i]!=arr[i])
 {
 printf("\n PB RX byte error ");    
 return 0;
 }
ReadDump(1);  
 
/*
 
 Sended sb0;  0x20 0x52 0x58 0x3a 0x62 0x30 0x3b 0x20  0x4f 0x6b 0x20 0x20 0x44 0x42 0x3d 0x00
*/
return 0;
 
 
}
 
int GetBytePD(void)
{
 
int i;
unsigned char preamble[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} ;
unsigned char arr[15] ={ 0x20, 0x52, 0x58, 0x3a, 0x64, 0x30, 0x3b, 0x20, 0x4f, 0x6b, 0x20, 0x20, 0x44, 0x42, 0x3d};
unsigned char d;
PurgeRXBuffer();    
SendRXBytePD(); 
printf ("\n Sended sd0; ")  ;
  ReadnBytesSilent(15, &preamble);
 for (i=0;i<15;i++)
 if (preamble[i]!=arr[i])
 {
 printf("\n PD RX byte error ");    
 return 0;
 }
ReadDump(1);  
 
  /*
  Sended sd0;  0x20 0x52 0x58 0x3a 0x64 0x30 0x3b 0x20
 0x4f 0x6b 0x20 0x20 0x44 0x42 0x3d <byte>
 */
//  
  
  
 return 0; 
   
}
 
 
int GetBytePE(void)
{
int db; 
int i;
unsigned char arr[15] ={ 0x20, 0x52, 0x58, 0x3a, 0x65, 0x30, 0x3b, 0x20, 0x4f, 0x6b, 0x20, 0x20, 0x44, 0x42, 0x3d };
unsigned char preamble[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} ;
PurgeRXBuffer();
SendRXBytePE(); 
printf ("\n Sended se0; ")  ;
ReadnBytesSilent(15, &preamble);
 for (i=0;i<15;i++)
 if (preamble[i]!=arr[i])
 {
 printf("\n PE RX byte error ");    
 return 0;
 }
ReadDump(1); 
 
/*
Sended se0;  0x20 0x52 0x58 0x3a 0x65 0x30 0x3b 0x20 0x4f 0x6b 0x20 0x20 0x44 0x42 0x3d 
*/
 
 
return 0;
}
 
 
 
 
 
 
 
void menu (void)
{
int i,n,byte;   
char key;
label1:
    
 
printf ("\n Menu: ");
printf ("\n r- reset device  ");
printf ("\n p- purge RX buffer  ");
printf ("\n q- quit from ADC  ");
printf ("\n v- get  ADC data  ");
printf ("\n b- read from PB  ");
printf ("\n d- read from PD  ");
printf ("\n e- read from PE  ");
printf ("\n B- write to PB  ");
printf ("\n D- write to PD  ");
printf ("\n E- write to PE  ");
printf ("\n w- PWM machine");
printf ("\n u- read dump UART  ");
printf ("\n X- exit ");
 
scanf ("%s",&key);
switch(key)
{
 
case 'p':
    PurgeRXBuffer();
    break;
case 'r':
PurgeRXBuffer();    
SendResetDevice(); 
break;
 
case 'q':
SendNoADC(); 
PurgeRXBuffer();
SendNoADC(); 
break;
case 'v':
SendDoADC(); 
break;
case 'b':
 
printf ("\n 1-once  ");
printf ("\n 2- n bytes manual  ");
//printf ("\n 3- n bytes from file   ");
 
scanf ("%s",&key);
switch(key)
{
case '1':
byte=GetBytePB();
//printf(" %d", byte);
PurgeRXBuffer();
break;
case '2':
printf ("\n Input number of bytes :");
scanf("%d",&n);
for (i=0;i<n;i++)
{
byte=GetBytePB();
//printf("\ni=%d byte= %d ",i, byte);
}
 
PurgeRXBuffer();
break;
case '3':
 
break;
}
 
 
 
break;
 
 
case 'd':
 
printf ("\n 1-once  ");
printf ("\n 2- n bytes manual  ");
//printf ("\n 3- n bytes from file   ");
 
scanf ("%s",&key);
switch(key)
{
case '1':
byte=GetBytePD();
PurgeRXBuffer();
//printf("%d", byte);
break;
case '2':
printf ("\n Input number of bytes :");
scanf(" %d",&n);
for (i=0;i<n;i++)
{
byte=GetBytePD();
//printf("\ni=%d byte= %d ",i, byte);
}
 
PurgeRXBuffer();
break;
case '3':
 
break;
}
 
break;
 
case 'e':
 
printf ("\n 1-once  ");
printf ("\n 2- n bytes manual  ");
//printf ("\n 3- n bytes from file   ");
 
scanf ("%s",&key);
switch(key)
{
case '1':
    
byte=GetBytePE();
//printf("%d", byte);
break;
case '2':
printf ("\n Input number of bytes :");
scanf("%d",&n);
for (i=0;i<n;i++)
{
byte=GetBytePD();
//printf("\ni=%d byte= %d ",i, byte);
}
 
PurgeRXBuffer();
break;
case '3':
 
break;
}
 
break;
 
case 'B':
 
printf ("\n 1-once  ");
printf ("\n 2- n bytes manual  ");
//printf ("\n 3- n bytes from file   ");
 
scanf ("%s",&key);
switch(key)
{
case '1':
    
SendBytePB(1);
break;
case '2':
printf ("\n Input number of bytes : ");
scanf("%d",&n); 
SendBytePB(n);
PurgeRXBuffer();
break;
case '3':
 
break;
}
 
break;
 
 
case 'D':
 
 
printf ("\n 1-once  ");
printf ("\n 2- n bytes manual  ");
//printf ("\n 3- n bytes from file   ");
 
scanf ("%s",&key);
switch(key)
{
case '1':
    
SendBytePD(1);
PurgeRXBuffer();
break;
case '2':
printf ("\n Input number of bytes : ");
scanf("%d",&n); 
SendBytePD(n);
PurgeRXBuffer();
break;
case '3':
 
break;
}
 
break;
 
case 'E':
 
printf ("\n 1-once  ");
printf ("\n 2- n bytes manual  ");
//printf ("\n 3- n bytes from file   ");
 
scanf ("%s",&key);
switch(key)
{
case '1':
    
SendBytePE(1);
PurgeRXBuffer();
break;
case '2':
printf ("\n Input number of bytes : ");
scanf("%d",&n); 
SendBytePE(n);
PurgeRXBuffer();
break;
case '3':
 
break;
}
 
 
break;
 
case 'u':
    
 
printf ("\n Input number of bytes :");  
 scanf("%d",&n);    
 ReadDump(n); 
PurgeRXBuffer();
break;
 
case 'X':
 
return;
break;
 
case 'w':
    
break;
 
 
}
 
goto label1;
 
}
0
Вложения
Тип файла: zip port.zip (956.8 Кб, 1 просмотров)
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,045
21.06.2019, 20:37  [ТС] 7
devcommands.h
C++
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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
  #include "portiosubs.h"
/*
    0   1    2  3   4   5   6   7   8   9   a   b   c   d   e   f
    
0   NUL SOH STX ETX EOT ENQ ACK BEl BS  HT  LF  VT  FF  CR  SO  SI
1   DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM  SUB ESC FS  GS  RS  US
2       !   "   #   $   %   &   '   (   )   *   +   ,   -   .   /
3   0   1   2   3   4   5   6   7   8   9   :   ;   <   =   >   ?
4   @   A   B   C   D   E   F   G   H   I   J   K   L   M   N   O
5   P   Q   R   S   T   U   V   W   X   Y   Z   [   \   ]   ^   _   
6   `   a   b   c   d   e   f   g   h   i   j   k   l   m   n   o
7   p   q   r   s   t   u   v   w   x   y   z   {   |   }   ~   DEL     
 
*/ 
 
void SendResetDevice(void) 
{
   PortWrite (0x73); //s
   PortWrite (0x72); //r
   PortWrite (0x30); //0
   PortWrite (0x3B); //;
}
void wait(void) 
{
sleep(100);
}
 
void SendNoADC(void) 
{
   PortWrite (0x73); //s
   PortWrite (0x71); //q
   PortWrite (0x30); //0
   PortWrite (0x3B); //;
}
 
void SendDoADC(void) 
{
   PortWrite (0x73); //s
   PortWrite (0x76); //v
   PortWrite (0x30); //0
   PortWrite (0x3B); //;
}
 
 
void SendTXBytePB(BYTE Byte) 
{
   PortWrite (0x73); //s
   PortWrite (0x42); //B
   PortWrite (Byte); //byte
   PortWrite (0x3B); //;
}
void SendTXBytePD(BYTE Byte) 
{
   PortWrite (0x73); //s
   PortWrite (0x44); //D
   PortWrite (Byte); //byte
   PortWrite (0x3B); //;
}
 
void SendTXBytePE(BYTE Byte) 
{
   PortWrite (0x73); //s
   PortWrite (0x45); //E
   PortWrite (Byte); //byte
   PortWrite (0x3B); //;
}
 
void SendRXBytePA(void) 
{
   PortWrite (0x73); //s
   PortWrite (0x61); //a
   PortWrite (0x30); //0
   PortWrite (0x3B); //;
}
 
 
void SendRXBytePB(void) 
{
   PortWrite (0x73); //s
   PortWrite (0x62); //b
   PortWrite (0x30); //0
   PortWrite (0x3B); //;
}
 
 
void SendRXBytePD(void) 
{
   PortWrite (0x73); //s
   PortWrite (0x64); //d
   PortWrite (0x30); //0
   PortWrite (0x3B); //;
}
 
void SendRXBytePE(void) 
{
   PortWrite (0x73); //s
   PortWrite (0x65); //e
   PortWrite (0x30); //0
   PortWrite (0x3B); //;
}
 
void SendModeCheck(void) 
{
   PortWrite (0x73); //s
   PortWrite (0x6d ); //m
   PortWrite (0x30 ); //0
   PortWrite (0x3B); //;
}
 
 
void SendRestorePrompt(void) 
{
   PortWrite (0x73); //s
   PortWrite (0x7a ); //z
   PortWrite (0x30 ); //0
   PortWrite (0x3B); //;
}
 
void SendNoPrompt(void) 
{
   PortWrite (0x73); //s
   PortWrite (0x5a ); //Z
   PortWrite (0x30 ); //0
   PortWrite (0x3B); //;
}
 
 
void RequestPWMMode(void) 
{
   PortWrite (0x73); //s
   PortWrite (0x77 ); //w
   PortWrite (0x6d ); //m
   PortWrite (0x3B); //;
}
 
 
void ResetPWM (void) 
{
   PortWrite (0x73); //s
   PortWrite (0x77 ); //w
   PortWrite (0x72 ); //r
   PortWrite (0x3B); //;
}
 
void LoadDefaultPWM (void) 
{
   PortWrite (0x73); //s
   PortWrite (0x77 ); //w
   PortWrite (0x64 ); //d
   PortWrite (0x3B); //;
}
 
void SendPWM1 (void) 
{
   PortWrite (0x73); //s
   PortWrite (0x77 ); //w
   PortWrite (0x6f ); //o
   PortWrite (0x3B); //;
}
void SendPWM2 (void) 
{
   PortWrite (0x73); //s
   PortWrite (0x77 ); //w
   PortWrite (0x4f ); //O
   PortWrite (0x3B); //;
}
 
void SendOnPWM1 (void) 
{
   PortWrite (0x73); //s
   PortWrite (0x77 ); //w
   PortWrite (0x31 ); //1
   PortWrite (0x3B); //;
}
 
void SendOnPWM2 (void) 
{
   PortWrite (0x73); //s
   PortWrite (0x77 ); //w
   PortWrite (0x32 ); //2
   PortWrite (0x3B); //;
}
void SendQuitPWM1 (void) 
{
   PortWrite (0x73); //s
   PortWrite (0x77 ); //w
   PortWrite (0x71 ); //q
   PortWrite (0x3B); //;
}
 
void SendQuitPWM2 (void) 
{
   PortWrite (0x73); //s
   PortWrite (0x77 ); //w
   PortWrite (0x51 ); //Q
   PortWrite (0x3B); //;
}
 
 
void SendPR2 (BYTE Byte) 
{
   PortWrite (0x73); //s
   PortWrite (0x54 ); //T
   PortWrite (Byte); //byte 0xff
   PortWrite (0x3B); //;
}
 
 
void SendT2CON (BYTE Byte) 
{
   PortWrite (0x73); //s
   PortWrite (0x78 ); //x
   PortWrite (Byte); //byte 0x01
   PortWrite (0x3B); //;
}
void LoadPR2T2CON (BYTE Byte) 
{
   PortWrite (0x73); //s
   PortWrite (0x77 ); //w
   PortWrite (Byte); //c
   PortWrite (0x3B); //;
}
 
void SendCCPR1L (BYTE Byte) 
{
   PortWrite (0x73); //s
   PortWrite (0x74 ); //t
   PortWrite (Byte); //byte 0x7f
   PortWrite (0x3B); //;
}
 
void SendCCPR2L (BYTE Byte) 
{
   PortWrite (0x73); //s
   PortWrite (0x79 ); //y
   PortWrite (Byte); //byte 0x7f
   PortWrite (0x3B); //;
}
void SendCCP1CON (BYTE Byte) 
{
   PortWrite (0x73); //s
   PortWrite (0x6e ); //n
   PortWrite (Byte); //byte 0x0c
   PortWrite (0x3B); //;
}
void SendCCP2CON (BYTE Byte) 
{
   PortWrite (0x73); //s
   PortWrite (0x4e ); //N
   PortWrite (Byte); //byte 0x0c
   PortWrite (0x3B); //;
}
 
 
 
 
void SendLoadDataPWM1 (void) 
{
   PortWrite (0x73); //s
   PortWrite (0x77 ); //w
   PortWrite (0x6c ); //l
   PortWrite (0x3B); //;
}
void SendLoadDataPWM2 (void) 
{
   PortWrite (0x73); //s
   PortWrite (0x77 ); //w
   PortWrite (0x4c ); //L
   PortWrite (0x3B); //;
}
 
 
void SendADCON0 (BYTE Byte) 
{
   PortWrite (0x73); //s
   PortWrite (0x80 ); //P
   PortWrite (0x81 ); //byte  10000001 bin
   PortWrite (0x3B); //;
}
 
void SendADCON1 (BYTE Byte) 
{
   PortWrite (0x73); //s
   PortWrite (0x70 ); //p
   PortWrite (0x00); //byte  00000000 bin
   PortWrite (0x3B); //;
}
 
void SendSPBRG (BYTE Byte) 
{
   PortWrite (0x73); //s
   PortWrite (0x66 ); //f
   PortWrite (0x20); //byte 0x20 bin
   PortWrite (0x3B); //;
}
 
void SendSetSPBRG (BYTE Byte) 
{
   PortWrite (0x73); //s
   PortWrite (0x69 ); //i
   PortWrite (0x20 ); //byte 0x20 bin
   PortWrite (0x3B); //;
}
 
 
 
 
 
/*    R    X     :    r    0    ;     
0x20 0x52 0x58 0x3a 0x72 0x30 0x3b 0x20
O     k         cr   lf   R    e    a
0x4f 0x6b 0x20 0x0d 0x0a 0x52 0x65 0x61
 d    y    cr   lf   >    :
0x64 0x79 0x0d 0x0a 0x3e 0x3a
 
 
prompt:
      cr   lf   R    e    a    d    y
0x00 0x0d 0x0a 0x52 0x65 0x61 0x64 0x79
  cr   lf   >    :
0x0d 0x0a 0x3e 0x3a
 
*/
Добавлено через 1 минуту
portiosubs.h
C++
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
  #include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "lusartport.h"
  
 int baud;
 int cport_nr;
 
int  OpenComPort(void)
{
 
  
  cport_nr=0;        /* /dev/ttyS0 */
 
  baud=38400;
  char mode[]={'8','N','1',0};
 
 printf ("\nInput Port number
 \n'0' -/dev/ttyS0,  '1'-/dev/ttyS1,'2'-/dev/ttyS2,'3'-/dev/ttyS3,'4'-/dev/ttyS4, 
 \n'5' -/dev/ttyS5,  '6'-/dev/ttyS6,'7'-/dev/ttyS7,'8'-/dev/ttyS8,'9'-/dev/ttyS9,
 \n'16'-/dev/ttyUSB0,'17'-/dev/ttyUSB1,'18'-/dev/ttyUSB2,'19'-/dev/ttyUSB3,
 \n'20'-/dev/ttyUSB4,'21'-/dev/ttyUSB5, 
 \n'26'-/dev/rfcomm0,'27'-/dev/rfcomm1,'28'-/dev/ircomm0,'29'-/dev/ircomm1 
 \n  ");
  
 scanf("%d",&cport_nr);
 printf ("\n Baudrate 38400 bps, 8-N-1 " );
  if(RS232_OpenComport(cport_nr, bdrate, mode))
  {
    printf("Can not open comport\n");
 
    return(0);
  }
RS232_enableDTR(cport_nr);
RS232_enableRTS(cport_nr);
 return(0) ;
}
 
 
 
void ReadDump(int n)
{
 int i;
 for (i = 0; i < n; i++)
 { 
 unsigned char ch = 0;
 int read = 0; 
 unsigned char buf[4096];
 while(!read) {
    read = RS232_PollComport(cport_nr, buf, 1);
    if(read > 0)
    {
      buf[read] = 0;   /* always put a "null" at the end of a string! */
      printf("received %i bytes: %s\n", read, (char *)buf);
 }
 return(0) ;    
 }
 
 
 
 
 
 
 void ReadnBytesSilent(int n,  unsigned char  *ar)
 {
 int i;
 for (i = 0; i < n; i++)
 { 
 unsigned char ch = 0;
 int read = 0; 
 unsigned char buf[4096];
 
  while(read!=n) {
  read = RS232_PollComport(cport_nr, buf, 1); 
  if (read > 0) {  ar[i]=ch;  }
 }
 return(0) ;
}
 
unsigned char ReadByte(void)
{
 
 int read = 0; 
 unsigned char buf[4096];
 while(!read) {
    read = RS232_PollComport(cport_nr, buf, 1);
    if(read > 0)
    {
      buf[read] = 0;   /* always put a "null" at the end of a string! */
      return buf[0];
    }
 
return 'e';
}
 
 
 
 
 
 
void PortWrite (int Byte)
{
if(RS232_SendByte(cport_nr, Byte))
{
    printf("\n Error .Can not send byte\n");
 
    return(0);
  }
} 
 
 
void PurgeTXBuffer(void)
{
 
return;
}
 
 
void PurgeRXBuffer(void)
{
RS232_PurgeRXBuffer(cport_nr);
return;
}
 
 void CloseComPort(void)
 {
  RS232_disableRTS(cport_nr);
  RS232_disableDTR(cport_nr);
  RS232_CloseComport(cport_nr);
return;     
 }
lusartport.h

C++
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
#include <stdio.h>
#include <string.h>
#include <termios.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <limits.h>
 
int RS232_OpenComport(int, int, const char *);
int RS232_PollComport(int, unsigned char *, int);
int RS232_SendByte(int, unsigned char);
int RS232_SendBuf(int, unsigned char *, int);
void RS232_CloseComport(int);
void RS232_cputs(int, const char *);
int RS232_IsDCDEnabled(int);
int RS232_IsCTSEnabled(int);
int RS232_IsDSREnabled(int);
void RS232_enableDTR(int);
void RS232_disableDTR(int);
void RS232_enableRTS(int);
void RS232_disableRTS(int);
void RS232_PurgeRXBuffer(int);
 
 
 
 
 
int Cport[38],
    error;
 
struct termios new_port_settings,
       old_port_settings[38];
 
 
char comports[38][16]={"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2","/dev/ttyS3","/dev/ttyS4","/dev/ttyS5",
                       "/dev/ttyS6","/dev/ttyS7","/dev/ttyS8","/dev/ttyS9","/dev/ttyS10","/dev/ttyS11",
                       "/dev/ttyS12","/dev/ttyS13","/dev/ttyS14","/dev/ttyS15","/dev/ttyUSB0",
                       "/dev/ttyUSB1","/dev/ttyUSB2","/dev/ttyUSB3","/dev/ttyUSB4","/dev/ttyUSB5",
                       "/dev/ttyAMA0","/dev/ttyAMA1","/dev/ttyACM0","/dev/ttyACM1",
                       "/dev/rfcomm0","/dev/rfcomm1","/dev/ircomm0","/dev/ircomm1",
                       "/dev/cuau0","/dev/cuau1","/dev/cuau2","/dev/cuau3",
                       "/dev/cuaU0","/dev/cuaU1","/dev/cuaU2","/dev/cuaU3"};
 
int RS232_OpenComport(int comport_number, int baudrate, const char *mode)
{
  int baudr,
      status;
 
  if((comport_number>37)||(comport_number<0))
  {
    printf("illegal comport number\n");
    return(1);
  }
 
 
  switch(baudrate)
  {
    case      50 : baudr = B50;
                   break;
    case      75 : baudr = B75;
                   break;
    case     110 : baudr = B110;
                   break;
    case     134 : baudr = B134;
                   break;
    case     150 : baudr = B150;
                   break;
    case     200 : baudr = B200;
                   break;
    case     300 : baudr = B300;
                   break;
    case     600 : baudr = B600;
                   break;
    case    1200 : baudr = B1200;
                   break;
    case    1800 : baudr = B1800;
                   break;
    case    2400 : baudr = B2400;
                   break;
    case    4800 : baudr = B4800;
                   break;
    case    9600 : baudr = B9600;
                   break;
    case   19200 : baudr = B19200;
                   break;
    case   38400 : baudr = B38400;
                   break;
    case   57600 : baudr = B57600;
                   break;
    case  115200 : baudr = B115200;
                   break;
    case  230400 : baudr = B230400;
                   break;
    case  460800 : baudr = B460800;
                   break;
    case  500000 : baudr = B500000;
                   break;
    case  576000 : baudr = B576000;
                   break;
    case  921600 : baudr = B921600;
                   break;
    case 1000000 : baudr = B1000000;
                   break;
    case 1152000 : baudr = B1152000;
                   break;
    case 1500000 : baudr = B1500000;
                   break;
    case 2000000 : baudr = B2000000;
                   break;
    case 2500000 : baudr = B2500000;
                   break;
    case 3000000 : baudr = B3000000;
                   break;
    case 3500000 : baudr = B3500000;
                   break;
    case 4000000 : baudr = B4000000;
                   break;
    default      : printf("invalid baudrate\n");
                   return(1);
                   break;
  }
 
  int cbits=CS8,
      cpar=0,
      ipar=IGNPAR,
      bstop=0;
 
  if(strlen(mode) != 3)
  {
    printf("invalid mode \"%s\"\n", mode);
    return(1);
  }
 
  switch(mode[0])
  {
    case '8': cbits = CS8;
              break;
    case '7': cbits = CS7;
              break;
    case '6': cbits = CS6;
              break;
    case '5': cbits = CS5;
              break;
    default : printf("invalid number of data-bits '%c'\n", mode[0]);
              return(1);
              break;
  }
 
  switch(mode[1])
  {
    case 'N':
    case 'n': cpar = 0;
              ipar = IGNPAR;
              break;
    case 'E':
    case 'e': cpar = PARENB;
              ipar = INPCK;
              break;
    case 'O':
    case 'o': cpar = (PARENB | PARODD);
              ipar = INPCK;
              break;
    default : printf("invalid parity '%c'\n", mode[1]);
              return(1);
              break;
  }
 
  switch(mode[2])
  {
    case '1': bstop = 0;
              break;
    case '2': bstop = CSTOPB;
              break;
    default : printf("invalid number of stop bits '%c'\n", mode[2]);
              return(1);
              break;
  }
 
/*
http://pubs.opengroup.org/onlinepubs/7908799/xsh/termios.h.html
 
http://man7.org/linux/man-pages/man3/termios.3.html
*/
 
  Cport[comport_number] = open(comports[comport_number], O_RDWR | O_NOCTTY | O_NDELAY);
  if(Cport[comport_number]==-1)
  {
    perror("unable to open comport ");
    return(1);
  }
 
  error = tcgetattr(Cport[comport_number], old_port_settings + comport_number);
  if(error==-1)
  {
    close(Cport[comport_number]);
    perror("unable to read portsettings ");
    return(1);
  }
  memset(&new_port_settings, 0, sizeof(new_port_settings));  /* clear the new struct */
 
  new_port_settings.c_cflag = cbits | cpar | bstop | CLOCAL | CREAD;
  new_port_settings.c_iflag = ipar;
  new_port_settings.c_oflag = 0;
  new_port_settings.c_lflag = 0;
  new_port_settings.c_cc[VMIN] = 0;      /* block untill n bytes are received */
  new_port_settings.c_cc[VTIME] = 0;     /* block untill a timer expires (n * 100 mSec.) */
 
  cfsetispeed(&new_port_settings, baudr);
  cfsetospeed(&new_port_settings, baudr);
 
  error = tcsetattr(Cport[comport_number], TCSANOW, &new_port_settings);
  if(error==-1)
  {
    close(Cport[comport_number]);
    perror("unable to adjust portsettings ");
    return(1);
  }
 
  if(ioctl(Cport[comport_number], TIOCMGET, &status) == -1)
  {
    perror("unable to get portstatus");
    return(1);
  }
 
  status |= TIOCM_DTR;    /* turn on DTR */
  status |= TIOCM_RTS;    /* turn on RTS */
 
  if(ioctl(Cport[comport_number], TIOCMSET, &status) == -1)
  {
    perror("unable to set portstatus");
    return(1);
  }
 
  return(0);
}
 
 
int RS232_PollComport(int comport_number, unsigned char *buf, int size)
{
  int n;
 
  n = read(Cport[comport_number], buf, size);
 
  return(n);
}
 
 
int RS232_SendByte(int comport_number, unsigned char byte)
{
  int n;
 
  n = write(Cport[comport_number], &byte, 1);
  if(n<0)  return(1);
 
  return(0);
}
 
 
int RS232_SendBuf(int comport_number, unsigned char *buf, int size)
{
  return(write(Cport[comport_number], buf, size));
}
 
 
void RS232_CloseComport(int comport_number)
{
  int status;
 
  if(ioctl(Cport[comport_number], TIOCMGET, &status) == -1)
  {
    perror("unable to get portstatus");
  }
 
  status &= ~TIOCM_DTR;    /* turn off DTR */
  status &= ~TIOCM_RTS;    /* turn off RTS */
 
  if(ioctl(Cport[comport_number], TIOCMSET, &status) == -1)
  {
    perror("unable to set portstatus");
  }
 
  tcsetattr(Cport[comport_number], TCSANOW, old_port_settings + comport_number);
  close(Cport[comport_number]);
}
 
 
 
void RS232_PurgeRXBuffer(int comport_number)
{
tcflush(Cport[comport_number], TCIFLUSH);
return;
}
 
 
 
 
/*
Constant  Description
TIOCM_LE        DSR (data set ready/line enable)
TIOCM_DTR       DTR (data terminal ready)
TIOCM_RTS       RTS (request to send)
TIOCM_ST        Secondary TXD (transmit)
TIOCM_SR        Secondary RXD (receive)
TIOCM_CTS       CTS (clear to send)
TIOCM_CAR       DCD (data carrier detect)
TIOCM_CD        see TIOCM_CAR
TIOCM_RNG       RNG (ring)
TIOCM_RI        see TIOCM_RNG
TIOCM_DSR       DSR (data set ready)
 
http://man7.org/linux/man-pages/man4/tty_ioctl.4.html
*/
 
int RS232_IsDCDEnabled(int comport_number)
{
  int status;
 
  ioctl(Cport[comport_number], TIOCMGET, &status);
 
  if(status&TIOCM_CAR) return(1);
  else return(0);
}
 
int RS232_IsCTSEnabled(int comport_number)
{
  int status;
 
  ioctl(Cport[comport_number], TIOCMGET, &status);
 
  if(status&TIOCM_CTS) return(1);
  else return(0);
}
 
int RS232_IsDSREnabled(int comport_number)
{
  int status;
 
  ioctl(Cport[comport_number], TIOCMGET, &status);
 
  if(status&TIOCM_DSR) return(1);
  else return(0);
}
 
void RS232_enableDTR(int comport_number)
{
  int status;
 
  if(ioctl(Cport[comport_number], TIOCMGET, &status) == -1)
  {
    perror("unable to get portstatus");
  }
 
  status |= TIOCM_DTR;    /* turn on DTR */
 
  if(ioctl(Cport[comport_number], TIOCMSET, &status) == -1)
  {
    perror("unable to set portstatus");
  }
}
 
void RS232_disableDTR(int comport_number)
{
  int status;
 
  if(ioctl(Cport[comport_number], TIOCMGET, &status) == -1)
  {
    perror("unable to get portstatus");
  }
 
  status &= ~TIOCM_DTR;    /* turn off DTR */
 
  if(ioctl(Cport[comport_number], TIOCMSET, &status) == -1)
  {
    perror("unable to set portstatus");
  }
}
 
void RS232_enableRTS(int comport_number)
{
  int status;
 
  if(ioctl(Cport[comport_number], TIOCMGET, &status) == -1)
  {
    perror("unable to get portstatus");
  }
 
  status |= TIOCM_RTS;    /* turn on RTS */
 
  if(ioctl(Cport[comport_number], TIOCMSET, &status) == -1)
  {
    perror("unable to set portstatus");
  }
}
 
void RS232_disableRTS(int comport_number)
{
  int status;
 
  if(ioctl(Cport[comport_number], TIOCMGET, &status) == -1)
  {
    perror("unable to get portstatus");
  }
 
  status &= ~TIOCM_RTS;    /* turn off RTS */
 
  if(ioctl(Cport[comport_number], TIOCMSET, &status) == -1)
  {
    perror("unable to set portstatus");
  }
}
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,045
21.06.2019, 20:41  [ТС] 8
скомпилировать файл LUARTDAB.c с помощью

Bash
1
2
cd /home/knoppix/Desktop/wread/New/lusartdab
gcc -o LUARTBAB -Wall -g LUARTDAB.c
0
Вложения
Тип файла: zip LUARTDAB.tar.zip (17.4 Кб, 1 просмотров)
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,045
21.06.2019, 20:57  [ТС] 9
Можно заменить протокол на Xon/Xoff, принимая в качестве заголовка данных Xon(17 dec, '\0x11' , старт-слово ) и Xoff(19 dec, '\0x13') в качестве ограничителя данных (стоп -слова ) , а передавать, дополняя передаваемую последовательность байтов этими кодами в начале и в конце ( https://www.techopedia.com/def... 17/xonxoff ) .
0
2 / 2 / 0
Регистрация: 29.06.2018
Сообщений: 1,045
04.07.2020, 02:06  [ТС] 10
Пробовал в MPLAB X 5.35 (pdblock\pdblock.X\dist\default\production\pdblock.X.product ion.hex ), на микросхеме еще не проверял .
0
Вложения
Тип файла: zip GPIOdemoblockMPLABX5_35.zip (2.49 Мб, 0 просмотров)
44 / 32 / 12
Регистрация: 06.07.2017
Сообщений: 178
13.07.2020, 17:08 11
Забыли конфиги в сишном файле прописать, MPLAB по умолчанию может впихнуть не то что ожидается.
Вдруг кто повторит проект на Cи, и будет потом репу чесать что-же не так
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.07.2020, 17:08

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Сравнение двух регистров (PIC16F877A)
Как сделать сравнение двух регистров и выбрать наименьший. Tо есть если к примеру значение регистра...

написать программу для PIC16F877A
Нужно написать вот такую программку для PIC16F877A : Написать программу, позволяющую при нажатии...

вытяжка Kuppersbusch kd9350.0e, дамп PIC16F877A
Буду очень признателен и благодарен - вылет по питанию - влага. Нужен дамп ...

Работа с PIC16F877A в первый раз (ASM)
Всем добрый день!Впервые столкнулась с Assembler на учебе и сразу же возникли вопросы. 1)какая...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.