Beste,ik heb de code van Frits getest met 16f628a en werkt alles ok .Ik zou deze willen gebruiken omdat je er kan mee zenden en ontvangen.Nu zou ik de code willen gebruiken met een 16f876a(deze heeft meer poorten)maar de aangepaste code voor 16f876a werkt niet.Als ik gewoon een progammaatje maak om de in- en uitgangen te testen werkt het wel,dus denk ik dat de poorten wel goed zijn ingesteld.
[DEVICE 16F876A
CONFIG HS_OSC, WDT_OFF, PWRTE_ON, LVP_OFF, BODEN_OFF
DECLARE ALL_DIGITAL = TRUE ;Alle ingangen digitaal
DECLARE XTAL = 20 ;Gebruik een kristal van 20MHz
DECLARE HSERIAL_BAUD = 2400 ;Transmissiesnelheid van de data over de bus
DECLARE HSERIAL_RCSTA = %10010000 ;Bit7:Enable serial port / Bit4:Continu ontvangen
DECLARE 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 = 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)
;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 = %00000000
PORTB = %00000000
PORTC = %00000000
TRISA = %11111110 ;A.0 is uitgang voor de LED (in dit voorbeeld)
TRISB = %11111111
TRISC = %11111111 ;USART uitgang C.6 moet in rust hoog-ohmig zijn
DECLARE 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
;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
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...
LED = ~LED ;... de LED aan of uitzetten (togglen)
END SELECT
GOTO HoofdLus ;Ga weer naar de oneindige hoofdlus/]
Wat doe ik fout?Alvast bedankt voor de hulp!!Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
'Code werkt niet' is nogal cryptisch en niet erg duidelijk...
Wat werkt er niet?
Zulke 'spaghetticode' met veel GOTO's erin is onoverzichtelijk en de oorzaak waardoor Basic een slechte naam kreeg... 
(in een goed programma staat liefst geen enkele GOTO...)
marcob
Honourable Member
People tend to overestimate what can be done in one year and to underestimate what can be done in five or ten years
Wat ik altijd doe is een 'Toggle LED' in het programma zetten.
je begint in de hoofdlus, zodat je weet dat het programma loopt.
Daarna verplaats je hem naar de sub lussen, zodat je kan zien dat die wordt aangeroepen.
De code werkt wel bij een 16F628A!Nu aangepast voor een 16f876a( config en poorten)en deze werkt niet op een 16f876a.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Opgelost,onderbreking in breadboard!Fout gevonden door tip van Marcob.Bedankt Marcob en Arco voor de hulp!