' +-------v------+ 'MCLR/VPP <[ 1 40 ]> RB7/PGD 'RA0/AN0 <[ 2 39 ]> RB6/PGC 'RA1/AN1 <[ 3 38 ]> RB5 'RA2/AN2/VREF-/CVREF <[ 4 37 ]> RB4 'RA3/AN3/VREF+ <[ 5 36 ]> RB3/PGM 'RA4/T0CKI/C1OUT <[ 6 35 ]> RB2 'RA5/AN4/SS/C2OUT <[ 7 34 ]> RB1 'RE0/RD/AN5 <[ 8 33 ]> RB0/INT 'RE1/WR/AN6 <[ 9 32 ]> VDD 'RE2/CS/AN7 <[ 10 31 ]> VSS 'VDD <[ 11 30 ]> RD7/PSP7 'VSS <[ 12 29 ]> RD6/PSP6 'OSC1/CLKI <[ 13 28 ]> RD5/PSP5 'OSC2/CLKO <[ 14 27 ]> RD4/PSP4 'RC0/T1OSO/T1CKI <[ 15 26 ]> RC7/RX/DT 'RC1/T1OSI/CCP2 <[ 16 25 ]> RC6/TX/CK 'RC2/CCP1 <[ 17 24 ]> RC5/SDO 'RC3/SCK/SCL <[ 18 23 ]> RC4/SDI/SDA 'RD0/PSP0 <[ 19 22 ]> RD3/PSP3 'RD1/PSP1 <[ 20 21 ]> RD2/PSP2 ' +--------------+ Device 16F877A ;We gebruiken een 16F877A type Config HS_OSC, WDT_OFF, PWRTE_ON, LVP_OFF ALL_DIGITAL TRUE ;Alle ingangen digitaal XTAL 20 PORTB_PULLUPS On ;On-chip pull-up weerstanden actief HSERIAL_BAUD = 2400 ;Transmissiesnelheid van de data over de bus HSERIAL_RCSTA = %10010000 ;Bit7:Enable serial port / Bit4:Continu ontvangen HSERIAL_TXSTA = %00000000 ;Bit5:Transmitpin uitgeschakeld (TXEN (Transmit ENable) = 0) ;Logische constanten Symbol HOOG = 1 ;Hoog niveau Symbol LAAG = 0 ;Laag niveau ;Algemene constanten Symbol Baud2400I = 16780 ;2400 Baud Inverted (baudrate voor SEROUT) ;Poortnamen Symbol Toets1 = PORTB.3 Symbol Toets2 = PORTB.4 Symbol Led1 = PORTB.0 Symbol Led2 = PORTB.1 Symbol Led3 = PORTB.2 Symbol SerieelIn = PORTC.7 ;Ontvangt via HSERIN data van de bus (B.1 = USART ingang, RX) Symbol SerieelUit = PORTC.6 ;Stuurt via SEROUT data naar de bus (B.2 = USART uitgang, TX) ;Variabelen declareren ;BYTE Dim Opdracht As Byte ;Bevat de laatst ontvangen opdrachtcode Dim Waarde As Byte ;Eventueel retour gezonden waarde (zoals gemeten LDR waarde) ; 76543210 PORTC = %00000000 ;PORTB poorten laag TRISC = %11111111 ;USART uitgang B.2 moet in rust hoog-ohmig zijn PORTB_PULLUPS On ;PORTB pull-ups geactiveerd voor de toets Clear ;Wis alle RAM geheugen DelayMS 500 ;Stabilisatie signalen en voorbeeld LED opstart tijd High Led1 High Led2 High Led3 DelayMS 2000 Low Led1 Low Led2 GoTo HoofdLus ;Spring over subroutine(s) ;SUBROUTINE(S) ZendBus: ;De bus die door het huis loopt RCSTA = %00000000 ;Zet USART uit, anders ontvangt deze zijn eigen verzonden data SerOut SerieelUit, Baud2400I, [Opdracht, Waarde] ;Geinverteerd verzenden (vanwege BC547) RCSTA = %10010000 ;Schakel USART weer in, zodat de PIC weer data kan ontvangen Input SerieelUit ;Maak TX poort hoog-ohmig door er een ingang van te maken Return ;HOOFDPROGRAMMA HoofdLus: Clear Opdracht ;Opdracht (na uitvoering) wissen Clear Waarde ;Idem voor 'Waarde' HSerIn 7, Verder, [Opdracht, Waarde] ;Time out staat op 7mSec GoTo OpdrachtUitvoeren ;Voer opdracht uit Verder: ;In het geval van een time-out van HSERIN, hier verder gaan ;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW ;Voorbeeld voor de picbasic.nl site (om te experimenteren, zelf uitbreiden) ;Onderstaand stukje staat dus niet in het programma bij mij thuis If Toets1 = LAAG Then ;Als toets wordt ingedrukt, dan... High Led1 Opdracht = 26 ;Verzendt waarde 26 over de bus GoSub ZendBus DelayMS 20 ;Antidender voor indrukken van de toets While Toets1 = LAAG : Wend ;Wacht tot toets wordt losgelaten, anders blijft hij zenden DelayMS 20 ;Antidender voor loslaten van de toets Else Low Led1 EndIf If Toets2 = LAAG Then ;Als toets wordt ingedrukt, dan... High Led2 Opdracht = 120 ;Verzendt waarde 26 over de bus GoSub ZendBus DelayMS 20 ;Antidender voor indrukken van de toets While Toets2 = LAAG : Wend ;Wacht tot toets wordt losgelaten, anders blijft hij zenden DelayMS 20 ;Antidender voor loslaten van de toets Else Low Led2 EndIf ;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW ;Op deze plek staat bij mij in de 18F452 "semi-master PIC", een oneindige lus, ;waarin continu DCF77 tijd en temperatuur wordt bijgehouden en op display wordt weergegeven ;alsook de twee 74HC165 schuifregisters continu worden ingelezen (= 16 extra ingangen) ;alsook of er een IR opdracht van de afstandsbediening binnenkomt in keuken TSOP1736 ;Komt er een opdracht binnen via 1 van deze inlezingen, dan GOTO OpdrachtUitvoeren, alwaar ;de opdracht (door een SELECT...CASE lijst) wordt afgehandeld ;Na OpdrachtUitvoeren springt het programma weer terug naar HoofdLus ;Op deze plek (buiten bovenste lus) staan timerfuncties, die 1x per minuut wordt doorlopen ;Dit gaat simpel met een SELECT...CASE lijst waarin alle tijden staan ;Als de tijd overeenkomt met een timerinstelling, wordt de bijbehorende opdracht uitgevoerd ;Daarna meteen weer terug naar HoofdLus, waar het programma weer wacht op een opdracht GoTo HoofdLus OpdrachtUitvoeren: Select Opdracht ;Deze SELECT lijst bepaalt wat een ontvangen opdracht gaat doen Case 26 ;Als de waarde '26' is ontvangen van de bus, dan... Led3 = ~Led3 ;... de LED aan of uitzetten (togglen) ' CASE 120 ;Als waarde '120' is ontvangen, dan... ' LED = HOOG ;... de LED aanzetten (poort een HOOG niveau geven) ' CASE 121 ;Als waarde '121' is ontvangen, dan... ' LED = LAAG ;... de LED uitzetten (poort een LAAG niveau geven) End Select GoTo HoofdLus ;Ga weer naar de oneindige hoofdlus