Beste CO ers,

De Picbasic cursus van Frits heb ik gevolgd en veel van geleerd.(www.picbasic.nl)
Nu ben ik bezig om mijn modelspoorbaan te automatiseren met Pic's.
Ik wil vanaf een Pic 18F452 een commando sturen naar diverse Pic's 16F628A.
De Pic 16F628A die de voor hem bedoelde commando's ontvangt schakeld een bepaald gedeelte uit of in.
De schakeling is gemaakt volgens het princippe van Frits. (Domotica: Huisautomatisering met PIC's en een bus)
Maar in de schakeling word alleen gebruikt gemaakt van de Pic's !6F628A.
Maar ik wil de hoofdprint maken met een 18F452.
De communitcatie tussen de Pic's 16F628A deden het in mijn probeer schakeling prima.
Maar nu vervang ik een Pic 16F628A door de Pic 18F452 en dan lukt de communicatie niet.
De code maak ik met Proton volledig pakket.
Dit voorbeeld moet de led togle dus uit -of aanzetten.

Wie kan mij vertellen wat ik fout doe?
************************************************
Hierbij mijn code van de 18F452.

Device 18F452

CONFIG_START
OSC = HS ; HS Oscillator
PWRT = On ; Enabled
BOR = On ; Enabled
BORV = 42 ; 4.2V
WDT = OFF ; Disabled
STVR = On ; Enabled
LVP = OFF ; Disabled
Debug = off ; Disabled
CONFIG_END
;Include "c:\proton18_20.inc"
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 LED = PORTA.0 ;Hierop een LED met serieweerstand aansluiten
Symbol Toets = PORTB.0 ;Toets voor verzenden van een waarde over de bus
Symbol SerieelIn = PORTB.1 ;Ontvangt via HSERIN data van de bus (B.1 = USART ingang, RX)
Symbol SerieelUit = PORTB.2 ;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
PORTA = %00000001 ;LED voor dit voorbeeld aanzetten (PIC opstart controle)
PORTB = %00000000 ;PORTB poorten laag
TRISA = %11111110 ;A.0 is uitgang voor de LED (in dit voorbeeld)
TRISB = %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

LED = LAAG ;Zet LED van PIC opstart controle uit (poort LAAG maken)

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

If Toets = LAAG Then ;Als toets wordt ingedrukt, dan...
Opdracht = 1 :LED = ~LED ;Verzendt waarde 1 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

GoTo HoofdLus

OpdrachtUitvoeren:
Select Opdracht ;Deze SELECT lijst bepaalt wat een ontvangen opdracht gaat doen
Case 1 ;Als de waarde '26' is ontvangen van de bus, dan...
LED = ~LED ;... de LED aan of uitzetten (togglen)

End Select
GoTo HoofdLus ;Ga weer naar de oneindige hoofdlus

*******************************************************************

En hier de code van de Pic 16F628A

Device 16F628A ;We gebruiken een 16F628A type
Config HS_OSC, WDT_OFF, PWRTE_ON, LVP_OFF, BODEN_OFF, 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)
; HSERIAL_TXSTA = %00100100 ' VOORBEELD PROTON_G20.INTEnable transmit and asynchronous mode
;Include "c:\proton18_20.inc"

;Logische constanten
Symbol HOOG = 1 ;Hoog niveau
Symbol LAAG = 0 ;Laag niveau

Symbol Baud2400I = 16780 ;2400 Baud Inverted (baudrate voor SEROUT)

;Poortnamen
Symbol LED = PORTA.0 ;Hierop een LED met serieweerstand aansluiten
Symbol Toets = PORTB.0 ;Toets voor verzenden van een waarde over de bus
Symbol SerieelIn = PORTB.1 ;Ontvangt via HSERIN data van de bus (B.1 = USART ingang, RX)
Symbol SerieelUit = PORTB.2 ;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
PORTA = %00000001 ;LED voor dit voorbeeld aanzetten (PIC opstart controle)
PORTB = %00000000 ;PORTB poorten laag
TRISA = %11111110 ;A.0 is uitgang voor de LED (in dit voorbeeld)
TRISB = %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

LED = LAAG ;Zet LED van PIC opstart controle uit (poort LAAG maken)

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

If Toets = LAAG Then ;Als toets wordt ingedrukt, dan...
Opdracht = 1 :LED = ~LED ;Verzendt waarde 1 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

GoTo HoofdLus

OpdrachtUitvoeren:
Select Opdracht ;Deze SELECT lijst bepaalt wat een ontvangen opdracht gaat doen
Case 1 ;Als de waarde '26' is ontvangen van de bus, dan...
LED = ~LED ;... de LED aan of uitzetten (togglen)
End Select
GoTo HoofdLus ;Ga weer naar de oneindige hoofdlus
**********************************************************

Ik denk dat bij de 18f de tx poort niet b.0 moet zijn maar C.6 , zie datasheet

Je hebt me op het juiste pad gebracht.
RX en TX had ik verkeerd benoemd bij de 18F452

Ik heb het verandert in:
Symbol SerieelIn = PORTC.7 ;Ontvangt via HSERIN data van de bus (C.7 = USART ingang, RX)
Symbol SerieelUit = PORTC.6 ;Stuurt via SEROUT data naar de bus (C.6 = USART uitgang, TX)

Wat ik wilde met de 18F452 een commando sturen naar de 16F628A gaat uitstekend bedankt voor de tip.

Nu ga ik het programma verder uitwerken.

Nog een vraagje als ik een terug melding wil hebben van de 16F628A naar de 18F452 dan moet ik zeker nog wat aanpassen want dat lukt nog niet?

Je laat dan bv dezelfde waarde meteen weer terugsturen in het submenu "opdracht uitvoeren"

Het terugmelden wilde in eerste instantie niet wat geprobeerd met de software maar uiteindelijk was het de hardware.
Meten zoeken en kijken en uiteindelijk zat pootje 26 van de 18F452 niet goed in het voetje.
Nu werkt het naar behoren.
Nu ga ik proberen een display aan te sturen via de 18F452.
Bedankt nog voor de tip.