Voorbeelden met Profilab Expert 4.0

Lambiek

Special Member

Het is de bedoeling dat ik in dit topic voorbeelden ga plaatsen met Profilab Expert 4.0 in combinatie met een microcontroller.

De controller die ik ga gebruiken is een 16F887. Dit type controller ga ik voor alle voorbeelden gebruiken. Maar voor de gene die dit na willen bouwen, een ander type controller kan ook.

Om te kunnen communiceren met Profilab hebben we een USB naar RS232 converter nodig. Of als je nog een seriële poort op de PC hebt, dan is de converter niet nodig natuurlijk.

Dit is in principe genoeg, maar ik heb er ook nog een interface tussen gemaakt voor de galvanische scheiding van het geheel. Op het schema kun je zien dat er een paar optocouplers gebruikt zijn van het type PC817, de optocouplers zijn snel genoeg voor 9600 baud. Hoger gebruik ik nooit, vaak is 2400 baud al ruim voldoende. Het enige wat ik er mee doe is commando's versturen naar de controller, de controller werkt dat verder af. Ik gebruik dit al jaren zo en heb er eigenlijk nooit problemen mee gehad. Voor de communicatie gebruik ik RSIN en RSOUT en dat is niet helemaal te vergelijken met het RS232 signaal, het werkt dus iets anders.

Ik heb ook een klein printje gemaakt voor de interface, alle getoonde printen zijn gemaakt met Sprint-Layout 4.0. Dat gebruik ik altijd vvor printontwerpen.

En hier de print van de gebruikte microcontroller.

Ik ga dit maar één keer laten zien, omdat dit iedere keer gebruikt gaat worden.

De printen worden trouwens hier mee gefreesd, sinds daar jaren geleden nieuwe software voor gekomen is werkt dat uitstekend. In het begin toen het net uit was, was het een ramp.

Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

Besturing motorregelaar met Profilab.
Voorbeeld – 0001.

In het eerste voorbeeld gaan we een kleine elektromotor besturen met Profilab Expert 4.0 in combinatie met een microcontroller.
Hieronder zie je het programma gemaakt in Profilab.

We beginnen links, daar zie je een formule module staan, een potmeter, een vaste waarde module met de waarde 30 en een display. De potmeter is ingesteld op een waarde tussen de 0 en 225, die waarde wordt opgeteld bij de waarde 30. De minimale waarde die verstuurd wordt is dus altijd 30. Dit heb ik zo gedaan omdat de motor pas reageert bij een waarde van 30, als je nu aan de potmeter draait gaat de motor direct draaien.

De formule in de module zorgt ervoor dat er een waarde tussen de 0 en 100 op het display gezet wordt. De waarde die er uit komt is decimaal, maar de waarde die verstuurd wordt is een string. Dit moet dus eerst omgezet worden en dat wordt gedaan met de CHR module.

Daarna komt de COM module, deze zet de waarde op de com-poort of op de usb poort. Het is net waar je voor kiest, het kan beide. Het signaal wordt met 5Hz verzonden, de led op de interface print staat dus ook te knipperen met 5Hz.

Als er op de drukknop linksom wordt gedrukt, wordt waarde 10 verzonden en waarde 10 komt ook weer terug. Die waarde wordt vergeleken door een vergelijker en als de waarde die binnen komt ook 10 is wordt de led linksom aangezet. Ook worden de drukknoppen vergrendeld door de vergelijkers, zodra er één van de twee knoppen linksom of rechtsom ingedrukt is kan de andere knop niet meer reageren op een indrukking. Dit kan pas weer als er op de stopknop gedrukt is. Dan wordt waarde 0 verzonden en de controller stuurt ook weer een waarde 0 terug.

Als er op de stopknop gedrukt is staan de leds met een frequentie van 1Hz rood te knipperen en na het indrukken van links of rechtsom worden de leds groen. Om het geheel te kunnen bedienen hebben we ook een frontplaat nodig, de bedienelementen komen automatisch op de frontplaat te staan als je ze in het programma naar het veld gesleept hebt. Je moet wel de frontplaat zelf indelen en dat dan op verschillende manieren. Hieronder zie je de indeling van de frontplaat.

Hier zie je de leds, drukknoppen, potmeter en het display waar het pwm percentage op komt te staan. De componenten kun je met een klik van de muis activeren, maar uiteraard niet in de voorbeelden die hier staan.

Hieronder het programma voor de controller.
Het programma is in basic geschreven, net zoals in alle voorbeelden die volgen.

pic basic code:


Device 16F887                               ; Processor type

Xtal 10                                     ; Cristal 10Mhz

Asm                                         ; Config settings
CONFIG_REQ            
__CONFIG _CONFIG1, HS_OSC & WDT_OFF & DEBUG_OFF & FCMEN_OFF & LVP_OFF & IESO_OFF & BOR_OFF & CPD_OFF & CP_OFF & MCLRE_OFF & PWRTE_ON 
__CONFIG _CONFIG2, WRT_OFF & BOR40V 
EndAsm
   
All_Digital true                            ; Alle poorten digitaal

Declare Adin_Res = 8                        ; resolutie 8 bits
Declare Adin_Tad = frc                      ; set RC osc
Declare Adin_Stime = 50                     ; sample tijd 5

Declare LCD_RSPin PORTD.2                   ; Reset display poort D.2
Declare LCD_ENPin PORTD.3                   ; Enable display poort D.3
Declare LCD_DTPin PORTD.4                   ; Data display poort D.4 t/m D.7

Declare Rsin_Pin  PORTB.0                   ; Data in
Declare Rsout_Pin PORTB.1                   ; Data uit

Declare Serial_Baud 9600                    ; Baudrate 9600

Declare CCP1_Pin PORTC.2                    ; HPWM 1 op poort C.2
Declare CCP2_Pin PORTC.1                    ; HPWM 2 op poort C.1

Symbol FREQUENTIE = 5000                    ; PWM frequentie 5Khz
Symbol MOT_L   = PORTC.0                    ; Motor linksom poort C.0
Symbol MOT_R   = PORTC.2                    ; Motor rechtsom poort C.2

Dim DATA_IN As Byte                         ; Variabele in

Cls                                         ; Wis display

DelayMS 500                                 ; Pauze 0.5 sec 

Clear                                       ; Wis geheugen

         ;543210                            ; Hulpregel poort A
PORTA  = %000000                            ; Maak poort A laag
TRISA  = %111111                            ; Poort_A I/O

         ;543210                            ; Hulpregel poort B
PORTB  = %000000                            ; Maak poort B laag
TRISB  = %000000                            ; Poort_B I/O

         ;76543210                          ; Hulpregel poort C
PORTC  = %00000000                          ; Maak poort C laag
TRISC  = %00000000                          ; Poort_C I/O

         ;76543210                          ; Hulpregel poort D
PORTD  = %00000000                          ; Maak poort D laag
TRISD  = %00000000                          ; Poort_D I/O

         ;210                               ; Hulpregel poort E 
PORTE  = %000                               ; Maak poort E laag
TRISE  = %111                               ; Poort_E I/O

         ;76543210                          ; Hulpregel analoog
ADCON0 = %00000001                          ; ADCON0 register analoog

         ;543210                            ; Hulpregel analoog poort_B
ANSELH = %000000                            ; ANSEL register analoog poort_B

;---------------------------------------------------------
; PROGRAMMA MOTORSTURING MINI MOTORREGELAAR VIA PROFILAB.
;--------------------------------------------------------- 

DATA_IN = 0
MOT_L = 0
MOT_R = 0 

;--------------------------------------------
; HIER WORDT OP DATA GEWACHT VANUIT PROFILAB.
;--------------------------------------------

RUN:

    DATA_IN = RSIn 
    DelayMS 5
    
    MOT_L = 0
    
    MOT_R = 0
    
    If DATA_IN = 10 Then
     RSOut 10
      DelayMS 5
     GoTo LINKS_OM
    EndIf 
    
    If DATA_IN = 20 Then
     RSOut 20
      DelayMS 5
     GoTo RECHTS_OM
    EndIf 
GoTo RUN

;-----------------------
; MOTOR DRAAIT LINKSOM.
;-----------------------

LINKS_OM:

    DATA_IN = RSIn 
    DelayMS 5
    
    HPWM 2, DATA_IN, FREQUENTIE
     
    MOT_L = 1
    
    MOT_R = 0
    
    If DATA_IN = 0 Then
     RSOut 0
      DelayMS 5
     GoTo RUN
    EndIf
GoTo LINKS_OM

;------------------------
; MOTOR DRAAIT RECHTSOM.
;------------------------

RECHTS_OM:

    DATA_IN = RSIn 
    DelayMS 5
    
    HPWM 2, DATA_IN, FREQUENTIE
    
    MOT_R = 1
    
    MOT_L = 0
    
    If DATA_IN = 0 Then
     RSOut 0
      DelayMS 5
     GoTo RUN
    EndIf
GoTo RECHTS_OM

End
 

Zoals je bovenin het programma kunt zien staat de baud rate hier ook op 9600, dit moet wel corresponderen met de waarde in Profilab anders gaat het niet werken. Je kunt zien dat RSIN op poort B.0 zit en RSOUT op poort B.1. De pwm frequentie staat hier op 5KHz en motor links en motor rechts zitten op poort C.0 en C.2. De pwm frequentie staat op poort C.1.

Onder run zie je dat de controller op data staat te wachten van Profilab, daaronder zie je dat als de waarde 10 binnen komt er ook een waarde 10 verzonden wordt. Als alles klopt gaat de motor nu linksom draaien. In de lus linksom wordt er weer gewacht op data van Profilab en in dit geval is dat de waarde van de potmeter.

Als er dus aan de potmeter gedraaid wordt op de frontplaat zal de motor sneller gaan draaien. Wordt er nu op de stopknop gedrukt op de frontplaat wordt waarde 0 verzonden door Profilab en de controller zend weer een waarde 0 terug. De motor zal nu dus stoppen en het programma staat nu weer in de run lus te wachten op een commando van Profilab.

Voor de andere richting werkt het precies het zelfde, alleen met andere waardes. In principe kun je hier iedere regelaar mee aansturen, ik heb hiervoor de mini motorregelaar gebruikt samen met een RB35 motor.

Hier het schema van de regelaar.

Hier de print van de regelaar.

Op pagina 1 kun je zien waar de poorten zitten op de printplaat van de controller.

Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

Verzenden van grote waarden met Profilab.
Voorbeeld – 0002.

We gaan nu naar een voorbeeld kijken om grote waarden met Profilab te verzenden. In voorbeeld 1 kon je maar van 0 tot 255 verzenden en dat komt omdat de compoort module maar 8 bit is. Maar daar is wel iets aan te doen, zie voorbeeld.

Op deze manier kun je een waarde van 0 tot 25000 verzenden. De ingegeven waarde wordt gedeeld door 100. Stel dat we een waarde van 10 willen verzenden, die waarde wordt gedeeld door 100 daar komt dus 0.1 uit.

Die waarde gaat door FRAC module en die plaatst de komma. Bovenin zie je dat de twee waardes van elkaar afgetrokken worden, dus 0.1 – 0.1 = 0. Door de eerste compoort module wordt dus de waarde 0 verzonden. Onder zie je dat de waarde uit de FRAC module vermenigvuldigt wordt met 100, dus 0.1 x 100 = 10, de onderste compoort module verzend dus waarde 10.

Nu zul je denken wat heeft dat voor zin. Stel dat we een waarde groter dan 255 verzenden, bijvoorbeeld waarde 1500. Dan krijgen we 1500 gedeeld door 100 = 15, dus de waarde 15 wordt weer door de bovenste compoort module verzonden. Na de FRAC module komt er 0 uit, en die waarde wordt door de onderste compoort verzonden. Nu zul je zeggen dat getal 15 is toch geen 1500, dat klopt maar daar doen we iets mee in het programma van de controller.

Zoals je kunt zien staan er maar twee modules op de frontplaat, dat is de drukknop om de waarde te verzenden en de ingaven module.

We gaan nu naar het programma kijken wat in de 16F887 staat.

pic basic code:


'*  Name    : GROTER DAN 8 BITS ONTVANGEN VAN PROFILAB.                                     
'*  Author  : H van Zwieten.                                    
'*  Notice  : Copyright (c) 2018 H.v.Z.                        
'*          : All Rights Reserved                              
'*  Date    : 16-1-2018                                         
'*  Version : 1.0                                               
'*  Notes   : VOORBEELD - 0002
                                                                                                    
Device 16F887                               ; Processor type

Xtal 10                                     ; Cristal 10Mhz

Asm                                         ; Config settings
CONFIG_REQ            
__CONFIG _CONFIG1, HS_OSC & WDT_OFF & DEBUG_OFF & FCMEN_OFF & LVP_OFF & IESO_OFF & BOR_OFF & CPD_OFF & CP_OFF & MCLRE_OFF & PWRTE_ON 
__CONFIG _CONFIG2, WRT_OFF & BOR40V 
EndAsm
   
All_Digital true                            ; Alle poorten digitaal

Declare Adin_Res = 8                        ; resolutie 8 bits
Declare Adin_Tad = frc                      ; set RC osc
Declare Adin_Stime = 50                     ; sample tijd 5

Declare LCD_RSPin PORTD.2                   ; Reset display poort D.2
Declare LCD_ENPin PORTD.3                   ; Enable display poort D.3
Declare LCD_DTPin PORTD.4                   ; Data display poort D.4 t/m D.7

Declare Rsin_Pin  PORTB.0                   ; Data in
Declare Rsout_Pin PORTB.1                   ; Data uit

Declare Serial_Baud 2400                    ; Baudrate 2400

Declare CCP1_Pin PORTC.2                    ; HPWM 1 op poort C.2
Declare CCP2_Pin PORTC.1                    ; HPWM 2 op poort C.1

Dim DATA_IN_1 As Byte                       ; Variabele data in 1
Dim DATA_IN_2 As Byte                       ; Variabele data in 2

Dim WAARDE As Word                          ; Variabele waarde

Cls                                         ; Wis display

DelayMS 500                                 ; Pauze 0.5 sec 

Clear                                       ; Wis geheugen


         ;543210                            ; Hulpregel poort A
PORTA  = %000000                            ; Maak poort A laag
TRISA  = %000001                            ; Poort_A I/O

         ;543210                            ; Hulpregel poort B
PORTB  = %000000                            ; Maak poort B laag
TRISB  = %000000                            ; Poort_B I/O

         ;76543210                          ; Hulpregel poort C
PORTC  = %00000000                          ; Maak poort C laag
TRISC  = %00000000                          ; Poort_C I/O

         ;76543210                          ; Hulpregel poort D
PORTD  = %00000000                          ; Maak poort D laag
TRISD  = %00000000                          ; Poort_D I/O

         ;210                               ; Hulpregel poort E 
PORTE  = %000                               ; Maak poort E laag
TRISE  = %111                               ; Poort_E I/O

         ;76543210                          ; Hulpregel analoog
ADCON0 = %00000001                          ; ADCON0 register analoog

         ;543210                            ; Hulpregel analoog poort_B
ANSELH = %000000                            ; ANSEL register analoog poort_B

;-----------------------------------------------------
; VOORBEELD GROTER DAN 8 BITS ONTVANGEN VAN PROFILAB.
;-----------------------------------------------------

;---------------------
; ZET VARIABELE OP 0.
;---------------------

DATA_IN_1 = 0
DATA_IN_2 = 0

WAARDE = 0

;------------------------------------------------------
; LEES DATA IN 1 EN DATA IN 2.
; ZET DATA IN 1 X 100 + DATA IN 2 IN VARIABELE WAARDE.
; PRINT VARIABELE WAARDE.
; ZET VARIABELE OP 0.
; WIS DISPLAY.
;------------------------------------------------------

RUN:


    DATA_IN_1 = RSIn
    DelayMS 1
    DATA_IN_2 = RSIn
    DelayMS 1
 
    WAARDE = ((DATA_IN_1 * 100) + DATA_IN_2)
    
    Print At 1,1,Dec,WAARDE,
    
    DelayMS 5000
    
    DATA_IN_1 = 0
    DATA_IN_2 = 0
    WAARDE = 0
    
    Cls
    
GoTo RUN

End 

Je kunt zien dat we DATA_IN_1 en DATA_IN_2 binnen krijgen, dat is de data die na elkaar verzonden wordt door Profilab. De binnen komen de waarde wordt in de variabel WAARDE gezet, zoals je kunt zien staat die waarde als woord. Daar past dus een waarde in tussen de 0 en 65535.

Achter WAARDE zie je dit staan, WAARDE = ((DATA_IN_1 * 100) + DATA_IN_2). Hier wordt de binnen komen de data verwerkt door de formule. We hadden als voorbeeld de waarde 1500 genomen en we zagen dat de waarde 15 verzonden werd, die staat dus in DATA_IN_1. En in DATA_IN_2 staat de waarde 0. Hier wordt dus DATA_IN_1 met 100 vermenigvuldigt en dan krijgen we weer de waarde 1500.

Op deze manier kun je dus grote waardes verzenden via 8 bit. Je zou er nog een waarde achter aan kunnen verzenden voor nog grotere waardes, maar dat heb ik zelf nog niet nodig gehad.

Zoals je kunt zien wordt de waarde hier op een display gezet, maar in de software kun je daar allerhande andere zaken mee doen natuurlijk.

Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

Rc5 zender saa3010 via Profilab.
Voorbeeld – 0003.

Hier een voorbeeld hoe je via Profilab een RC5 signaal kunt verzenden in combinatie met twee microcontrollers. Op deze manier kun je bijvoorbeeld een relaiskaart aansturen via infrarood, eigenlijk kun je er van alles voor verzinnen.

De afstand waarmee ik getest heb is ruim 10 meter in een zonnige omgeving. Ik had nog een aantal SAA3010 IC’s liggen van Phillips en daarmee kun je in totaal 63 verschillende commando’s verzenden.

Hieronder het schema.

Bovenin zie je 8 jumper steek plaatsen, je kunt dus 8 verschillende commando’s per steekplaats verzenden. De lijnen worden doorverbonden doormiddel van 8 optocouplers, de optocouplers worden door de controller aangestuurd en de controller op zijn beurt weer door Profilab via de USB poort.

Je zou het printje ook rechtstreeks door de parallelle poort aan kunnen sturen, maar die kom je niet zo vaak meer tegen op de nieuwe pc’s van tegenwoordig. De twee IR led’s worden aangestuurd door een mosfet van het type IRF540.

Hieronder de het aansluitschema van de print.

Ik heb er ook een printje voor gefreesd, zie hieronder.

Het programma in Profilab stelt ook niets voor, zie hieronder.

Ik heb in het voorbeeld maar twee drukknoppen gemaakt, alleen drukknop 1 en 7. Je kunt zien dat er ook maar twee waardes verzonden worden. In de vaste waarde modules zie je die staan, waarde 1 en waarde 7. De waardes worden weer omgezet naar een string en aangeboden aan de compoort, dat is alles.

Naast de compoort zie je een schermpje staan voor de instellingen van de poort, in dit geval is dat com-3 en 2400baud.

Hieronder de frontplaat, op de frontplaat zie je de twee drukknoppen staan.

Ik heb twee controllers gebruikt in dit voorbeeld één voor het verzenden en de communicatie met Profilab en één voor het ontvangen van de verzonden RC5 IR code. We gaan eerst naar het zend gedeelte kijken.

pic basic code:


Device 16F887                               ; Processor type

Xtal 10                                     ; Cristal 10Mhz

Asm                                         ; Config settings
CONFIG_REQ            
__CONFIG _CONFIG1, HS_OSC & WDT_OFF & DEBUG_OFF & FCMEN_OFF & LVP_OFF & IESO_OFF & BOR_OFF & CPD_OFF & CP_OFF & MCLRE_OFF & PWRTE_ON 
__CONFIG _CONFIG2, WRT_OFF & BOR40V 
EndAsm
   
All_Digital true                            ; Alle poorten digitaal

Declare Adin_Res = 8                        ; resolutie 8 bits
Declare Adin_Tad = frc                      ; set RC osc
Declare Adin_Stime = 50                     ; sample tijd 5
Declare LCD_Lines 2                         ; Twee lijns display

Declare LCD_RSPin PORTD.2                   ; Reset display poort D.2
Declare LCD_ENPin PORTD.3                   ; Enable display poort D.3
Declare LCD_DTPin PORTD.4                   ; Data display poort D.4 t/m D.7

Declare Rsin_Pin  PORTB.0                   ; Data in
Declare Rsout_Pin PORTB.1                   ; Data uit
Declare Serial_Baud 2400                    ; Baudrate 2400
Declare Serial_Data 8                       ; Acht bit data

Symbol UIT1 = PORTC.0                       ; Uitgang 1
Symbol UIT2 = PORTC.1                       ; Uitgang 2

;Declare CCP1_Pin PORTC.2                    ; HPWM 1 op poort C.2
;DECLARE CCP2_PIN PORTC.1                    ; HPWM 2 op poort C.1

Dim DATA_IN As Byte

Cls                                         ; Wis display

DelayMS 2000                                ; Pauze 2 sec 

Clear                                       ; Wis geheugen

         ;543210                            ; Hulpregel poort A
PORTA  = %000000                            ; Maak poort A laag
TRISA  = %111111                            ; Poort_A I/O

         ;543210                            ; Hulpregel poort B
PORTB  = %000000                            ; Maak poort B laag
TRISB  = %000000                            ; Poort_B I/O

         ;76543210                          ; Hulpregel poort C
PORTC  = %00000000                          ; Maak poort C laag
TRISC  = %00000000                          ; Poort_C I/O

         ;76543210                          ; Hulpregel poort D
PORTD  = %00000000                          ; Maak poort D laag
TRISD  = %00000000                          ; Poort_D I/O

         ;210                               ; Hulpregel poort E 
PORTE  = %000                               ; Maak poort E laag
TRISE  = %111                               ; Poort_E I/O

         ;76543210                          ; Hulpregel analoog
;ADCON0 = %00000001                          ; ADCON0 register analoog 8 bit

         ;76543210                          ; Hupregel analoog
;ADCON1 = %10000000                          ; ADCON1 register analoog 10 bit

         ;76543210                          ; Hulpregel analoog poort_B
;ANSELH = %00000000                          ; ANSEL register analoog poort_B

;-----------------------
; PROGRAMMA RC5 ZENDER.
;----------------------- 

DATA_IN = 0
UIT1 = 0
UIT2 = 0

RUN:


    DATA_IN = RSIn
    DelayMS 5
    
    If DATA_IN = 1 Then
      GoSub UITGANG1
    EndIf
    
    If DATA_IN = 7 Then
      GoSub UITGANG2
    EndIf
    
GoTo RUN
    
UITGANG1:


    UIT1 = 1
    DelayMS 300
    UIT1 = 0
    Return
    
UITGANG2:


    UIT2 = 1
    DelayMS 300
    UIT2 = 0
    Return

End

Zoals je kunt zien staat de baud rate hier ook op 2400 baud, net zoals in het Profilab programma. er staan twee uitgangen gedefinieerd die de twee optocouplers aansturen. In dit geval zijn dat optocoupler één en zeven. De jumper op de IR print staat hier dus op steekplaats X0.

In het programma kun je zien dat DATA_IN 1 en DATA_IN 2 afgevraagd wordt, deze waardes worden dus door Profilab verzonden als er op de knoppen 1 of 7 gedrukt wordt. Als de juiste data ontvangen wordt, wordt uitgang 1 of uitgang 7 voor 300mS hoog. Meer doet dit programma niet.

We gaan nu naar het programma van het ontvang gedeelte kijken.

pic basic code:


Device 16F887                          ; Processor type

Xtal 10                                ; Kristal 10MHz

Asm                                    ; Config settings
CONFIG_REQ            
__CONFIG _CONFIG1, HS_OSC & WDT_OFF & DEBUG_OFF & FCMEN_OFF & LVP_OFF & IESO_OFF & BOR_OFF & CPD_OFF & CP_OFF & MCLRE_OFF & PWRTE_ON 
__CONFIG _CONFIG2, WRT_OFF & BOR40V 
EndAsm

All_Digital true                       ; Alle poorten digitaal

Declare LCD_RSPin PORTD.2              ; Reset display poort D.2
Declare LCD_ENPin PORTD.3              ; Enable display poort D.3
Declare LCD_DTPin PORTD.4              ; Data display poort D.4 t/m D.7

Declare RC5In_Pin PORTB.0              ; ir ontvanger op poort B.0

Symbol LED1 = PORTC.0                  ; Uitgang led 1
Symbol LED2 = PORTC.1                  ; UItgang led 2
                                                                                               
Dim rc5_commando As Byte               ; variabele RC5 commando 

Cls                                    ; Wis display

Clear                                  ; Wis geheugen 

DelayMS 2000                           ; Wacht 2 seconden

         ;543210                       ; Hulpregel poort A
PORTA  = %000000                       ; Maak poort A laag
TRISA  = %000000                       ; Poort_A I/O

         ;543210                       ; Hulpregel poort B
PORTB  = %000000                       ; Maak poort B laag
TRISB  = %000001                       ; Poort_B I/O

         ;76543210                     ; Hulpregel poort C
PORTC  = %00000000                     ; Maak poort C laag
TRISC  = %00000000                     ; Poort_C I/O

         ;76543210                     ; Hulpregel poort D
PORTD  = %00000000                     ; Maak poort D laag
TRISD  = %00000000                     ; Poort_D I/O

         ;210                          ; Hulpregel poort E 
PORTE  = %000                          ; Maak poort E laag
TRISE  = %000                          ; Poort_E I/O

         ;76543210                     ; Hulpregel analoog
;ADCON0 = %00000001                     ; ADCON0 register analoog 8 bit

         ;76543210                     ; Hupregel analoog
;ADCON1 = %10000000                    ; ADCON1 register analoog 10 bit

         ;76543210                     ; Hulpregel analoog poort_B
;ANSELH = %00000000                    ; ANSEL register analoog poort_B

;---------------------------------
; PROGRAMMA UITLEZEN IR COMMANDO.
;---------------------------------

START:
                                        

    Print At 1,1,"COMMANDO"
                    
    Repeat                                  
    rc5_commando = RC5In                   
    Until rc5_commando <> 255              
    Print At 1,10,Dec rc5_commando , "  "  
    
    If rc5_commando = 1 Then
      GoSub UIT1
    EndIf
    
    If rc5_commando = 7 Then
      GoSub UIT2
    EndIf

GoTo START 

UIT1:


    Toggle LED1
    DelayMS 500
    Return
    
UIT2:


    Toggle LED2
    DelayMS 500
    Return                                   

End                                           
 

Picbasic heeft een RC5_IN commando om eenvoudig een RC5 code in te lezen zoals je hierboven kunt zien. De TSOP1738 ziet op poort B.0 zoals je kunt zien, op deze poort komt het IR signaal dus binnen.

Er zijn twee uitgangen gedefinieerd die een led aan zetten als er een 1 of een 7 binnen komt. De uitgangen voor de led's hebben hier een toggle functie zoals je kunt zien. Verder valt er weinig over te vertellen en als er vragen zijn hoor ik het wel.

Tot zover dit voorbeeld.

Als je haar maar goed zit, GROETEN LAMBIEK.
Lambiek

Special Member

Dobbelsteen gooien met Profilab.
Voorbeeld – 0004.

We gaan nu een voorbeeld bekijken hoe je bijvoorbeeld een dobbelsteen waarde kunt gooien met Profilab. Je kunt de dobbelsteen waarde laten zien door op de knop gooien te drukken op de frontplaat of door op de knop te drukken die aan de controller zit. Als je het via de controller doet wordt er een waarde door de controller verzonden via de USB poort.

Hieronder het programma in Profilab.

Boven in het programma zie je een random generator staan die een waarde van 1 tot 6 genereerd, dit proces gaat achter elkaar door zodra het programma opgestart wordt. Daar achter staat een sample and hold module die de geselecteerde waarde vast houd. De waarde van de sample and hold module stuurt de analoge waarde naar een A/D converter. Daar achter hangen een paar and poorten voor het tekst en hex display. Daar wordt ook de waarde weer omgezet door een D/A converter voor de diaprojector die de dobbelsteen laat zien als er gegooid is.

De diaprojector kun je laden onder eigenschappen met bijvoorbeeld een JPEG of BITMAP bestand. Ik heb de plaatjes met Frontdesigner gemaakt en geëxporteerd naar een BITMAP en geladen in de diaprojector.

Als er nu op de knop gooien gedrukt wordt, dan wordt er voor twee seconden een waarde gesampled van de random generator. Als de tijd verstreken is wordt de desbetreffende dobbelsteen getoond door de diaprojector en de waarde in tekst en in een getal.

Onderaan kun je zien dat er ook een compoort in het programma gebruikt wordt, achter de compoort staat een D/A converter met een vergelijker. Als de waarde 100 binnen komt van de controller wordt er ook weer een waarde gegenereerd.

Hieronder de frontplaat.

Op de frontplaat zie de componenten staan, dit zijn de drukknop gooien, busy led, tekst display, hex display en de diaprojector staan. Dit is de frontplaat als het programma niet draait.

Hieronder een paar frontplaten als er gegooid is.

Hier is drie gegooid.

Hier is vijf gegooid.

We gaan nu naar het programma van de controller kijken.

pic basic code:


Device 16F887                               ; Processor type

Xtal 10                                     ; Cristal 10Mhz

Asm                                         ; Config settings
CONFIG_REQ            
__CONFIG _CONFIG1, HS_OSC & WDT_OFF & DEBUG_OFF & FCMEN_OFF & LVP_OFF & IESO_OFF & BOR_OFF & CPD_OFF & CP_OFF & MCLRE_OFF & PWRTE_ON 
__CONFIG _CONFIG2, WRT_OFF & BOR40V 
EndAsm
   
All_Digital true                            ; Alle poorten digitaal

Declare Adin_Res = 8                        ; resolutie 8 bits
Declare Adin_Tad = frc                      ; set RC osc
Declare Adin_Stime = 50                     ; sample tijd 5
Declare LCD_Lines 2                         ; Twee lijns display

Declare LCD_RSPin PORTD.2                   ; Reset display poort D.2
Declare LCD_ENPin PORTD.3                   ; Enable display poort D.3
Declare LCD_DTPin PORTD.4                   ; Data display poort D.4 t/m D.7

Declare Rsin_Pin  PORTB.0                   ; Data in
Declare Rsout_Pin PORTB.1                   ; Data uit
Declare Serial_Baud 2400                    ; Baudrate 2400
Declare Serial_Data 8                       ; Acht bit data

;Declare CCP1_Pin PORTC.2                    ; HPWM 1 op poort C.2
;DECLARE CCP2_PIN PORTC.1                    ; HPWM 2 op poort C.1

Symbol S1 = PORTA.0                         ; Ingang schakelaar

Dim DATA_IN As Byte                         ; Variabele data in

Cls                                         ; Wis display

DelayMS 2000                                ; Pauze 2 sec 

Clear                                       ; Wis geheugen

         ;543210                            ; Hulpregel poort A
PORTA  = %000000                            ; Maak poort A laag
TRISA  = %111111                            ; Poort_A I/O

         ;543210                            ; Hulpregel poort B
PORTB  = %000000                            ; Maak poort B laag
TRISB  = %000000                            ; Poort_B I/O

         ;76543210                          ; Hulpregel poort C
PORTC  = %00000000                          ; Maak poort C laag
TRISC  = %00000000                          ; Poort_C I/O

         ;76543210                          ; Hulpregel poort D
PORTD  = %00000000                          ; Maak poort D laag
TRISD  = %00000000                          ; Poort_D I/O

         ;210                               ; Hulpregel poort E 
PORTE  = %000                               ; Maak poort E laag
TRISE  = %111                               ; Poort_E I/O

         ;76543210                          ; Hulpregel analoog
;ADCON0 = %00000001                          ; ADCON0 register analoog 8 bit

         ;76543210                          ; Hupregel analoog
;ADCON1 = %10000000                          ; ADCON1 register analoog 10 bit

         ;76543210                          ; Hulpregel analoog poort_B
;ANSELH = %00000000                          ; ANSEL register analoog poort_B

;---------------------------------
; WAARDE VERSTUREN NAAR PROFILAB.
;--------------------------------- 


RUN:


    If S1 = 1 Then
      RSOut 100
      DelayMS 1000
      RSOut 0
    EndIf
    
GoTo RUN
    
End

Het programma stelt weer niet veel voor, we hebben de drukknop S1 die op poort A.0 zit en meer eigenlijk niet. Als nu de drukknop ingedrukt wordt dan wordt de waarde Op het interface printje zie je de led dus twee maal een keer oplichten, één maal als de waarde 100 verzonden wordt en één maal als de waarde 0 verzonden wordt. Dit is eigenlijk alles wat er gebeurd. De waarde wordt weer met 2400 baud verstuurd.

Dit was het weer wat dit voorbeeld betreft.

Als je haar maar goed zit, GROETEN LAMBIEK.