; PIC16F690: ; +----v----+ ; Vdd <[ 1 20 ]> Vss ; RA5/T1CKI/OSC1/CLKIN <[ 2 19 ]> RA0/AN0/C1IN+/ICSPDAT/ULPWU ; RA4/AN3/T1G/OSC2/CLKOUT <[ 3 18 ]> RA1/AN1/C12IN-/VREF/ICSPCLK ; RA3/MCLR/VPP <[ 4 17 ]> RA2/AN2/T0CKI/INT/C1OUT ; RC5/CCP1/P1A <[ 5 16 ]< RC0/AN4/C2IN+ ; RC4/C2OUT/P1B <[ 6 15 ]< RC1/AN5/C12IN ; RC3/AN7/P1C <[ 7 14 ]< RC2/AN6/P1D ; RC6/AN8/SS <[ 8 13 ]< RB4/AN10/SDI/SDA/Open Drain ; RC7/AN9/SDO <[ 9 12 ]< RB5/AN11/RX/DT ; RB7/TX/CK <[ 10 11 ]< RB6/SCK/SCL ; +---------+ Device 16F690 ;Gebruik een 16F690 type Config HS_OSC, CP_OFF, PWRTE_ON, MCLRE_OFF ALL_DIGITAL = TRUE ;Alle ingangen digitaal XTAL = 20 ;Gebruik een kristal van 20MHz 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 Led1 = PORTC.6 Symbol Led2 = PORTC.7 Symbol SerieelIn = PORTB.5 ;Ontvangt via HSERIN data van de bus (B.1 = USART ingang, RX) Symbol SerieelUit = PORTB.7 ;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 PORTB = %00000000 ;PORTB poorten laag TRISB = %10111111 ;USART uitgang B.2 moet in rust hoog-ohmig zijn TRISC = %00000000 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 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 Toets = LAAG Then ;Als toets wordt ingedrukt, dan... ' Opdracht = 26 ;Verzendt waarde 26 over de bus ' GoSub ZendBus ' DelayMS 20 ;Antidender voor indrukken van de toets ' While Toets = LAAG : Wend ;Wacht tot toets wordt losgelaten, anders blijft hij zenden ' DelayMS 20 ;Antidender voor loslaten van de toets ' 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 27 ;Als de waarde '26' is ontvangen van de bus, dan... Low Led1 ;... de LED aan of uitzetten (togglen) Case 120 ;Als waarde '120' is ontvangen, dan... Low Led2 ' 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