Dank je voor het snelle commentaar, van zulke dingen leer ik nu - ik had nog nooit gehoord van een CASE structuur.
Na wat help files te doorspitten heb ik nu het volgende:
*zie FP voor het geheel*


'hier begint het scherm gedeelte

      
      if volgend_scherm = high then     'indien de knop ingedrukt word...
         INC schermteller               'dan wordt de var schermteller één hoger
      end if                            '...anders niet
      
      if vorig_scherm = high then       'indien de knop ingedrukt word...
         DEC schermteller               'dan wordt de var schermteller één lager
      end if                            '...anders niet

      select case schermteller          'afhankelijk van de var schermteller wordt
             case 0                     'een tekst op het scherm gezet
                  Lcd_Out(1, 1, Aantal munten= een_cent)
             case 1
                  Lcd_Out(1, 1, Aantal munten= twee_cent)
             case 2
                  Lcd_Out(1, 1, Aantal munten= vijf_cent)
             case 3
                  Lcd_Out(1, 1, Aantal munten= tien_cent)
             case 4
                  Lcd_Out(1, 1, Aantal munten= twintig_cent)
             case 5
                  Lcd_Out(1, 1, Aantal munten= vijftig_cent)
             case 6
                  Lcd_Out(1, 1, Aantal munten= een_euro)
             case 7
                  Lcd_Out(1, 1, Aantal munten= twee_euro)
             case 8
                  Lcd_Out(1, 1, Aantal munten= Totaal)
             case else
                  schermteller = 0
      end select
                  
      if reset_knop = high then         'de reset wordt ingedrukt en dan
         goto main                      'gaat het programma terug naar main
      else                              'anders
         goto Teller                    'gaat het programma terug naar Teller
      end if
      
End.                                    'einde

Nog meer hints, tips?

Wat ik me ook afvraag is het volgende: wanneer een munt voorbij de sensor valt, zal die sensor dan niet te lang een signaal geven (zodat hij er eigenlijk tien ofzo telt)?
Ik dacht dit op te lossen door enkele delays, maar ik denk dat hij dan op enkele andere plaatsen munten niet zal tellen... Suggesties?
groeten, wartos
PS: dit is mijn eerste programmeer-ervaring en voorlopig is het werkend krijgen mijn hoogste prioriteit

je zal op deze manier zeker weten een delay in moeten bouwen. Je micro is veels te snel voor een vallend muntje. Maar zet die delay bijvoorbeeld op 250ms/500ms, dan is het muntje er allang doorheen en dan heb je denk ik nog niet de kans gehad om een volgende erin te stoppen.

En dit:

      
      if telsensor2 = high then
      INC twee_cent
      end if

      if telsensor3 = high then
      INC vijf_cent
      end if
      
      if telsensor4 = high then
      INC tien_cent
      end if
      
      if telsensor5 = high then
      INC twintig_cent
      end if
      
      if telsensor6 = high then
      INC vijftig_cent
      end if
      
      if telsensor7 = high then
      INC een_euro
      end if
      
      if telsensor8 = high then
      INC twee_euro
      end if

kun je oplossen door bijv te doen

if telsensor2 = high then
INC twee_cent
elseif telsensor3 = high then
INC vijf_cent
elseif.... enz
INC ...
end if

Als je klaar bent dan hoef je maar eenmalig end if te typen. Je moet even zien of mijn voorbeeld zo klopt(programmeer normaal in andere talen) maar zo te zien moet het wel goedkomen

[Bericht gewijzigd door Erik op ]

Hmm misschien maar het grote probleem is dat er zowat 8 muntjes tegelijk kunnen vallen, theoretisch dan toch (in ieder gaatje één)
in ieder geval; een goeie nacht!
wartos

positieve flankdetectie gebruiken op de sensor die de munten telt...!!!

ook op de increment / decrement van de schermteller en reset knop een positieve flank detecteren...

de µc is zodanig snel dat ie bij een hoog signaal van de inputs blijft doortellen zolang de drukknop ingedrukt is...
positieve flank detecteert enkel 1 muntje of in het geval de +- knoppen 1 waarde wijziging

je zal ook een debounce of ontdendering moeten inbouwen...

onthou 1 ding : gebruik zo weinig mogelijk delays, das schimmel op de kaas in software.

[Bericht gewijzigd door shortcircuit op ]

Heeft die PIC geen "on pin change" interrupt zoals de AVR ?

<Edit> Zelf maar even Google gedaan:

http://www.mikroe.com/en/books/picbook/2_07chapter.htm

[Bericht gewijzigd door Roland van Leusden op ]

ik zou in dit geval toch opteren om zelf + flanken te programmeren en een debounce functie...

die interrupts zullen theoretisch wel werken maar de sensor zal bij 1 muntje toch denderen en filtert die on change functie van pic die eruit ?

[Bericht gewijzigd door shortcircuit op ]

je kan ook je prog ferm inkorten door slechts 1 lcd_out te programmeren en gebruik te maken van een string variable om je munten te displayen ifv de schermteller,...

Dank je voor de input shortcircuit, maar je praat nu toch een beetje chinees voor mij vrees ik.
een positieve flank detecteren... euh dat doet me denken aan transistors maar ik zit wss fout, of is het softwarematig?
Dat met die string variabele zal ik eens bestuderen, straks zal ik mijn code posten als ik iets goed vind.
Ik ga nu eerst de link van roland checken...

Positieve flank detecteren is puur softwarematig

voor een avr doe ik het meestal zo...

voor - flankdetectie
bitwait portA.0,SET
bitwait portA.0,RESET

voor + flankdetectie
bitwait portA.0,RESET
bitwait portA.0,SET

algemeen (S5/S7 siemens) doe ik het zo:

U M0.0 TE BEWAKEN SIGNAAL
UN M0.2 HULPBITJE
= M0.1 ONE SHOT BITJE

U M0.0
= M0.2

met wat if thens is dat ook te gebruiken in pic of avr
het laatste heeft in deze toepassing mijn voorkeur omdat het programma niet stop en blijft scannen...

je kan ook ergens een interrupt + of - flank configureren geloof ik... maar jij hebt minstens 9 flankdetecties nodig.

er bestaat ook een algoritme om op een byte een detectie te doen maar die vind ik ff niet terug...

[Bericht gewijzigd door shortcircuit op ]

Op 5 maart 2007 09:51:37 schreef shortcircuit:
ik zou in dit geval toch opteren om zelf + flanken te programmeren en een debounce functie...

die interrupts zullen theoretisch wel werken maar de sensor zal bij 1 muntje toch denderen en filtert die on change functie van pic die eruit ?

Volgens mij wel.

If they are defined as input, their current state is compared to the old value which was stored at the last reading from port B.

Probleem is dat de gebruikte uC maar 4 pinnen met on pin change interrupt heeft. Een i2c mcp23016 i/o extender kun je ook goed gebruiken hiervoor.

Dank je voor het meeredeneren allemaal!
1. De PIC16F876A (de 28 pins versie van de 877A) heeft volgens zijn datasheet 14 interrupts(heb er minimaal 11 nodig), maar het ziet er ingewikkeld uit. als het makkelijker kan...
2. Shortcircuit, wat bedoel je eigelijk met die string variabels?
Hier staat de info erover, maar waarom zou ik dat gebruiken? (vragend bedoeld)
3. Dat met die flanken, kan iemand meer uitleg geven?
Ik denk dat shortcircuit bedoelt dat de µC ziet dat een input hoog wordt en vervolgens er eentje bij telt wanneer diezelfde input opnieuw laag wordt, en niet vroeger. Dat zou mooi zijn, alleen, hoe moet ik dat doen in basic? Heeft iemand trefwoorden voor google, voorbeelden van code of ervaring met telprogramma's die werken met externe invloeden?
4.


Teller:                                 'label voor de loop

      if telsensor1 = high then         'indien de sensor een munt waarneemt...
      INC een_cent                      'telt hij er eentje bij de variabele
      else if telsensor2 = high then                           '...anders niet
      INC twee_cent
      else if telsensor3 = high then
      INC vijf_cent
      else if telsensor4 = high then
      INC tien_cent
      else if telsensor5 = high then
      INC twintig_cent
      else if telsensor6 = high then
      INC vijftig_cent
      else if telsensor7 = high then
      INC een_euro
      else if telsensor8 = high then
      INC twee_euro
      end if

dit stukje heb ik opnieuw geschreven, ik hoop dat het werkt

groeten

string variablen zijn variablen die text kunnen bevatten

je zou dan de string variable kunnen vullen met de gewenste text ifv de schermteller en dan op het einde van het programma slechts 1 lcd_out (met de string var) programmeren.

positieve flank:
een hoog signaal wordt gedecteerd terwijl het signaal vorige cycle laag was

negatieve flank:
een laag signaal wordt gedecteerd terwijl het signaal vorige cycle hoog was

hieronder pseudo code voor een positieve flank met if then's

ONE SHOT BITJE = 0
IF (TE BEWAKEN SIGNAAL) = 1 AND (HULPBITJE) = 0 THEN
ONE SHOT BITJE = 1
ENDIF

HULPBITJE = TE BEWAKEN SIGNAAL

het ONE SHOT BITJE is slechts 1 cycle hoog waarmee het mogelijk is om tiptoetsen te maken.

[Bericht gewijzigd door shortcircuit op ]

dit zou je ook eventueel kunnen gebruiken om de munten te tellen

for x = 0 to 7
if portb.x = 1 then
inc munt(x)
endif
next x

Een lichtje gaat bij me branden
voorbeeld:


symbol telsensor = PORTB.0

dim munt as byte
dim controlebit, opteller, as bit

telsensor = 0

main:

 opteller = 0

   if controlebit = 0 AND telsensor = 1 then
     opteller = 1
   end if

 controlebit = telsensor

   if opteller = 1 then
     INC munt
   end if

goto main

end.

poging tot waarheidstabel:


controlebit  | telsensor  || opteller  | munt
             |            ||           |
     0       |     0      ||     0     |   0
     0       |     1      ||     1     |   1
     1       |     0      ||     0     |   0
     1       |     1      ||     0     |   0
opnieuw
     0       |     0      ||     0     |   0
     0       |     1      ||     1     |   2
     1       |     0      ||     0     |   0
     1       |     1      ||     0     |   0

hartelijk dank!

ik ga dit even verwerken en dan post ik de nieuwe broncode
groeten

je kan ook altijd een subroutine schrijven voor een flank detectie en dan dmv vars steeds een andere gebruiken,

tis maar een voorstel ;-)

... echt fijn om te weten wat er als oplossing is gebruikt...

Nou sorry daarvoor maar de programmer werkt nu en het blijkt dat de aansturing van de knoppen niet eens werkt(het lcd trouwens ook niet) dus ik ben bezig vanalles aan het testen, spijtig genoeg schiet het niet echt op want de code schrijven is niet het enige dat moet gebeuren...
wanneer het betert zal ik zeker de code posten :)

volgens mij gaat dit niet op:


TRISA = 1                               'poorten A,B en C worden geconfigureerd
TRISB = 1                               ' 1 = ingang, 0 = uitgang
TRISC = 0

aansturing van de knoppen

worden knoppen tegenwoordig ook al aangestuurd?
volgens mij worden ze ingelezen...

bedoel je hiermee dat je geen hoog signalen krijgt?

Wat ik me ook afvraag is het volgende: wanneer een munt voorbij de sensor valt, zal die sensor dan niet te lang een signaal geven (zodat hij er eigenlijk tien ofzo telt)?

start:
dummywaarde = inputsignaal
if dummywaarde != inputsignaal {
dan is de input veranderd, oftewel munt gevallen
}

goto start

Op 16 maart 2007 20:11:15 schreef wartos:
Waarom niet Jeroen?

Als jij schrijft:

TRISA = 1
TRISB = 1
TRISC = 0

...dan betekent dat je door TRISA alleen PORTA.0 een ingang hebt, door TRISB alleen PORTB.0 ingang en alle 8 PORTC poorten zijn uitgangen.

Waarom?
Omdat TRISA = 1 gelijk is aan TRISA = %00000001
Omdat TRISB = 1 gelijk is aan TRISB = %00000001
Omdat TRISC = 0 gelijk is aan TRISC = %00000000

Lees hierover de cursus deel 3: www.picbasic.nl/beginners3_nl.htm

Dank je wel allemaal voor de reacties!
Na veel gevloek en zoekwerk heb ik een testprogramma opgesteld en na wat testwerk werkt dit! ik kan het nog steeds bijna niet geloven.
Om de pic te laten reageren op de knoppen volstond dit magische zinnetje:

CMCON = 7 

Hier de broncode:


program eenvoudige_teller

'gemaakt voor de PIC16F627
'DOEL: programma voor een muntenteller
'FUNCTIES: 4 knoppen die tellen, led's voor de output
'PORTA bevat de knoppen, PORTB bevat de led's

'*******************************************************************************
' ***ALGEMEEN***
'*******************************************************************************

symbol plus2 = PORTA.1            'de eerste knop wordt gedefinieerd
symbol plus1 = PORTA.0            'de tweede knop wordt gedefinieerd
symbol min1 = PORTA.2             'de derde knop wordt gedefinieerd
symbol min2 = PORTA.3             'de vierde knop wordt gedefinieerd
symbol led1 = PORTB.0
symbol led2 = PORTB.1
symbol led3 = PORTB.2
symbol led4 = PORTB.3
symbol led5 = PORTB.4
symbol led6 = PORTB.5

dim munt as byte
dim controlebit1, opteller1 as byte
dim controlebit2, opteller2 as byte
dim controlebit3, afteller1 as byte
dim controlebit4, afteller2 as byte

'*******************************************************************************
' ***BODY***
'*******************************************************************************

config:

TRISA = %11111111                 'poorten A en B worden geconfigureerd
TRISB = %00000000                 ' 1 = ingang, 0 = uitgang
CMCON = 7                         'iets dat moet, ?waarom? iets met porta
munt = 0                          'var van de munten worden op nul gezet

teller:                             'label om het begin aan te duiden

 opteller1 = 0
 opteller2 = 0
 afteller1 = 0
 afteller2 = 0
 
'*******************************************************************************
 'hier begint het tel gedeelte
'*******************************************************************************

   if (controlebit1 = 0) and (plus1 = 1) then
     opteller1 = 1
   end if

 controlebit1 = plus1

   if (opteller1 = 1) then
     Inc(munt)
   end if
   
'*******************************************************************************
   
   if (controlebit2 = 0) and (plus2 = 1) then
     opteller2 = 1
   end if
   
 controlebit2 = plus2

   if (opteller2 = 1) then
     munt = munt + 2
   end if
   
'*******************************************************************************
   
   if (controlebit3 = 0) and (min1 = 1) then
     afteller1 = 1
   end if

 controlebit3 = min1

   if (afteller1 = 1) then
     Dec(munt)
   end if

'*******************************************************************************
   
   if (controlebit4 = 0) and (min2 = 1) then
     afteller2 = 1
   end if

 controlebit4 = min2

   if (afteller2 = 1) then
     munt = munt - 2
   end if

'*******************************************************************************
 'hier begint het output gedeelte
'*******************************************************************************

  select case munt
          case 0
                  Led1 = 0
                  Led2 = 0
                  Led3 = 0
                  Led4 = 0
                  Led5 = 0
                  Led6 = 0
          case 1
                  Led1 = 1
                  Led2 = 0
                  Led3 = 0
                  Led4 = 0
                  Led5 = 0
                  Led6 = 0
          case 2
                  Led1 = 1
                  Led2 = 1
                  Led3 = 0
                  Led4 = 0
                  Led5 = 0
                  Led6 = 0
          case 3
                  Led1 = 1
                  Led2 = 1
                  Led3 = 1
                  Led4 = 0
                  Led5 = 0
                  Led6 = 0
          case 4
                  Led1 = 1
                  Led2 = 1
                  Led3 = 1
                  Led4 = 1
                  Led5 = 0
                  Led6 = 0
          case 5
                  Led1 = 1
                  Led2 = 1
                  Led3 = 1
                  Led4 = 1
                  Led5 = 1
                  Led6 = 0
          case 6
                  Led1 = 1
                  Led2 = 1
                  Led3 = 1
                  Led4 = 1
                  Led5 = 1
                  Led6 = 1
          case else
                  munt = 0
      end select

goto teller
end.

Het doet exaxt wat het hoort te doen, en ik hoop dat het mensen die ook net beginnen met mikrocontrollers kan helpen.
Opm: dit is geschreven in mikroBasic

Nu moet ik dit zien te verwerken in mijn echte programma, iemand hints om 1) mikroBasic duidelijk te maken dat ik met het intern kristal wil werken en 2) om een 20x4 lcd aan te sturen?

Gebruik de googledoos eens voor CMCON...

CMCON = 7 is bekend.
Dit onder andere, wordt in Proton PIC Basic ingesteld door de bekende ALL_DIGITAL = TRUE.