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
Geen opmerkingen:
Een reactie posten