instelbare deler via up/down toets

Arco

Special Member

Dit zou moeten werken voor een PIC16F1936 (Mikrobasic. niet getest)
Toetsen op RA0 en RA1 naar Vcc met pull-down weerstand, bcd output op Port B en C. Interne oscillator op 500kHz.
Auto-repeat na 1 seconde. Ontdendertijd is 50mS. Wrap-around bij Min/Max waarde. Hex file attached...

pic basic code:


'==================================================================================================
'                       PortC                     |                     PortB
' |  7  |  6  |  5  |  4  |  3  |  2  |  1  |  0  |  7  |  6  |  5  |  4  |  3  |  2  |  1  |  0  |
' |        digit 4        |        digit 3        |        digit 2        |        digit 1        |
'==================================================================================================  
Program Test

Dim KeyUp     As sbit at PORTA.B0
    KeyDn     As sbit at PORTA.B1

Dim Cnt       As Word
    KeyCnt    As Byte
    KeyRepCnt As Byte
    Flags     As Byte
    fRep      As sbit at Flags.0

Const MINCNT   = 3300
      MAXCNT   = 5300
      STARTCNT = 3300
      REPTIME  = 8  'x10ms
      DEBOUNCE = 5  'x10ms
'========================================================================================
Sub procedure Interrupt() iv 0x0004 ics ICS_AUTO
'========================================================================================
  If TMR2IF_bit = 1 Then
    If (KeyUp) Or (KeyDn) Then
      If KeyCnt < 250 Then Inc (KeyCnt) End If
      If KeyCnt = 100 Then fRep = 1 End If
      If KeyUp then
        If KeyCnt = DEBOUNCE Then
          If Cnt > MAXCNT Then Cnt = MINCNT Else Inc(Cnt) End If
        End If
        If fRep Then
          Inc(KeyRepCnt)
          If KeyRepCnt >= REPTIME Then 
            If Cnt > MAXCNT Then Cnt = MINCNT Else Inc(Cnt) End If
            KeyRepCnt = 0
          End If
        End If
      End If
      If KeyDn Then
        If KeyCnt = DEBOUNCE Then
          If Cnt < MINCNT Then Cnt = MAXCNT Else Dec(Cnt) End If
        End If
        If fRep Then
          Inc(KeyRepCnt)
          If KeyRepCnt >= REPTIME Then
            If Cnt < MINCNT Then Cnt = MAXCNT Else Dec(Cnt) End If
            KeyRepCnt = 0
          End If
        End If
      End If
    Else
      fRep   = 0
      KeyCnt = 0
      KeyRepCnt = 0
    End If
    TMR2IF_bit = 0
  End If
End Sub

'========================================================================================
Sub Procedure Init()
'========================================================================================
  TRISA  = 0x03    ANSELA = 0
  TRISB  = 0x00    ANSELB = 0
  TRISC  = 0x00
  PR2    = 124
  T2CON  = %01001100
  TMR2IE_bit = 1
  GIE_bit    = 1
  PEIE_bit   = 1
  Cnt = STARTCNT
End Sub

'========================================================================================
main:

'========================================================================================
  Init()
  while true
    LATB = Lo(Dec2BCD16(Cnt))
    LATC = Hi(Dec2BCD16(Cnt))
    Delay_ms(10)
  wend
End.
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Arco

Special Member

Heb de code nog wat aangepast, er zaten wat puntjes die verbeterd konden worden...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Persoonlijk zou ik er nog een I2C schermpje aan hangen zodat je de huidige deelfactor kunt weergeven, dat kost maar 2 PI/O pinnen. Daarbij lijkt en encoder me eigenlijk prettiger om het mee in te stellen dan knopjes, maar dat ligt eraan wat je er precies mee wilt doen.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Arco

Special Member

TS heeft al een frequentie uitlezing, dus dat zou dubbelop zijn.
(je kunt zoals hij zegt natuurlijk altijd een 7 segment display/decoder aan elke poort hangen)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 19 oktober 2022 00:22:26 schreef SparkyGSX:
Daarbij lijkt en encoder me eigenlijk prettiger om het mee in te stellen dan knopjes, maar dat ligt eraan wat je er precies mee wilt doen.

Dat werkt idd prettiger maar weinig goed verkrijgbare encoders voldoen om zoiets te implementeren.
Het probleem is hier de 2000steps die je vloeiend moet kunnen overbruggen en binnen redelijke tijd, anders is het een lijdensweg.

LDmicro user.
mel

Golden Member

Ik heb wel eens encoders gebruikt voor pulsgever, dit gaat vrij goed.
met encoders bedoel ik dan richting gevers die je op een as zet om de richting en de snelheid te bepalen.

[Bericht gewijzigd door mel op woensdag 19 oktober 2022 08:12:27 (44%)

u=ir betekent niet :U bent ingenieur..
Arco

Special Member

Met up/down toets is ook goed werkbaar. Bij auto-repeat doet 'ie nu 12.5 stappen per seconde, maar dat kan indien nodig natuurlijk veel sneller.
Meestal wil je zoeken binnen een bepaald gebiedje, en ga je niet als een wilde van het ene uiteinde naar het andere springen... (niet al te snel is dan juist een pré...)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Ik heb nog zitten nadenken om het analoog te doen: Een condensator laad langzaam op en bepaalt de frequentie van een oscillator die dan de counters aanstuurt. edit: ... iets verder uitgewerkt: Condensator laad op tot 5V indien schakelaar niet ingedrukt. met de schakelaar ingedrukt ontlaad de condensator en dan een zaagtand 10V/sec van nul tot de condensator spanning. Zodra de condensatorspanning bereikt is ontlaad je de zaagtand condensator snel en begin je overnieuw. Met de 10V/sec heb ik de eerste puls in ongeveer een halve seconde. Door de timing condensator niet naar nul maar naar zeg 0.1V te laten ontladen kan je een max stepsnelheid bereiken (met 10V/sec wordt dat dan 100 steps per sec.)

Met 12 steps per seconde doe je de eerste stap na 80ms. Het is voor de meeste mensen lastig om een knop in te drukken en binnen 100ms weer los te laten. Je moet minstens de eerste 1 of 2 repeats overslaan om ook een "step-by-one" prettig mogelijk te maken.

[Bericht gewijzigd door rew op woensdag 19 oktober 2022 10:38:11 (39%)

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Arco

Special Member

Zie commentaar bij code, auto-repeat begint pas na 1 seconde... ;)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 19 oktober 2022 09:34:33 schreef Arco:
...
Meestal wil je zoeken binnen een bepaald gebiedje, en ga je niet als een wilde van het ene uiteinde naar het andere springen... (niet al te snel is dan juist een pré...)

Dat is niet zeker, als je de laatste stand van de knop niet onthouden hebt en je zit voortdurend in de hoogste getallen te zoeken moet je elke keer dat je opstart naar de hoogste stand draaien.

LDmicro user.

Op 19 oktober 2022 10:33:11 schreef Arco:
Zie commentaar bij code, auto-repeat begint pas na 1 seconde... ;)

Sorry. Had ik geskipped: zowel Basic- als PIC code ga ik niet voor de lol lezen. :-)

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Arco

Special Member

Ik heb hetzelfde met C... :)
Versie met autosave/restore na 10 seconden van inactiviteit met keyup/down toetsen:

pic basic code:


'==================================================================================================
' |                     PortC                     |                     PortB                     |
' |  7  |  6  |  5  |  4  |  3  |  2  |  1  |  0  |  7  |  6  |  5  |  4  |  3  |  2  |  1  |  0  |
' |        digit 4        |        digit 3        |        digit 2        |        digit 1        |
'==================================================================================================  
Program Test

Dim KeyUp     As sbit at PORTA.B0
    KeyDn     As sbit at PORTA.B1

Dim Cnt       As Word
    KeyCnt    As Byte
    KeyRepCnt As Byte
    SaveCnt   As Word
    Flags     As Byte
      fRep    As sbit at Flags.0
      fSave   As sbit at Flags.1

Const MINCNT    = 3300
      MAXCNT    = 5300
      STARTCNT  = 3300
      REPTIME   = 8
      DEBOUNCE  = 5
      SAVETIME  = 1000
      EEADDRESS = 0x20
'========================================================================================
Sub procedure Interrupt() iv 0x0004 ics ICS_AUTO
'========================================================================================
  If TMR2IF_bit = 1 Then
    If (KeyUp) Or (KeyDn) Then
      If KeyCnt < 250 Then Inc (KeyCnt) End If
      If KeyCnt = 100 Then fRep = 1 End If
      If KeyUp then
        If KeyCnt = DEBOUNCE Then
          If Cnt > MAXCNT Then Cnt = MINCNT Else Inc(Cnt) End If
        End If
        If fRep Then
          Inc(KeyRepCnt)
          If KeyRepCnt >= REPTIME Then
            If Cnt > MAXCNT Then Cnt = MINCNT Else Inc(Cnt) End If
            KeyRepCnt = 0
          End If
        End If
      End If
      If KeyDn Then
        If KeyCnt = DEBOUNCE Then
          If Cnt < MINCNT Then Cnt = MAXCNT Else Dec(Cnt) End If
        End If
        If fRep Then
          Inc(KeyRepCnt)
          If KeyRepCnt >= REPTIME Then
            If Cnt < MINCNT Then Cnt = MAXCNT Else Dec(Cnt) End If
            KeyRepCnt = 0
          End If
        End If
      End If
      SaveCnt = 0
    Else
      fRep   = 0
      KeyCnt = 0
      KeyRepCnt = 0
      If SaveCnt < SAVETIME Then
        Inc(SaveCnt)
        If SaveCnt = SAVETIME Then fSave = 1 End If
      End If
    End If
    TMR2IF_bit = 0
  End If
End Sub

'========================================================================================
Sub Procedure Init()
'========================================================================================
  TRISA  = 0x03    ANSELA = 0
  TRISB  = 0x00    ANSELB = 0
  TRISC  = 0x00
  Flags  = 0
  PR2    = 124      'Timer2 interrupt 500000/4/125/10 = 10ms
  T2CON  = %01001100
  TMR2IE_bit = 1
  GIE_bit    = 1
  PEIE_bit   = 1
  Hi(Cnt) = EEProm_Read(EEADDRESS)
  Lo(Cnt) = EEProm_Read(EEADDRESS+1)
  If (Cnt < MINCNT) or (Cnt > MAXCNT) Then Cnt = STARTCNT End If
End Sub

'========================================================================================
main:

'========================================================================================
  Init()
  while true
    LATB = Lo(Dec2BCD16(Cnt))
    LATC = Hi(Dec2BCD16(Cnt))
    If fSave Then
      EEProm_Write(EEADDRESS, Hi(Cnt))
      EEProm_Write(EEADDRESS+1, Lo(Cnt))
      fSave = 0
    End If
    Delay_ms(10)
  wend
End.
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 19 oktober 2022 11:06:53 schreef Arco:
Versie met autosave/restore na 10 seconden van inactiviteit met keyup/down toetsen:

Ik had daar nog een leuke bug mee laatst. Nieuwe bridgeklok naar de club meegenomen.... Na een paar minuten: crash: loopt niet verder. Grmbl. Dus thuis geprobeerd: Werkt prima. Weer naar de club: Werkt prima.

Dan thuis verder werken aan de software... Blijkt dat als je de instellingen (mogelijk) gewijzigd hebt die autosave na zoveel tijd plaatsvind. Ik had de software geport van STM32 naar RP2040 en vergeten een klein stukje infrastructuur op te zetten om de "save-to-flash" te laten werken.

Ik heb dus eerst thuis en later de 2e keer op de club gewoon mazzel gehad dat de "er is mogelijk wat gewijzigd" niet getriggerd was. (die staat iets te gevoelig: Hij triggert ook als je niets wijzigt). (De RP2040 is een beetje tricky: Je mag GEEN code uit flash uitvoeren als er een flash-write loopt. De STM32 stopt gewoon tot het klaar is).

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Zo daar ben ik weer. Arco heeft al een code geschreven voor een Pic, maar wat doe ik daar verder mee.
En hoe sluit ik die 16 data lijnen aan op de Pic.
Om even terug te komen op een schakeling met TTL ic´s kan ik mij herinneren dat zo schakeling ook eens heeft gestaan in het blad Electron van de Veron.
Dat artikel was getiteld 400 kanalen op een bepaalde tranciever, dat is alles wat ik er nog van weet te herinneren.
Daar stond ook in hoe dat bestuurd kan worden met een optische encoder.

Dat aansluiten op een optische encoder moet heel makkelijk zijn, het gaat op een flip/flop schakeling die de pulsjes maakt, het fijne weet ik er echter niet van.
Is er iemand die hier een voorbeeld van heeft.
Draaien aan een knop lijkt mij makkelijker als drukken op een up of down teller.

De rest van de schakeling is makkelijk te tekenen en ik heb het schema al aardig uitgewerkt in mijn hoofd zitten.

Het instellen van een preset van de tellers kan ik toch doen door de input lijnen A,B,C,D op logisch 1 of nul nivo te zetten.
Dan begint de teller vanaf een bepaalde waarde 3300 te tellen.
Hoe ik dat moet doen is wat proberen, het fijne weet ik er niet van.
edit in een schema van een frequentie teller wordt de 74HC190 gebruikt dat is een synchronous up down counter met down up mode control waar de ingangen A,B,C,D op logisch 1 of nul worden gezet met een dip schakelaar.

edit even een kleine zoekactie op google geeft genoeg voorbeelden om een optische encoder aan te sluiten op een flip flop.

Telefunken Sender Systeme Berlin
Arco

Special Member

Aansluiten staat boven de sourcecode (port b en c):
Kan uiteraard (na aanpassing) ook met een rotary encoder.

(ikzelf vindt druktoetsen fijner...)

Versie voor encoder (aansluiten zelfde, code is nog veel simpeler):

pic basic code:


'======================================================================================
Program Test

Dim REncA         As sbit at PORTA.B0
    REncB         As sbit at PORTA.B1

Dim Cnt           As Word
    KeyCnt        As Byte
    KeyRepCnt     As Byte
    SaveCnt       As Word
    Flags         As Byte
      fSave       As sbit at Flags.0
      fOldREncA   As sbit at Flags.1

Const MINCNT    = 3300
      MAXCNT    = 5300
      STARTCNT  = 3300
      REPTIME   = 8
      SAVETIME  = 1000
      EEADDRESS = 0x20
'========================================================================================
Sub procedure Interrupt() iv 0x0004 ics ICS_AUTO
'========================================================================================
  If TMR2IF_bit = 1 Then
    If SaveCnt < SAVETIME Then
      Inc(SaveCnt)
      If SaveCnt = SAVETIME Then fSave = 1 End If
    End If
    TMR2IF_bit = 0
  End If
End Sub

'========================================================================================
Sub Procedure Init()
'========================================================================================
  TRISA  = 0x03    ANSELA = 0
  TRISB  = 0x00    ANSELB = 0
  TRISC  = 0x00
  Flags  = 0
  PR2    = 124
  T2CON  = %01001100
  TMR2IE_bit = 1
  GIE_bit    = 1
  PEIE_bit   = 1
  Hi(Cnt) = EEProm_Read(EEADDRESS)
  Lo(Cnt) = EEProm_Read(EEADDRESS+1)
  If (Cnt < MINCNT) or (Cnt > MAXCNT) Then Cnt = STARTCNT End If
End Sub

'========================================================================================
main:

'========================================================================================
  Init()
  while true
    If REncA <> fOldREncA Then
      Delay_ms(5)
      If REncA <> fOldREncA Then
        If (REncA = 1) And (REncB = 1) Then
          Inc(Cnt) 
          If (Cnt > MAXCNT) Then Cnt = MINCNT End If
        End If
        If (REncA = 1) And (REncB = 0) Then
          Dec(Cnt) 
          If (Cnt < MINCNT) Then Cnt = MAXCNT End If
        End If
        fOldREncA = REncA
        SaveCnt = 0
        LATB = Lo(Dec2BCD16(Cnt))
        LATC = Hi(Dec2BCD16(Cnt))
      End If
      If fSave Then
        EEProm_Write(EEADDRESS, Hi(Cnt))
        EEProm_Write(EEADDRESS+1, Lo(Cnt))
        fSave = 0
      End If
    End If
  wend
End.

Test.hex

[Bericht gewijzigd door Arco op woensdag 19 oktober 2022 15:05:01 (88%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Arco welke programmer raad je mij aan. Ik zie prijzen van 59 euro en die zijn alweer obsolete. Vaak zit er niet veel aan componenten in, zodat ik zelf ook zoiets kan maken, dat is nog goedkoper.
Alvast bedankt voor de moeite je neemt om een programma te schrijven.
En ik moet zeggen dat deze manier wel erg aantrekkelijk is, omdat er geen andere componenten en ic´s nodig zijn.

Telefunken Sender Systeme Berlin

Dat is eigenlijk waarom ik een Arduino (kloon) zou gebruiken, je hebt geen programmer nodig, daar zit gewoon een USB bootloader in.

Voor de PICs heb je wel een aparte programmer nodig, maar die is vast ook wel te krijgen voor een paar euro in China.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken
Arco

Special Member

Pickit2 met voetje voor DIL versie is hier €14.59: https://nl.aliexpress.com/item/1005003684254048.html
Zelf bouwen kan, maar er zit aardig wat in...:

Bootloader voor zo'n klein processortje vind ik overkill (en gemakzucht... :) )

[Bericht gewijzigd door Arco op woensdag 19 oktober 2022 19:26:57 (42%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Hoever sta je ermee? ga je zelf pic's programmeren?

Gisteren had ik wat tijd om mijn versie op een prikbord te plaatsen en hier is het resultaat, zie filmpje

https://www.youtube.com/watch?v=TUZAj738AYA
Was het verkeerde filmpje nu is het juist.

Arco was iets sneller met zijn versie maar heeft waarschijnlijk meer tijd ;)

Deze versie is voor een 16F876a omdat ik er nog wel enkele in stock heb en veel prikbordversies.
Omzetten naar een 16F886 zou ook kunnen.
Met zo'n goedkope rotary encoder is dat niet werkbaar en een andere goed in de handel verkrijgbare heb ik niet.

De automatische opslagtijd van de instelling heb ik op 2sec gezet, volgens mij is het beter en niet levensbedreigend voor de chip.

De display's in het filmpje zijn oude HP5082-7300 met een BCD input en zijn heel moeilijk/niet verkrijgbaar.
Het schema is bijna identiek aan dat van ARCO, enkel heb je extern kristal/resonator (20Mhz) nodig en zijn de display's van plaats verwisseld.

Digit3 = eenheden
Digit4 = tientallen
Digit1 = honderdtallen
Digit2 = duizendtallen

Ik heb de hexfile erbij gevoegd moest je die zelf willen programmeren.
Het programma zelf is geschreven in LDmicro maar niemand heeft daar interesse voor en ik zou het eerst nog moeten opkuisen voor publicatie moesten er gegadigden zijn.

LDmicro user.

Mooi filmpje MGP.
De laatste dagen ben ik druk geweest met het ontwerp van de oscillator voor het frequentiebereik 3300 tot 5300kHz.
En ik heb het voor elkaar gekregen een zeer goede frequentie stabiliteit te krijgen, zo goed dat een PLL niet meer nodig is.
Het verloop van deze oscillator is niet meer als 10Hz in 10min. tijd op 5300kHz en dat maakt een PLL regeling overbodig.
En na die eerste inschakeling, na 10min. is het verloop helemaal niet meer en blijft op de frequentie staan met kristal stabiliteit.
Het gedoe rond om de PIC heb ik voor me uitgeschoven, maar kan ik geen Arduino ervoor gebruiken dan heb ik geen programmer nodig.

Telefunken Sender Systeme Berlin

kan ik geen Arduino ervoor gebruiken

Ja, dat moet zeker kunnen. Denk bv. aan een Arduino Nano, 1 analoge ingang leest enkele drukknoppen in, en een cascade van 74xx595 vormt uw 13 uitgangsbits. Status uitvoeren kan via een karakter-lcd en/of serieel.

Op 22 oktober 2022 22:44:55 schreef Martin V:
Het gedoe rond om de PIC heb ik voor me uitgeschoven, maar kan ik geen Arduino ervoor gebruiken dan heb ik geen programmer nodig.

Mooi dat je het anders opgelost hebt.
Arduino is niet mijn ding, er zullen wel anderen zijn die dat wel kunnen.

Maak je geen zorgen over mij want ik ging het sowieso toch eens geprogrammeerd hebben zonder dat je het wist, want ik heb nood aan ideeën ;)

Ik maak van veel wat hier voorbijkomt een programma en een testopstelling, laatst nog dat vuurtorenlicht nog gemaakt alsook de 3 staps ledverlichting maar niet gepubliceerd want als de TS geen pic's kan programmeren heeft het eigenlijk geen zin en daar kan ik wel mee leven.

Op naar het volgende idee :)

LDmicro user.

Als je alsnog met delers in de weer zou willen is misschien een cd4059 een bruikbare oplossing?

Arco

Special Member

Het gedoe rond om de PIC heb ik voor me uitgeschoven

Microcontroller in dit geval is vooruitgang... :) (simpeler als 4 onderdelen wordt 't niet...)
Misschien heeft iemand nog wel een 1936 liggen en wil die programmeren/leveren...
(ik zelf heb niet veel meer in DIL...)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com