picbasic


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.

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 en software ontwikkeling: www.arcovox.com
hadv

Golden Member

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.

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

Arco - "Simplicity is a prerequisite for reliability" - hard 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 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.
Lambiek

Special Member

Oké, dat is mooi. Volgens mij had je de twee gedeeltes in twee aparte lussen staan, en dat gaat nooit goed. Je had een While Wend lus, en een Run Gto Run lus in je programma staan. Dat moet in één lus staan, of While Wend of Run Goto Run.

Het kan wel met twee lussen, maar dan moet je Gosub en Return gebruiken.

Maar het werkt nu, en daar gaat het om. :)

Als je haar maar goed zit, GROETEN LAMBIEK.
paaltje73

Golden Member

Om te beginnen mis ik je TRIS instellingen zoals reeds vermeld.

Voor de duidelijkheid maak je commentaar zonder fouten.
Symbol LED1 = PORTA.2 ; Poort A.0 heeft nu de naam LED1
Zit die LED1 nou aan A.2 of A.0?

Dan de fout...
If S1 = AAN Then ; Als S1 aan is dan...
High LED1 ; LED1 aan
DelayMS 500 ; na 0,5 sec uit
Low LED1
DelayMS 500 ; na 0,5 sec uit
EndIf

Bovenstaande werkt, het verschil...
Zet die delayMS 500 ook onder de LOW LED1 en verwijder de regels
While S2 = AAN
Wend
Hij blijft vanzelf in de IF...ENDIF loop zolang je de button drukt.

Doe dit ook bij de andere 2 IF's....ENDIF's

Hoop dat het helpt.
Gr. paaltje
Te laat ivm inlog problemen. sorry