picbasic

schiet mij terug in het rubbertje.

Na tips , ideeën ben ik met frisse energie de hele middag weer aan het stoeien (lezen/experimenteren) gegaan maar helaas krijg niets werkend.

krijg bij compile fout melding, incorrect file type for compiler.

wat zie ik als beginner over het hoofd.

Arco

Special Member

Als het eerst wel compileerde dan zal je wel iets kapotgemodificeerd hebben in de code... ;)
Zoals gezegd, CMCON moet in ieder geval op 0x07, anders werkt 't zeker niet...

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

Special Member

Op 2 maart 2017 22:21:32 schreef zeeman..59:
wat zie ik als beginner over het hoofd.

Ik heb je programma even in een 16F887 gezet en getest, niet op PORTA.7 maar op PORTA.0. Het werkt niet goed op deze manier, zodra je een puls geeft vliegt de teller omhoog. Dit even buiten dat je PORTA.7 niet aan de gang krijgt.

Ik doe het vaak op deze manier:

pic basic code:


Symbol SW1 = PORTE.0
Symbol SW2 = PORTE.1

Dim TELLER As Word
Dim TEL_BIT As Bit

Cls                                        

DelayMS 500                                

Clear 

; Jou poortinstellingen.......

TELLER = 0

Print At 1,1,"TELLER"

RUN:

    If SW1 = 1 Then
     TEL_BIT = 1
      GoSub TEL_OP
    EndIf
       
    If SW2 = 1 Then
     TEL_BIT = 1
      GoSub TEL_AF
    EndIf  
GoTo RUN

TEL_OP:

    If TEL_BIT = 1 Then
     TELLER = TELLER + 1
    EndIf
    
    Print At 1,8,Dec3 TELLER,
    
    TEL_BIT = 0
    
    If TELLER > 255 Then
     TELLER = TELLER - 1
    EndIf
    
    If SW1 = 0 Then
     If TEL_BIT = 0 Then
      Return
     EndIf
    EndIf
GoTo TEL_OP

TEL_AF:

    If TEL_BIT = 1 Then
     TELLER = TELLER - 1
    EndIf
    
    Print At 1,8,Dec3 TELLER,
    
    TEL_BIT = 0 
    
    If TELLER < 0 Then
     TELLER = TELLER + 1
    EndIf
    
    If SW2 = 0 Then
     If TEL_BIT = 0 Then
      Return
     EndIf
    EndIf
GoTo TEL_AF

End

Er wordt een bit hoog gezet zodra SW1 ingedrukt wordt, als de TEL_BIT 1 is dan wordt er naar TEL_OP gestapt en de teller wordt met één op gehoogd. De TEL_BIT wordt op nul gezet en zodra SW1 losgelaten wordt, wordt er weer naar run gestapt.

Op deze manier kun je SW1 gewoon ingedrukt houden zonder dat de teller in waarde omhoog vliegt.

Voor SW2 geld het zelfde, dan wordt er afgeteld. Misschien kun je hier iets mee.

Met dit stukje kun je verhinderen dat je teller hoger gaat dan een bepaalde in gegeven waarde, in dit geval is dat 255 en 0.

pic basic code:


    If TELLER > 255 Then
     TELLER = TELLER - 1
    EndIf

; Of dit.

    If TELLER < 0 Then
     TELLER = TELLER + 1
    EndIf

Maar dat ligt helemaal aan de toepassing, je heb het niet altijd nodig.

Als je haar maar goed zit, GROETEN LAMBIEK.

Een ieder dank voor alle hulp ideeën.(voor ik het vergeet)

@Lambiek, dat de teller opslaat was mij ook opgevallen.
Dat had mijn volgende uitdaging geweest.

De teller is een klein stukje van een groter geheel dus ik wil weten hoe ik alle poorten kan gebruiken.

Daarom erger ik mij dat mij niet lukt om A.0,A.1 gedefinieerd te krijgen.(maar aanhouder wint)

Voor zover iedereen vast bedankt.

Arco

Special Member

Daarom erger ik mij dat mij niet lukt om A.0,A.1 gedefinieerd te krijgen.(maar aanhouder wint)

Dan nog maar eens: je moet de comparators uitzetten...

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

De mogelijke oplossing is toch ECHT al enige malen gegeven:
- comparators uitzetten (CMCON = 0x07)
of
- declare all_digital = 1

heb je dit nou al eens uitgeprobeerd?

misschien moet je de laatste versie van de code waar het mis gaat eens even posten...

Just find out what you like and let it kill you

@Arco, hadv,

twijfel geen moment aan jullie antwoorden, geloof me ik heb het allemaal geprobeerd.

het zal beginners onkunde zijn.

des al niet te min ben ik blij met jullie suggesties en antwoorden.

Dank daar voor.

Arco

Special Member

Plaats je code, dan is het misschien zo opgelost...

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

na het weekend ga ik het eerst zelf proberen.

Eureka, het is gelukt.
Heb poort A.0 en A.1 werkend.
Heb het programma van Lambiek aangepast.(Lambiek excuus daarvoor)
Heb aan het programma contact dender toegevoegd omdat de teller af en toe toch doorloopt.
Na veel uit proberen blijf ik dit probleem toch houden.
Zou dit te maken kunnen hebben met soort drukknop.
Drukknop wordt met de tijd vervangen voor potentiaal vrij maakcontact.

Device 16F628A
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF

All_Digital True

Declare LCD_DTPin PORTB.0
Declare LCD_ENPin = PORTA.3
Declare LCD_RSPin = PORTA.4

Symbol SW1 = PORTA.0

Dim TELLER As Word
Dim TEL_BIT As Bit

Cls

DelayMS 500

Clear

; poortinstellingen.......
; 76543210
PORTA = %00000000
TRISA = %00000001
PORTB = %00000000
TRISB = %00000000

TELLER = 0

Print At 2,1,"TELLER"

RUN:
If SW1 = 1 Then
TEL_BIT = 1
GoSub TEL_OP
EndIf
GoTo RUN

TEL_OP:
If TEL_BIT = 1 Then
DelayMS 100 ;contact dender
TELLER = TELLER + 1
Print At 2,8,Dec4 TELLER,
EndIf

TEL_BIT = 0

If TELLER > 255 Then
TELLER = TELLER - 1
EndIf

If SW1 = 0 Then
DelayMS 100 ;contact dender
If TEL_BIT = 0 Then
Return
EndIf
EndIf

GoTo TEL_OP

End

Lambiek

Special Member

Op 9 maart 2017 18:27:17 schreef zeeman..59:
Heb het programma van Lambiek aangepast.(Lambiek excuus daarvoor)

Ja, dat is wel heel erg. :) Doe ermee wat je wil, het is om je op weg te helpen.

Heb aan het programma contact dender toegevoegd omdat de teller af en toe toch doorloopt.

Dat is bijna onmogelijk, want er wordt op deze manier echt gekeken of de drukknop hoog of laag is. Die DELAYMS hoeft er echt niet tussen. Maar het kan ook geen kwaad.

Na veel uit proberen blijf ik dit probleem toch houden.
Zou dit te maken kunnen hebben met soort drukknop.

Je zou inderdaad denken aan een slechte drukknop. Heb je wel pull down weerstanden aan de pinnen zitten, zo niet dan heb je last van zwevende pinnen.

En zet je code eens hier tussen, dat leest een stuk pretiger.

[code=picbasic]
-------------------------------
JOU PROGRAMMA CODE.
-------------------------------
[/code]

Als je haar maar goed zit, GROETEN LAMBIEK.

Onderstaand programma is samengevoegd uit twee verschillende programma's
De 1 is thermostaat figuur 8 picbasic cursus tweede is een teller.

Onafhankelijk van elkaar werkt het zoals ik wil.
Beide,temperatur en teller wil ik zichtbaar in 1 diplay.(2x24)

Dit lukt dus niet, alleen thermostaat werkt.
Dit is ook niet vreemd omdat ik met while en wend goto door elkaar gebruik.

Uiteraard ben hier mee aan experimenteren geweest.

Wat zie ik over het hoofd

pic basic code:


-------------------------------------------------------------------
Device 16F628A                
Config INTRC_OSC_NOCLKOUT,_
       WDT_OFF,_
       PWRTE_ON,_
       LVP_OFF,_
       MCLRE_OFF

All_Digital TRUE              ; alle ingangen digitaal

Declare LCD_DTPin   PORTB.0
Declare LCD_ENPin = PORTA.3
Declare LCD_RSPin = PORTA.4

;Logische constanten
Symbol HOOG         = 1
Symbol LAAG         = 0


;Normale constanten
Symbol Convert      = $44     ; de DS1820 moet de temperatuur gaan meten
Symbol Graad        = 223     ; 223 is 'graad' karakter
Symbol RdScratchPad = $BE     ; temperatuur van de DS1820 uitlezen
Symbol SkipROM      = $CC     ; geen gebruik van unieke adres


;Poortnamen
Symbol DS1820       = PORTA.1 ; temperatuur sensor op poort a.1
Symbol Potmeter     = PORTA.2 ; potmeter op poort a.2
Symbol Uitgang      = PORTB.4 ; led op poort b.4
Symbol telpuls      = PORTA.0 ; potentiaal vrij contact


;Variabele declareren
;BYTE
Dim Temperatuur   As Byte     ; factor 2 van de temperatuur Celsius
Dim Thermostaat   As Byte     ; ingestelde thermostaat temperatuur 
Dim Teller        As Word
Dim Tel_Bit       As Byte


;        76543210
PORTA = %00000000             ; porta laag
TRISA = %00000001             ; porta.0 potentiaal contact
PORTB = %00000000             ; portb laag
TRISB = %11101111             ; portb.4 uitgang voor led 


Clear                         ; wis ram geheugen

DelayMS 500                   ; stabilisatie lcd

; --- eerste gedeelte thermostaat ----

;Hoofdprogramma
Cls                            ; wis lcd
                               
Print At 1, 1,  "Temp."        ; tekst op regel 1, thermostaat, eerste gedeelte
Print At 1, 14, "Inst."        ; tekst op regel 2, thermostaat, eerste gedeelte
Print At 2, 1,  "teller"       ; teller, tweede gedeelte
Print At 2, 12, "punten"       ; teller, tweede gedeelte

While  1 = 1
  Thermostaat = Pot Potmeter, 40             ; lees voor de functie pot deel 5 door
  If Thermostaat > 60 Then Thermostaat = 60  ; max tot 30 graden instelbaar (60 / 2)

  OWrite DS1820, 1, [SkipROM, Convert]       ; temperatuur meten
  OWrite DS1820, 1, [SkipROM, RdScratchPad]  ; Zend opdracht
  ORead  DS1820, 2, [Temperatuur]            ; lees temperatuur  

  Print At 1, 7,  @Temperatuur / 2, ".", Dec1 (Temperatuur // 2) * 5, Graad, "C- "
  Print At 1, 14, @Thermostaat / 2, ".", Dec1 (Thermostaat // 2) * 5, Graad, "C "

  If Temperatuur < Thermostaat Then Uitgang = HOOG ; uitgang hoog (aan) als temp te laag is
  If Temperatuur > Thermostaat Then Uitgang = LAAG ; uitgang laag (uit) als temp te hoog is

  DelayMS 300
Wend
 
; --- tweede gedeelte teller ---

Teller = 0

RUN:

    If telpuls = 1 Then
    Tel_Bit = 1
     GoSub Tel_op
    EndIf
GoTo RUN

Tel_op:

    If Tel_Bit = 1 Then
     Teller = Teller + 1
     Print At 2, 8, Dec3 Teller,
    EndIf 
    
Tel_Bit = 0
 
If Teller > 255 Then
 Teller = Teller - 1
EndIf

If telpuls = 0 Then
 If Tel_Bit = 0 Then
  Return
 EndIf
EndIf
 
GoTo Tel_op 

End
-----------------------------------------------------------------
Lambiek

Special Member

Dit moet een bit zijn.

pic basic code:

Dim Tel_Bit  As Byte

pic basic code:

Dim Tel_Bit  As Bit

En waar stap je naar run toe, ik denk dat je programma op deze manier in de While lus blijft hangen.

Als je haar maar goed zit, GROETEN LAMBIEK.

programma blijft inderdaad in de while lus hangen.

Lambiek

Special Member

Alles even in één lus zetten.

Als je haar maar goed zit, GROETEN LAMBIEK.

Iemand nog een idee/tip.
Na een dag ploeteren niet gelukt om 1 lus te maken.
Zal beginners onkunde zijn.

paaltje73

Golden Member

Je laatste opdracht in je programma luidt 'END'. Zet daar een 'W' voor. Verwijder die WEND halverwege je programma. Er zal in je 2e stukkie ook nog wel wat mis zijn maar dat zien we dan wel weer.
Succes Paaltje

Dat is dus die Wend voor je 2e gedeelte regel

[Bericht gewijzigd door paaltje73 op vrijdag 24 maart 2017 09:21:22 (10%)

Lambiek

Special Member

En vergeet dan weer geen END helemaal onderaan je programma te zetten, anders gaat het nog mis. :)

Als je haar maar goed zit, GROETEN LAMBIEK.

Dank voor de tips.
Ga ik zeker uit proberen als ik weer terug ben.

Terug van weggeweest, heb afgelopen 2 weken mijn gedachte over programma laten gaan.

Heb zelf nog het 1 en ander uitgeprobeerd.(niet werken dus)

Als laatste heb ik de aanpassingen gedaan zoals paaltje73 en Lambiek adviseerde.

Ook hier, paaltje73 voorspelde het al, gaat het niet goed.

De teller werkt goed maar temp werkt niet.

Wat mij wel opvalt is, dat de actuele temperatuur en ingestelde temp in display verschijnt op het moment dat ik de pic opnieuw programmeer.

Heeft er iemand nog een idee.

Lambiek

Special Member

En als je het zo neer zet. Vanaf Clear haal je weg, en daar zet je dit voor in de plaats.

pic basic code:


Clear                          ; wis ram geheugen
 
DelayMS 500                    ; stabilisatie lcd
 
Cls                            ; wis lcd

Teller = 0
 
Print At 1, 1,  "Temp."        ; tekst op regel 1, thermostaat, eerste gedeelte
Print At 1, 14, "Inst."        ; tekst op regel 2, thermostaat, eerste gedeelte
Print At 2, 1,  "teller"       ; teller, tweede gedeelte
Print At 2, 12, "punten"       ; teller, tweede gedeelte
 
RUN:

  Thermostaat = Pot Potmeter, 40             ; lees voor de functie pot deel 5 door
  If Thermostaat > 60 Then Thermostaat = 60  ; max tot 30 graden instelbaar (60 / 2)
 
  OWrite DS1820, 1, [SkipROM, Convert]       ; temperatuur meten
  OWrite DS1820, 1, [SkipROM, RdScratchPad]  ; Zend opdracht
  ORead  DS1820, 2, [Temperatuur]            ; lees temperatuur  
 
  Print At 1, 7,  @Temperatuur / 2, ".", Dec1 (Temperatuur // 2) * 5, Graad, "C- "
  Print At 1, 14, @Thermostaat / 2, ".", Dec1 (Thermostaat // 2) * 5, Graad, "C "
 
  If Temperatuur < Thermostaat Then Uitgang = HOOG ; uitgang hoog (aan) als temp te laag is
  If Temperatuur > Thermostaat Then Uitgang = LAAG ; uitgang laag (uit) als temp te hoog is
 
    DelayMS 50

    If telpuls = 1 Then
     Tel_Bit = 1
      GoSub Tel_op
    EndIf
GoTo RUN
 
Tel_op:

    If Tel_Bit = 1 Then
     Teller = Teller + 1
     Print At 2, 8, Dec3 Teller,
    EndIf 
 
    Tel_Bit = 0
 
    If Teller > 255 Then
     Teller = Teller - 1
    EndIf
 
    If telpuls = 0 Then
     If Tel_Bit = 0 Then
      Return
     EndIf
    EndIf
 
GoTo Tel_op 
 
End

Als je haar maar goed zit, GROETEN LAMBIEK.

@ Lambiek;en andere co'ers

Heb ook nog even geëxperimenteerd met while en wend ook dit gaat goed.

Heb nog even mijn aantekeningen er bij gepakt om te kijken wat ik over het hoofd heb gezien.

Ik heb er akelig dichtbij gezeten met experimenteren.

Al met al een leerzaam project geweest.

Dank voor alle input.

Lambiek

Special Member

Als je haar maar goed zit, GROETEN LAMBIEK.