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

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.


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

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

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.

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