Eenvoudige projecten voor de microchip microcontrollers geschreven in picbasic, proton+.
vrijdag 18 januari 2013
ad9850 dds
Meetzender van 0-40mhz met de ad9850 module.
Device 18F4620
Xtal 20
LCD_DTPin PORTC.0
LCD_ENPin PORTC.4
LCD_RSPin PORTC.5
All_Digital = TRUE
INTCON.3 = 1
INTCON.4 = 1
INTCON2.6 = 0
INTCON2.7 = 0
INTCON2.5 = 0
INTCON3.3 = 1
Dim rotaryold As Byte
Dim rotary As Byte
Dim teller As Byte
Dim lcdfreq As Dword
Dim freq As Dword
Dim calfreq As Dword
Dim clock As Dword
Dim dds As Dword
Dim lcdmhz As Byte
Dim calbit As Word
Dim lcdkhz As Word
Dim lcdhz As Byte
Dim stap As Dword
clock = 12500500
freq = 1000000
stap = 100
Cls
freq = ERead 0
If freq > 4000000 Or freq < 0 Then freq = 1000000
Call calcad
main:
rotaryold = PORTB & $3
rotary=rotaryold
While rotary = 3
INTCON.0 = 0
INTCON.1 = 0
INTCON3.0 = 0
nap 7
' verwerk portb waarden rot encoder
rotary = PORTB & $3
Select Case INTCON.0
Case 1
If PORTB.7 = 0 Then Call chstap
End Select
Wend
' rustand rot enc 3, draaien we omlaag dan 2-1-3 omhoog 1-2-3 na int = dus oml een 1 en omh een 2
Select Case rotary
Case 0
GoTo main
Case 1
If rotaryold = 3 Then Call omlaag
Case 2
If rotaryold = 3 Then Call omhoog
End Select
GoTo main
omhoog:
freq = freq + stap
If freq > 4000000 Then freq = 0
Call calcad
Return
omlaag:
freq = freq - stap
If freq < 0 Then freq = 4000000
Call calcad
Return
calcad:
dds = 0
calfreq = freq
For teller = 31 To 0 Step -1 ' 32 bits berekenen
calfreq = calfreq // clock << 1 ' restant *2
calbit = calfreq / clock ' volgende bit
If calbit = 1 Then SetBit dds,teller
Next teller
SHOut PORTE.2,PORTE.0,0,[dds.Byte0,dds.Byte1,dds.Byte2,dds.Byte3,$00]
High PORTE.1
Low PORTE.1
EWrite 0,[freq]
lcdfreq = freq
lcdmhz = lcdfreq / 100000
lcdkhz = (lcdfreq // 1000000) / 100
lcdhz = lcdfreq // 100
Print At 1,1, Dec2 lcdmhz,".",Dec3 lcdkhz,",",Dec2 lcdhz,"0 Khz"
Select Case stap
Case 1
Print At 2,2," ^"
Case 10
Print At 2,2," ^ "
Case 100
Print At 2,2," ^ "
Case 1000
Print At 2,2," ^ "
Case 10000
Print At 2,2," ^ "
Case 100000
Print At 2,2,"^ "
End Select
Return
chstap:
Select Case stap
Case 1
stap = 10
Case 10
stap = 100
Case 100
stap = 1000
Case 1000
stap = 10000
Case 10000
stap = 100000
Case 100000
stap = 1
End Select
DelayMS 100
Call calcad
Return
donderdag 13 september 2012
thierry mugler weerstation decoderen
Ik heb onlangs bij de action een thierry mugler weerstation gekocht om mee te experimenteren.
Echt geweldig zijn ze niet, slecht bereik, veel te lage waarden en de ontvanger loopt uit de pas waardoor na een tijd geen buitentemperatuur meer word weergegeven.
Maar ze zijn wel leuk om te zien hoe een en ander werkt.
Op het internet vond ik al snel het protocol waar mee de sensoren werken.
http://roel.reijerse.net/thierry/ Met een heel simpel programmatje wat via rs232 de lengte van de pulsen aangaf met PulsIn PORTB.0,1 kon ik de lengte bepalen, hieruit bleek dat voor de data er een startpuls word uitgezonden van ongeveer 4000us, hierna volgt de data waarbij een 1 : 980us is en een 0 : 2300us is.
Voor de startpuls zitten ook nog pulsen maar die zijn niet nodig.
Op de site van Roel kun je vinden waar alles zit. In mijn progje mist alleen het - teken. Deze bit zit nog na de hygro en kun je dus eenvoudig toevoegen. De ontvanger is van de conrad, elke andere zal ook willen als het maar op 433.92 Mhz werkt. Wat ook mooi zou zijn is om zelf ook het signaal te kunnen uitzenden maar er zit een checksum in waar nog niet alles van bekend is. Ook heb ik nog meer weerstations van andere merken die ga ik ook proberen te decoderen met proton.
' " ook" ontvanger op portb.0
Device 18F2620
Xtal 20
LCD_DTPin PORTC.0
LCD_ENPin PORTC.4
LCD_RSPin PORTC.5
All_Digital = On
TRISB = 000000
Dim tijdpuls As Word
Dim teller As Byte
Dim mugtemp As Byte
Dim mugtempdec As Byte
Dim mughyg As Byte
Clear
DelayMS 100
Print $FE, $40, $08, $14, $08, $03, $04, $04, $03, $00 ' celcius
Print $FE, $48, $04, $0E, $0E, $1F, $1F, $1F, $0E, $00 ' drupje
Print $FE, $50, $04, $0E, $1F, $00, $1F, $0E, $04, $00 ' temp buiten
Cls
main:
tijdpuls = PulsIn PORTB.0,1
Select Case tijdpuls
Case 1600 To 2300 'startpuls ong 4000us (bij 20mhz is 1 puls 2us) +- 20%
GoTo bitsinlezen
End Select
GoTo main
bitsinlezen:
For teller = 23 To 0 Step -1 ' 24 bits inlezen na start
tijdpuls = PulsIn PORTB.0,1
Select Case tijdpuls
Case < 390 ' bij pulsen die te klein of te groot of er tussen vallen weer terug
GoTo main
Case > 1400
GoTo main
Case 590 To 950
GoTo main
Case 390 To 590 ' 1 = ong 980 us +- 20%
Select Case teller ' eerste 4 bits altijd 1 kunnen we overslaan.
Case 16 To 19
SetBit mugtempdec, 19 - teller ' decimalen inlezen 4 bits
Case 8 To 15
SetBit mugtemp, 15 - teller ' aantal graden
Case 0 To 7
SetBit mughyg, 7 - teller ' hygro
End Select
Case 950 To 1400 '0 ong 2300 us
Select Case teller
Case 16 To 19
ClearBit mugtempdec, 19 - teller
Case 8 To 15
ClearBit mugtemp, 15 - teller
Case 0 To 7
ClearBit mughyg, 7 - teller
End Select
End Select
Next teller
Print At 1,1, 2," ",Hex2 mugtemp,".",Hex1 mugtempdec,0," ",1," ",Hex2 mughyg,"%"
GoTo main
Echt geweldig zijn ze niet, slecht bereik, veel te lage waarden en de ontvanger loopt uit de pas waardoor na een tijd geen buitentemperatuur meer word weergegeven.
Maar ze zijn wel leuk om te zien hoe een en ander werkt.
Op het internet vond ik al snel het protocol waar mee de sensoren werken.
http://roel.reijerse.net/thierry/ Met een heel simpel programmatje wat via rs232 de lengte van de pulsen aangaf met PulsIn PORTB.0,1 kon ik de lengte bepalen, hieruit bleek dat voor de data er een startpuls word uitgezonden van ongeveer 4000us, hierna volgt de data waarbij een 1 : 980us is en een 0 : 2300us is.
Voor de startpuls zitten ook nog pulsen maar die zijn niet nodig.
Op de site van Roel kun je vinden waar alles zit. In mijn progje mist alleen het - teken. Deze bit zit nog na de hygro en kun je dus eenvoudig toevoegen. De ontvanger is van de conrad, elke andere zal ook willen als het maar op 433.92 Mhz werkt. Wat ook mooi zou zijn is om zelf ook het signaal te kunnen uitzenden maar er zit een checksum in waar nog niet alles van bekend is. Ook heb ik nog meer weerstations van andere merken die ga ik ook proberen te decoderen met proton.
' " ook" ontvanger op portb.0
Device 18F2620
Xtal 20
LCD_DTPin PORTC.0
LCD_ENPin PORTC.4
LCD_RSPin PORTC.5
All_Digital = On
TRISB = 000000
Dim tijdpuls As Word
Dim teller As Byte
Dim mugtemp As Byte
Dim mugtempdec As Byte
Dim mughyg As Byte
Clear
DelayMS 100
Print $FE, $40, $08, $14, $08, $03, $04, $04, $03, $00 ' celcius
Print $FE, $48, $04, $0E, $0E, $1F, $1F, $1F, $0E, $00 ' drupje
Print $FE, $50, $04, $0E, $1F, $00, $1F, $0E, $04, $00 ' temp buiten
Cls
main:
tijdpuls = PulsIn PORTB.0,1
Select Case tijdpuls
Case 1600 To 2300 'startpuls ong 4000us (bij 20mhz is 1 puls 2us) +- 20%
GoTo bitsinlezen
End Select
GoTo main
bitsinlezen:
For teller = 23 To 0 Step -1 ' 24 bits inlezen na start
tijdpuls = PulsIn PORTB.0,1
Select Case tijdpuls
Case < 390 ' bij pulsen die te klein of te groot of er tussen vallen weer terug
GoTo main
Case > 1400
GoTo main
Case 590 To 950
GoTo main
Case 390 To 590 ' 1 = ong 980 us +- 20%
Select Case teller ' eerste 4 bits altijd 1 kunnen we overslaan.
Case 16 To 19
SetBit mugtempdec, 19 - teller ' decimalen inlezen 4 bits
Case 8 To 15
SetBit mugtemp, 15 - teller ' aantal graden
Case 0 To 7
SetBit mughyg, 7 - teller ' hygro
End Select
Case 950 To 1400 '0 ong 2300 us
Select Case teller
Case 16 To 19
ClearBit mugtempdec, 19 - teller
Case 8 To 15
ClearBit mugtemp, 15 - teller
Case 0 To 7
ClearBit mughyg, 7 - teller
End Select
End Select
Next teller
Print At 1,1, 2," ",Hex2 mugtemp,".",Hex1 mugtempdec,0," ",1," ",Hex2 mughyg,"%"
GoTo main
vrijdag 20 juli 2012
ad9850 dds
Op ebay kun je voor rond de 5 euro een module kopen met de ad9850 dds van analog
Met deze module zou je een meetzender of een vfo voor een ontvanger kunnen maken.
De aansluitingen van de module zijn wel te vinden op internet.
Het lastige is het berekenen van de data wat de ad9850 in moet voor het zetten van de frequentie.
Volgens de datasheet,
freq_out = (data-dds * clockfreq) / 2^32
Het probleem om het in 1 keer te bereken is de 2^32, hier kunnen we in proton niks mee.
Dit zijn namelijk 33 bitjes. De oplossing is om het bit voor bit te doen.
Op de volgende manier:
dds = 0
calfreq = freq
For teller = 31 To 0 Step -1 ' 32 bits berekenen
calfreq = calfreq // clock << 1 ' restant *2
calbit = calfreq / clock ' volgende bit
If calbit = 1 Then SetBit dds,teller
Next teller
waarbij freq de gewenste freq is.
clock de klokfrequentie van de ad9850, Op de module zit een oscillator van 125mhz.
en in dds de output wat naar de ad9850 toemoet.
alle variabelen zijn 32 bits breed.
we kunnen nu dus op de hertz nauwkeurig de data voor de ad9850
berekenen.
Op de foto zien we het resultaat, we moeten wel 10mhz van de frequentie aftrekken.
dus de dds gaat draaien op 4.169 mhz. De kleinste stap word 10hz.
De bedoeling is om in eerste instantie de dds te laten draaien van 4.0 tot 4.35 mhz
voor mijn qrp transceiver voor de 20m, De taurus van sp5ddj.
waarbij een mf van 10mhz wordt gebruikt.Het nadeel van de dds is wel dat er
nog al wat rommel geproduceerd word. Een extra bandfilter achter de dds
zal zeker nodig zijn.
Nu nog de software verder afmaken en de module testen.
Met deze module zou je een meetzender of een vfo voor een ontvanger kunnen maken.
De aansluitingen van de module zijn wel te vinden op internet.
Het lastige is het berekenen van de data wat de ad9850 in moet voor het zetten van de frequentie.
Volgens de datasheet,
freq_out = (data-dds * clockfreq) / 2^32
Het probleem om het in 1 keer te bereken is de 2^32, hier kunnen we in proton niks mee.
Dit zijn namelijk 33 bitjes. De oplossing is om het bit voor bit te doen.
Op de volgende manier:
dds = 0
calfreq = freq
For teller = 31 To 0 Step -1 ' 32 bits berekenen
calfreq = calfreq // clock << 1 ' restant *2
calbit = calfreq / clock ' volgende bit
If calbit = 1 Then SetBit dds,teller
Next teller
waarbij freq de gewenste freq is.
clock de klokfrequentie van de ad9850, Op de module zit een oscillator van 125mhz.
en in dds de output wat naar de ad9850 toemoet.
alle variabelen zijn 32 bits breed.
we kunnen nu dus op de hertz nauwkeurig de data voor de ad9850
berekenen.
Op de foto zien we het resultaat, we moeten wel 10mhz van de frequentie aftrekken.
dus de dds gaat draaien op 4.169 mhz. De kleinste stap word 10hz.
De bedoeling is om in eerste instantie de dds te laten draaien van 4.0 tot 4.35 mhz
voor mijn qrp transceiver voor de 20m, De taurus van sp5ddj.
waarbij een mf van 10mhz wordt gebruikt.Het nadeel van de dds is wel dat er
nog al wat rommel geproduceerd word. Een extra bandfilter achter de dds
zal zeker nodig zijn.
Nu nog de software verder afmaken en de module testen.
zondag 8 juli 2012
DHT11
Op EBAY kun je voor rond de €1,50 de DHT11 aantreffen, deze sensor meet
de temperatuur en de luchtvochtigheid., temperatuur bereik 0-50 graden vochtigheid van 20-95% nauwkeurigheid +/-2 graden en +/- 5% vochtigheid. De sensor werkt min of meer zoals een onewire van dallas. De resolutie is 1, het vreemde is wel dat de decimalen wel mee worden verstuurd maar die zijn dus altijd 0. De luxere uitvoering is de DHT21 of DHT22 met een betere resolutie en bereik.
De datasheet is hier te vinden.
Op de foto heb ik naast de DHT11 ook een SHT11, de bovenste regel is de DHT11 de onderste
de SHT11
En hier de software voor de DHT11, aansluitingen voor het lcd en DHT11 vind je in de software,
De pic is in mijn geval een 18f2620, maar andere typen werken ook, alleen we maken gebruik van "pulsin"
dus de xtal freq moet 20mhz zijn. Anders dien je de waarden aan te passen.
De sensor is vrij traag en heeft een 1 seconde nodig om op te starten.
Is er een probleem met de sensor krijgen we een foutmelding,
Is er een bitje omgevallen van de 40 bits die worden ingelezen dan krijgen we een bit error.
Device 18F2620
Xtal 20
LCD_DTPin PORTC.0
LCD_ENPin PORTC.4
LCD_RSPin PORTC.5
All_Digital = On
Dim hygro As Byte
Dim hygrodec As Byte
Dim temp As Byte
Dim tempdec As Byte
Dim checksum As Byte
Dim dhtin As Byte
Dim teller As Byte
Dim checkchks As Byte
Dim dataout As Byte
DelayMS 100
Print $FE, $40, $08, $14, $08, $03, $04, $04, $03, $00 ' celcius
Print $FE, $48, $04, $0E, $0E, $1F, $1F, $1F, $0E, $00 ' drupje
Print $FE, $50, $1F, $0E, $04, $00, $04, $0E, $1F, $00 ' temp binnen
Start:
Cls
Print At 1,1,"DHT11"
DelayMS 1500
main:
checksum = 0
TRISB = 000000
PORTB.0 = 1
DelayMS 50
PORTB.0=0:DelayMS 20 'start data cycles min 18ms
PORTB.0=1:DelayUS 30 ' port weer hoog, min 20 us
dhtin = PulsIn PORTB.0,1
If dhtin < 20 Or dhtin > 60 Then GoTo senserror ' sensor error
GoSub datain
hygro = dataout
GoSub datain
hygrodec = dataout
GoSub datain
temp = dataout
GoSub datain
tempdec = dataout
GoSub datain
checksum = dataout
checkchks = (hygro + hygrodec + temp + tempdec)
If checkchks <> checksum Then
Print At 1,1, "Bit error"
Else
Print At 1,1,2," ",Dec2 temp,".",Dec1 tempdec,0," ",1," ",Dec2 hygro,".",Dec1 hygrodec,"%"
EndIf
DelayMS 1000
GoTo main
datain:
dhtin = 0
For teller = 7 To 0 Step -1
dhtin = PulsIn PORTB.0,1
If dhtin >30 Then
SetBit dataout,teller
Else
ClearBit dataout,teller
EndIf
Next teller
Return
senserror:
Print At 1,1,"Sensor error "
DelayMS 2000
GoTo Start
de temperatuur en de luchtvochtigheid., temperatuur bereik 0-50 graden vochtigheid van 20-95% nauwkeurigheid +/-2 graden en +/- 5% vochtigheid. De sensor werkt min of meer zoals een onewire van dallas. De resolutie is 1, het vreemde is wel dat de decimalen wel mee worden verstuurd maar die zijn dus altijd 0. De luxere uitvoering is de DHT21 of DHT22 met een betere resolutie en bereik.
De datasheet is hier te vinden.
Op de foto heb ik naast de DHT11 ook een SHT11, de bovenste regel is de DHT11 de onderste
de SHT11
En hier de software voor de DHT11, aansluitingen voor het lcd en DHT11 vind je in de software,
De pic is in mijn geval een 18f2620, maar andere typen werken ook, alleen we maken gebruik van "pulsin"
dus de xtal freq moet 20mhz zijn. Anders dien je de waarden aan te passen.
De sensor is vrij traag en heeft een 1 seconde nodig om op te starten.
Is er een probleem met de sensor krijgen we een foutmelding,
Is er een bitje omgevallen van de 40 bits die worden ingelezen dan krijgen we een bit error.
Device 18F2620
Xtal 20
LCD_DTPin PORTC.0
LCD_ENPin PORTC.4
LCD_RSPin PORTC.5
All_Digital = On
Dim hygro As Byte
Dim hygrodec As Byte
Dim temp As Byte
Dim tempdec As Byte
Dim checksum As Byte
Dim dhtin As Byte
Dim teller As Byte
Dim checkchks As Byte
Dim dataout As Byte
DelayMS 100
Print $FE, $40, $08, $14, $08, $03, $04, $04, $03, $00 ' celcius
Print $FE, $48, $04, $0E, $0E, $1F, $1F, $1F, $0E, $00 ' drupje
Print $FE, $50, $1F, $0E, $04, $00, $04, $0E, $1F, $00 ' temp binnen
Start:
Cls
Print At 1,1,"DHT11"
DelayMS 1500
main:
checksum = 0
TRISB = 000000
PORTB.0 = 1
DelayMS 50
PORTB.0=0:DelayMS 20 'start data cycles min 18ms
PORTB.0=1:DelayUS 30 ' port weer hoog, min 20 us
dhtin = PulsIn PORTB.0,1
If dhtin < 20 Or dhtin > 60 Then GoTo senserror ' sensor error
GoSub datain
hygro = dataout
GoSub datain
hygrodec = dataout
GoSub datain
temp = dataout
GoSub datain
tempdec = dataout
GoSub datain
checksum = dataout
checkchks = (hygro + hygrodec + temp + tempdec)
If checkchks <> checksum Then
Print At 1,1, "Bit error"
Else
Print At 1,1,2," ",Dec2 temp,".",Dec1 tempdec,0," ",1," ",Dec2 hygro,".",Dec1 hygrodec,"%"
EndIf
DelayMS 1000
GoTo main
datain:
dhtin = 0
For teller = 7 To 0 Step -1
dhtin = PulsIn PORTB.0,1
If dhtin >30 Then
SetBit dataout,teller
Else
ClearBit dataout,teller
EndIf
Next teller
Return
senserror:
Print At 1,1,"Sensor error "
DelayMS 2000
GoTo Start
maandag 4 juni 2012
Ombouw 27mhz cb 27mc van 11m naar 10m
Alles werkt, ook het zenden, om wat een groter bereik te krijgen heb ik de varicap van het vco veranderd.
Nu zijn we toe aan het ombouwen van het ontvangst en zend gedeelte naar 10 meter. Om te testen heb ik
de software aangepast zodat we werken van 26-30 mhz, In de jaren 80 hadden ze het wiel al eens uit gevonden, Met een zoektocht op internet kwam ik de site van PA3DRQ tegen, daar vond ik de beschrijvingen
die ooit in de cq-pa hebben gestaan. Die wijzigingen die daar in staan ga eerst eens doorvoeren. Maar ik zag op de site van Roelof ook een sm2010 staan die de hele 10 meter bestrijkt. Dat vond ik niet terug in die beschrijvingen uit de cq-pa, nieuwsgierigheid gewekt, maar even mailen met Roelof, deze was toevallig druk bezig om dit in een pdf te zetten, Ik begreep dat hij de ombouw heeft gedaan met een pll02a. En min of meer de schema's van de ham international jumbo heeft gebruikt. Zeer interessant en ben zeer benieuwd naar de beschrijving van dit alles, ook heeft hij er nog een transverter in zitten voor 70cm. Ik heb een filmpje gemaakt wel wat kort, de kaart was vol, het in ieder geval zien dat we ontvangen.
Hier de source van de testversie dus inclusief zenden,
Device 18F2620
Xtal 20
' i2c
Declare Slow_Bus On
SDA_Pin = PORTA.1
SCL_Pin = PORTA.0
'lcd op portb b0 en b2 vrij voor interrupt
LCD_DTPin PORTC.0
LCD_ENPin PORTC.4
LCD_RSPin PORTC.5
All_Digital = TRUE
'PORTB rb0 en rb1 Input encoder b4-b7 input
TRISB = %11110011
' portb pullups aan verplicht bij int on change
PortB_Pullups On
'interrupts rb0,rb1 falling, rb4-7 on change
INTCON.3 = 1
INTCON.4 = 1
INTCON2.6 = 0
INTCON2.7 = 0
INTCON2.5 = 0
INTCON3.3 = 1
' i2c adressen
Symbol tsa6057 = %11000100
Symbol ds1307 = %11010000
' variabelen
Dim rotaryold As Byte
Dim rotary As Byte
Dim freq As Word
Dim Stap As Byte
Dim stapold As Byte
Dim lcdfreq As Dword
Dim addr As Byte
Dim zend As Byte
Dim tsadeeltal As Word
'lcd init
DelayMS 100
Cls
' haal freq uit ds1307 eerste keer kan er rotzooi in zitten
Call startup
' lus voor schakelaars en encoder via sleep
main:
stapold = Stap
rotaryold = PORTB & $3
rotary=rotaryold
While rotary = 3
INTCON.0 = 0
INTCON.1 = 0
INTCON3.0 = 0
nap 7
' verwerk portb waarden rot encoder
rotary = PORTB & $3
' verwerk portb waarden switches (wil niet in select case intcon.0)
Stap = PORTB & %11000000
Stap = Stap >> 6 '6 verschuiven voor 0-3
If Stap = 3 Then Stap = 0
Select Case Stap
Case 0
Stap = 2
Case 1
Stap = 4
Case 2
Stap = 40
End Select
zend = PORTB.5
' indien int door b4-b7 kijken welke switch
Select Case INTCON.0
Case 1
If zend = 0 Then Call zenden
If stapold <> Stap Then Call chstap
End Select
Wend
' rustand rot enc 3, draaien we omlaag dan 2-1-3 omhoog 1-2-3 na int = dus oml een 1 en omh een 2
Select Case rotary
Case 0
GoTo main
Case 1
If rotaryold = 3 Then Call omlaag
Case 2
If rotaryold = 3 Then Call omhoog
End Select
GoTo main
startup:
' bepaal stand band schakelaar.
Stap = PORTB & %11000000
Stap = Stap >> 6
If Stap = 3 Then Stap = 0
Select Case Stap
Case 0
Stap = 2 ´5khz
Case 1
Stap = 4 ´10khz
Case 2
Stap = 40 ´100khz
End Select
' haal freq uit ds1307
addr = $20
BusIn ds1307,addr,[freq]
' indien ds leeg dan rotzooi in mem
If freq > 1600 Then freq = 0
Call showfreq
Call progtsa
Return
omlaag:
freq = freq - Stap
If freq > 1600 Then freq = 1600
Call progds
Return
omhoog:
freq = freq + Stap
If freq > 1600 Then freq = 0
Call progds
Return
progds:
addr = $20
BusOut ds1307,addr,[freq]
Call showfreq
Call progtsa
Return
showfreq:
lcdfreq = freq * 250
lcdfreq = lcdfreq / 10
lcdfreq = 260000+lcdfreq
Print At 1,1,"Frq ", Dec2 lcdfreq / 10000,".",Dec4 lcdfreq // 10000," Mhz"
Print At 2,1,"Stp ", Dec3 (Stap * 25) / 10,".",Dec1 (stap*25) // 10," Khz"
Print At 2,16,"R"
Return
chstap:
stapold = Stap
Call showfreq
Call progtsa
Return
´deeltal = ( freq - 10.695 - 10.240 ) / 1.25
' voor 26mhz dus 4052
progtsa:
tsadeeltal = 4052 + freq * 2
tsadeeltal = tsadeeltal << 1 ' alles 1 opschuiven voor bit0 charge pump
tsadeeltal.0 = 1 ' charge pump 1 fast
'byte2.4 moet 1 (AM mode) verder geen bits voor deeltal rest kan 0
BusOut tsa6057,0,[tsadeeltal.Byte0,tsadeeltal.Byte1,010000,0]
DelayMS 10
Return
'deeltal = ( freq / 2 - 10.240) / 1.25
'voor 26mhz dus 2208
zenden:
tsadeeltal = 2208 + freq
' repeatershift 100khz
If tsadeeltal > 3650 And tsadeeltal < 3686 Then tsadeeltal = tsadeeltal - 40
tsadeeltal = tsadeeltal << 1tsadeeltal.0 = 1
BusOut tsa6057,0,[tsadeeltal.Byte0,tsadeeltal.Byte1,010000,0]
Print At 2,16,"T"
While PORTB.5 = 0
Wend
' terug naar ontvangst
Call progtsa
Return
Nu zijn we toe aan het ombouwen van het ontvangst en zend gedeelte naar 10 meter. Om te testen heb ik
de software aangepast zodat we werken van 26-30 mhz, In de jaren 80 hadden ze het wiel al eens uit gevonden, Met een zoektocht op internet kwam ik de site van PA3DRQ tegen, daar vond ik de beschrijvingen
die ooit in de cq-pa hebben gestaan. Die wijzigingen die daar in staan ga eerst eens doorvoeren. Maar ik zag op de site van Roelof ook een sm2010 staan die de hele 10 meter bestrijkt. Dat vond ik niet terug in die beschrijvingen uit de cq-pa, nieuwsgierigheid gewekt, maar even mailen met Roelof, deze was toevallig druk bezig om dit in een pdf te zetten, Ik begreep dat hij de ombouw heeft gedaan met een pll02a. En min of meer de schema's van de ham international jumbo heeft gebruikt. Zeer interessant en ben zeer benieuwd naar de beschrijving van dit alles, ook heeft hij er nog een transverter in zitten voor 70cm. Ik heb een filmpje gemaakt wel wat kort, de kaart was vol, het in ieder geval zien dat we ontvangen.
Hier de source van de testversie dus inclusief zenden,
Device 18F2620
Xtal 20
' i2c
Declare Slow_Bus On
SDA_Pin = PORTA.1
SCL_Pin = PORTA.0
'lcd op portb b0 en b2 vrij voor interrupt
LCD_DTPin PORTC.0
LCD_ENPin PORTC.4
LCD_RSPin PORTC.5
All_Digital = TRUE
'PORTB rb0 en rb1 Input encoder b4-b7 input
TRISB = %11110011
' portb pullups aan verplicht bij int on change
PortB_Pullups On
'interrupts rb0,rb1 falling, rb4-7 on change
INTCON.3 = 1
INTCON.4 = 1
INTCON2.6 = 0
INTCON2.7 = 0
INTCON2.5 = 0
INTCON3.3 = 1
' i2c adressen
Symbol tsa6057 = %11000100
Symbol ds1307 = %11010000
' variabelen
Dim rotaryold As Byte
Dim rotary As Byte
Dim freq As Word
Dim Stap As Byte
Dim stapold As Byte
Dim lcdfreq As Dword
Dim addr As Byte
Dim zend As Byte
Dim tsadeeltal As Word
'lcd init
DelayMS 100
Cls
' haal freq uit ds1307 eerste keer kan er rotzooi in zitten
Call startup
' lus voor schakelaars en encoder via sleep
main:
stapold = Stap
rotaryold = PORTB & $3
rotary=rotaryold
While rotary = 3
INTCON.0 = 0
INTCON.1 = 0
INTCON3.0 = 0
nap 7
' verwerk portb waarden rot encoder
rotary = PORTB & $3
' verwerk portb waarden switches (wil niet in select case intcon.0)
Stap = PORTB & %11000000
Stap = Stap >> 6 '6 verschuiven voor 0-3
If Stap = 3 Then Stap = 0
Select Case Stap
Case 0
Stap = 2
Case 1
Stap = 4
Case 2
Stap = 40
End Select
zend = PORTB.5
' indien int door b4-b7 kijken welke switch
Select Case INTCON.0
Case 1
If zend = 0 Then Call zenden
If stapold <> Stap Then Call chstap
End Select
Wend
' rustand rot enc 3, draaien we omlaag dan 2-1-3 omhoog 1-2-3 na int = dus oml een 1 en omh een 2
Select Case rotary
Case 0
GoTo main
Case 1
If rotaryold = 3 Then Call omlaag
Case 2
If rotaryold = 3 Then Call omhoog
End Select
GoTo main
startup:
' bepaal stand band schakelaar.
Stap = PORTB & %11000000
Stap = Stap >> 6
If Stap = 3 Then Stap = 0
Select Case Stap
Case 0
Stap = 2 ´5khz
Case 1
Stap = 4 ´10khz
Case 2
Stap = 40 ´100khz
End Select
' haal freq uit ds1307
addr = $20
BusIn ds1307,addr,[freq]
' indien ds leeg dan rotzooi in mem
If freq > 1600 Then freq = 0
Call showfreq
Call progtsa
Return
omlaag:
freq = freq - Stap
If freq > 1600 Then freq = 1600
Call progds
Return
omhoog:
freq = freq + Stap
If freq > 1600 Then freq = 0
Call progds
Return
progds:
addr = $20
BusOut ds1307,addr,[freq]
Call showfreq
Call progtsa
Return
showfreq:
lcdfreq = freq * 250
lcdfreq = lcdfreq / 10
lcdfreq = 260000+lcdfreq
Print At 1,1,"Frq ", Dec2 lcdfreq / 10000,".",Dec4 lcdfreq // 10000," Mhz"
Print At 2,1,"Stp ", Dec3 (Stap * 25) / 10,".",Dec1 (stap*25) // 10," Khz"
Print At 2,16,"R"
Return
chstap:
stapold = Stap
Call showfreq
Call progtsa
Return
´deeltal = ( freq - 10.695 - 10.240 ) / 1.25
' voor 26mhz dus 4052
progtsa:
tsadeeltal = 4052 + freq * 2
tsadeeltal = tsadeeltal << 1 ' alles 1 opschuiven voor bit0 charge pump
tsadeeltal.0 = 1 ' charge pump 1 fast
'byte2.4 moet 1 (AM mode) verder geen bits voor deeltal rest kan 0
BusOut tsa6057,0,[tsadeeltal.Byte0,tsadeeltal.Byte1,010000,0]
DelayMS 10
Return
'deeltal = ( freq / 2 - 10.240) / 1.25
'voor 26mhz dus 2208
zenden:
tsadeeltal = 2208 + freq
' repeatershift 100khz
If tsadeeltal > 3650 And tsadeeltal < 3686 Then tsadeeltal = tsadeeltal - 40
tsadeeltal = tsadeeltal << 1tsadeeltal.0 = 1
BusOut tsa6057,0,[tsadeeltal.Byte0,tsadeeltal.Byte1,010000,0]
Print At 2,16,"T"
While PORTB.5 = 0
Wend
' terug naar ontvangst
Call progtsa
Return
zaterdag 19 mei 2012
Ombouw 27mhz cb 27mc van 11m naar 10m
Natuurlijk doet iets het nooit meteen, de wet van Murphy gaat altijd op.
Maar na een avond zitten knutselen werkt iig de ontvangst, het zendgedeelte is nog even wat uitzoekwerk.
Maar dat komt vast wel goed.
In eerste instantie deed de schakeling het helemaal niet, achteraf logisch. maar ja dat is achteraf.
Ik had al pech met de low budget ic voet van de tsa, volgende keer koop ik toch wat duurdere nu zijn er
twee pootjes gebroken van de tsa, gelukkig de ref freq en wat minder pootje 1, maar met een drupje tin tussen 1 en 2 was dat ook op te lossen. Ook in het voetje zijn twee pinnetjes totaal verbogen. Het werkt nu maar het kan wel een bron van storingen zijn.
Ik had alles aangesloten maar de pll lockte niet. ik dacht eerst te weinig input. dus een buffertje er tussen.
ook dat bood geen oplossing, dan maar rechtstreeks op de uitgang van het vco. software aanpassen.
Bij het deeltal 8192 (8192*1.25 = 10.24mhz) optellen, maar ook deed werkte niet. tsa in fm mode gezet.
schakeling iets veranderd. maar ook dat werkte niet.
Ik heb nog een pos150 vco liggen, die werkt tussen de ongeveer tussen de 70 en 130 mhz, zou ik ooit gebruiken voor een hf ontvanger met een mf van 70mhz. De pos150 maar aan de tsa dan dat werkte toen d prima, nu dus niet. Das vreemd toch maar eens kijken naar de software.
de tsa programmeer ik met busout tsa6057,0,[data,data,data,data]. zonder een start en stop.
dit gewijzigd in
bstart
busout tsa6057
busout 0
busout data
busout data
busout data
busout data
bstop.
ja!! de pos150 lock op 70.45 mhz.das handig een meetzendertje voor 4m,
Software weer terug naar 16mhz / am mode ook daar een lock. maar als ik de freq verander gebeurt er niks. Das vreemd. Toen dacht ik o ja stom van me had ik ooit niet ergens gelezen bij een xtal van 8mhz of meer aan de microprocessor om de i2c bus in slowmode te zetten. om dat sommige i2c ic's anders bijna of
geheel niet werken. Declare Slow_Bus On is zou dus de oplossing kunnen zijn commando toegevoegd
en alles werkt idd prima. Wat me wel opvalt is dat de pll een beetje sloom is. Je hoort hem bijsloffen
als je 10khz verschuift. Eerst maar eens de ontvangst afregelen zien hoe hoog we kunnen komen zonder
de nodige aanpassingen. De pll lockt in ieder geval wel tussen het hele frequentie gebied. das alweer een meevaller. Morgen maar weer eens kijken.
Maar na een avond zitten knutselen werkt iig de ontvangst, het zendgedeelte is nog even wat uitzoekwerk.
Maar dat komt vast wel goed.
In eerste instantie deed de schakeling het helemaal niet, achteraf logisch. maar ja dat is achteraf.
Ik had al pech met de low budget ic voet van de tsa, volgende keer koop ik toch wat duurdere nu zijn er
twee pootjes gebroken van de tsa, gelukkig de ref freq en wat minder pootje 1, maar met een drupje tin tussen 1 en 2 was dat ook op te lossen. Ook in het voetje zijn twee pinnetjes totaal verbogen. Het werkt nu maar het kan wel een bron van storingen zijn.
Ik had alles aangesloten maar de pll lockte niet. ik dacht eerst te weinig input. dus een buffertje er tussen.
ook dat bood geen oplossing, dan maar rechtstreeks op de uitgang van het vco. software aanpassen.
Bij het deeltal 8192 (8192*1.25 = 10.24mhz) optellen, maar ook deed werkte niet. tsa in fm mode gezet.
schakeling iets veranderd. maar ook dat werkte niet.
Ik heb nog een pos150 vco liggen, die werkt tussen de ongeveer tussen de 70 en 130 mhz, zou ik ooit gebruiken voor een hf ontvanger met een mf van 70mhz. De pos150 maar aan de tsa dan dat werkte toen d prima, nu dus niet. Das vreemd toch maar eens kijken naar de software.
de tsa programmeer ik met busout tsa6057,0,[data,data,data,data]. zonder een start en stop.
dit gewijzigd in
bstart
busout tsa6057
busout 0
busout data
busout data
busout data
busout data
bstop.
ja!! de pos150 lock op 70.45 mhz.das handig een meetzendertje voor 4m,
Software weer terug naar 16mhz / am mode ook daar een lock. maar als ik de freq verander gebeurt er niks. Das vreemd. Toen dacht ik o ja stom van me had ik ooit niet ergens gelezen bij een xtal van 8mhz of meer aan de microprocessor om de i2c bus in slowmode te zetten. om dat sommige i2c ic's anders bijna of
geheel niet werken. Declare Slow_Bus On is zou dus de oplossing kunnen zijn commando toegevoegd
en alles werkt idd prima. Wat me wel opvalt is dat de pll een beetje sloom is. Je hoort hem bijsloffen
als je 10khz verschuift. Eerst maar eens de ontvangst afregelen zien hoe hoog we kunnen komen zonder
de nodige aanpassingen. De pll lockt in ieder geval wel tussen het hele frequentie gebied. das alweer een meevaller. Morgen maar weer eens kijken.
donderdag 17 mei 2012
Ombouw 27mhz cb 27mc van 11m naar 10m
Het schiet aardig op, hier wat foto's,
Verder vond ik op internet de CB2HAM groep met zeer veel info te vinden op
http://groups.yahoo.com/group/CB2HAM
Verder vond ik op internet de CB2HAM groep met zeer veel info te vinden op
http://groups.yahoo.com/group/CB2HAM
zaterdag 5 mei 2012
Ombouw 27mhz cb 27mc van 11m naar 10m
Hier het schema van de pll met aansturing. Ik heb niet gelet op de i2c aansluitingen data en clock.
deze kunnen dus fout zitten in het schema.Hetzelfde geldt voor het display.
De vraag is ook of de tsa genoeg input krijgt om te locken, mocht dit niet zo zijn dan moet
er nog een buffertje tussen.
Nu nog uitzoeken hoe we het geheel moeten aansluiten in de 27mhz transceiver.
Schema is inmiddels aangepast en correct
deze kunnen dus fout zitten in het schema.Hetzelfde geldt voor het display.
De vraag is ook of de tsa genoeg input krijgt om te locken, mocht dit niet zo zijn dan moet
er nog een buffertje tussen.
Nu nog uitzoeken hoe we het geheel moeten aansluiten in de 27mhz transceiver.
dinsdag 1 mei 2012
Ombouw 27mhz cb 27mc van 11m naar 10m
Hier alvast een stuk van de source, het progje werkt op basis van interrupts,
voor de rotary encoder op port b0,b1 en voor de switches op port b4-b7.
Ik zal binnenkort het schema tekenen. Het zend gedeelte en het programmeren van de tsa6057
ontbreek nog. Verder gebruik ik een ds1307 voor het opslaan van gegevens,
dit ic heeft geen beperkte levensduur voor het lezen en schrijven naar het geheugen, dit in tegenstelling tot
het interne geheugen van de pic. En je hebt de mogelijkheid om een klokje toe te voegen.
Er zullen nog wel kleine dingen inzitten. Maar het werkt in eerste instantie.
Device 18F2620
Xtal 20
' i2c
SDA_Pin = PORTA.0
SCL_Pin = PORTA.1
'lcd op port c
LCD_DTPin PORTC.0
LCD_ENPin PORTC.4
LCD_RSPin PORTC.5
All_Digital = TRUE
0 en rb1 Input encoder b4-b7 input
TRISB = %11110011
' portb pullups aan verplicht bij int on change
PortB_Pullups On
'interrupts rb0,rb1 falling, rb4-7 on change
INTCON.3 = 1
INTCON.4 = 1
INTCON2.6 = 0
INTCON2.7 = 0
INTCON2.5 = 0
INTCON3.3 = 1
' i2c adressen
Symbol tsa6057 = %11000100
Symbol ds1307 = %11010000
' variabelen
Dim rotaryold As Byte
Dim rotary As Byte
Dim freq As Word
Dim Stap As Byte
Dim stapold As Byte
Dim lcdfreq As Dword
Dim band As Byte
Dim bandold As Byte
Dim addr As Byte
Dim zend As Byte
'lcd init
DelayMS 100
Cls
' haal freq uit ds1307 eerste keer kan er rotzooi in zitten
Call startup
' lus voor schakelaars en encoder via sleep
main:
bandold = band
stapold = Stap
rotaryold = PORTB & $3
rotary=rotaryold
While rotary = 3
INTCON.0 = 0
INTCON.1 = 0
INTCON3.0 = 0
nap 7
' verwerk portb waarden rot encoder
rotary = PORTB & $3
' verwerk portb waarden switches (wil niet in select case intcon.0)
band = PORTB & %11000000
band = band >> 6 '6 verschuiven voor 0-3
If band = 3 Then band = 0
zend = PORTB & 100000
zend = zend >> 5
Stap = PORTB & 010000
Stap = Stap >> 4
Stap = Stap + 4
' indien int door b4-b7 kijken welke switch
Select Case INTCON.0
Case 1
If bandold <> band Then Call chband
If stapold <> Stap Then Call chstap
If zend = 0 Then Call zenden
End Select
Wend
' rustand rot enc 3, draaien we omlaag dan 2-1-3 omhoog 1-2-3 na int = dus oml een 1 en omh een 2
Select Case rotary
Case 0
GoTo main
Case 1
If rotaryold = 3 Then Call omlaag
Case 2
If rotaryold = 3 Then Call omhoog
End Select
GoTo main
startup:
' bepaal stand band schakelaar.
band = PORTB & %11000000
band = band >> 6
If band = 3 Then band = 0
' haal freq uit ds1307
addr = band * 2 + $20
BusIn ds1307,addr,[freq]
' indien ds leeg dan rotzooi in mem, nog aanpassen
Select Case band
Case 0
If freq > 480 Then freq = 400
Case 1
If freq > 600 Then freq = 400
Case 2
If freq > 200 Then freq = 180
End Select
Stap = PORTB & 010000
Stap = Stap >> 4
Stap = Stap + 4
Select Case Stap
Case 4
Call chk10stap
Case 5
Call chk12stap
End Select
Call showfreq
Return
omlaag:
freq = freq - Stap
Select Case band
Case 0
If freq > 480 Then freq = 480
Case 1
If freq > 600 Then freq = 600
Case 2
If freq > 200 Then freq = 200
End Select
Call progds
Return
omhoog:
freq = freq + Stap
Select Case band
Case 0
If freq > 480 Then freq = 0
Case 1
If freq > 600 Then freq = 0
Case 2
If freq > 200 Then freq = 0
End Select
Call progds
Return
progds:
addr = band * 2 + $20
BusOut ds1307,addr,[freq]
Call showfreq
Return
showfreq:
lcdfreq = freq * 250
lcdfreq = lcdfreq / 10
Select Case band
Case 0
lcdfreq = 285000+lcdfreq
Print At 2,14,"10m"
Case 1
lcdfreq = 505000+lcdfreq
Print At 2,14," 6m"
Case 2
lcdfreq = 700000+lcdfreq
Print At 2,14," 4m"
End Select
Print At 1,1,"Frq ", Dec2 lcdfreq / 10000,".",Dec4 lcdfreq // 10000," Mhz"
Print At 2,1,"Stp ", Dec2 (Stap * 25) / 10,".",Dec1 (stap*25) // 10," Khz"
Return
chstap:
Select Case Stap
Case 4
Call chk10stap
Case 5
Call chk12stap
End Select
stapold = Stap
Return
chk10stap:
freq = freq / 4
freq = freq * 4
Stap = 4
Call progds
Return
chk12stap:
freq = (freq + 4) / 5
freq = freq * 5
Stap = 5
Call progds
Return
chband:
addr = band * 2 + $20
BusIn ds1307,addr,[freq]
Select Case band
Case 0
If freq > 480 Then freq = 400
Case 1
If freq > 600 Then freq = 400
Case 2
If freq > 200 Then freq = 180
End Select
Call chstap
bandold = band
Return
zenden:
Return
voor de rotary encoder op port b0,b1 en voor de switches op port b4-b7.
Ik zal binnenkort het schema tekenen. Het zend gedeelte en het programmeren van de tsa6057
ontbreek nog. Verder gebruik ik een ds1307 voor het opslaan van gegevens,
dit ic heeft geen beperkte levensduur voor het lezen en schrijven naar het geheugen, dit in tegenstelling tot
het interne geheugen van de pic. En je hebt de mogelijkheid om een klokje toe te voegen.
Er zullen nog wel kleine dingen inzitten. Maar het werkt in eerste instantie.
Device 18F2620
Xtal 20
' i2c
SDA_Pin = PORTA.0
SCL_Pin = PORTA.1
'lcd op port c
LCD_DTPin PORTC.0
LCD_ENPin PORTC.4
LCD_RSPin PORTC.5
All_Digital = TRUE
0 en rb1 Input encoder b4-b7 input
TRISB = %11110011
' portb pullups aan verplicht bij int on change
PortB_Pullups On
'interrupts rb0,rb1 falling, rb4-7 on change
INTCON.3 = 1
INTCON.4 = 1
INTCON2.6 = 0
INTCON2.7 = 0
INTCON2.5 = 0
INTCON3.3 = 1
' i2c adressen
Symbol tsa6057 = %11000100
Symbol ds1307 = %11010000
' variabelen
Dim rotaryold As Byte
Dim rotary As Byte
Dim freq As Word
Dim Stap As Byte
Dim stapold As Byte
Dim lcdfreq As Dword
Dim band As Byte
Dim bandold As Byte
Dim addr As Byte
Dim zend As Byte
'lcd init
DelayMS 100
Cls
' haal freq uit ds1307 eerste keer kan er rotzooi in zitten
Call startup
' lus voor schakelaars en encoder via sleep
main:
bandold = band
stapold = Stap
rotaryold = PORTB & $3
rotary=rotaryold
While rotary = 3
INTCON.0 = 0
INTCON.1 = 0
INTCON3.0 = 0
nap 7
' verwerk portb waarden rot encoder
rotary = PORTB & $3
' verwerk portb waarden switches (wil niet in select case intcon.0)
band = PORTB & %11000000
band = band >> 6 '6 verschuiven voor 0-3
If band = 3 Then band = 0
zend = PORTB & 100000
zend = zend >> 5
Stap = PORTB & 010000
Stap = Stap >> 4
Stap = Stap + 4
' indien int door b4-b7 kijken welke switch
Select Case INTCON.0
Case 1
If bandold <> band Then Call chband
If stapold <> Stap Then Call chstap
If zend = 0 Then Call zenden
End Select
Wend
' rustand rot enc 3, draaien we omlaag dan 2-1-3 omhoog 1-2-3 na int = dus oml een 1 en omh een 2
Select Case rotary
Case 0
GoTo main
Case 1
If rotaryold = 3 Then Call omlaag
Case 2
If rotaryold = 3 Then Call omhoog
End Select
GoTo main
startup:
' bepaal stand band schakelaar.
band = PORTB & %11000000
band = band >> 6
If band = 3 Then band = 0
' haal freq uit ds1307
addr = band * 2 + $20
BusIn ds1307,addr,[freq]
' indien ds leeg dan rotzooi in mem, nog aanpassen
Select Case band
Case 0
If freq > 480 Then freq = 400
Case 1
If freq > 600 Then freq = 400
Case 2
If freq > 200 Then freq = 180
End Select
Stap = PORTB & 010000
Stap = Stap >> 4
Stap = Stap + 4
Select Case Stap
Case 4
Call chk10stap
Case 5
Call chk12stap
End Select
Call showfreq
Return
omlaag:
freq = freq - Stap
Select Case band
Case 0
If freq > 480 Then freq = 480
Case 1
If freq > 600 Then freq = 600
Case 2
If freq > 200 Then freq = 200
End Select
Call progds
Return
omhoog:
freq = freq + Stap
Select Case band
Case 0
If freq > 480 Then freq = 0
Case 1
If freq > 600 Then freq = 0
Case 2
If freq > 200 Then freq = 0
End Select
Call progds
Return
progds:
addr = band * 2 + $20
BusOut ds1307,addr,[freq]
Call showfreq
Return
showfreq:
lcdfreq = freq * 250
lcdfreq = lcdfreq / 10
Select Case band
Case 0
lcdfreq = 285000+lcdfreq
Print At 2,14,"10m"
Case 1
lcdfreq = 505000+lcdfreq
Print At 2,14," 6m"
Case 2
lcdfreq = 700000+lcdfreq
Print At 2,14," 4m"
End Select
Print At 1,1,"Frq ", Dec2 lcdfreq / 10000,".",Dec4 lcdfreq // 10000," Mhz"
Print At 2,1,"Stp ", Dec2 (Stap * 25) / 10,".",Dec1 (stap*25) // 10," Khz"
Return
chstap:
Select Case Stap
Case 4
Call chk10stap
Case 5
Call chk12stap
End Select
stapold = Stap
Return
chk10stap:
freq = freq / 4
freq = freq * 4
Stap = 4
Call progds
Return
chk12stap:
freq = (freq + 4) / 5
freq = freq * 5
Stap = 5
Call progds
Return
chband:
addr = band * 2 + $20
BusIn ds1307,addr,[freq]
Select Case band
Case 0
If freq > 480 Then freq = 400
Case 1
If freq > 600 Then freq = 400
Case 2
If freq > 200 Then freq = 180
End Select
Call chstap
bandold = band
Return
zenden:
Return
dinsdag 24 april 2012
Ombouw 27mhz cb 27mc van 11m naar 10m
Inmiddels de skyline uit elkaar gehaald en de kanalenkiezer er uit gesloopt.
De tsa6057 ligt klaar. Zie foto's.
De transceiver gaat werken tussen 28.380 en 29.880 mhz. Het signaal wat nu de pll08a ingaat.
is een mengproduct waarbij er verschil is tussen ontvangen en zenden.
Voor ontvangen geldt:
Ontv freq - 10.695(mf) - 10.240 dus dit wordt 7.445 tot 8,945 mhz.
Voor zenden geldt;
Zend freq / 2 - 10.240 en dit wordt dan 3.95 tot 4.7 mhz.
De tsa6057 doet stapjes van 1.25 khz dus de deler in de tsa moeten we voor
ontvangst instellen tussen:
5956 tot 7156
voor zenden:
3160 - 3760
De software kunnen we dan zo maken dat we de frq kunnen instellen tussen 0 en 600.
We kunnen het deeltal dan als volgt berekenen
zenden = 3160 + X
ontv = 5956 + 2X
De kleinste stap is dan 2.5 khz. Voor 10khz moeten we dus steeds 4 bij X optellen en voor 12.5khz 5.
Als we schakelen tussen 10 en 12.5 khz moeten we uitrekenen wat de dichtstbijzijnde correcte frequentie
is. Dit doen we heel simpel door X te delen door 4 of 5 en dan weer te vermenigvuldigen met 4 of 5.
Dus bijv voor 10khz X = (X / 4) * 4.
X moet dan wel een word zijn. Zodat we geen decimalen hebben.
Nu kunnen we starten met de software.
De tsa6057 ligt klaar. Zie foto's.
De transceiver gaat werken tussen 28.380 en 29.880 mhz. Het signaal wat nu de pll08a ingaat.
is een mengproduct waarbij er verschil is tussen ontvangen en zenden.
Voor ontvangen geldt:
Ontv freq - 10.695(mf) - 10.240 dus dit wordt 7.445 tot 8,945 mhz.
Voor zenden geldt;
Zend freq / 2 - 10.240 en dit wordt dan 3.95 tot 4.7 mhz.
De tsa6057 doet stapjes van 1.25 khz dus de deler in de tsa moeten we voor
ontvangst instellen tussen:
5956 tot 7156
voor zenden:
3160 - 3760
De software kunnen we dan zo maken dat we de frq kunnen instellen tussen 0 en 600.
We kunnen het deeltal dan als volgt berekenen
zenden = 3160 + X
ontv = 5956 + 2X
De kleinste stap is dan 2.5 khz. Voor 10khz moeten we dus steeds 4 bij X optellen en voor 12.5khz 5.
Als we schakelen tussen 10 en 12.5 khz moeten we uitrekenen wat de dichtstbijzijnde correcte frequentie
is. Dit doen we heel simpel door X te delen door 4 of 5 en dan weer te vermenigvuldigen met 4 of 5.
Dus bijv voor 10khz X = (X / 4) * 4.
X moet dan wel een word zijn. Zodat we geen decimalen hebben.
Nu kunnen we starten met de software.
maandag 23 april 2012
Ombouw 27mhz cb 27mc van 11m naar 10m
Het is een tijdje stil geweest, ben weer volledig aan het werk gegaan waardoor er voor het bijhouden van het blog minder tijd is. maar dit project ga ik volledig bijhouden op mijn blog.
Vanaf januari 2012 is er voor zendamateurs de 4m beschikbaar, Om hier op uit te komen
heb ik besloten om een oude 22 kanaals 27mc bakkie om te bouwen naar 10m, om dan met een transverter uit te komen op 4m. Op internet kun je wel wat ombouw beschrijvingen vinden maar niet zoals ik het wil.
Ik heb de volgende wensen:
De bak moet bruikbaar blijven voor 10m
stapgrootte 10khz en 12.5khz.
Naast 4m eventueel ook 6m.
Zendvermogen rond de 2 watt op alle banden
In mijn rommelbak vond ik de volgende kristallen 40.68 mhz en voor 6m 22.1184 mhz.
4m loopt van 70 tot 70.5 met 40.68 komen we dan 29.32 - 29.82 mhz, voor 6m met 22.12 mhz
(afgerond naar boven) kom ik als ik reken voor fm van 50.5 tot 52 mhz, 28.38 tot 29.80 mhz.
het bakkie laat ik daarom werken van 28.38 tot 29.88.
Als ik de diverse ombouwbeschrijvingen lees dan moet 1.5 mhz haalbaar zijn.
Ik ben inmiddels in het bezit van een skyline sm2010 basisbak.
Daar zit als we de voeding er ook nog uithalen ruimte genoeg in.
De deltatuneknop ga ik gebruiken voor het omschakelen van de banden.
Als volgt :
onderste stand: 10m van 28.5 tot 29.7 mhz
middelste stand: 6m van 50.5 tot 52 mhz
bovenste stand: 4m van 70 tot 70.5 mhz
De schakelaar er naast voor 10/12.5khz stapgrootte.
Waar nu de kanalenkiezer zit met het display kont een lcd 16x2.
En de rfgain word de afstemknop (rotary encoder).
In mijn rommelbakjes vond ik een TSA6057 pll ic.
programmeerbaar via i2c en met een 5mhz kristal is de kleinste stap 1.25khz.
perfect dus als vervanging van aanwezige pll de pll08a.
Nu eerst eens ff nadenken over hoe we de software willen.
dat de volgende keer.
Vanaf januari 2012 is er voor zendamateurs de 4m beschikbaar, Om hier op uit te komen
heb ik besloten om een oude 22 kanaals 27mc bakkie om te bouwen naar 10m, om dan met een transverter uit te komen op 4m. Op internet kun je wel wat ombouw beschrijvingen vinden maar niet zoals ik het wil.
Ik heb de volgende wensen:
De bak moet bruikbaar blijven voor 10m
stapgrootte 10khz en 12.5khz.
Naast 4m eventueel ook 6m.
Zendvermogen rond de 2 watt op alle banden
In mijn rommelbak vond ik de volgende kristallen 40.68 mhz en voor 6m 22.1184 mhz.
4m loopt van 70 tot 70.5 met 40.68 komen we dan 29.32 - 29.82 mhz, voor 6m met 22.12 mhz
(afgerond naar boven) kom ik als ik reken voor fm van 50.5 tot 52 mhz, 28.38 tot 29.80 mhz.
het bakkie laat ik daarom werken van 28.38 tot 29.88.
Als ik de diverse ombouwbeschrijvingen lees dan moet 1.5 mhz haalbaar zijn.
Ik ben inmiddels in het bezit van een skyline sm2010 basisbak.
Daar zit als we de voeding er ook nog uithalen ruimte genoeg in.
De deltatuneknop ga ik gebruiken voor het omschakelen van de banden.
Als volgt :
onderste stand: 10m van 28.5 tot 29.7 mhz
middelste stand: 6m van 50.5 tot 52 mhz
bovenste stand: 4m van 70 tot 70.5 mhz
De schakelaar er naast voor 10/12.5khz stapgrootte.
Waar nu de kanalenkiezer zit met het display kont een lcd 16x2.
En de rfgain word de afstemknop (rotary encoder).
In mijn rommelbakjes vond ik een TSA6057 pll ic.
programmeerbaar via i2c en met een 5mhz kristal is de kleinste stap 1.25khz.
perfect dus als vervanging van aanwezige pll de pll08a.
Nu eerst eens ff nadenken over hoe we de software willen.
dat de volgende keer.
vrijdag 23 september 2011
experimenteren met de pcf8574
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
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
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
Abonneren op:
Posts (Atom)

