picbasic

Goede middag,

Het is er eindelijke van gekomen om mij in te schrijven bij co forum.

Kleine introductie, ben een oudere jongere die zins een jaar bezig met de cursus picbasic.

Kan het tot nu toe allemaal redelijk volgen maar loop nu vast in deel 4 van de cursus.

Onder staand programma heb ik aangepast, het is de dozen/flessen teller.

Heb eerst orgineel opgebouwd (dit werkt) heb daarna pin configuratie van lcd, leds en drukknop aangepast.

Lcd geeft juite tekst aan alleen werken de drukknoppen niet.

Wat doe/zie ik over het hoofd.

met vriendelijke groet,

pic basic code:


Device 16F628A                ;Gebruik een 16F628A type
Config INTRC_OSC_NOCLKOUT,_   ;Interne oscillator, geen clocksignaal naar buiten
       WDT_OFF,_              ;WatchDog Timer uitgeschakeld
       PWRTE_ON,_             ;Power-up Timer Enable ingeschakeld
       LVP_OFF,_              ;Low Voltage Programming uitgeschakeld
       MCLRE_OFF              ;Externe Master Reset Enable uitgeschakeld
All_Digital TRUE              ;Alle ingangen digitaal
 
;Logische constanten 
Symbol AAN          = 0       ;Geinverteerd AAN 
Symbol OFF          = 0       ;UIT 
Symbol On           = 1       ;AAN 
Symbol UIT          = 1       ;Geinverteerd UIT

Declare LCD_DTPin   PORTB.0   ;De DATA aansluitingen moet nu aan PORTB.0
Declare LCD_ENPin = PORTA.3   ;De EN aansluiting moet nu aan PORTA.3
Declare LCD_RSPin = PORTA.4   ;De RS aansluiting moet nu aan PORTA.4

;Algemene constanten 
Symbol AantalDozen  = 5       ;Aantal dozen dat geproduceerd moet worden 
Symbol AantalStuks  = 12      ;Aantal stuks producten dat in een doos moet(VPE) 

;Poortnamen 
Symbol Gereed       = PORTA.0 ;Hoog als productie klaar is 
Symbol DoosVol      = PORTA.7 ;Geeft puls als een doos vol is 
Symbol ResetToets   = PORTB.6 ;Deze pulstoets stelt de startwaarde weer in 
Symbol TelPuls      = PORTB.7 ;Impuls van de machine als er weer een fles klaar is

;Variabelen declareren
Dim DozenTeller     As Byte   ;Telt het aantal dozen
Dim StuksTeller     As Byte   ;Telt aantal stuks per doos 

        ;76543210
PORTA = %00000000             ; alle portb laag maken.
TRISA = %01111110             ; PORTa.0 en a.7 zijn uitgangen voor de LED's
             
Clear                         ;Wis alle RAM geheugen
DelayMS 500                   ;LCD stabilisering

;Hoofdprogramma 
Cls                           ;Eerste keer scherm wissen 

While 1 = 1                   ;Oneindige lus
  Print At 1, 1, "Stuks: ", @StuksTeller, " van ", @AantalStuks, " "
  Print At 2, 1, "Dozen: ", @DozenTeller, " van ", @AantalDozen, " "

  While (PORTB & 3) < 3 : Wend ;Wacht tot resettoets of puls van de machine weg is
  DelayMS 20                   ;Anti contactdender
  While (PORTB & 3) = 3 : Wend ;Wacht op resettoets of puls van de machine

  If DozenTeller < AantalDozen And StuksTeller < AantalStuks Then ;Order nog niet klaar? 
    If TelPuls = AAN Then     ;Telpuls van de machine bij ieder afgeleverd product
      Inc StuksTeller         ;Weer 1 klaar, dus teller met 1 verhogen
        If StuksTeller = AantalStuks Then ;Als doos vol is dan...
        DoosVol = 1           ;Puls signaal voor machine: moet nieuwe doos invoeren
        DelayMS 200           ;Pulstijd
        DoosVol = 0           ;Signaal weer uitzetten
        Inc DozenTeller       ;Nieuwe doos erbij gekomen
        Clear StuksTeller     ;Reset aantal stuks per doos want nieuwe doos
      EndIf
     EndIf
  Else
    If ResetToets = AAN Then  ;Als er op de resettoets wordt gedrukt dan...
      Clear DozenTeller       ;Reset de DozenTeller (op 0 zetten)
      Clear StuksTeller       ;Reset de StuksTeller (op 0 zetten)
      Gereed = 0              ;Gereed signaal weer laag maken
    EndIf
  EndIf

  If DozenTeller = AantalDozen Then Gereed = 1 ;Aantal dozen is bereikt
Wend                          ;Terug naar WHILE

End
[/code=picbasic]

[Bericht gewijzigd door Hugo Welther op 29 januari 2017 17:16:30 (0%)]

Zet de code even tussen tags, dan is het beter leesbaar:

[code=picbasic]
...
...
...
[/code]

Aanpassen kan met klikken op het 'wijzigen' https://www.circuitsonline.net/images/icons/edit_message.png icon...

[Bericht gewijzigd door Arco op 29 januari 2017 15:12:11 (19%)]

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

Kijk even goed naar je instructieblokken om te beginnen.

Denk aan het gebruik van wile-wend en if/then/else/endif.

Nog even over ENDIF:
Als je met een IF...THEN maar 1 opdracht uit wilt voeren dan kun je dat meteen achter IF...THEN zetten zoals hierboven met S2 is gedaan.
Wil je meer dan 1 opdracht met IF...THEN uitvoeren dan moet je de opdrachten onder IF...THEN zetten, zoals hierboven met S1 en S3 is gedaan.
Om nu de PIC Basic compiler te laten weten waar het blok eindigt moet na de laatste opdracht van dat IF...THEN blok worden afgesloten met ENDIF.

Het verschil tussen WHILE - WEND en REPEAT - UNTIL is dat WHILE voordat het de lus inloopt de conditie al bekijkt, is meteen al niet aan de voorwaarde voldaan, dan wordt de lus nooit uitgevoerd en wordt met de eerste opdracht na WEND verder gegaan.
REPEAT - UNTIL loopt eerst door de lus en daarna wordt pas bekeken of de lus nog eens moet worden uitgevoerd, een REPEAT - UNTIL lus wordt dus altijd minimaal 1 keer uitgevoerd.
Een WHILE - WEND lus wordt steeds opnieuw uitgevoerd zolang aan de voorwaarde is voldaan.
Een REPEAT - UNTIL lus wordt steeds opnieuw uitgevoerd zolang niet aan de voorwaarde is voldaan.

Dit commando voert het programma uit dat staat tussen de woorden WHILE en WEND, hier het aan- en uitzetten van een LED.
Dus WHILE (= zolang) 1 gelijk is aan 1, WEND (= terug keren, wenden), altijd blijven knipperen dus.
WHILE kan dus niet functioneren zonder het woord WEND en horen dus altijd beide in een programma te staan, anders krijg je een foutmelding.

Take care to get what you like or you will be forced to like what you get

@Arco, mijn excuus hier voor ben nog niet zo bedreven in dit soort dingen, zal er de volgende keer opletten.

@Theove, het programma zoals die in picbasic staat(hfdst 4 voorbeeld 3)werkt gewoon.
Het enige wat ik toegevoegd heb zijn de declare regels voor lcd.
Houdt dus ook in dat pinnr's voor de tel en reset toets gewijzigd moeten worden.
En juist deze werken niet.

buckfast_beekeeper

Golden Member

Waarom moet je de tel en reset pulsen wijzigen als je een lcd toevoegt? Kan je in picbasic geen lcd zetten op de pennen die jij wenst? Soepelere programmeer omgeving zoeken in dat geval.

Van Lambiek wordt goede geuze gemaakt.
Rob W.

Golden Member

PortB pullups ontbreekt en ook de trisB staat nergens gedefinieerd.

"Any sufficiently advanced technology is indistinguishable from magic."
paaltje73

Golden Member

Je hebt de buttons verplaatst naar B.6 en 7 maar test nog steeds op port b.0 en 1

WHILE (PORTB & 3) < 3 : WEND

Paaltje

Lambiek

Special Member

Ten eerste welkom op het forum.

pic basic code:


Symbol ResetToets  = PORTB.6 ;Deze pulstoets stelt de startwaarde..
Symbol TelPuls     = PORTB.7 ;Impuls van de machine als er weer....

Zet dit er nog even bij.

pic basic code:


        ;76543210
PORTB = %00000000            
TRISB = %11000000 
Als je haar maar goed zit, GROETEN LAMBIEK.
hadv

Golden Member

Op 29 januari 2017 17:21:08 schreef buckfast_beekeeper:
Waarom moet je de tel en reset pulsen wijzigen als je een lcd toevoegt? Kan je in picbasic geen lcd zetten op de pennen die jij wenst? Soepelere programmeer omgeving zoeken in dat geval.

Kan best, portb is gewoon de default. In de manual staat beschreven hoe je dat moet doen.
Maar dit is typisch iemand de net begint en de picbasic cursus volgt. Op zich prima, zo kom je er in ieder geval rustig in.

Just find out what you like and let it kill you

Goede avond,

Heb alle raad en aanwijzingen opgevolgd maar heb het programma nog niet werkend.

Ten einde raad ben ik weer basic begonnen.
Eerst de led andere pinnr's gegeven.(programma werkt nog steeds.)

Daarna lcd andere pinnr's,.
Hierdoor krijgen de reset en teller ook een ander pinnr.

Hier gaat het fout en werkt het programma niet.

Heb een vraag over onderstaande while regels.
Wat doen/betekend deze regels.

Voor mijn gevoel ga ik hier de fout in.

While (PORTB & 3) < 3 : Wend ;Wacht tot resettoets of puls van de machine weg is
DelayMS 20 ;Anti contactdender
While (PORTB & 3) = 3 : Wend ;Wacht op resettoets of puls van de machine

Klopt dat mask nu dan ook met de aangesloten toetsen? Als je 0x03 gebruikt als mask, moeten de toetsen op RB0 en RB1 zitten...

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

Omdat ik het voorgaande niet snap/begrijp (beginner/Leeftijd)
ben ik opnieuw begonnen met hfdst 4 picbasic.
Kan zeggen dat he leerzaam was.
Omdat ik het niet begrijp heb ik een ander programma gemaakt om het voor mij wat inzichtelijk te maken.
Wat mij niet lukt na veel uitproberen is om pin RA0 en RA1 gedefinieerd te krijgen voor drukknop.
Heb andere pic's geprobeerd maar het zelfde verhaal.

Vraag: wat doe ik niet goed of zie ik over het hfd, zijn deze 2 pinnen wel te definiëren als ingand.

pic basic code:

Device 16F628A ;Gebruik een 16F628A type
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF

Declare LCD_DTPin PORTB.0 ;De DATA aansluitingen nu aan PORTB.0, 1, 2, 3
Declare LCD_ENPin = PORTA.3 ;De EN aansluiting nu aan PORTA.3
Declare LCD_RSPin = PORTA.4 ;De RS aansluiting nu aan PORTA.4

;Logische contante
Symbol AAN = 0 ;geinverteerd aan
Symbol OFF = 0 ;UIT
Symbol On = 1 ;AAN
Symbol UIT = 1 ;geinverteerd uit

;Poort naam
Symbol S1 = PORTA.7 ;tijdelijk drukknop(op pin 16)

;variabelen declareren
Dim Teller As Dword ;telt door(bij As Byte telt de teller maar tot 255)

; 76543210
TRISA = %10000000
PORTA = %00000000
;trisb = %00000000
;portb = %00000000

Clear ;wis alle ram geheugen
DelayMS 500 ;stabilisatie lcd

;Hoofdprogramma
Cls ;Scherm wissen

While 1 = 1 ;oneindige lus
Print At 2, 1, Dec Teller, " ", "pulsen"
If S1 = AAN Then ; als s1 is aan dan
Inc Teller ; met 1 verhogen
EndIf

Wend ;terug naar while

End

basic][/code]

Lambiek

Special Member

Deze onzin heb je niet nodig, dat gebruik je alleen als dat nodig mocht zijn.

pic basic code:


;Logische contante
 Symbol AAN = 0 ;geinverteerd aan
 Symbol OFF = 0 ;UIT
 Symbol On = 1 ;AAN
 Symbol UIT = 1 ;geinverteerd ui

Als je er aan went om 1 en 0 te gebruiken, werkt dat veel makkelijker.

En dit zet je niet zo neer.

pic basic code:


; 76543210
 TRISA = %10000000
 PORTA = %00000000 
 ;trisb = %00000000
 ;portb = %00000000

Maar dat zet je zo neer.

pic basic code:


        ;76543210
PORTA = %00000000
TRISA = %10000000
PORTB = %00000000
TRISB = %00000000

Eerst PORTA en dan TRISA, eerst PORTB en dan TRISB. Dat is veel logischer. Met TRIS bepaal je of het een ingang of een uitgang moet worden.

Dus als je een ingang hoog wil maken, of een uitgang hoog of laag. Gewoon 1 en 0 gebruiken.

pic basic code:


RUN: 

 If S1 = 1 Then     ; als s1 is aan dan
  DELAYMS 100       ; wacht even
   Inc Teller       ; met 1 verhogen
  Print At 2, 1, Dec Teller, " "
 EndIf
GOTO RUN

Heb je al geprobeerd om alleen tekst op je display te zetten, dus zonder teller. Probeer dat eerst eens, en als dat lukt voeg je de teller toe.

Als je haar maar goed zit, GROETEN LAMBIEK.

Ik gebruik meestal:

code:


AAN  = 1
UIT  = 0
_AAN = 0
_UIT = 1

Dan zie je meteen wat het is, maar ik weet niet of Picbasic een underscore als beginkarakter accepteert.

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

Special Member

Op 27 februari 2017 14:07:34 schreef Arco:
Ik gebruik meestal:

code:


AAN  = 1
UIT  = 0
_AAN = 0
_UIT = 1

Dan zie je meteen wat het is, maar ik weet niet of Picbasic een underscore als beginkarakter accepteert.

Die underscore gaat niet volgens mij. Maar vindt je 1 en 0 niet makkelijker dan?, dan zie je toch ook of het aan of uit is.

Als je haar maar goed zit, GROETEN LAMBIEK.

Het kan verwarrend zijn, want soms is aan '1', en soms '0' (hangt af van het feit of het sink of source is)

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

Special Member

Op 27 februari 2017 15:15:46 schreef Arco:
Het kan verwarrend zijn, want soms is aan '1', en soms '0' (hangt af van het feit of het sink of source is)

Ja, maar dan gebruik je het toch alleen als het nodig is.

Als je haar maar goed zit, GROETEN LAMBIEK.
paaltje73

Golden Member

TS schrijft "Wat mij niet lukt na veel uitproberen is om pin RA0 en RA1 gedefinieerd te krijgen voor drukknop."
Declareert ; 76543210
TRISA = %10000000
PORTA = %00000000
Is m.i. geen portA.0 en portA.1
Hoop dat ik het goed zeg.
Succes Paaltje

Dank voor alle reactie's.
Ga hier weer mee stoeien.

@Lamiek:heb het programma zo gemaakt dat ik voor mijzelf wat duidelijkheid schep.
Ja tekst krijg ik in het display.

Neem raad zeker meenemen.

Zoals paaltje al aangeeft was de vraag waarom krijg pin A0.1 en A0.0 niet gedefinieerd.

Lambiek

Special Member

Je hebt PORTA.7 nu als ingang staan, dus moet daar ook de drukknop op.

Als je die op A0 of A1 wil moet je dat opgeven in je programma, en in de TRSA.

pic basic code:


        ;76543210
TRISA = %00000001
Of 
        ;76543210
TRISA = %00000010

En dit moet je dan ook aanpassen

pic basic code:


Symbol S1 = PORTA.1
Of
Symbol S1 = PORTA.2

Of bedoel je nog iets anders?

Als je haar maar goed zit, GROETEN LAMBIEK.

Ik twijfel nu niet meer aan mijn beginners kennis en zeker niet aan de kennis hier op het forum maar dit is gewoon frusterend.

Krijg pin A.0 en A.1 niet gedefinieerd.
Alles lukt mij behalve dit.

Drie andere pic's geprobeert, (lijkt mij dat ze alle 3 niet dezelfde fout hebben)

Iemand nog een idee,

Je moet de pinnen op digitaal zetten door de comparators uit te zetten, default is analoog (dan lees je altijd '0' uit). CMCON op 0x07 zetten.
Staat in de datasheet bij i/o ports:

"The PORTA pins are multiplexed with comparator and voltage reference functions.
The operation of these pins are selected by control bits in the CMCON (Comparator Control register) register and the VRCON (Voltage Reference Control register) register.
When selected as a comparator input, these pins will read as '0's."

[Bericht gewijzigd door Arco op 2 maart 2017 10:17:51 (58%)]

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

Golden Member

Just find out what you like and let it kill you

Werkt dat ook bij de comparators? (in het verleden moest er soms toch CMCON = 0x07 bij wat ik me herinner)

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

Special Member

Zelf zet ik het altijd zo neer.

pic basic code:


All_Digital true 

Dat werkt hier altijd.

Als je haar maar goed zit, GROETEN LAMBIEK.