pic basic code van 16f628a naar 16f876a

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.

pic basic code:

[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!!

'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...)

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

Golden Member

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.

Een WOK is ook maar een vergiet zonder gaatjes

De code werkt wel bij een 16F628A!Nu aangepast voor een 16f876a( config en poorten)en deze werkt niet op een 16f876a.

Loopt de processor wel en waar gaat het mis? (testen met ledje zoals @marcob zegt)

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

Opgelost,onderbreking in breadboard!Fout gevonden door tip van Marcob.Bedankt Marcob en Arco voor de hulp!