868Mhz zender/ontvanger

Alleen berichten met de trefwoorden “interrupt picbasic” worden getoond. Alle berichten tonen

Hallo,

ik zou willen via de PC een getal serieel versturen naar mijn PIC en dan dat getal draadloos versturen naar een andere PIC. Momenteel heb ik een werkend schema maar dan bedraad. De draden zou ik dus weg willen en werken met een zender/ontvanger, deze die ik gebruik is die van CONRAD (190939 - 89).

Ik vroeg mij af of ik de Signaal pinnen rechtstreeks mag aansluiten mijn RX/TX-pin van mijn PIC16f627 of is er nog een encoder/decoder nodig?

Ik heb al wat rondgezocht op het forum en ik las dat het zou moeten lukken met Manchester-codering. Nu vroeg ik mij hoe je dit juist doet in picbasic? Iemand die hiervan een voorbeeldje heeft?

Arco

Special Member

Als de pic en de modules op dezelfde spanning werken kun je ze aan elkaar hangen...
Over picbasic en manchester zijn genoeg topics te vinden: http://www.picbasic.co.uk/forum/showthread.php?t=198

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

Ik heb de link bekeken en ben dan met volgende code aan de slag proberen te gaan

pic basic code:


Device 16F628A                ;We gebruiken een 16F628A type
Config XT_OSC, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
 
ALL_DIGITAL TRUE                            ;Alle ingangen digitaal
PORTB_PULLUPS ON 
XTAL 4
 
;*************************************************************************************************************
; Alle byte's enz. 
;*************************************************************************************************************
 
dim MYDATA as byte
dim D as byte
dim ENCODED as word
 
;*************************************************************************************************************
; Baudrate instellingen rs232  2400,8,N,1
;*************************************************************************************************************
 
HSERIAL_BAUD = 2400            			    ; 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
 
;*************************************************************************************************************
; Interrupt
;*************************************************************************************************************
 
main:
 

    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
 
;*************************************************************************************************************
; Hier het hoofdmenu:
;*************************************************************************************************************
 
INT:
 

while 1 = 1                     ; while 1 is 1 then stay in this loop
 
HRSIN MYDATA

'Encode Data
For D = 0 TO 7
    IF MYDATA.0[D]=0 Then
        ENCODED.0[D * 2]=0
        ENCODED.0[D * 2 + 1]=1
    Else
        ENCODED.0[D * 2]=1
        ENCODED.0[D * 2 + 1]=0
    EndIF
Next

HRSOUT MYDATA                   ; send incoming to transmitter

   CONTEXT RESTORE              ; Restore the registers and exit
 
GOTO main                       ; Goto start so INT will be used again
 
wend
 
End

Als ik dit probeer te compileren krijg ik tal van errors. Iemand een idee wat ik fout doe? De code is nochtans bijna een exacte copy van de link

Arco

Special Member

Ik gebruik geen Picbasic, maar een paar dingen vallen toch wel op.

- De interrupt routine staat middenin main() waar 'ie niet thuis hoort.
- Hserin en -out horen eigenlijk niet in een interrupt thuis

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

de interrupt werkt wel als ik i.p.v. zender en ontvanger werk met bedrading ertussen dus daar zit het probleem volgens mij niet.

De errors die gegeven worden zijn de lijnen van "IF" t.e.m. "ENDIF"

Het is dus enkel dat stuk dat fout kan zijn volgens mij

of eventueel in het begin van het programma
->
dim MYDATA as byte
dim D as byte
dim ENCODED as word

Het enige probleem is dat ik niet zie wat er mis is

Arco

Special Member

Zoals gezegd: de interrupt routine staat middenin je gewone code, dat hoort niet. (Misschien dat de compiler het toch nog recht breit, maar dat is gissen)

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

Ik heb nu de interrupt weggehaald en geprobeerd met volgende code:

pic basic code:

Device 16F628A                ;We gebruiken een 16F628A type
Config XT_OSC, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
 
ALL_DIGITAL TRUE                            ;Alle ingangen digitaal
PORTB_PULLUPS ON 
XTAL 4
 
;*************************************************************************************************************
; Alle byte's enz. 
;*************************************************************************************************************
 
dim MYDATA as byte
dim D as byte
dim ENCODED as word
 
;*************************************************************************************************************
; Baudrate instellingen rs232  2400,8,N,1
;*************************************************************************************************************
 
HSERIAL_BAUD = 2400            			    ; 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
 
 
;*************************************************************************************************************
; Hier het hoofdmenu:
;*************************************************************************************************************
 
main:
 

while 1 = 1                     ; while 1 is 1 then stay in this loop
 
HRSIN MYDATA

'Encode Data
For D = 0 TO 7
    IF MYDATA.0[D] = 0 Then
        ENCODED.0[D * 2] = 0
        ENCODED.0[D * 2 + 1] = 1
    Else
        ENCODED.0[D * 2] = 1
        ENCODED.0[D * 2 + 1] = 0
    EndIF
Next

HRSOUT MYDATA                   ; send incoming to transmitter
 
wend
 
End

Het resultaat blijft jammer genoeg hetzelfde, nog ideeen?

"Ben nog een N00B, maar dat is al aan het veranderen ;)

het moeten idd Arrays zijn, de "MYDATA" zou moeten een waarde voorstellen die bv. ingegeven wordt in hyperterminal

de "ENCODED" array om van 8bit naar 16bit te gaan (manchester codering)

Gevonden op een forum:
Encoding: 8 bit byte becomes 16 bits to transmit... zero's become "01" and ones become "10".

Decoding: 16 bits get deconstructed back to 8 bit byte... "01" gets turned back into a zero and "10" gets turned back into a one.

Example... you are sending byte $00 which is equal to %00000000... this get's turned into %0101010101010101.

Als ik van MYDATA een array probeer te maken door bv. dim MYDATA[7] as byte in te geven werkt mijn HRSIN MYDATA niet meer :s

dus wat in werkelijkheid moet gebeuren is seriele data inlezen via RS232 (dus "MYDATA"). Deze data omzetten naar een 16-bit signaal voor de transmitter (d.m.v. manchester coding). En dan deze data doorsturen via de transmitter naar de receiver en daar dan terug decoderen (maar dat is pas de volgende stap - het zenden lukt namelijk nog niet)

Ik heb nu ondertussen al heel wat gezocht op het internet en heb momenteel nog niks gevonden voor picbasic. M.a.w. enkel theorie maar niks dat werkt. Er moet toch nog iemand zijn die mij dit al voorgedaan heeft? Het is enkel het coderen en decoderen van het draadloos signaal dat mij niet lukt, met draad werkt alles perfect.

Is er niemand die een voorbeeldcode heeft van het coderen/decoderen via manchester in picbasic?

Arco

Special Member

Als ik van MYDATA een array probeer te maken door bv. dim MYDATA[7] as byte in te geven werkt mijn HRSIN MYDATA niet meer

Je moet er ook wel een index achter zetten, anders weet de compiler niet wat er gebeuren moet.

pic basic code:

HRSIN MYDATA[index]   

(Index is in dit geval 0...7)

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

de HRSIN werkt nu idd maar ik zit nog steeds met het probleem tussen "IF" en "ENDIF"

de code die ik gebruik heb ik gevonden op verschillende fora maar ik denk dat dit geen picbasic code is? (er staat bij code voor PBP, ik dacht dat dit stond voor PicBasicPro maar waarom werkt het dan niet bij mij? Ook al is het de Lite versie die ik gebruik, dit zou dan toch ook moeten lukken veronderstel ik?)

ik begrijp niet waarom die .0 staat achter "MYDATA" en "ENCODED"?
Als ik de .0 weg doen en onderstaande code gebruik krijg ik geen errors meer maar ik denk niet dat het nog zal werken dan?

pic basic code:

Device 16F628A                ;We gebruiken een 16F628A type
Config XT_OSC, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
 
ALL_DIGITAL TRUE                            ;Alle ingangen digitaal
PORTB_PULLUPS ON 
XTAL 4
 
;*************************************************************************************************************
; Alle byte's enz. 
;*************************************************************************************************************
 
dim MYDATA[8] as byte
dim D as byte
dim ENCODED[16] as word
 
;*************************************************************************************************************
; Baudrate instellingen rs232  2400,8,N,1
;*************************************************************************************************************
 
HSERIAL_BAUD = 2400            			    ; 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
 
;*************************************************************************************************************
; Interrupt
;*************************************************************************************************************
 
main:
 

    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
 
;*************************************************************************************************************
; Hier het hoofdmenu:
;*************************************************************************************************************
 
INT:
 

while 1 = 1                     ; while 1 is 1 then stay in this loop
 
Hrsin MYDATA[7]

'Encode Data
For D = 0 TO 7
    IF MYDATA[D] = 0 Then
        ENCODED[D * 2] = 0
        ENCODED[D * 2 + 1] = 1
    Else
        ENCODED[D * 2] = 1
        ENCODED[D * 2 + 1] = 0
    EndIF
Next

HrsOUT MYDATA[7]               ; send incoming to transmitter

   CONTEXT RESTORE              ; Restore the registers and exit
 
GOTO main                       ; Goto start so INT will be used again
 
wend
 
End

[Bericht gewijzigd door MLX op dinsdag 24 september 2013 23:22:38 (68%)