Voor het basisstation hebben we ook een toetsen nodig. Je kunt natuurlijk ze rechtstreeks aan de pic koppelen, maar het kan ook via een chip. In mijn geval met de pcf8574. Het mooie van dit ic is dat het een interrupt uitgang heeft. Het uitlezen is heel makkelijk, Zodra er een toets is ingedrukt springen we naar de uitleesroutine en zetten de waarde op het scherm. Het grootste probleem is het instellen van de interrupts daarvoor moet je echt de datasheet van de pic lezen.
In dit geval heb ik 'on interrupt' gebruikt maar je zou de afhandeling ook na het sleep commando kunnen doen (nap 7). In het basisstation gaan we meerdere interrupts gebruiken. De toetsen op rb0, de ook ontvanger op rb1 en een timer interrupt voor het tonen van de tijd.
Device 18F4620
Xtal 20
ADCON1=7
LCD_DTPin PORTB.4
LCD_ENPin PORTB.3
LCD_RSPin PORTB.2
SCL_Pin = PORTC.3 ' i2c
SDA_Pin = PORTC.4
'portB rb0 input
TRISB = 000001
INTCON.4 = 1
INTCON2.6 = 0
INTCON2.7 = 0
Dim bus As Byte
Cls
DelayMS 100
On Interrupt GoTo keyin
' voor de zekerheid alle poorten hoog zetten.
BusOut $70,[255] 'adres voor pcf8574ap met a0,a1,a2 op 0
While 1=1
INTCON.1=0
nap 7
Wend
Disable
keyin:
BusIn $70,[bus]
DelayMS 50
Print At 1,1,Bin bus
Resume
Enable
End
Eenvoudige projecten voor de microchip microcontrollers geschreven in picbasic, proton+.
vrijdag 23 september 2011
donderdag 22 september 2011
DS1307 klok in combinatie met DCF77
In het basisstation wil ook graag een nauwkeurig klok het liefst met DCF77
Op het internet vind je verschillende beschrijvingen voor een DCF77 klok.
Ik ben hiermee aan het experimenteren gegaan met de bedoeling om een
DS1307 met de juiste tijd in te stellen. Ik ontvang twee keer een minuut van de dcf77
ontvanger zit hier een idd een minuut tussen dan zetten we de dcf77 tijd in de ds1307
en zijn we klaar. De tijd word alleen gezet als de ds1307 nog niet gestart is.
Wat er verder nog moet gebeuren is dat de tijd op een bepaald tijdstip op de dag
de ds1307 weer gesynchroniseerd word met de dcf77 ontvanger.
Device 18F4620
Xtal 20
ADCON1=7
LCD_DTPin PORTB.4 'lcd 16x2 op portb
LCD_ENPin PORTB.3
LCD_RSPin PORTB.2
'I2c op c.3 en c.4
SCL_Pin = PORTC.3 '
SDA_Pin = PORTC.4
Symbol ds1307 = %11010000 'adres ds1307
Symbol Dcfin = PORTC.0 'portc.0 dcf77 ontvanger ingang (positief)
Symbol Blok = 255
Dim SignaalCheck As Word
Dim Teller As Word
Dim Bittijdtel As Word
Dim Sec As Byte
Dim Minuut As Byte
Dim Uur As Byte
Dim Startbyte As Byte
Dim Ontvbyte As Byte
Dim Dag As Byte
Dim Week As Byte
Dim Maand As Byte
Dim Jaar As Byte
Dim I As Byte
Dim N As Byte
Dim Dcfmin As Byte
Dim Fout As Bit
Dim Ontvbit As Bit
Dim ParBit As Bit
Dim Loops As Bit
DelayMS 100 ' opstarttijd disp
BusIn ds1307,$00,[Sec] 'controleer of de klok loopt zo niet instellen met dcf77
If Sec.7=1 Then Call setklok
Cls
' tijd uitlezing met ds1307
main:
BusIn ds1307,0,[Sec,Minuut,Uur,Week,Dag,Maand,Jaar]
Print At 1,1,Hex2 Dag, "-", Hex2 Maand, "-", Hex2 Jaar
Print At 2,9,Hex2 Uur, ":", Hex2 Minuut, ":", Hex2 Sec
GoTo main
setklok:
Cls
Clear
Print At 1,1, "DCF77"
Print At 2,1, "Wacht op start"
GoSub Wachtopstartbit
'we hebben de startbit gevonden
init:
Print At 1,7, Rep " " \ 10
Print At 2,1,"Wacht op tijd "
Clear Sec
Clear ParBit
For I = 0 To 20 '0 TOT 20 OVERSLAAN
GoSub Eenbitontv
Next
N = 7
GoSub Bytesontv '21-27 MINUUT
Minuut = Ontvbyte
GoSub Eenbitontv '28 PARITY
If ParBit = 1 Then setklok
N = 6
GoSub Bytesontv '29-34 UUR
Uur = Ontvbyte
GoSub Eenbitontv '35 PARITY
If ParBit = 1 Then setklok
N = 6
GoSub Bytesontv '36-41 DAG
Dag = Ontvbyte
N = 3
GoSub Bytesontv '42-44 WEEK
Week = Ontvbyte
N = 5
GoSub Bytesontv '45-49 MAAND
Maand = Ontvbyte
N = 8
GoSub Bytesontv '50-57 JAAR
Jaar = Ontvbyte
GoSub Eenbitontv '58 PARITY
If ParBit = 1 Then setklok ' fout opgetreden
' we gaan twee keer de tijd binnenhalen en controleren of er een minuut
' verschil is. zo ja dan gaan we tijd in de ds1307 zetten.
' we nemen de overgang van 59 naar 0 voor lief
Select Case Loops
Case 0
Dcfmin = Minuut
Loops = 1
GoTo init
Case 1
If Dcfmin <> Minuut - 1 Then setklok
End Select
DelayMS 1000 ' 1 seconde wachten (sec59)
BusOut ds1307,$00,[0,Minuut,Uur,Week,Dag,Maand,Jaar]
Return
Wachtopstartbit:
' routine voor opstart tijd voor de DCF77 ontvanger bij power-on
Clear Teller
While Dcfin = 0
Inc Teller
DelayMS 1
If Teller > 50000 Then ErrorOntvangst
Wend
Clear Sec
Clear Startbyte
While Startbyte = 0
Clear Bittijdtel
Clear Teller
While Dcfin = 1
Inc Teller
DelayMS 1
If Teller > 5000 Then ErrorOntvangst ' meer dan 5 seconden een 1 dan error
Wend
While Dcfin = 0
Bittijdtel = Bittijdtel + 1
DelayMS 10
If Bittijdtel > 500 Then ErrorOntvangst ' meer dan 5 sec een 0 dan error
Wend
If Bittijdtel > 100 Then Startbyte = 1
Inc Sec
If Sec > 65 Then Clear Sec ' langer bezig dan 65 sec dan geen blokjes meer
Print At 1,7+(Sec/7),Blok
Wend
Return
Eenbitontv:
Clear Teller
Clear Bittijdtel
While Dcfin = 0
DelayMS 1
Inc Teller
If Teller > 3000 Then ErrorOntvangst
Wend
While Dcfin = 1
Bittijdtel = Bittijdtel + 1
DelayMS 10
Wend
If Bittijdtel > 16 Then
Ontvbit = 1
Else
Ontvbit = 0
EndIf
ParBit = ParBit + Ontvbit
Inc Sec
Print At 1,7+(Sec/6),Blok
Return
Bytesontv:
Clear Ontvbyte
For I = 0 To N - 1
GoSub Eenbitontv
If Ontvbit = 1 Then SetBit Ontvbyte, I
Next I
Return
ErrorOntvangst:
Print At 1,7, Rep " " \ 10
Print At 2,1, "Ontvangst slecht"
Repeat
Clear
Fout = Dcfin
While Dcfin = Fout ;Wacht op signaal verandering
Inc SignaalCheck
DelayMS 1
Wend
Fout = Fout ^ 1
While Dcfin = Fout ;Wacht op signaal verandering
Inc SignaalCheck
DelayMS 1
Wend
Until SignaalCheck < 500
GoTo setklok
Op het internet vind je verschillende beschrijvingen voor een DCF77 klok.
Ik ben hiermee aan het experimenteren gegaan met de bedoeling om een
DS1307 met de juiste tijd in te stellen. Ik ontvang twee keer een minuut van de dcf77
ontvanger zit hier een idd een minuut tussen dan zetten we de dcf77 tijd in de ds1307
en zijn we klaar. De tijd word alleen gezet als de ds1307 nog niet gestart is.
Wat er verder nog moet gebeuren is dat de tijd op een bepaald tijdstip op de dag
de ds1307 weer gesynchroniseerd word met de dcf77 ontvanger.
Device 18F4620
Xtal 20
ADCON1=7
LCD_DTPin PORTB.4 'lcd 16x2 op portb
LCD_ENPin PORTB.3
LCD_RSPin PORTB.2
'I2c op c.3 en c.4
SCL_Pin = PORTC.3 '
SDA_Pin = PORTC.4
Symbol ds1307 = %11010000 'adres ds1307
Symbol Dcfin = PORTC.0 'portc.0 dcf77 ontvanger ingang (positief)
Symbol Blok = 255
Dim SignaalCheck As Word
Dim Teller As Word
Dim Bittijdtel As Word
Dim Sec As Byte
Dim Minuut As Byte
Dim Uur As Byte
Dim Startbyte As Byte
Dim Ontvbyte As Byte
Dim Dag As Byte
Dim Week As Byte
Dim Maand As Byte
Dim Jaar As Byte
Dim I As Byte
Dim N As Byte
Dim Dcfmin As Byte
Dim Fout As Bit
Dim Ontvbit As Bit
Dim ParBit As Bit
Dim Loops As Bit
DelayMS 100 ' opstarttijd disp
BusIn ds1307,$00,[Sec] 'controleer of de klok loopt zo niet instellen met dcf77
If Sec.7=1 Then Call setklok
Cls
' tijd uitlezing met ds1307
main:
BusIn ds1307,0,[Sec,Minuut,Uur,Week,Dag,Maand,Jaar]
Print At 1,1,Hex2 Dag, "-", Hex2 Maand, "-", Hex2 Jaar
Print At 2,9,Hex2 Uur, ":", Hex2 Minuut, ":", Hex2 Sec
GoTo main
setklok:
Cls
Clear
Print At 1,1, "DCF77"
Print At 2,1, "Wacht op start"
GoSub Wachtopstartbit
'we hebben de startbit gevonden
init:
Print At 1,7, Rep " " \ 10
Print At 2,1,"Wacht op tijd "
Clear Sec
Clear ParBit
For I = 0 To 20 '0 TOT 20 OVERSLAAN
GoSub Eenbitontv
Next
N = 7
GoSub Bytesontv '21-27 MINUUT
Minuut = Ontvbyte
GoSub Eenbitontv '28 PARITY
If ParBit = 1 Then setklok
N = 6
GoSub Bytesontv '29-34 UUR
Uur = Ontvbyte
GoSub Eenbitontv '35 PARITY
If ParBit = 1 Then setklok
N = 6
GoSub Bytesontv '36-41 DAG
Dag = Ontvbyte
N = 3
GoSub Bytesontv '42-44 WEEK
Week = Ontvbyte
N = 5
GoSub Bytesontv '45-49 MAAND
Maand = Ontvbyte
N = 8
GoSub Bytesontv '50-57 JAAR
Jaar = Ontvbyte
GoSub Eenbitontv '58 PARITY
If ParBit = 1 Then setklok ' fout opgetreden
' we gaan twee keer de tijd binnenhalen en controleren of er een minuut
' verschil is. zo ja dan gaan we tijd in de ds1307 zetten.
' we nemen de overgang van 59 naar 0 voor lief
Select Case Loops
Case 0
Dcfmin = Minuut
Loops = 1
GoTo init
Case 1
If Dcfmin <> Minuut - 1 Then setklok
End Select
DelayMS 1000 ' 1 seconde wachten (sec59)
BusOut ds1307,$00,[0,Minuut,Uur,Week,Dag,Maand,Jaar]
Return
Wachtopstartbit:
' routine voor opstart tijd voor de DCF77 ontvanger bij power-on
Clear Teller
While Dcfin = 0
Inc Teller
DelayMS 1
If Teller > 50000 Then ErrorOntvangst
Wend
Clear Sec
Clear Startbyte
While Startbyte = 0
Clear Bittijdtel
Clear Teller
While Dcfin = 1
Inc Teller
DelayMS 1
If Teller > 5000 Then ErrorOntvangst ' meer dan 5 seconden een 1 dan error
Wend
While Dcfin = 0
Bittijdtel = Bittijdtel + 1
DelayMS 10
If Bittijdtel > 500 Then ErrorOntvangst ' meer dan 5 sec een 0 dan error
Wend
If Bittijdtel > 100 Then Startbyte = 1
Inc Sec
If Sec > 65 Then Clear Sec ' langer bezig dan 65 sec dan geen blokjes meer
Print At 1,7+(Sec/7),Blok
Wend
Return
Eenbitontv:
Clear Teller
Clear Bittijdtel
While Dcfin = 0
DelayMS 1
Inc Teller
If Teller > 3000 Then ErrorOntvangst
Wend
While Dcfin = 1
Bittijdtel = Bittijdtel + 1
DelayMS 10
Wend
If Bittijdtel > 16 Then
Ontvbit = 1
Else
Ontvbit = 0
EndIf
ParBit = ParBit + Ontvbit
Inc Sec
Print At 1,7+(Sec/6),Blok
Return
Bytesontv:
Clear Ontvbyte
For I = 0 To N - 1
GoSub Eenbitontv
If Ontvbit = 1 Then SetBit Ontvbyte, I
Next I
Return
ErrorOntvangst:
Print At 1,7, Rep " " \ 10
Print At 2,1, "Ontvangst slecht"
Repeat
Clear
Fout = Dcfin
While Dcfin = Fout ;Wacht op signaal verandering
Inc SignaalCheck
DelayMS 1
Wend
Fout = Fout ^ 1
While Dcfin = Fout ;Wacht op signaal verandering
Inc SignaalCheck
DelayMS 1
Wend
Until SignaalCheck < 500
GoTo setklok
zaterdag 17 september 2011
Vervolg onweer detector.
Inmiddels draait de onweer detector alweer een tijdje.
Hij hangt op zolder met een stukje draad verticaal als antenne. Het bereik is ca 50km. Ik heb de software uitgebreid met een aflezing per minuut en het totale aantal strikes. Het totale aan strikes word opgeslagen in het eeprom van de pic. Op portb.1 kun je een speaker aansluiten, zodra er meer dan 25strikes zijn per 5 minuten hoor je een piepje elke minuut. Tevens wordt de data draadloos verstuurd. Hier de source.
Device 16F628A
Xtal 4
LCD_DTPin PORTA.0
LCD_ENPin PORTB.3
LCD_RSPin PORTB.4
TRISB=000001 ' PortB.0 as input
'ANSEL = 0 ' all Portb.7 digital
CMCON = 7
PORTB.7 = 0
Dim teller As Byte
Dim zendtel As Byte
Dim mantel As Byte
Dim strikes[5] As Word
Dim strikes5m As Word
Dim strikestotal As Dword
Dim strikesmc As Word
Dim manchestin As Byte
Dim manchestout As Word
Dim tempdata As Bit
Dim manchestsl As Word
Dim manchestsh As Word
Dim manchests5h As Word
Dim manchests5l As Word
Dim manchestst0 As Word
Dim manchestst1 As Word
Dim manchestst2 As Word
Dim manchestst3 As Word
Dim manchestck As Word
Dim manchestzd As Word
Dim checksum As Byte
Symbol zender = 2
Symbol adres = 1
Symbol zendout = PORTB.7
Symbol startman = $55
Symbol dataman = $aa
Clear
manchestin = zender
Call manchesterdata
manchestzd = manchestout
strikestotal = ERead adres
Cls
DelayMS 100
Print At 1,1,"Lightning"
Print At 2,1,"Detector 1.0"
main:
For teller = 0 To 4
strikes[teller] = Counter PORTB.0,60000
strikes5m = strikes[0] + strikes[1] + strikes[2] + strikes[3] + strikes[4]
Print At 1,1,Dec3 strikes[teller]," S/m ",Dec3 strikes5m," S/5m"
If strikes5m > 25 Then Sound PORTB.1,[122,25]
If strikes[teller] > 2 Then strikestotal = strikestotal+strikes[teller]
Print At 2,1,Dec6 strikestotal," Tstrikes"
strikesmc = strikes[teller]
manchestin = strikesmc.HighByte
Call manchesterdata
manchestsh = manchestout
manchestin = strikesmc.LowByte
Call manchesterdata
manchestsl = manchestout
manchestin = strikes5m.HighByte
Call manchesterdata
manchests5h = manchestout
manchestin = strikes5m.LowByte
Call manchesterdata
manchests5l = manchestout
manchestin = strikestotal.Byte0
Call manchesterdata
manchestst0 = manchestout
manchestin = strikestotal.Byte1
Call manchesterdata
manchestst1 = manchestout
manchestin = strikestotal.Byte2
Call manchesterdata
manchestst2 = manchestout
manchestin = strikestotal.Byte3
Call manchesterdata
manchestst3 = manchestout
checksum = zender + strikes[teller] + strikes5m + strikestotal.Byte0 + strikestotal.Byte1 + strikestotal.Byte2 + strikestotal.Byte3 - 1
manchestin = checksum
Call manchesterdata
manchestck = manchestout
For zendtel = 1 To 3
SerOut zendout, 49965,[startman,dataman,manchestzd.HighByte,manchestzd.LowByte,manchestsh.HighByte,manchestsh.LowByte,manchestsl.HighByte,manchestsl.LowByte,manchests5h.HighByte,manchests5h.LowByte,manchests5l.HighByte,manchests5l.LowByte]
SerOut zendout, 49965,[manchestst0.HighByte,manchestst0.LowByte,manchestst1.HighByte,manchestst1.LowByte,manchestst2.HighByte,manchestst2.LowByte,manchestst3.HighByte,manchestst3.LowByte,manchestck.HighByte,manchestck.LowByte]
DelayMS 10
Next zendtel
Next teller
EWrite adres,[strikestotal]
GoTo main
manchesterdata:
For mantel = 0 To 7
tempdata = GetBit manchestin,mantel
If tempdata = 0 Then
ClearBit manchestout,(mantel*2)
SetBit manchestout,(mantel*2+1)
Else
SetBit manchestout,(mantel*2)
ClearBit manchestout,(mantel*2+1)
EndIf
Next mantel
Return
End
Hij hangt op zolder met een stukje draad verticaal als antenne. Het bereik is ca 50km. Ik heb de software uitgebreid met een aflezing per minuut en het totale aantal strikes. Het totale aan strikes word opgeslagen in het eeprom van de pic. Op portb.1 kun je een speaker aansluiten, zodra er meer dan 25strikes zijn per 5 minuten hoor je een piepje elke minuut. Tevens wordt de data draadloos verstuurd. Hier de source.
Device 16F628A
Xtal 4
LCD_DTPin PORTA.0
LCD_ENPin PORTB.3
LCD_RSPin PORTB.4
TRISB=000001 ' PortB.0 as input
'ANSEL = 0 ' all Portb.7 digital
CMCON = 7
PORTB.7 = 0
Dim teller As Byte
Dim zendtel As Byte
Dim mantel As Byte
Dim strikes[5] As Word
Dim strikes5m As Word
Dim strikestotal As Dword
Dim strikesmc As Word
Dim manchestin As Byte
Dim manchestout As Word
Dim tempdata As Bit
Dim manchestsl As Word
Dim manchestsh As Word
Dim manchests5h As Word
Dim manchests5l As Word
Dim manchestst0 As Word
Dim manchestst1 As Word
Dim manchestst2 As Word
Dim manchestst3 As Word
Dim manchestck As Word
Dim manchestzd As Word
Dim checksum As Byte
Symbol zender = 2
Symbol adres = 1
Symbol zendout = PORTB.7
Symbol startman = $55
Symbol dataman = $aa
Clear
manchestin = zender
Call manchesterdata
manchestzd = manchestout
strikestotal = ERead adres
Cls
DelayMS 100
Print At 1,1,"Lightning"
Print At 2,1,"Detector 1.0"
main:
For teller = 0 To 4
strikes[teller] = Counter PORTB.0,60000
strikes5m = strikes[0] + strikes[1] + strikes[2] + strikes[3] + strikes[4]
Print At 1,1,Dec3 strikes[teller]," S/m ",Dec3 strikes5m," S/5m"
If strikes5m > 25 Then Sound PORTB.1,[122,25]
If strikes[teller] > 2 Then strikestotal = strikestotal+strikes[teller]
Print At 2,1,Dec6 strikestotal," Tstrikes"
strikesmc = strikes[teller]
manchestin = strikesmc.HighByte
Call manchesterdata
manchestsh = manchestout
manchestin = strikesmc.LowByte
Call manchesterdata
manchestsl = manchestout
manchestin = strikes5m.HighByte
Call manchesterdata
manchests5h = manchestout
manchestin = strikes5m.LowByte
Call manchesterdata
manchests5l = manchestout
manchestin = strikestotal.Byte0
Call manchesterdata
manchestst0 = manchestout
manchestin = strikestotal.Byte1
Call manchesterdata
manchestst1 = manchestout
manchestin = strikestotal.Byte2
Call manchesterdata
manchestst2 = manchestout
manchestin = strikestotal.Byte3
Call manchesterdata
manchestst3 = manchestout
checksum = zender + strikes[teller] + strikes5m + strikestotal.Byte0 + strikestotal.Byte1 + strikestotal.Byte2 + strikestotal.Byte3 - 1
manchestin = checksum
Call manchesterdata
manchestck = manchestout
For zendtel = 1 To 3
SerOut zendout, 49965,[startman,dataman,manchestzd.HighByte,manchestzd.LowByte,manchestsh.HighByte,manchestsh.LowByte,manchestsl.HighByte,manchestsl.LowByte,manchests5h.HighByte,manchests5h.LowByte,manchests5l.HighByte,manchests5l.LowByte]
SerOut zendout, 49965,[manchestst0.HighByte,manchestst0.LowByte,manchestst1.HighByte,manchestst1.LowByte,manchestst2.HighByte,manchestst2.LowByte,manchestst3.HighByte,manchestst3.LowByte,manchestck.HighByte,manchestck.LowByte]
DelayMS 10
Next zendtel
Next teller
EWrite adres,[strikestotal]
GoTo main
manchesterdata:
For mantel = 0 To 7
tempdata = GetBit manchestin,mantel
If tempdata = 0 Then
ClearBit manchestout,(mantel*2)
SetBit manchestout,(mantel*2+1)
Else
SetBit manchestout,(mantel*2)
ClearBit manchestout,(mantel*2+1)
EndIf
Next mantel
Return
End
woensdag 31 augustus 2011
Vervolg radio met tea5767
De radio werkt met een lcd, Het adres was fout, overkomt me wel vaker met i2c, het moet zijn %11000000, Verder is het beter om niet continu de freq in de tea te zetten en dat 1 keer te doen in plaats van een loop. Dit geeft veel minder storing. Nu nog de signaalsterkte en een stereo indicator. Maar ik laat het hierbij het audio is namelijk nogal vervormd, er heeft 5v over de de mpx uitgang gestaan ik vermoed dat het ic niet niet kon waarderen.
Device 18F2620
Declare Xtal = 20
' i2c
SCL_Pin = PORTB.0
SDA_Pin = PORTB.1
' aansluitingen lcd
LCD_DTPin PORTB.4
LCD_ENPin PORTB.3
LCD_RSPin PORTB.2
' adres tea5767
Symbol tea5767 = %11000000
' up en down toets
Symbol Toetsup = PORTA.0
Symbol Toetsdown = PORTA.1
' Variabelen
Dim Frequentie As Word
Dim Pll As Dword
TRISA= %00000011
Declare All_Digital = True
Clear
' Init lcd
Cls
DelayMS 100
' init opstart freq (waterstad fm)
Frequentie = 932
GoSub displayfreq
GoSub progtea
main:
If Toetsup = 0 Then GoSub frequp
If Toetsdown = 0 Then GoSub freqdown
GoTo main
frequp:
DelayMS 100
Frequentie = Frequentie + 1
If Frequentie > 1080 Then Frequentie = 1080
GoSub displayfreq
GoSub progtea
Return
freqdown:
DelayMS 100
Frequentie = Frequentie - 1
If Frequentie < 875 Then Frequentie = 875
GoSub displayfreq
GoSub progtea
Return
progtea:
Pll = Frequentie * 100000 + 225000
Pll = Pll * 4 / 32768
BusOut tea5767,[Pll.Byte1,Pll.Byte0,$10,$10,$00]
Return
displayfreq:
Print At 1,1,Dec Frequentie / 10,".",Dec1 Frequentie // 10," Mhz "
Return
Device 18F2620
Declare Xtal = 20
' i2c
SCL_Pin = PORTB.0
SDA_Pin = PORTB.1
' aansluitingen lcd
LCD_DTPin PORTB.4
LCD_ENPin PORTB.3
LCD_RSPin PORTB.2
' adres tea5767
Symbol tea5767 = %11000000
' up en down toets
Symbol Toetsup = PORTA.0
Symbol Toetsdown = PORTA.1
' Variabelen
Dim Frequentie As Word
Dim Pll As Dword
TRISA= %00000011
Declare All_Digital = True
Clear
' Init lcd
Cls
DelayMS 100
' init opstart freq (waterstad fm)
Frequentie = 932
GoSub displayfreq
GoSub progtea
main:
If Toetsup = 0 Then GoSub frequp
If Toetsdown = 0 Then GoSub freqdown
GoTo main
frequp:
DelayMS 100
Frequentie = Frequentie + 1
If Frequentie > 1080 Then Frequentie = 1080
GoSub displayfreq
GoSub progtea
Return
freqdown:
DelayMS 100
Frequentie = Frequentie - 1
If Frequentie < 875 Then Frequentie = 875
GoSub displayfreq
GoSub progtea
Return
progtea:
Pll = Frequentie * 100000 + 225000
Pll = Pll * 4 / 32768
BusOut tea5767,[Pll.Byte1,Pll.Byte0,$10,$10,$00]
Return
displayfreq:
Print At 1,1,Dec Frequentie / 10,".",Dec1 Frequentie // 10," Mhz "
Return
maandag 29 augustus 2011
FM radio met TEA5767
Op Ebay had ik een FM radio module gevonden met de TEA5767 voor €2,50. Ik had het idee om hier met een MAX7219 als displaydriver 4 displays aan te sturen, nou dat was niet echt een succes.
De MAX7219 zorgt er voor dat ik alleen een piep hoor, de multiplexfrequentie stoort enorm.
Display dan maar uit en kijken of ik geluid kreeg. Maar ook dat zit tegen. Toch wat fout in het i2c gedeelte? Eerst een LCD en dan maar weer eens proberen. Met het lcd is het ook wat makkelijker om de inhoud van de registers van de tea5756 weer te geven. Voor de aardigheid heb ik de source toegevoegd.
Device 18F2620
Declare Xtal = 20
' i2c
SCL_Pin = PORTC.3
SDA_Pin = PORTC.4
' aansluitingen max7219
Symbol Clk = PORTB.0
Symbol Dta = PORTB.1
Symbol Load = PORTB.2
' adres tea5767
Symbol tea5767 = %01100000
' up en down toets
Symbol Toetsup = PORTB.3
Symbol Toetsdown = PORTB.4
' Variabelen
Dim Frequentie As Word
Dim Pll As Dword
Dim Register As Byte
Dim Waarde As Byte
Dim Digit As Byte
Dim Positie As Byte
TRISB= %00011000
Declare All_Digital = True
' Init MAX7219 zie datasheet
Register = 11 ' aantal displays 0-3 (4)
Waarde = 3
GoSub waardenaarMax
Register = 10 ' Helderheid
Waarde = 9
GoSub waardenaarMax
Register = 9 ' BCD voor 4 disp
Waarde = 15
GoSub waardenaarMax
Register = 12 'Display aan
Waarde = 1
GoSub waardenaarMax
Register = 15 ' Disp test uit
Waarde = 0
GoSub waardenaarMax
Frequentie = 932
main:
If Toetsup = 0 Then GoSub frequp
If Toetsdown = 0 Then GoSub freqdown
GoSub displayfreq
GoSub progtea
GoTo main
frequp:
DelayMS 100
Frequentie = Frequentie + 1
If Frequentie > 1080 Then Frequentie = 1080
Return
freqdown:
DelayMS 100
Frequentie = Frequentie - 1
If Frequentie < 875 Then Frequentie = 875
Return
progtea:
Pll = Frequentie * 100000 + 225000
Pll = Pll * 4 / 32768
BusOut tea5767,[Pll.Byte1,Pll.Byte0,$10,$10,$00] 'zie datasheet tea
Return
displayfreq:
Digit = 0 ' eerste disp
For Positie = 4 To 1 Step -1 ' bepaal reg max
Register = Positie
Waarde = Dig Frequentie,Digit ' bepaal disp waarde
If Frequentie < 1000 And Positie = 1 Then Waarde = 15 ' onder 100 mhz geen 0 op laatste digit
If Digit = 1 Then Waarde.7 = 1 ' punt op digit 1
GoSub waardenaarMax
If Digit >= 3 Then Digit = 0 ' 4 digits gehad ?
Digit = Digit + 1
Next
Return
waardenaarMax:
SHOut Dta,Clk,MsbFirst,[Register,Waarde] 'Waarde via spi naar max
High Load 'enable transfer
DelayUS 2
Low Load
Return
De MAX7219 zorgt er voor dat ik alleen een piep hoor, de multiplexfrequentie stoort enorm.
Display dan maar uit en kijken of ik geluid kreeg. Maar ook dat zit tegen. Toch wat fout in het i2c gedeelte? Eerst een LCD en dan maar weer eens proberen. Met het lcd is het ook wat makkelijker om de inhoud van de registers van de tea5756 weer te geven. Voor de aardigheid heb ik de source toegevoegd.
Device 18F2620
Declare Xtal = 20
' i2c
SCL_Pin = PORTC.3
SDA_Pin = PORTC.4
' aansluitingen max7219
Symbol Clk = PORTB.0
Symbol Dta = PORTB.1
Symbol Load = PORTB.2
' adres tea5767
Symbol tea5767 = %01100000
' up en down toets
Symbol Toetsup = PORTB.3
Symbol Toetsdown = PORTB.4
' Variabelen
Dim Frequentie As Word
Dim Pll As Dword
Dim Register As Byte
Dim Waarde As Byte
Dim Digit As Byte
Dim Positie As Byte
TRISB= %00011000
Declare All_Digital = True
' Init MAX7219 zie datasheet
Register = 11 ' aantal displays 0-3 (4)
Waarde = 3
GoSub waardenaarMax
Register = 10 ' Helderheid
Waarde = 9
GoSub waardenaarMax
Register = 9 ' BCD voor 4 disp
Waarde = 15
GoSub waardenaarMax
Register = 12 'Display aan
Waarde = 1
GoSub waardenaarMax
Register = 15 ' Disp test uit
Waarde = 0
GoSub waardenaarMax
Frequentie = 932
main:
If Toetsup = 0 Then GoSub frequp
If Toetsdown = 0 Then GoSub freqdown
GoSub displayfreq
GoSub progtea
GoTo main
frequp:
DelayMS 100
Frequentie = Frequentie + 1
If Frequentie > 1080 Then Frequentie = 1080
Return
freqdown:
DelayMS 100
Frequentie = Frequentie - 1
If Frequentie < 875 Then Frequentie = 875
Return
progtea:
Pll = Frequentie * 100000 + 225000
Pll = Pll * 4 / 32768
BusOut tea5767,[Pll.Byte1,Pll.Byte0,$10,$10,$00] 'zie datasheet tea
Return
displayfreq:
Digit = 0 ' eerste disp
For Positie = 4 To 1 Step -1 ' bepaal reg max
Register = Positie
Waarde = Dig Frequentie,Digit ' bepaal disp waarde
If Frequentie < 1000 And Positie = 1 Then Waarde = 15 ' onder 100 mhz geen 0 op laatste digit
If Digit = 1 Then Waarde.7 = 1 ' punt op digit 1
GoSub waardenaarMax
If Digit >= 3 Then Digit = 0 ' 4 digits gehad ?
Digit = Digit + 1
Next
Return
waardenaarMax:
SHOut Dta,Clk,MsbFirst,[Register,Waarde] 'Waarde via spi naar max
High Load 'enable transfer
DelayUS 2
Low Load
Return
dinsdag 23 augustus 2011
Vervolg onweer detector.
Na het lezen van wat info, heb ik aan de onweer detector een counter aangesloten die het aantal strikes per 5 minuten weergeeft, maar het wordt wel elke minuut bijgewerkt. Verder heb ik de puls van de ne555 verkort tot 0.2 seconden, Het werkt prima, helaas ontwijkt het onweer Friesland, en heb dus nog niet echt veel strikes per 5 minuten gezien, De detector is nu aangesloten op een inverted V voor de 20m amateurband de antenne zit onderdak. Ongeveer richting zuid/noord dat scheelt behoorlijk in de gevoeligheid, het onweerde in Overijssel dit kon ik duidelijk waarnemen. Onder de foto's staat de source welk nog verder kunnen uitbreiden. De detector is aangesloten op portb.0.
Device 16F88
Xtal 4
LCD_DTPin PORTA.0
LCD_ENPin PORTB.3
LCD_RSPin PORTB.4
TRISB=%00000001 ' PortB.0 as input
ANSEL = 0 ' all Portb.7 digital
Dim teller As Byte
Dim strikes[5] As Word
Dim strikeslcd As Word
Cls
DelayMS 100
Print At 1,1,"Initializing"
Clear
main:
For teller = 0 To 4
strikes[teller] = Counter PORTB.0,60000
strikeslcd = strikes[0] + strikes[1] + strikes[2] + strikes[3] + strikes[4]
Print At 1,1,Dec4 strikeslcd," Strikes/5m"
Next teller
GoTo main
End
Device 16F88
Xtal 4
LCD_DTPin PORTA.0
LCD_ENPin PORTB.3
LCD_RSPin PORTB.4
TRISB=%00000001 ' PortB.0 as input
ANSEL = 0 ' all Portb.7 digital
Dim teller As Byte
Dim strikes[5] As Word
Dim strikeslcd As Word
Cls
DelayMS 100
Print At 1,1,"Initializing"
Clear
main:
For teller = 0 To 4
strikes[teller] = Counter PORTB.0,60000
strikeslcd = strikes[0] + strikes[1] + strikes[2] + strikes[3] + strikes[4]
Print At 1,1,Dec4 strikeslcd," Strikes/5m"
Next teller
GoTo main
End
vrijdag 19 augustus 2011
Basisontvanger wireless temperatuur sensor
In juli heb ik een temperatuur sensor beschreven met 12f683 en een ds1820, hierbij de ontvanger. Als ontvanger gebruik ik een AM ontvanger van conrad, de data uitgang is aangesloten op portb.1.Het lcd zit ook op portb zie source. De werking. De PIC kijkt in een loop of er een $55 word ontvangen.
Is dit het geval dan gaan we naar de volgende routine waarbij de data ontvangen word. Mocht hier iets niet goed gaan gaan we terug naar de hoofdroutine. Is er wel goede data dan springen we als de zender 1 is naar de display routine. De errorchecking zit er nog niet in. Het is een bassis en de ontvangst gaat prima. Voor de pic heb ik gekozen voor een 18f2620
Ik heb drie tellers er in zitten die aangeven hoeveel keer er $55 is ontvangen, hoeveel keer data ontvangen is en hoeveel keer er iets op het lcd is gezet.
Device 18F2620
Xtal 20
ADCON1=7
LCD_DTPin PORTB.4
LCD_ENPin PORTB.3
LCD_RSPin PORTB.2
Print $FE, $40, $08, $14, $08, $03, $04, $04, $03, $00 ' celcius
Dim telontv As Word
Dim tempser As Byte
Dim teller As Byte
Dim teldoor As Word
Dim telzend As Word
Dim regel As Byte
Dim tempdata As Bit
Dim manchest1 As Word
Dim manchest2 As Word
Dim manchest3 As Word
Dim manchest4 As Word
Dim manchest5 As Word
Dim manchest6 As Word
Dim manchestck As Word
Dim manchestin As Word
Dim byteout As Byte
Dim zender As Byte
Dim decode1 As Byte
Dim decode2 As Byte
Dim decode3 As Byte
Dim decode4 As Byte
Dim decode5 As Byte
Dim checksum As Byte
Dim templcd As Byte
Dim tempture As Word
Cls
telontv = 0
teldoor = 0
telzend = 0
main:
SerIn PORTB.1,49965,1,geendata, [tempser]
If tempser =$55 Then GoTo rest
GoTo main
geendata:
tempser=$ff
GoTo main
rest:
teldoor = teldoor + 1
Print At 2,1 , Dec3 teldoor
SerIn PORTB.1,49965, 10, geendata,[Wait($AA), manchest1.HighByte,manchest1.LowByte, manchest2.HighByte, manchest2.LowByte,manchest3.HighByte,manchest3.LowByte]
SerIn PORTB.1,49965,[manchest4.HighByte, manchest4.LowByte,manchest5.HighByte,manchest5.LowByte, manchest6.HighByte, manchest6.LowByte,manchestck.HighByte, manchestck.LowByte]
telontv = telontv + 1
Print At 2,5, Dec3 telontv
GoSub decodeall
If zender = 1 Then GoSuB showtemp
GoTo main
showtemp:
telzend = telzend + 1
Print At 2,9,Dec3 telzend
tempture.HighByte= decode2
tempture.LowByte = decode1
Print At 1,1, Dec2 (tempture / 100),".",Dec2 tempture,0
Return
decodeall:
manchestin = manchest1
GoSub decodmanchester
zender = byteout
manchestin = manchest2
GoSub decodmanchester
decode1 = byteout
manchestin = manchest3
GoSub decodmanchester
decode2 = byteout
manchestin = manchest4
GoSub decodmanchester
decode3 = byteout
manchestin = manchest5
GoSub decodmanchester
decode4 = byteout
manchestin = manchest6
GoSub decodmanchester
decode5 = byteout
manchestin = manchestck
GoSub decodmanchester
checksum = byteout
Return
decodmanchester:
byteout=$00
For teller=7 To 0 Step -1
tempdata = GetBit manchestin,(teller*2)
If tempdata = 1 Then
tempdata = GetBit manchestin,(teller*2+1)
If tempdata = 0 Then
SetBit byteout,teller
EndIf
EndIf
Next teller
Return
Is dit het geval dan gaan we naar de volgende routine waarbij de data ontvangen word. Mocht hier iets niet goed gaan gaan we terug naar de hoofdroutine. Is er wel goede data dan springen we als de zender 1 is naar de display routine. De errorchecking zit er nog niet in. Het is een bassis en de ontvangst gaat prima. Voor de pic heb ik gekozen voor een 18f2620
Ik heb drie tellers er in zitten die aangeven hoeveel keer er $55 is ontvangen, hoeveel keer data ontvangen is en hoeveel keer er iets op het lcd is gezet.
Device 18F2620
Xtal 20
ADCON1=7
LCD_DTPin PORTB.4
LCD_ENPin PORTB.3
LCD_RSPin PORTB.2
Print $FE, $40, $08, $14, $08, $03, $04, $04, $03, $00 ' celcius
Dim telontv As Word
Dim tempser As Byte
Dim teller As Byte
Dim teldoor As Word
Dim telzend As Word
Dim regel As Byte
Dim tempdata As Bit
Dim manchest1 As Word
Dim manchest2 As Word
Dim manchest3 As Word
Dim manchest4 As Word
Dim manchest5 As Word
Dim manchest6 As Word
Dim manchestck As Word
Dim manchestin As Word
Dim byteout As Byte
Dim zender As Byte
Dim decode1 As Byte
Dim decode2 As Byte
Dim decode3 As Byte
Dim decode4 As Byte
Dim decode5 As Byte
Dim checksum As Byte
Dim templcd As Byte
Dim tempture As Word
Cls
telontv = 0
teldoor = 0
telzend = 0
main:
SerIn PORTB.1,49965,1,geendata, [tempser]
If tempser =$55 Then GoTo rest
GoTo main
geendata:
tempser=$ff
GoTo main
rest:
teldoor = teldoor + 1
Print At 2,1 , Dec3 teldoor
SerIn PORTB.1,49965, 10, geendata,[Wait($AA), manchest1.HighByte,manchest1.LowByte, manchest2.HighByte, manchest2.LowByte,manchest3.HighByte,manchest3.LowByte]
SerIn PORTB.1,49965,[manchest4.HighByte, manchest4.LowByte,manchest5.HighByte,manchest5.LowByte, manchest6.HighByte, manchest6.LowByte,manchestck.HighByte, manchestck.LowByte]
telontv = telontv + 1
Print At 2,5, Dec3 telontv
GoSub decodeall
If zender = 1 Then GoSuB showtemp
GoTo main
showtemp:
telzend = telzend + 1
Print At 2,9,Dec3 telzend
tempture.HighByte= decode2
tempture.LowByte = decode1
Print At 1,1, Dec2 (tempture / 100),".",Dec2 tempture,0
Return
decodeall:
manchestin = manchest1
GoSub decodmanchester
zender = byteout
manchestin = manchest2
GoSub decodmanchester
decode1 = byteout
manchestin = manchest3
GoSub decodmanchester
decode2 = byteout
manchestin = manchest4
GoSub decodmanchester
decode3 = byteout
manchestin = manchest5
GoSub decodmanchester
decode4 = byteout
manchestin = manchest6
GoSub decodmanchester
decode5 = byteout
manchestin = manchestck
GoSub decodmanchester
checksum = byteout
Return
decodmanchester:
byteout=$00
For teller=7 To 0 Step -1
tempdata = GetBit manchestin,(teller*2)
If tempdata = 1 Then
tempdata = GetBit manchestin,(teller*2+1)
If tempdata = 0 Then
SetBit byteout,teller
EndIf
EndIf
Next teller
Return
maandag 15 augustus 2011
Onweer detector
Voor het detecteren van onweer vind je op internet diverse schema's van detectors, waarvan 1 zeer veel gebouwd wordt. Dat is de schakeling van techlib.com
en ik moet zeggen dat werkt prima. Het is een klein ontvangertje wat ontvangt rond de 300khz, ik heb achter de detector een ne555 gezet die van een puls een puls maakt van ca 0,5 seconden. Zodat we van 1 flits niet meerdere detecties krijgen. Nu nog een counter met een pic en een 433mhz zender, zodat we op het in aanbouw zijnde basisstation het aantal ontladingen per minuut kunnen aflezen.
en ik moet zeggen dat werkt prima. Het is een klein ontvangertje wat ontvangt rond de 300khz, ik heb achter de detector een ne555 gezet die van een puls een puls maakt van ca 0,5 seconden. Zodat we van 1 flits niet meerdere detecties krijgen. Nu nog een counter met een pic en een 433mhz zender, zodat we op het in aanbouw zijnde basisstation het aantal ontladingen per minuut kunnen aflezen.
donderdag 11 augustus 2011
afstandmeting met hc-sr04
Met een beetje geluk heb ik op ebay voor omgerekend €2,50 een hc-sr04 ultrasonic sensor met een veiling gewonnen.
Normaal heb je ze met nu kopen ongeveer vanaf €5,00 wat eigenlijk ook niet zo duur is.
Op internet kun je verder genoeg info er over vinden. Ik heb heel snel een afstandmeter er mee gemaakt en dat werkt prima. Ik kon in ieder geval in de woonkamer tot 4 meter meten. Onderaan vind je de source die ik gebruikt heb. Kun je naar eigen wens aanpassen.
Device 18F2620
Xtal 20
ADCON1=7
LCD_DTPin PORTB.4
LCD_ENPin PORTB.3
LCD_RSPin PORTB.2
TRISC=%00000010
Symbol TRIGGER = PORTC.2 'Trigger puls
Symbol ECHO = PORTC.1 'Echo puls
Dim Afstand As Word
Cls
DelayMS 100
While 1 = 1
PulsOut TRIGGER,15,High 'Trigger puls van 15us
Afstand = PulsIn ECHO,1 ' Meet afstand in uS
Afstand = Afstand * 2 / 58 ' 20 mhz (2uS instructietijd)
Print At 1,1,"Afstand = ", Dec Afstand," cm "
DelayMS 100
Wend
Normaal heb je ze met nu kopen ongeveer vanaf €5,00 wat eigenlijk ook niet zo duur is.
Op internet kun je verder genoeg info er over vinden. Ik heb heel snel een afstandmeter er mee gemaakt en dat werkt prima. Ik kon in ieder geval in de woonkamer tot 4 meter meten. Onderaan vind je de source die ik gebruikt heb. Kun je naar eigen wens aanpassen.
Device 18F2620
Xtal 20
ADCON1=7
LCD_DTPin PORTB.4
LCD_ENPin PORTB.3
LCD_RSPin PORTB.2
TRISC=%00000010
Symbol TRIGGER = PORTC.2 'Trigger puls
Symbol ECHO = PORTC.1 'Echo puls
Dim Afstand As Word
Cls
DelayMS 100
While 1 = 1
PulsOut TRIGGER,15,High 'Trigger puls van 15us
Afstand = PulsIn ECHO,1 ' Meet afstand in uS
Afstand = Afstand * 2 / 58 ' 20 mhz (2uS instructietijd)
Print At 1,1,"Afstand = ", Dec Afstand," cm "
DelayMS 100
Wend
zondag 7 augustus 2011
Barometer met de ms5540b van Measurement Specialties (Intersema)
Op ebay kwam ik voor een paar dollar de ms5540b tegen. In de elektor van juni 2005 heeft een schakeling gestaan voor deze sensor. De ms5540b is volledig software compatible met de ms5534 die elektor gebruikt.
Ik heb de schakeling op een breadboard gebouwd en het werkt redelijk. De barometer is niet echt stabiel en schommelt ongeveer 5 hPa (zal in de software zitten), de temperatuur is wel stabiel. Nu gaan we proberen om de source om te zetten naar proton+, De elektor versie is te downloaden bij elektor.
Ik heb de schakeling op een breadboard gebouwd en het werkt redelijk. De barometer is niet echt stabiel en schommelt ongeveer 5 hPa (zal in de software zitten), de temperatuur is wel stabiel. Nu gaan we proberen om de source om te zetten naar proton+, De elektor versie is te downloaden bij elektor.
zaterdag 30 juli 2011
source code wireless sensor
Hierbij de source:
'****************************************************************
'* Name : 12f683.BAS *
'* Author : VoXiT-Pro *
'* Notice : Copyright (c) 2011 *
'* : All Rights Reserved *
'* Date : 29-7-2011 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
Device = 12F683
Config MCLRE_ON, INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BOD_ON
Xtal 4
ADCON0 = 0
CMCON0 = 7 ' comparators off
ANSEL = 0 ' all inputs digital
WPU = 0
OPTION_REG = %10000000 ' Pull-ups = off
GPIO = 000000 ' All outputs = 0 on boot
TRISIO = 111101 ' gpio.1 output rest input
INTCON = $90 ' Enable INTE interrupt (GPIO.2 pen5 = int)
OPTION_REG.6=0
Symbol zender = 1
Symbol ds1820 = GPIO.0
Symbol zendout = GPIO.1
Symbol startman = $55
Symbol dataman = $aa
Dim tempture As Word
Dim teller As Byte
Dim manchestin As Byte
Dim manchestout As Word
Dim tempdata As Bit
Dim manchesttl As Word
Dim manchestth As Word
Dim manchestck As Word
Dim manchestzd As Word
Dim checksum As Byte
Dim C_remain As Byte
Dim C_per_c As Byte
Dim Dum As Byte
manchestin = zender
Call manchesterdata
manchestzd = manchestout
On Interrupt GoTo Meting 'Enable interrupts
Main:
@sleep
GoTo Main
Disable ' Disable interrupts in the handler
' data omzetten naar manchester
' invoer een byte
' output een word
manchesterdata:
For teller = 0 To 7
tempdata = GetBit manchestin,teller
If tempdata = 0 Then
ClearBit manchestout,(teller*2)
SetBit manchestout,(teller*2+1)
Else
SetBit manchestout,(teller*2)
ClearBit manchestout,(teller*2+1)
EndIf
Next teller
Return
Meting:
OWrite ds1820, 1, [$CC, $44] ' Start temperature conversion
While ORead ds1820, 4 = 0 : Wend
OWrite ds1820, 1, [$CC, $BE] ' Read the temperature
ORead ds1820, 2, [tempture.LowByte, tempture.HighByte, Dum,Dum,Dum,Dum, C_remain, C_per_c]
tempture = (((tempture >> 1) * 100) - 25) + (((C_per_c - C_remain) * 100) / C_per_c)
manchestin = tempture.HighByte
Call manchesterdata
manchestth = manchestout
manchestin = tempture.LowByte
Call manchesterdata
manchesttl = manchestout
checksum = zender + tempture - 1
manchestin = checksum
Call manchesterdata
manchestck = manchestout
For teller = 0 To 1
SerOut zendout, 49965,[startman,startman,startman,startman,startman,startman,startman,startman,dataman,manchestzd.HighByte,manchestzd.LowByte,manchesttl.HighByte,manchesttl.LowByte,manchestth.HighByte,manchestth.LowByte]
SerOut zendout, 49965,[dataman,dataman,dataman,dataman,dataman,dataman,manchestck.HighByte,manchestck.LowByte]
DelayMS 70
Next
INTCON.1 = 0 ' Clear interrupt flag
Resume ' Return to main program
Enable ' Enable interrupts after the handler
'****************************************************************
'* Name : 12f683.BAS *
'* Author : VoXiT-Pro *
'* Notice : Copyright (c) 2011 *
'* : All Rights Reserved *
'* Date : 29-7-2011 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
Device = 12F683
Config MCLRE_ON, INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BOD_ON
Xtal 4
ADCON0 = 0
CMCON0 = 7 ' comparators off
ANSEL = 0 ' all inputs digital
WPU = 0
OPTION_REG = %10000000 ' Pull-ups = off
GPIO = 000000 ' All outputs = 0 on boot
TRISIO = 111101 ' gpio.1 output rest input
INTCON = $90 ' Enable INTE interrupt (GPIO.2 pen5 = int)
OPTION_REG.6=0
Symbol zender = 1
Symbol ds1820 = GPIO.0
Symbol zendout = GPIO.1
Symbol startman = $55
Symbol dataman = $aa
Dim tempture As Word
Dim teller As Byte
Dim manchestin As Byte
Dim manchestout As Word
Dim tempdata As Bit
Dim manchesttl As Word
Dim manchestth As Word
Dim manchestck As Word
Dim manchestzd As Word
Dim checksum As Byte
Dim C_remain As Byte
Dim C_per_c As Byte
Dim Dum As Byte
manchestin = zender
Call manchesterdata
manchestzd = manchestout
On Interrupt GoTo Meting 'Enable interrupts
Main:
@sleep
GoTo Main
Disable ' Disable interrupts in the handler
' data omzetten naar manchester
' invoer een byte
' output een word
manchesterdata:
For teller = 0 To 7
tempdata = GetBit manchestin,teller
If tempdata = 0 Then
ClearBit manchestout,(teller*2)
SetBit manchestout,(teller*2+1)
Else
SetBit manchestout,(teller*2)
ClearBit manchestout,(teller*2+1)
EndIf
Next teller
Return
Meting:
OWrite ds1820, 1, [$CC, $44] ' Start temperature conversion
While ORead ds1820, 4 = 0 : Wend
OWrite ds1820, 1, [$CC, $BE] ' Read the temperature
ORead ds1820, 2, [tempture.LowByte, tempture.HighByte, Dum,Dum,Dum,Dum, C_remain, C_per_c]
tempture = (((tempture >> 1) * 100) - 25) + (((C_per_c - C_remain) * 100) / C_per_c)
manchestin = tempture.HighByte
Call manchesterdata
manchestth = manchestout
manchestin = tempture.LowByte
Call manchesterdata
manchesttl = manchestout
checksum = zender + tempture - 1
manchestin = checksum
Call manchesterdata
manchestck = manchestout
For teller = 0 To 1
SerOut zendout, 49965,[startman,startman,startman,startman,startman,startman,startman,startman,dataman,manchestzd.HighByte,manchestzd.LowByte,manchesttl.HighByte,manchesttl.LowByte,manchestth.HighByte,manchestth.LowByte]
SerOut zendout, 49965,[dataman,dataman,dataman,dataman,dataman,dataman,manchestck.HighByte,manchestck.LowByte]
DelayMS 70
Next
INTCON.1 = 0 ' Clear interrupt flag
Resume ' Return to main program
Enable ' Enable interrupts after the handler
wireless temperatuur sensor
Hierbij een eenvoudige versie van de temperatuur sensor deze stuurt alleen de temperatuur door.
De sensor is ingebouwd in een een kastje van een oude sensor, ook de 433 mhz zender komt uit deze sensor.
De 4060 zorgt er voor dat de pic elke minuut ff wakker wordt.
De sensor is een onewire ds18b20 van maxim. In een volgende post zet ik de source.
De sensor is ingebouwd in een een kastje van een oude sensor, ook de 433 mhz zender komt uit deze sensor.
De 4060 zorgt er voor dat de pic elke minuut ff wakker wordt.
De sensor is een onewire ds18b20 van maxim. In een volgende post zet ik de source.
zaterdag 23 juli 2011
Nog meer sensors.
De test uitgebreid met nog meer sensors, dit zijn de tmp75 in 12 bits mode, de n75-5.0 alleen 9 bits mode,
doet eigenlijk dus niet echt mee, 9 bits mode is aflezen op een halve graad. En de sht11.
Op het display als achtereenvolgend de ds18s20, ds2438, tmp75,n75-5.0, sht11, ds1624, adt7410 en als laatste de lm92, zeer rustig zijn de ds18s20 en de tmp75 en de ds1624 hier zie je de temperatuur heel rustig stijgen of dalen. Ook de sht11 is zeer rustig alleen omdat de resolutie hoog is zie je de temperatuur relatief vaak veranderen.
De ds2438 en de lm92 en de adt7410 zie je het meest heen en weer schommelen. De tmp75 en sht11 zitten met de temperatuur het dichtst bij de sensors van maxim-ic.
doet eigenlijk dus niet echt mee, 9 bits mode is aflezen op een halve graad. En de sht11.
Op het display als achtereenvolgend de ds18s20, ds2438, tmp75,n75-5.0, sht11, ds1624, adt7410 en als laatste de lm92, zeer rustig zijn de ds18s20 en de tmp75 en de ds1624 hier zie je de temperatuur heel rustig stijgen of dalen. Ook de sht11 is zeer rustig alleen omdat de resolutie hoog is zie je de temperatuur relatief vaak veranderen.
De ds2438 en de lm92 en de adt7410 zie je het meest heen en weer schommelen. De tmp75 en sht11 zitten met de temperatuur het dichtst bij de sensors van maxim-ic.
woensdag 20 juli 2011
temperatuur sensor test
Voor de aardigheid een kleine test van diverse temperatuur sensors.
Op het lcd achtereen volgend de eerste 4 de ds18s20, waarvan de eerste twee uit een andere serie dan
de andere 2, daarnaast de ds2438 ,ds1624, adt7410 en als laatste de lm92, De maxim-ic's geven allemaal ongeveer hetzelfde aan, de adt7410 van analog devices zit daar weer boven en met een verschil een 1.5 graad geeft de lm92 van national semiconducters de hoogste temperatuur aan. De sensors staan wel continu aan de spanning en komen nooit in rust. Dus in hoeverre ze zichzelf opwarmen is hier geen rekening mee gehouden
Op het lcd achtereen volgend de eerste 4 de ds18s20, waarvan de eerste twee uit een andere serie dan
de andere 2, daarnaast de ds2438 ,ds1624, adt7410 en als laatste de lm92, De maxim-ic's geven allemaal ongeveer hetzelfde aan, de adt7410 van analog devices zit daar weer boven en met een verschil een 1.5 graad geeft de lm92 van national semiconducters de hoogste temperatuur aan. De sensors staan wel continu aan de spanning en komen nooit in rust. Dus in hoeverre ze zichzelf opwarmen is hier geen rekening mee gehouden
zaterdag 16 juli 2011
Draadloze sensor uitgebreid.
De draadloze sensor is uitgebreid met een HH10D van Hope voor het meten van de vochtigheid.
De HH10D levert een toontje uit waarvan de frequentie varieert afhankelijk van de vochtigheid.
Met behulp van het commando COUNTER kunnen we de frequentie meten als we COUNTER gedurende 1 seconde de pulsen laten tellen. De HH10D heeft een EEPROM waarin de calibratie waarden staan met wat rekenwerk kunnen we dan de vochtigheid bereken met 1 cijfer achter de komma. Verder heb ik voor de lichtsterkte een eenvoudige LDR gebruikt. Super is dit niet maar het werkt.
De HH10D levert een toontje uit waarvan de frequentie varieert afhankelijk van de vochtigheid.
Met behulp van het commando COUNTER kunnen we de frequentie meten als we COUNTER gedurende 1 seconde de pulsen laten tellen. De HH10D heeft een EEPROM waarin de calibratie waarden staan met wat rekenwerk kunnen we dan de vochtigheid bereken met 1 cijfer achter de komma. Verder heb ik voor de lichtsterkte een eenvoudige LDR gebruikt. Super is dit niet maar het werkt.
vrijdag 15 juli 2011
Ontvanger draadloze temperatuur sensor
De eerste stappen voor de ontvanger zijn gemaakt.
In de video kunnen we zien dat we manchester data op het display krijgen.
Nu moeten we nog het signaal weer decoderen.
In de video kunnen we zien dat we manchester data op het display krijgen.
Nu moeten we nog het signaal weer decoderen.
woensdag 13 juli 2011
Draadloze temperatuur sensor
Het volgende project is het maken van een draadloos weerstation, hier alvast een filmpje van de zender.
De zender bestaat uit een 16f88 en een ds1624 i2c temperatuur sensor. Ook nog een 4060 die elke minuut een interrupt genereert. In het filmpje iets vaker. De zender gaan we nog uitbreiden met een vochtigheidssensor en een lichtsterkte meting. Zodra ook de ontvanger klaar is zetten hier de schema's en source's neer.
De zender bestaat uit een 16f88 en een ds1624 i2c temperatuur sensor. Ook nog een 4060 die elke minuut een interrupt genereert. In het filmpje iets vaker. De zender gaan we nog uitbreiden met een vochtigheidssensor en een lichtsterkte meting. Zodra ook de ontvanger klaar is zetten hier de schema's en source's neer.
zondag 10 juli 2011
Barometer
Hier de eerste schakeling een barometer met de 16f876a pic microcontroller.
Het schema
De Werking.
We gebruiken een Motorola druksensor in mijn geval de MPXH6115A, deze levert een analoge spanning die afhankelijk is van de druk. Echter het bereik van de sensor is veel groter dan nodig. De sensor kan meten van 150 Hpa tot 1150 Hpa. En het bereik van de AD omzetter is maar 10 bits. We zouden dan een uitlezing hebben van ongeveer 1 Hpa. Om dit te veranderen maken we gebruik van twee referentiespanningen. De AD convertor van de pic zal dan tussen deze twee waarden sampelen. Deze waarden worden aangeleverd door een I2C 8 bits DA omzetter de MAX518. De Vref- word 3.164v en de Vref+ word 4.688v. Nu kunnen we al een veel nauwkeuriger uitlezing krijgen. Maar we willen nog nauwkeuriger dit bereiken we dmv oversampling. Van 10 bits gaan we naar max 16 bits. We sampelen voor 14 bits bijvoorbeeld 256 keer en dit totaal delen we dan door 16. We krijgen dan een 14 bits waarde. De software is nog niet optimaal een correctie is nog niet ingebouwd. Naast de HPA geven op het display het voltage en de AD waarde weer.
Source:
Het schema
De Werking.
We gebruiken een Motorola druksensor in mijn geval de MPXH6115A, deze levert een analoge spanning die afhankelijk is van de druk. Echter het bereik van de sensor is veel groter dan nodig. De sensor kan meten van 150 Hpa tot 1150 Hpa. En het bereik van de AD omzetter is maar 10 bits. We zouden dan een uitlezing hebben van ongeveer 1 Hpa. Om dit te veranderen maken we gebruik van twee referentiespanningen. De AD convertor van de pic zal dan tussen deze twee waarden sampelen. Deze waarden worden aangeleverd door een I2C 8 bits DA omzetter de MAX518. De Vref- word 3.164v en de Vref+ word 4.688v. Nu kunnen we al een veel nauwkeuriger uitlezing krijgen. Maar we willen nog nauwkeuriger dit bereiken we dmv oversampling. Van 10 bits gaan we naar max 16 bits. We sampelen voor 14 bits bijvoorbeeld 256 keer en dit totaal delen we dan door 16. We krijgen dan een 14 bits waarde. De software is nog niet optimaal een correctie is nog niet ingebouwd. Naast de HPA geven op het display het voltage en de AD waarde weer.
Source:
'**************************************************************** '* Name : Barometer.BAS * '* Author : VoXiT-Pro * '* Notice : Copyright (c) 2010 * '* : All Rights Reserved * '* Date : 19-11-2010 * '* Version : 1.0 * '* Notes : barometer * '* : * '**************************************************************** Device 16F876A Xtal 20 SCL_Pin = PORTC.3 ' i2c SDA_Pin = PORTC.4 LCD_DTPin PORTB.0 'lcd LCD_ENPin PORTB.4 LCD_RSPin PORTB.5 Adin_Res = 10 ' 10-bit ADC Adin_Tad = frc ' Adin_Stime = 50 ' TRISA = %11111111 ' PORTA allemaal input ADCON1 = %10001111 ' PORTa.0 en vref-,vref+ gebruiken Symbol max518 = %01011110 Dim ADvalue As Word ' global - the final A/D value Dim ADCount As Word ' sample count Dim ADDivisor As Word ' averaging divisor Dim ADmax As Word ' max Advalue Dim ADAccum As Dword ' 32-bit sample accumulator Dim Volts As Float Dim Prcalc As Float Dim Pressure As Float Cls DelayMS 100 Print $FE,$40,$08,$08,$08,$0E,$09,$09,$09,$00 ' H Print $FE,$48,$00,$0C,$12,$12,$1E,$12,$12,$00 ' a BusOut max518,$00,[$A2] ' max518 uitgang 0 op 3.164v vref- BusOut max518,$01,[$F0] ' max518 uitgang 1 op 4.688v vref+ main: GoSub GetADC ' Haal A/D value op Volts = (1.524/ADmax)*ADvalue ' volts out from mpx4115 Volts = Volts + 3.164 Prcalc = (Volts/5)+ 0.095 ' (Vout/5)+0.095) Pressure = (Prcalc/0.009)*10 ' convert to pa by *1000 'Pressure = Pressure + 2.1 Print At 1,1, Dec1 Pressure ,0,"P",1," ",Dec Volts,"v" Print At 2,1, Dec5 ADvalue DelayMS 1000 GoTo main GetADC: ' voor 12 bits waarde 16 x sampelen dan delen door 4 ' voor 14 bits waarde 256 x sampelen dan delen door 16 ' voor 16 bits waarde 4096 x sampelen dan delen door 64
ADCount = 256 ADDivisor = 16 ADAccum = 0 ADmax = 16368 AdLoop: ADvalue= ADIn 0 ' 10-bit sample ADAccum = ADAccum + ADvalue ADCount = ADCount - 1 If ADCount > 0 Then AdLoop ADvalue = ADAccum / ADDivisor ; get the average value 14 bits Return End
Abonneren op:
Posts (Atom)