433 mhz HRSIN en WAIT commando

Hallo,

Ik ben sinds kort bezig met pics. Hiervoor gebruik ik picbascic.
Mijn project is het automatiseren van mijn huis en ik wil beginnen met het aansturen van rolgordijnen. Dit ga ik doen met motortjes en een sensor die kijkt hoe vaak de as van het rolgordijn heeft rondgedraaid. De sensor wil ik op één van de poorten als input zetten. Ik maak gebruik van een setje van 433 mhz zender en ontvanger. Aan de hand van dit forum heb ik het verzenden en ontvangen goed voor elkaar. Het werkt over een aanzienlijke afstand met weinig fouten.
Mijn bedoeling is om de ontvanger en de aansturing van het rolgordijn in één 16f628a te stoppen.

Ik gebruik nu in de ontvanger het commando:
HRSin Wait("oke"),waarde

Het probleem hierbij is dat de ontvanger blijft wachten bij het HRSIN-commando. Hoe kan ik een lus maken waarin de HRSIN in de gaten wordt gehouden en dat ook nog de sensoren worden gecontroleerd? Nu blijft de ontvanger wachten bij HRSIN en 'ziet' hij niet dat de sensoren een signaal doorgeven.
Dus: is er een manier om wel met een 'wachtwoord' (zoals nu:"oke") te werken, zonder daarop te wachten?

Alvast bedankt!

Lucky Luke

Golden Member

er is een mogelijkheid, in ieder geval met Hserin, om een time-out op te geven, en een label waarnaar gesprongen moet worden na die time-out.

Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)

Interrupt laten genereren bij ontvangst in de usart.

In the beginning there was nothing.... and even that exploded...

Met WAIT wacht HRSIN net zolang tot het woordje "Oke" langs komt, waardoor de kans dat de waarde die daarna wordt ontvangen vrijwel altijd de juiste waarde is.
Maarja, dan doet je PIC intussen niets anders.

Als je WAIT weglaat en de timeout op 0 zet, loopt je programma bij HRSIN gewoon door als er geen ontvangen waarde in de USART buffer zit.
Het probleem is bij jou echter dat je een 433MHz ontvanger gebruikt, die altijd wel eens rommel ontvangt.
Hoe onderzoek je nou of dat een geldige waarde is en geen rommel van iets anders?

Ohm sweet Ohm | www.picbasic.nl

Ik ga vandaag proberen om de timeout op te nemen in het programma. Denk dat het een trial and error wordt, om te bepalen hoeveel tijd de timeout kan zijn, zonder dat de registratie van de sensor wordt overgeslagen.

Ik heb geen ervaring met interupts. Zo'n interupt zou toch alleen maar werken wanneer de hrsin op de achtergrond blijft doordraaien? Als dat mogelijk is, is mijn probleem opgelost, maar ik heb nog nergens gelezen hoe en of het mogelijk is om de pic het programma te laten doorlopen en dat die wordt onderbroken op het moment dat er informatie binnenkomt.

Ik kan natuurlijk ook de kans op ontvangst vergroten door de zender het commando meerdere malen achter elkaar te laten verzenden (bijvoorbeeld 10 keer). Dan is de kans al groter dat de ontvanger 'toevallig' bij HRSIN is en de data ontvangt.

Op 11 mei 2008 11:45:51 schreef Jeronimo_34:
Ik heb geen ervaring met interupts. Zo'n interupt zou toch alleen maar werken wanneer de hrsin op de achtergrond blijft doordraaien? Als dat mogelijk is, is mijn probleem opgelost, maar ik heb nog nergens gelezen hoe en of het mogelijk is om de pic het programma te laten doorlopen en dat die wordt onderbroken op het moment dat er informatie binnenkomt.

Dat kan inderdaad.

Op 11 mei 2008 11:45:51 schreef Jeronimo_34:
Ik kan natuurlijk ook de kans op ontvangst vergroten door de zender het commando meerdere malen achter elkaar te laten verzenden (bijvoorbeeld 10 keer). Dan is de kans al groter dat de ontvanger 'toevallig' bij HRSIN is en de data ontvangt.

Dat zou je kunnen doen, maar mij lijkt, dat dat niet goed gaat werken.
Omdat het programma dan "toevallig" bij HRSIN moet zijn.
Met interrupts verhelp je dit probleem, kijk maar eens op dit forum.

Verder ben ik ook met dit verhaal bezig, en zou ik eigenlijk even contact willen hebben.
Als het kan via MSN of mail, helaas heb je geen mail in je profiel.

.

Vreemd dat je mijn email niet kan zien. Ik heb niet aangevinkt dat ie verborgen moet worden... Ik zal je dadelijk even een mailtje sturen, dan heb je mijn e-mailadres.

Verder heb ik vandaag niet heel veel kunnen doen, omdat mijn programmer het niet meer doet :-(

Wanneer ik meer nieuws heb, laat ik het weten! In ieder geval alvast bedankt voor jullie bijdrage!!!

HRSIN leest de USART buffer van de PIC waar maximaal 2 bytes in passen.
Je hóeft dus niet op het moment dat er wat ontvangen wordt door de PIC met de instructie HRSIN bezig te zijn (dit in tegenstelling tot de software variant RSIN).

Als je maar regelmatig checked of er wat in de USART staat met HRSIN.
Zonder WAIT, zodat ie gewoon doorloopt.
Zet de TimeOut van HRSIN op 0.

Een voorbeeld met HSERIN:

code:


DIM Opdracht  AS BYTE

WHILE 1 = 1
  HSERIN 0, Verder, [Opdracht]
  PRINT AT 1, 1, DEC3 Opdracht

Verder:
  DELAYMS 1000
  TOGGLE LED
WEND

HSERIN leest hier de USART buffer.
Deze kan ook waarden ontvangen als de PIC met iets anders bezig is, bijvoorbeeld wachten in de DELAYMS 1000.
Zolang er niets in de USART buffer staat, zal de PIC de PRINT opdracht niet uitvoeren maar meteen (want TimeOut staat hier op 0) verder gaan bij 'Verder:'.
Is er een byte ontvangen dan zal de PRINT instructie deze waarde op het display zetten.

Let op de USART kan maximaal 2 bytes bevatten.
(Lees datasheet van de PIC).

Ohm sweet Ohm | www.picbasic.nl

Mijn programmer doet het weer! :-) Ik moest 'm opnieuw programmeren en daar had ik een tweede programmer voor nodig. Het is allemaal gelukt.

Ik heb de oplossing die Frits aandraagt nog niet geprobeerd, maar volgens mij blijf ik dan last houden van ruis. De ontvanger ontvangt continu wel iets en dat komt dan waarschijnlijk in de buffer. Het zou wel heel toevallig zijn dat daar net mijn 'wachtwoord' in zit en dat het programma dan ook nog op tijd is om de opdrachten in te lezen.

Hebben jullie een idee hoe ik dit kan oplossen? Ik heb Eagle Eye hierover net ook een mailtje gestuurd, omdat hij aangaf ervaring te hebben met interrupts. Ik heb hiernaar gezocht op het forum en in de manual van Proton, maar heel duidelijk is het me nog niet. Ik heb nog nergens iets gelezen waarbij HSERIN wordt gekoppeld aan een interrupt. Deze interrupt moet dan ook alleen maar in werking treden wanneer mijn 'wachtwoord' binnenkomt.

Hopelijk hebben jullie nog goede ideeën.

Lucky Luke

Golden Member

probeer het eens met gewoon serin. Dat levert meer code op (nadeel) maar heeft geen buffer (voordeel).

Eluke.nl | De mens onderscheid zich van (andere) dieren door o.a. complexe gereedschappen en bouwwerken te maken. Mens zijn is nerd zijn. Blijf Maken. (Of wordt, bijvoorbeeld, cultuurhistoricus)

Volgens mij is het buffer niet direct een nadeel. Ik gebruik het nu alleen volgens mij (nog) niet.

Ben net weer even bezig geweest en heb voor mezelf een aantal belangrijke ontdekkingen gedaan:

- Wanneer HSerin wordt gebruikt (natuurlijk op poort RX), dan kan de poort voor het verzenden (TX) niet meer gebruikt worden als gewone i/o poort.

- Het commando WAIT overruled de timeout in HSERIN. Het programma blijft dus wachten op het 'wachtwoord' en trekt zich niets aan van de timeout.

Van eventuele interrupts begrijp ik nog te weinig om dit op te nemen in het programma.

code:


Device 16F628A
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE                                        ;Alle ingangen digitaal 

;Logische constanten
Symbol AAN          = 0       ;Geinverteerd AAN 
Symbol OFF          = 0       ;UIT 
Symbol On           = 1       ;AAN 
Symbol UIT          = 1       ;Geinverteerd UIT
Symbol HOOG         = 1       ;Hoog signaal
Symbol LAAG         = 0       ;Laag signaal


;Poortnamen
Symbol Sensor1 = PORTB.4                                ;Poort B4 is de eerste sensor
Symbol sensor2 = PORTB.5                                ;Poort B5 is de tweede sensor
Symbol sensor3 = PORTB.6                                ;Poort B6 is de derde sensor
Symbol Led1    = PORTB.0                                ;Led om aan te geven of de sensor iets geregistreerd heeft
Symbol Led2    = PORTB.7                                ;Led om aan te geven of de sensor iets geregistreerd heeft
Symbol Led3    = PORTB.3                                ;Led om aan te geven of de sensor iets geregistreerd heeft


Symbol wachttijd = 100                                  ;Aantal ms voor timeout
Symbol baudrate = 2400                                  ;baudrate

;        76543210
PORTA = %00000000                                       ;Alle PORTA uitgangen uit (laag maken)
PORTB = %11111001                                       ;0,3,4,5,6,7 hoog
TRISB = %01110110                                       ;PoortB als input, behalve 0,3 en 7 voor de leds 

PORTB_PULLUPS On 

HSERIAL_BAUD = baudrate                                 ;baudrate 2400
HSERIAL_RCSTA = %10010000                               ;Enable serial port and continuous receive
HSERIAL_CLEAR=On                                        ;heft eventuele ontvangst buffer overflow op

Dim waarde1 As Byte
Dim waarde2 As Byte
Dim waarde3 As Byte

Declare LCD_DTPIN = PORTA.0                             ;lcd niet standaard aangesloten
Declare LCD_ENPIN = PORTA.7  
Declare LCD_RSPIN = PORTA.6

DelayMS 500                                             ;Opstarten lcd
Cls

Ontvanger: 
    HSerIn wachttijd, Checkpoort, [Wait("oke"),waarde1,waarde2,waarde3]  ;nadat "oke" ontvangen is de volgende waarde doorgeven
    Print At 1,1, DEC3 waarde1, " ", DEC3 waarde2, " ", DEC3 waarde3               ;en deze op lcd scherm laten zien
GoTo Ontvanger

Checkpoort:
    DelayMS 10
    If sensor2=LAAG Then Led1=Led1^1                    ;als sensor1 laag is, toggled led1
    If Sensor1=LAAG Then Led2=Led2^1                    ;als sensor2 laag is, toggled led2
    Led3=Led3^1                                         ;toggled led3        
GoTo Ontvanger

End

De zender stuurt iedere seconde 5 keer het wachtwoord 'oke' en daarna drie waarden. Deze worden door de ontvanger opgeslagen in waarde1, 2 en 3 en geprint op de lcd. Dit werkt goed.
Led3 laat ik togglen om te kijken of de sensors worden uitgelezen. Hiermee heb ik ontdekt dat als de zender uit staat HSERIN blijft wachten door WAIT.

Heeft iemand een idee (en het liefst een beetje voorbeeld code) hoe ik WAIT kan verwijderen en toch met een 'wachtwoord' de start van de dataontvangst kan herkennen?

Ik heb thuis wel een stukje Picbasic-code dat ik in het weekend in elkaar heb geprutst, dat je kunt gebruiken, ik zal het vanavond even posten, kan er nu niet bij.

Het werkt met een interrupt op de RX-lijn, iedere keer dat er een byte binnenkomt wordt deze direct uit de buffer ingelezen en verplaatst naar een array. De al aanwezige data in de array wordt een plekje doorgeschoven. Dit doe je net zolang totdat de eerste drie waarden in je array overeenkomen met de letters 'o', 'k' en 'e'. De bytes daarna bevatten dan de data, eventueel gevolgd door een checksum oid.

Dat zou super zijn! Vol spanning wacht ik af!

Daar is ie dan. Vast niet de netste code die mogelijk is, een beetje van mezelf en een beetje bij elkaar gejat, maar bij mij werkt het prima. Ik ben benieuwd of je er iets mee kunt, en ben ook benieuwd of de pro's nog suggesties hebben om eea te verbeteren!

code:


Device 16F628A                 	                      ; Gebruik een 16F628A type
CONFIG WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF, HS_OSC  ; INTRC_OSC_NOCLKOUT verwijderd
ALL_DIGITAL TRUE              	   		      ; Alle ingangen digitaal
PORTB_PULLUPS ON                        
declare LCD_RSPIN = PORTA.1      		      ; RS pin declareren
DECLARE LCD_ENPIN = PORTA.0   			      ; EN pin declareren
declare XTAL 4

HSERIAL_BAUD = 1200            			      ; Set baud rate
HSERIAL_RCSTA = %10010000  			      ; Enable serial port and continuous receive
HSERIAL_TXSTA = %00100000  			      ; Enable transmit and asynchronous mode
HSERIAL_CLEAR = ON			              ; Optionally clear the buffer before receiving
	
SYMBOL flash_LED = PORTA.2
SYMBOL int_LED   = PORTA.3        

DIM Received AS BYTE                                  ; Variabelen
DIM Value[4] AS BYTE

clear                                                 ; Initialiseren
DELAYMS 500
cls

START:
  INTCON.7 = 1                                        ; Enable Global Interrupts
  INTCON.6 = 1                                        ; Enable Peripheral Interrupts
  PIE1.5 = 1                                          ; Enable UART Rx Interrupt
  ON_INTERRUPT GOTO INT                               ; If there is UART activity: goto INT
GOTO MAIN                                             ; Skip INT, goto main program

INT:  
  HIGH int_LED					      ; interrupt led aan
  HSERIN [Received]
  Value[0]  = Value[1]				      ; zet ontvangen waarde in de array
  Value[1]  = Value[2]				      ; en schuif al aanwezige waarden door
  Value[2]  = Value[3]
  Value[3]  = Received
  If Value[0] = "P" AND Value[1] = "W" Then           ; password = PW
      PRINT AT 1,1, DEC3 Value[2]
      PRINT AT 2,1, DEC3 Value[3]
  EndIf
  LOW int_LED
  CONTEXT RESTORE                         	      ; Restore the registers and exit
GOTO START                                            ; Goto start so INT will be used again

MAIN:
  HIGH flash_LED				      ; hoofdprogramma laat een ledje knipperen
  DELAYMS 500
  LOW flash_LED  
  DELAYMS 500
GOTO MAIN

End

Ziet er netjes uit hoor :)

code:


MAIN:
  HIGH flash_LED				      ; hoofdprogramma laat een ledje knipperen
  DELAYMS 500
  LOW flash_LED  
  DELAYMS 500
GOTO MAIN

Had ook korter gekunt :)

code:


MAIN:
  Toggle flash_LED				      ; hoofdprogramma laat een ledje knipperen
  DELAYMS 500
GOTO MAIN

Scheelt tog weer 2 regels ;)

Wat is trouwens jouw reden om een extern Xtal te gebruiken ? intern is toch ook goed genoeg hiervoor ?

[Bericht gewijzigd door Gerwinh op donderdag 22 mei 2008 21:20:40 (13%)

Bedankt voor de code! Ziet er inderdaad netjes uit.

Ik denk ook dat een externe xtal niet echt nodig is. Bij mijn programmaatje werkte het ook prima met de interne oscilator. Ik ga dit programma ook proberen met de interne oscilator.

Dit weekend ga ik het uitproberen! Ik laat je weten of het gelukt is...

Dank voor de suggesties, die 2 regels verwijderen scheelt toch weer een paar bytes schijfruimte op mijn harddisk :9

Op dit moment ben ik nog met allerlei verschillende circuitjes bezig op mijn breadboard, vandaar het externe Xtal, had gewoon geen zin om het eraf te halen ;) Mijn vorige opstelling bevatte een DS1820 temperatuursensor, daarbij schijnt het allemaal wat kritischer te zijn qua timing.

Ik kon niet wachten tot het weekend en ben net nog even aan de slag gegaan ;-)

Het werkt echt perfect. Dit is wat ik zocht. Nu kan ik mijn experiment verder uitbreiden en proberen om de gordijnen aan te gaan sturen met de zender en ontvanger!!!

Enorm bedankt Mr. Chaos!

BTW: het werkt prima op de interne oscilator.

heb je toevallig nog in dit oude topic de code van de zender??

gr robo