Zbyt dużo do przerabiania w tym moim kodzie, a jak pokażę całość to się nie połapiesz
Tak na szybko wymyśliłem coś takiego:
- pomiar napięcia do 40V
- pomiar natężenia do 1A
Rezystory dla napięcia 10k i 360k
rezystor dla natężenia prądu to 0.1om
No i kod:
- $regfile = "m328pdef.dat"
- $crystal = 16000000
- $hwstack = 64
- $swstack = 32
- $framesize = 128
- Config Submode = New
- Config Timer0 = Timer , Prescale = 1024 , Compare A = Disconnect , Compare B = Disconnect , Clear Timer = 1
- Enable Compare0a : On Compare0a Int_10ms Nosave : Compare0a = 155 '10ms @16MHz
- Config Adc = Single , Prescaler = Auto , Reference = Internal
- Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.1 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7
- Config Lcd = 16x2
- Cursor Off , Noblink : Cls
- Const Korekta_prad = 0.001
- Const Korekta_napiecie = 0.0397
- Const Ilosc_probek = 32
- Config 1wire = Portd.4
- 1wreset
- 1wwrite &HCC
- 1wwrite &H44
- Dim 10ms As Byte , 1s As Byte
- Dim Pomiar_wejscia As Word , Odczyt As Single , Krok As Byte
- Dim Amper As String * 5 , Volt As String * 5 , Watt As String * 5
- Dim Watt_volt As Single , Watt_amper As Single , Watt_x As Single
- Dim Odczyt_ds(2) As Byte , T As Integer , T1 As Single , Temp As String * 5
- Sub Pomiary(byval Channel As Byte)
- Local Pomiar As Word : Pomiar = 0
- For Krok = 1 To Ilosc_probek
- Pomiar = Pomiar + Getadc(channel)
- Next
- Pomiar_wejscia = Pomiar / Ilosc_probek
- Select Case Channel
- Case 0
- Odczyt = Pomiar_wejscia * Korekta_prad
- Watt_amper = Odczyt
- Amper = Fusing(odczyt , "##.##")
- Case 1
- Odczyt = Pomiar_wejscia * Korekta_napiecie
- Watt_volt = Odczyt
- Volt = Fusing(odczyt , "##.##")
- End Select
- End Sub
- Sub Temperatura
- If Err = 0 Then
- 1wreset
- 1wwrite &HCC
- 1wwrite &HBE
- Odczyt_ds(1) = 1wread(2)
- T = Odczyt_ds(2)
- Shift T , Left , 8
- T = T + Odczyt_ds(1)
- T1 = T * 0.0625
- Temp = Fusing(t1 , "###.#")
- Else
- Temp = "0.0"
- End If
- 1wreset
- 1wwrite &HCC
- 1wwrite &H44
- End Sub
- Locate 1 , 1 : Lcd " Power Supply "
- Locate 2 , 1 : Lcd " 40V & 1A v1.0 "
- Wait 3 : Cls
- Enable Interrupts
- Do
- If 10ms = 1 Then
- 10ms = 0
- Incr 1s
- If 1s = 100 Then
- 1s = 0
- Call Pomiary(0)
- Call Pomiary(1)
- Call Temperatura
- Watt_x = Watt_volt * Watt_amper
- Watt = Fusing(watt_x , "##.##")
- Locate 1 , 1 : Lcd "V:" ; Volt ; " "
- Locate 1 , 10 : Lcd "A:" ; Amper ; " "
- Locate 2 , 1 : Lcd "W:" ; Watt ; " "
- Locate 2 , 10 : Lcd "T:" ; Temp ; " "
- End If
- End If
- Loop
- End
- Int_10ms:
- $asm
- PUSH R24
- !in R24, sreg
- PUSH R24
- $end Asm
- 10ms = 1
- '---Tuned with NoSave Tool
- $asm
- POP R24
- !out sreg, r24
- POP R24
- $end Asm
- Return
Co to jest "Proteus"?