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
Eenvoudige projecten voor de microchip microcontrollers geschreven in picbasic, proton+.
woensdag 31 augustus 2011
maandag 29 augustus 2011
FM radio met TEA5767
Op Ebay had ik een FM radio module gevonden met de TEA5767 voor €2,50. Ik had het idee om hier met een MAX7219 als displaydriver 4 displays aan te sturen, nou dat was niet echt een succes.
De MAX7219 zorgt er voor dat ik alleen een piep hoor, de multiplexfrequentie stoort enorm.
Display dan maar uit en kijken of ik geluid kreeg. Maar ook dat zit tegen. Toch wat fout in het i2c gedeelte? Eerst een LCD en dan maar weer eens proberen. Met het lcd is het ook wat makkelijker om de inhoud van de registers van de tea5756 weer te geven. Voor de aardigheid heb ik de source toegevoegd.
Device 18F2620
Declare Xtal = 20
' i2c
SCL_Pin = PORTC.3
SDA_Pin = PORTC.4
' aansluitingen max7219
Symbol Clk = PORTB.0
Symbol Dta = PORTB.1
Symbol Load = PORTB.2
' adres tea5767
Symbol tea5767 = %01100000
' up en down toets
Symbol Toetsup = PORTB.3
Symbol Toetsdown = PORTB.4
' Variabelen
Dim Frequentie As Word
Dim Pll As Dword
Dim Register As Byte
Dim Waarde As Byte
Dim Digit As Byte
Dim Positie As Byte
TRISB= %00011000
Declare All_Digital = True
' Init MAX7219 zie datasheet
Register = 11 ' aantal displays 0-3 (4)
Waarde = 3
GoSub waardenaarMax
Register = 10 ' Helderheid
Waarde = 9
GoSub waardenaarMax
Register = 9 ' BCD voor 4 disp
Waarde = 15
GoSub waardenaarMax
Register = 12 'Display aan
Waarde = 1
GoSub waardenaarMax
Register = 15 ' Disp test uit
Waarde = 0
GoSub waardenaarMax
Frequentie = 932
main:
If Toetsup = 0 Then GoSub frequp
If Toetsdown = 0 Then GoSub freqdown
GoSub displayfreq
GoSub progtea
GoTo main
frequp:
DelayMS 100
Frequentie = Frequentie + 1
If Frequentie > 1080 Then Frequentie = 1080
Return
freqdown:
DelayMS 100
Frequentie = Frequentie - 1
If Frequentie < 875 Then Frequentie = 875
Return
progtea:
Pll = Frequentie * 100000 + 225000
Pll = Pll * 4 / 32768
BusOut tea5767,[Pll.Byte1,Pll.Byte0,$10,$10,$00] 'zie datasheet tea
Return
displayfreq:
Digit = 0 ' eerste disp
For Positie = 4 To 1 Step -1 ' bepaal reg max
Register = Positie
Waarde = Dig Frequentie,Digit ' bepaal disp waarde
If Frequentie < 1000 And Positie = 1 Then Waarde = 15 ' onder 100 mhz geen 0 op laatste digit
If Digit = 1 Then Waarde.7 = 1 ' punt op digit 1
GoSub waardenaarMax
If Digit >= 3 Then Digit = 0 ' 4 digits gehad ?
Digit = Digit + 1
Next
Return
waardenaarMax:
SHOut Dta,Clk,MsbFirst,[Register,Waarde] 'Waarde via spi naar max
High Load 'enable transfer
DelayUS 2
Low Load
Return
De MAX7219 zorgt er voor dat ik alleen een piep hoor, de multiplexfrequentie stoort enorm.
Display dan maar uit en kijken of ik geluid kreeg. Maar ook dat zit tegen. Toch wat fout in het i2c gedeelte? Eerst een LCD en dan maar weer eens proberen. Met het lcd is het ook wat makkelijker om de inhoud van de registers van de tea5756 weer te geven. Voor de aardigheid heb ik de source toegevoegd.
Device 18F2620
Declare Xtal = 20
' i2c
SCL_Pin = PORTC.3
SDA_Pin = PORTC.4
' aansluitingen max7219
Symbol Clk = PORTB.0
Symbol Dta = PORTB.1
Symbol Load = PORTB.2
' adres tea5767
Symbol tea5767 = %01100000
' up en down toets
Symbol Toetsup = PORTB.3
Symbol Toetsdown = PORTB.4
' Variabelen
Dim Frequentie As Word
Dim Pll As Dword
Dim Register As Byte
Dim Waarde As Byte
Dim Digit As Byte
Dim Positie As Byte
TRISB= %00011000
Declare All_Digital = True
' Init MAX7219 zie datasheet
Register = 11 ' aantal displays 0-3 (4)
Waarde = 3
GoSub waardenaarMax
Register = 10 ' Helderheid
Waarde = 9
GoSub waardenaarMax
Register = 9 ' BCD voor 4 disp
Waarde = 15
GoSub waardenaarMax
Register = 12 'Display aan
Waarde = 1
GoSub waardenaarMax
Register = 15 ' Disp test uit
Waarde = 0
GoSub waardenaarMax
Frequentie = 932
main:
If Toetsup = 0 Then GoSub frequp
If Toetsdown = 0 Then GoSub freqdown
GoSub displayfreq
GoSub progtea
GoTo main
frequp:
DelayMS 100
Frequentie = Frequentie + 1
If Frequentie > 1080 Then Frequentie = 1080
Return
freqdown:
DelayMS 100
Frequentie = Frequentie - 1
If Frequentie < 875 Then Frequentie = 875
Return
progtea:
Pll = Frequentie * 100000 + 225000
Pll = Pll * 4 / 32768
BusOut tea5767,[Pll.Byte1,Pll.Byte0,$10,$10,$00] 'zie datasheet tea
Return
displayfreq:
Digit = 0 ' eerste disp
For Positie = 4 To 1 Step -1 ' bepaal reg max
Register = Positie
Waarde = Dig Frequentie,Digit ' bepaal disp waarde
If Frequentie < 1000 And Positie = 1 Then Waarde = 15 ' onder 100 mhz geen 0 op laatste digit
If Digit = 1 Then Waarde.7 = 1 ' punt op digit 1
GoSub waardenaarMax
If Digit >= 3 Then Digit = 0 ' 4 digits gehad ?
Digit = Digit + 1
Next
Return
waardenaarMax:
SHOut Dta,Clk,MsbFirst,[Register,Waarde] 'Waarde via spi naar max
High Load 'enable transfer
DelayUS 2
Low Load
Return
dinsdag 23 augustus 2011
Vervolg onweer detector.
Na het lezen van wat info, heb ik aan de onweer detector een counter aangesloten die het aantal strikes per 5 minuten weergeeft, maar het wordt wel elke minuut bijgewerkt. Verder heb ik de puls van de ne555 verkort tot 0.2 seconden, Het werkt prima, helaas ontwijkt het onweer Friesland, en heb dus nog niet echt veel strikes per 5 minuten gezien, De detector is nu aangesloten op een inverted V voor de 20m amateurband de antenne zit onderdak. Ongeveer richting zuid/noord dat scheelt behoorlijk in de gevoeligheid, het onweerde in Overijssel dit kon ik duidelijk waarnemen. Onder de foto's staat de source welk nog verder kunnen uitbreiden. De detector is aangesloten op portb.0.
Device 16F88
Xtal 4
LCD_DTPin PORTA.0
LCD_ENPin PORTB.3
LCD_RSPin PORTB.4
TRISB=%00000001 ' PortB.0 as input
ANSEL = 0 ' all Portb.7 digital
Dim teller As Byte
Dim strikes[5] As Word
Dim strikeslcd As Word
Cls
DelayMS 100
Print At 1,1,"Initializing"
Clear
main:
For teller = 0 To 4
strikes[teller] = Counter PORTB.0,60000
strikeslcd = strikes[0] + strikes[1] + strikes[2] + strikes[3] + strikes[4]
Print At 1,1,Dec4 strikeslcd," Strikes/5m"
Next teller
GoTo main
End
Device 16F88
Xtal 4
LCD_DTPin PORTA.0
LCD_ENPin PORTB.3
LCD_RSPin PORTB.4
TRISB=%00000001 ' PortB.0 as input
ANSEL = 0 ' all Portb.7 digital
Dim teller As Byte
Dim strikes[5] As Word
Dim strikeslcd As Word
Cls
DelayMS 100
Print At 1,1,"Initializing"
Clear
main:
For teller = 0 To 4
strikes[teller] = Counter PORTB.0,60000
strikeslcd = strikes[0] + strikes[1] + strikes[2] + strikes[3] + strikes[4]
Print At 1,1,Dec4 strikeslcd," Strikes/5m"
Next teller
GoTo main
End
vrijdag 19 augustus 2011
Basisontvanger wireless temperatuur sensor
In juli heb ik een temperatuur sensor beschreven met 12f683 en een ds1820, hierbij de ontvanger. Als ontvanger gebruik ik een AM ontvanger van conrad, de data uitgang is aangesloten op portb.1.Het lcd zit ook op portb zie source. De werking. De PIC kijkt in een loop of er een $55 word ontvangen.
Is dit het geval dan gaan we naar de volgende routine waarbij de data ontvangen word. Mocht hier iets niet goed gaan gaan we terug naar de hoofdroutine. Is er wel goede data dan springen we als de zender 1 is naar de display routine. De errorchecking zit er nog niet in. Het is een bassis en de ontvangst gaat prima. Voor de pic heb ik gekozen voor een 18f2620
Ik heb drie tellers er in zitten die aangeven hoeveel keer er $55 is ontvangen, hoeveel keer data ontvangen is en hoeveel keer er iets op het lcd is gezet.
Device 18F2620
Xtal 20
ADCON1=7
LCD_DTPin PORTB.4
LCD_ENPin PORTB.3
LCD_RSPin PORTB.2
Print $FE, $40, $08, $14, $08, $03, $04, $04, $03, $00 ' celcius
Dim telontv As Word
Dim tempser As Byte
Dim teller As Byte
Dim teldoor As Word
Dim telzend As Word
Dim regel As Byte
Dim tempdata As Bit
Dim manchest1 As Word
Dim manchest2 As Word
Dim manchest3 As Word
Dim manchest4 As Word
Dim manchest5 As Word
Dim manchest6 As Word
Dim manchestck As Word
Dim manchestin As Word
Dim byteout As Byte
Dim zender As Byte
Dim decode1 As Byte
Dim decode2 As Byte
Dim decode3 As Byte
Dim decode4 As Byte
Dim decode5 As Byte
Dim checksum As Byte
Dim templcd As Byte
Dim tempture As Word
Cls
telontv = 0
teldoor = 0
telzend = 0
main:
SerIn PORTB.1,49965,1,geendata, [tempser]
If tempser =$55 Then GoTo rest
GoTo main
geendata:
tempser=$ff
GoTo main
rest:
teldoor = teldoor + 1
Print At 2,1 , Dec3 teldoor
SerIn PORTB.1,49965, 10, geendata,[Wait($AA), manchest1.HighByte,manchest1.LowByte, manchest2.HighByte, manchest2.LowByte,manchest3.HighByte,manchest3.LowByte]
SerIn PORTB.1,49965,[manchest4.HighByte, manchest4.LowByte,manchest5.HighByte,manchest5.LowByte, manchest6.HighByte, manchest6.LowByte,manchestck.HighByte, manchestck.LowByte]
telontv = telontv + 1
Print At 2,5, Dec3 telontv
GoSub decodeall
If zender = 1 Then GoSuB showtemp
GoTo main
showtemp:
telzend = telzend + 1
Print At 2,9,Dec3 telzend
tempture.HighByte= decode2
tempture.LowByte = decode1
Print At 1,1, Dec2 (tempture / 100),".",Dec2 tempture,0
Return
decodeall:
manchestin = manchest1
GoSub decodmanchester
zender = byteout
manchestin = manchest2
GoSub decodmanchester
decode1 = byteout
manchestin = manchest3
GoSub decodmanchester
decode2 = byteout
manchestin = manchest4
GoSub decodmanchester
decode3 = byteout
manchestin = manchest5
GoSub decodmanchester
decode4 = byteout
manchestin = manchest6
GoSub decodmanchester
decode5 = byteout
manchestin = manchestck
GoSub decodmanchester
checksum = byteout
Return
decodmanchester:
byteout=$00
For teller=7 To 0 Step -1
tempdata = GetBit manchestin,(teller*2)
If tempdata = 1 Then
tempdata = GetBit manchestin,(teller*2+1)
If tempdata = 0 Then
SetBit byteout,teller
EndIf
EndIf
Next teller
Return
Is dit het geval dan gaan we naar de volgende routine waarbij de data ontvangen word. Mocht hier iets niet goed gaan gaan we terug naar de hoofdroutine. Is er wel goede data dan springen we als de zender 1 is naar de display routine. De errorchecking zit er nog niet in. Het is een bassis en de ontvangst gaat prima. Voor de pic heb ik gekozen voor een 18f2620
Ik heb drie tellers er in zitten die aangeven hoeveel keer er $55 is ontvangen, hoeveel keer data ontvangen is en hoeveel keer er iets op het lcd is gezet.
Device 18F2620
Xtal 20
ADCON1=7
LCD_DTPin PORTB.4
LCD_ENPin PORTB.3
LCD_RSPin PORTB.2
Print $FE, $40, $08, $14, $08, $03, $04, $04, $03, $00 ' celcius
Dim telontv As Word
Dim tempser As Byte
Dim teller As Byte
Dim teldoor As Word
Dim telzend As Word
Dim regel As Byte
Dim tempdata As Bit
Dim manchest1 As Word
Dim manchest2 As Word
Dim manchest3 As Word
Dim manchest4 As Word
Dim manchest5 As Word
Dim manchest6 As Word
Dim manchestck As Word
Dim manchestin As Word
Dim byteout As Byte
Dim zender As Byte
Dim decode1 As Byte
Dim decode2 As Byte
Dim decode3 As Byte
Dim decode4 As Byte
Dim decode5 As Byte
Dim checksum As Byte
Dim templcd As Byte
Dim tempture As Word
Cls
telontv = 0
teldoor = 0
telzend = 0
main:
SerIn PORTB.1,49965,1,geendata, [tempser]
If tempser =$55 Then GoTo rest
GoTo main
geendata:
tempser=$ff
GoTo main
rest:
teldoor = teldoor + 1
Print At 2,1 , Dec3 teldoor
SerIn PORTB.1,49965, 10, geendata,[Wait($AA), manchest1.HighByte,manchest1.LowByte, manchest2.HighByte, manchest2.LowByte,manchest3.HighByte,manchest3.LowByte]
SerIn PORTB.1,49965,[manchest4.HighByte, manchest4.LowByte,manchest5.HighByte,manchest5.LowByte, manchest6.HighByte, manchest6.LowByte,manchestck.HighByte, manchestck.LowByte]
telontv = telontv + 1
Print At 2,5, Dec3 telontv
GoSub decodeall
If zender = 1 Then GoSuB showtemp
GoTo main
showtemp:
telzend = telzend + 1
Print At 2,9,Dec3 telzend
tempture.HighByte= decode2
tempture.LowByte = decode1
Print At 1,1, Dec2 (tempture / 100),".",Dec2 tempture,0
Return
decodeall:
manchestin = manchest1
GoSub decodmanchester
zender = byteout
manchestin = manchest2
GoSub decodmanchester
decode1 = byteout
manchestin = manchest3
GoSub decodmanchester
decode2 = byteout
manchestin = manchest4
GoSub decodmanchester
decode3 = byteout
manchestin = manchest5
GoSub decodmanchester
decode4 = byteout
manchestin = manchest6
GoSub decodmanchester
decode5 = byteout
manchestin = manchestck
GoSub decodmanchester
checksum = byteout
Return
decodmanchester:
byteout=$00
For teller=7 To 0 Step -1
tempdata = GetBit manchestin,(teller*2)
If tempdata = 1 Then
tempdata = GetBit manchestin,(teller*2+1)
If tempdata = 0 Then
SetBit byteout,teller
EndIf
EndIf
Next teller
Return
maandag 15 augustus 2011
Onweer detector
Voor het detecteren van onweer vind je op internet diverse schema's van detectors, waarvan 1 zeer veel gebouwd wordt. Dat is de schakeling van techlib.com
en ik moet zeggen dat werkt prima. Het is een klein ontvangertje wat ontvangt rond de 300khz, ik heb achter de detector een ne555 gezet die van een puls een puls maakt van ca 0,5 seconden. Zodat we van 1 flits niet meerdere detecties krijgen. Nu nog een counter met een pic en een 433mhz zender, zodat we op het in aanbouw zijnde basisstation het aantal ontladingen per minuut kunnen aflezen.
en ik moet zeggen dat werkt prima. Het is een klein ontvangertje wat ontvangt rond de 300khz, ik heb achter de detector een ne555 gezet die van een puls een puls maakt van ca 0,5 seconden. Zodat we van 1 flits niet meerdere detecties krijgen. Nu nog een counter met een pic en een 433mhz zender, zodat we op het in aanbouw zijnde basisstation het aantal ontladingen per minuut kunnen aflezen.
donderdag 11 augustus 2011
afstandmeting met hc-sr04
Met een beetje geluk heb ik op ebay voor omgerekend €2,50 een hc-sr04 ultrasonic sensor met een veiling gewonnen.
Normaal heb je ze met nu kopen ongeveer vanaf €5,00 wat eigenlijk ook niet zo duur is.
Op internet kun je verder genoeg info er over vinden. Ik heb heel snel een afstandmeter er mee gemaakt en dat werkt prima. Ik kon in ieder geval in de woonkamer tot 4 meter meten. Onderaan vind je de source die ik gebruikt heb. Kun je naar eigen wens aanpassen.
Device 18F2620
Xtal 20
ADCON1=7
LCD_DTPin PORTB.4
LCD_ENPin PORTB.3
LCD_RSPin PORTB.2
TRISC=%00000010
Symbol TRIGGER = PORTC.2 'Trigger puls
Symbol ECHO = PORTC.1 'Echo puls
Dim Afstand As Word
Cls
DelayMS 100
While 1 = 1
PulsOut TRIGGER,15,High 'Trigger puls van 15us
Afstand = PulsIn ECHO,1 ' Meet afstand in uS
Afstand = Afstand * 2 / 58 ' 20 mhz (2uS instructietijd)
Print At 1,1,"Afstand = ", Dec Afstand," cm "
DelayMS 100
Wend
Normaal heb je ze met nu kopen ongeveer vanaf €5,00 wat eigenlijk ook niet zo duur is.
Op internet kun je verder genoeg info er over vinden. Ik heb heel snel een afstandmeter er mee gemaakt en dat werkt prima. Ik kon in ieder geval in de woonkamer tot 4 meter meten. Onderaan vind je de source die ik gebruikt heb. Kun je naar eigen wens aanpassen.
Device 18F2620
Xtal 20
ADCON1=7
LCD_DTPin PORTB.4
LCD_ENPin PORTB.3
LCD_RSPin PORTB.2
TRISC=%00000010
Symbol TRIGGER = PORTC.2 'Trigger puls
Symbol ECHO = PORTC.1 'Echo puls
Dim Afstand As Word
Cls
DelayMS 100
While 1 = 1
PulsOut TRIGGER,15,High 'Trigger puls van 15us
Afstand = PulsIn ECHO,1 ' Meet afstand in uS
Afstand = Afstand * 2 / 58 ' 20 mhz (2uS instructietijd)
Print At 1,1,"Afstand = ", Dec Afstand," cm "
DelayMS 100
Wend
zondag 7 augustus 2011
Barometer met de ms5540b van Measurement Specialties (Intersema)
Op ebay kwam ik voor een paar dollar de ms5540b tegen. In de elektor van juni 2005 heeft een schakeling gestaan voor deze sensor. De ms5540b is volledig software compatible met de ms5534 die elektor gebruikt.
Ik heb de schakeling op een breadboard gebouwd en het werkt redelijk. De barometer is niet echt stabiel en schommelt ongeveer 5 hPa (zal in de software zitten), de temperatuur is wel stabiel. Nu gaan we proberen om de source om te zetten naar proton+, De elektor versie is te downloaden bij elektor.
Ik heb de schakeling op een breadboard gebouwd en het werkt redelijk. De barometer is niet echt stabiel en schommelt ongeveer 5 hPa (zal in de software zitten), de temperatuur is wel stabiel. Nu gaan we proberen om de source om te zetten naar proton+, De elektor versie is te downloaden bij elektor.
Abonneren op:
Posts (Atom)