;********************************************************** ;* AD_wand.ASM ;********************************************************** ;* AD-Wandler ;* ohne Interrupts !!! sondern Polling ;-( ;* RA0 = analog input ;* PortC = output ;* - Zeigt die zehnfache (gerundete) Spannung an (DualZahl) ;* schlechte Genauigkeit durch einfache Anzeige 0 bis 50 für 0 bis 5Volt in 32 Schritten ;* !!! ;* -Zeigt zwei 7-Segment Ziffern an (0,2 bis 5,0 Volt)(Offset ist kleiner Schönheitsfehler vom Programmierer) ;* -Zeigt 2/100 der Spannung an (DualZahl) ;* von 0V bis 5V als 1/50 DualZahl ;* Ergebnis = DualZahl * 2 / 100 [Volt] ;* -Zeigt 5/256 der Spannung an (DualZahl) ;* (Genaueste ANzeige mit einem Port) ;* (für genauste Auswertung müssten zwei AusgabePorts verwendet werden) ;* - Auswahl weiter unten im Code durch Auskommentieren von goto-Befehlen ;* ;* ProcessorClock min 62,5kHz max 5MHz -> AD-Wandler = 1/8 ;* ProcessorClock = 4MHz ;* ;* für 2stellige 7-SegmentAnzeige an PortC ;* Bit0=a ... Bit6=g ;* Bit7 = 0 für Zehntel ;* = 1 für Einer ;* -> Kathoden mit Transistoren mit Bit7 von Einer auf Zehntel umschalten ;********************************************************** list p=16f877 ; Include file, change directory if needed include "p16f877.inc" ; damit "Namen" für Register in Bits umgewandelt werden DUMMY EQU H'0020' ; Initialisierung einer 8Bit-Variablen ; Start at the reset vector org 0x000 nop InitAD banksel PORTC clrf PORTC ;Clear PORTC movlw B'01000001' ;Fosc/8 ->C_Clock, channel RA0/AN0, A/D enabled ; (0->off!!) movwf ADCON0 ; A/D-Modul banksel OPTION_REG ; Bank 1 movlw B'10000100' ;TMR0 prescaler, 1:32 -> 4Mhz -> 2Hz ; Takt: 1/Clock * 2^6 * Teiler ; 0,52s = 1/4MHz * 65536 * 32 movwf OPTION_REG clrf TRISC ;PORTC alle outputs movlw B'00001110' ;Left justify,1 analog channel movwf ADCON1 ;VDD and VSS references, RA0/AN0 -> analog banksel PORTC ; Bank 0 Delay ;Verzögerung vor (Neu)Start des AD-Wandlers bcf INTCON,T0IF ;overflow wegnehmen = Timer starten Loop btfss INTCON,T0IF ;Wait for Timer0 to timeout, 1=overflowed goto Loop StartAD bsf ADCON0,GO ;(Neu)Start A/D conversion Wait btfss PIR1,ADIF ;Wait for conversion to complete ; A/D-Wandler Intrrupt-Flag ; Interrupts werden nicht ausgelöst -> INTCON{GIE}=0 ; und PIE1{ADIE}=0 beides vom RESET goto Wait Anzeige banksel STATUS movf ADRESH,W ; A/D Ergebnis (nur Bit10 bis Bit 3) ;----------------------------------- ; Ausgabeart wählen ; bis zum gewünschteni 'goto' auskommentieren ; goto AM1 ; Ausgabe 10fache DualZahl ; goto AM2 ; Ausgabe 2 * 7-Segment-Anzeige goto AM3 ; alternative Ausgabe 2/100 DualZahl ; goto AM4 ; 5/256 V ;----------------------------------- AM1 movwf DUMMY ; DUMMY = 20h bcf STATUS,0 ; Carry löschen rrf DUMMY,F bcf STATUS,0 rrf DUMMY,F bcf STATUS,0 rrf DUMMY,F ; in Dummy = 20h steht 1/32 des A/D Ergebnises = 2^5 movf DUMMY,W call Tab movwf PORTC ;LEDs als zehnfache Dualzahl goto Delay ; Do it again ;-) AM2 movwf DUMMY ; DUMMY = 20h bcf STATUS,0 ; Carry löschen rrf DUMMY,F bcf STATUS,0 rrf DUMMY,F bcf STATUS,0 rrf DUMMY,F ; in Dummy = 20h steht 1/32 des A/D Ergebnises = 2^5 movf DUMMY,W call SiSe goto StartAD ; ohne Delay neu starten AM3 bcf STATUS,2 ; Z(ero-Flag) lösche incf ADRESH,W ; Ergebnis um eins erhöhen (und in w schreiben) btfsc STATUS,2 ; und schauen ob es lauter 1er waren goto Tab2Help ; wenn ja geht Tab2 nicht, deshalb Sprung zu Tab2Help movlw HIGH Tab2 ; oberen Bist für die Adresse von Tab2 holen movwf PCLATH ; und in 0x0A eintragen (oberne Bits des Prog.Counters, ; die nicht mit 'addwf' erreicht werden können) movf ADRESH,W ; noch mal da das w-Reg. nicht mehr aktuell ist ; A/D Ergebnis (nur Bit10 bis Bit 3) call Tab2 movwf PORTC ;LEDs als 1/50 Dualzahl goto Delay ; Do it again ;-) AM4 movwf PORTC goto Delay ; Do it again ;-) ; Tabelle für 0 bis 5 Volt Tab addwf PCL,f ; Spannung -> 1/10 retlw 0 ;0,0 retlw 2 ;0,2 retlw 3 ;0,3 retlw 5 ;0,5 retlw 6 ;0,6 retlw 8 ;0,8 retlw 0A ;1,0 retlw 0B ;1,1 retlw 0E ;1,3 retlw 0F ;1,5 retlw 10 ;1,6 retlw 12 ;1,8 retlw 13 ;1,9 retlw 15 ;2,1 retlw 17 ;2,3 retlw 18 ;2,4 retlw 1A ;2,6 retlw 1B ;2,7 retlw 1C ;2,9 retlw 1F ;3,1 retlw 20 ;3,2 retlw 22 ;3,4 retlw 23 ;3,5 retlw 25 ;3,7 retlw 27 ;3,9 retlw 28 ;4,0 retlw 2A ;4,2 retlw 2C ;4,4 retlw 2D ;4,5 retlw 2F ;4,7 retlw 30 ;4,8 retlw 32 ;5,0 ; 2stellige 7-SegmentAnzeige an PortC ; Bit0=a ... Bit6=g ; Bit7 = 0 für Zehntel ; = 1 für Einer ; -> Kathoden mit Transistoren mittels Bit7 von Einer auf Zehntel umschalten SiSe call Tab7SegE movwf PORTC bcf INTCON,T0IF ;overflow wegnehmen = Timer starten WarteE btfss INTCON,T0IF ;warten vor Umschalten, damit man was sieht goto WarteE movf DUMMY,W call Tab7SegZ movwf PORTC bcf INTCON,T0IF ;overflow wegnehmen = Timer starten WarteZ btfss INTCON,T0IF ;warten vor Umschalten, damit man was sieht goto WarteZ retlw 00 ;Return ; Tabelle fuer die Siebensegmentcodes ; !!!!!!!!!! ; Bit0=a ... Bit6=g ; Bit7 = 0 für Zehntel ; = 1 für Einer ; -> Kathoden mit Transistoren mittels Bit7 von Einer auf Zehntel umschalten Tab7SegZ addwf PCL,f ; Ssgt-Code fuer Zehntel retlw 5B ; 0,2 retlw 4F ; 0,3 retlw 6D ; 0,5 retlw 7D ; 0,6 retlw 7F ; 0,8 retlw 6F ; 0,9 retlw 06 ; 1,1 retlw 4F ; 1,3 retlw 66 ; 1,4 retlw 7D ; 1,6 retlw 07 ; 1,7 retlw 7F ; 1,8 retlw 3F ; 2,0 retlw 5B ; 2,2 retlw 4F ; 2,3 retlw 6D ; 2,5 retlw 07 ; 2,7 retlw 7F ; 2,8 retlw 3F ; 3,0 retlw 06 ; 3,1 retlw 4F ; 3,3 retlw 66 ; 3,4 retlw 7D ; 3,6 retlw 7F ; 3,8 retlw 6F ; 3,9 retlw 06 ; 4,1 retlw 5B ; 4,2 retlw 66 ; 4,4 retlw 6D ; 4,5 retlw 07 ; 4,7 retlw 7F ; 4,8 retlw 3F ; 5,0 Tab7SegE addwf PCL,f ; Ssgt-Code fuer Einer retlw 0BF ; 0,2 retlw 0BF ; 0,3 retlw 0BF ; 0,5 retlw 0BF ; 0,6 retlw 0BF ; 0,8 retlw 0BF ; 0,9 retlw 086 ; 1,1 retlw 086 ; 1,3 retlw 086 ; 1,4 retlw 086 ; 1,6 retlw 086 ; 1,7 retlw 086 ; 1,8 retlw 0DB ; 2,0 retlw 0DB ; 2,2 retlw 0DB ; 2,3 retlw 0DB ; 2,5 retlw 0DB ; 2,7 retlw 0DB ; 2,8 retlw 0CF ; 3,0 retlw 0CF ; 3,1 retlw 0CF ; 3,3 retlw 0CF ; 3,4 retlw 0CF ; 3,6 retlw 0CF ; 3,8 retlw 0CF ; 3,9 retlw 0E6 ; 4,1 retlw 0E6 ; 4,2 retlw 0E6 ; 4,4 retlw 0E6 ; 4,5 retlw 0E6 ; 4,7 retlw 0E6 ; 4,8 retlw 0ED ; 5,0 ; eine HexZahl darf nicht mit einerm Buchstaben beginnen, ; sonst wird sie als Symbol gewertet !! ; oder h'0F' schreiben Tab2Help movlw h'FF' movwf PORTC ;LEDs als 1/50 Dualzahl goto Delay ; Do it again ;-) ; Tabelle für Auflösung von 1/50 V org 0x300 ; Anfang der Tabelle auf den Anfang eines 256-Blocks legen !!!!!!!!!!! ; Da sonst der PC überläuft ; Was bei h'FF' trotzdem passiert, ; deshalb Tab2Help Tab2 addwf PCL,f ; Spannung -> 1/50 1|d= 0,019607843 V retlw d'0' ; 0 0 retlw d'1' ; 0,019607843 1 retlw d'2' ; 0,039215686 2 retlw d'3' ; 0,058823529 3 retlw d'4' ; 0,078431373 4 retlw d'5' ; 0,098039216 5 retlw d'6' ; 0,117647059 6 retlw d'7' ; 0,137254902 7 retlw d'8' ; 0,156862745 8 retlw d'9' ; 0,176470588 9 retlw d'10' ; 0,196078431 10 retlw d'11' ; 0,215686275 11 retlw d'12' ; 0,235294118 12 retlw d'13' ; 0,254901961 13 retlw d'14' ; 0,274509804 14 retlw d'15' ; 0,294117647 15 retlw d'16' ; 0,31372549 16 retlw d'17' ; 0,333333333 17 retlw d'18' ; 0,352941176 18 retlw d'19' ; 0,37254902 19 retlw d'20' ; 0,392156863 20 retlw d'21' ; 0,411764706 21 retlw d'22' ; 0,431372549 22 retlw d'23' ; 0,450980392 23 retlw d'24' ; 0,470588235 24 retlw d'25' ; 0,490196078 25 retlw d'25' ; 0,509803922 26 retlw d'26' ; 0,529411765 27 retlw d'27' ; 0,549019608 28 retlw d'28' ; 0,568627451 29 retlw d'29' ; 0,588235294 30 retlw d'30' ; 0,607843137 31 retlw d'31' ; 0,62745098 32 retlw d'32' ; 0,647058824 33 retlw d'33' ; 0,666666667 34 retlw d'34' ; 0,68627451 35 retlw d'35' ; 0,705882353 36 retlw d'36' ; 0,725490196 37 retlw d'37' ; 0,745098039 38 retlw d'38' ; 0,764705882 39 retlw d'39' ; 0,784313725 40 retlw d'40' ; 0,803921569 41 retlw d'41' ; 0,823529412 42 retlw d'42' ; 0,843137255 43 retlw d'43' ; 0,862745098 44 retlw d'44' ; 0,882352941 45 retlw d'45' ; 0,901960784 46 retlw d'46' ; 0,921568627 47 retlw d'47' ; 0,941176471 48 retlw d'48' ; 0,960784314 49 retlw d'49' ; 0,980392157 50 retlw d'50' ; 1 51 retlw d'51' ; 1,019607843 52 retlw d'52' ; 1,039215686 53 retlw d'53' ; 1,058823529 54 retlw d'54' ; 1,078431373 55 retlw d'55' ; 1,098039216 56 retlw d'56' ; 1,117647059 57 retlw d'57' ; 1,137254902 58 retlw d'58' ; 1,156862745 59 retlw d'59' ; 1,176470588 60 retlw d'60' ; 1,196078431 61 retlw d'61' ; 1,215686275 62 retlw d'62' ; 1,235294118 63 retlw d'63' ; 1,254901961 64 retlw d'64' ; 1,274509804 65 retlw d'65' ; 1,294117647 66 retlw d'66' ; 1,31372549 67 retlw d'67' ; 1,333333333 68 retlw d'68' ; 1,352941176 69 retlw d'69' ; 1,37254902 70 retlw d'70' ; 1,392156863 71 retlw d'71' ; 1,411764706 72 retlw d'72' ; 1,431372549 73 retlw d'73' ; 1,450980392 74 retlw d'74' ; 1,470588235 75 retlw d'75' ; 1,490196078 76 retlw d'75' ; 1,509803922 77 retlw d'76' ; 1,529411765 78 retlw d'77' ; 1,549019608 79 retlw d'78' ; 1,568627451 80 retlw d'79' ; 1,588235294 81 retlw d'80' ; 1,607843137 82 retlw d'81' ; 1,62745098 83 retlw d'82' ; 1,647058824 84 retlw d'83' ; 1,666666667 85 retlw d'84' ; 1,68627451 86 retlw d'85' ; 1,705882353 87 retlw d'86' ; 1,725490196 88 retlw d'87' ; 1,745098039 89 retlw d'88' ; 1,764705882 90 retlw d'89' ; 1,784313725 91 retlw d'90' ; 1,803921569 92 retlw d'91' ; 1,823529412 93 retlw d'92' ; 1,843137255 94 retlw d'93' ; 1,862745098 95 retlw d'94' ; 1,882352941 96 retlw d'95' ; 1,901960784 97 retlw d'96' ; 1,921568627 98 retlw d'97' ; 1,941176471 99 retlw d'98' ; 1,960784314 100 retlw d'99' ; 1,980392157 101 retlw d'100' ; 2 102 retlw d'101' ; 2,019607843 103 retlw d'102' ; 2,039215686 104 retlw d'103' ; 2,058823529 105 retlw d'104' ; 2,078431373 106 retlw d'105' ; 2,098039216 107 retlw d'106' ; 2,117647059 108 retlw d'107' ; 2,137254902 109 retlw d'108' ; 2,156862745 110 retlw d'109' ; 2,176470588 111 retlw d'110' ; 2,196078431 112 retlw d'111' ; 2,215686275 113 retlw d'112' ; 2,235294118 114 retlw d'113' ; 2,254901961 115 retlw d'114' ; 2,274509804 116 retlw d'115' ; 2,294117647 117 retlw d'116' ; 2,31372549 118 retlw d'117' ; 2,333333333 119 retlw d'118' ; 2,352941176 120 retlw d'119' ; 2,37254902 121 retlw d'120' ; 2,392156863 122 retlw d'121' ; 2,411764706 123 retlw d'122' ; 2,431372549 124 retlw d'123' ; 2,450980392 125 retlw d'124' ; 2,470588235 126 retlw d'125' ; 2,490196078 127 retlw d'125' ; 2,509803922 128 retlw d'126' ; 2,529411765 129 retlw d'127' ; 2,549019608 130 retlw d'128' ; 2,568627451 131 retlw d'129' ; 2,588235294 132 retlw d'130' ; 2,607843137 133 retlw d'131' ; 2,62745098 134 retlw d'132' ; 2,647058824 135 retlw d'133' ; 2,666666667 136 retlw d'134' ; 2,68627451 137 retlw d'135' ; 2,705882353 138 retlw d'136' ; 2,725490196 139 retlw d'137' ; 2,745098039 140 retlw d'138' ; 2,764705882 141 retlw d'139' ; 2,784313725 142 retlw d'140' ; 2,803921569 143 retlw d'141' ; 2,823529412 144 retlw d'142' ; 2,843137255 145 retlw d'143' ; 2,862745098 146 retlw d'144' ; 2,882352941 147 retlw d'145' ; 2,901960784 148 retlw d'146' ; 2,921568627 149 retlw d'147' ; 2,941176471 150 retlw d'148' ; 2,960784314 151 retlw d'149' ; 2,980392157 152 retlw d'150' ; 3 153 retlw d'151' ; 3,019607843 154 retlw d'152' ; 3,039215686 155 retlw d'153' ; 3,058823529 156 retlw d'154' ; 3,078431373 157 retlw d'155' ; 3,098039216 158 retlw d'156' ; 3,117647059 159 retlw d'157' ; 3,137254902 160 retlw d'158' ; 3,156862745 161 retlw d'159' ; 3,176470588 162 retlw d'160' ; 3,196078431 163 retlw d'161' ; 3,215686275 164 retlw d'162' ; 3,235294118 165 retlw d'163' ; 3,254901961 166 retlw d'164' ; 3,274509804 167 retlw d'165' ; 3,294117647 168 retlw d'166' ; 3,31372549 169 retlw d'167' ; 3,333333333 170 retlw d'168' ; 3,352941176 171 retlw d'169' ; 3,37254902 172 retlw d'170' ; 3,392156863 173 retlw d'171' ; 3,411764706 174 retlw d'172' ; 3,431372549 175 retlw d'173' ; 3,450980392 176 retlw d'174' ; 3,470588235 177 retlw d'175' ; 3,490196078 178 retlw d'175' ; 3,509803922 179 retlw d'176' ; 3,529411765 180 retlw d'177' ; 3,549019608 181 retlw d'178' ; 3,568627451 182 retlw d'179' ; 3,588235294 183 retlw d'180' ; 3,607843137 184 retlw d'181' ; 3,62745098 185 retlw d'182' ; 3,647058824 186 retlw d'183' ; 3,666666667 187 retlw d'184' ; 3,68627451 188 retlw d'185' ; 3,705882353 189 retlw d'186' ; 3,725490196 190 retlw d'187' ; 3,745098039 191 retlw d'188' ; 3,764705882 192 retlw d'189' ; 3,784313725 193 retlw d'190' ; 3,803921569 194 retlw d'191' ; 3,823529412 195 retlw d'192' ; 3,843137255 196 retlw d'193' ; 3,862745098 197 retlw d'194' ; 3,882352941 198 retlw d'195' ; 3,901960784 199 retlw d'196' ; 3,921568627 200 retlw d'197' ; 3,941176471 201 retlw d'198' ; 3,960784314 202 retlw d'199' ; 3,980392157 203 retlw d'200' ; 4 204 retlw d'201' ; 4,019607843 205 retlw d'202' ; 4,039215686 206 retlw d'203' ; 4,058823529 207 retlw d'204' ; 4,078431373 208 retlw d'205' ; 4,098039216 209 retlw d'206' ; 4,117647059 210 retlw d'207' ; 4,137254902 211 retlw d'208' ; 4,156862745 212 retlw d'209' ; 4,176470588 213 retlw d'210' ; 4,196078431 214 retlw d'211' ; 4,215686275 215 retlw d'212' ; 4,235294118 216 retlw d'213' ; 4,254901961 217 retlw d'214' ; 4,274509804 218 retlw d'215' ; 4,294117647 219 retlw d'216' ; 4,31372549 220 retlw d'217' ; 4,333333333 221 retlw d'218' ; 4,352941176 222 retlw d'219' ; 4,37254902 223 retlw d'220' ; 4,392156863 224 retlw d'221' ; 4,411764706 225 retlw d'222' ; 4,431372549 226 retlw d'223' ; 4,450980392 227 retlw d'224' ; 4,470588235 228 retlw d'225' ; 4,490196078 229 retlw d'225' ; 4,509803922 230 retlw d'226' ; 4,529411765 231 retlw d'227' ; 4,549019608 232 retlw d'228' ; 4,568627451 233 retlw d'229' ; 4,588235294 234 retlw d'230' ; 4,607843137 235 retlw d'231' ; 4,62745098 236 retlw d'232' ; 4,647058824 237 retlw d'233' ; 4,666666667 238 retlw d'234' ; 4,68627451 239 retlw d'235' ; 4,705882353 240 retlw d'236' ; 4,725490196 241 retlw d'237' ; 4,745098039 242 retlw d'238' ; 4,764705882 243 retlw d'239' ; 4,784313725 244 retlw d'240' ; 4,803921569 245 retlw d'241' ; 4,823529412 246 retlw d'242' ; 4,843137255 247 retlw d'243' ; 4,862745098 248 retlw d'244' ; 4,882352941 249 retlw d'245' ; 4,901960784 250 retlw d'246' ; 4,921568627 251 retlw d'247' ; 4,941176471 252 retlw d'248' ; 4,960784314 253 retlw d'249' ; 4,980392157 254 retlw d'250' ; 5 255 end