PIC16F690 programma doet rare dingen wanneer de program-counter groter dan 11bit wordt

Hoi,

Ikzelf sta nog in de beginfase in het programmeren met PIC's.
Nu ben ik zover geraakt om tekst op een LCD te kunnen schrijven.

Het projectje waar ik momenteel aan bezig ben is een munten-teller.
De code is steeds stapje per stapje uitgebreid om steeds te kunnen testen of mijn 'programeersels' ook werkte.
Nu ben ik op een punt gekomen dat mijn programmeercode de 2048 regels overschrijd en dat het programma dan rare dingen doet.

Na wat op te zoeken blijkt dat dit komt dat een 'goto' of 'call' instructie niet kan overspringen in de 2 hoogste bits van de program-counter 'PCLATH'.
(hopelijk goed uitgelegd)
Nu was ik in veronderstelling dat ik met 13 bit (8192 regels) ruim voldoende programma-counter had. Maar eigenlijk kan ik met mijn huidige programmeerlogica nooit verder dan 11bit (2048 regels) volschrijven.

Zo was ik in het begin ook erachter gekomen dat 'addwf PCL,f' en de nodige regels eronder om tekst op mijn LCD te schrijven, in het PCL moeten blijven. dit omdat de PCLATH niet geschreven of gelezen kan worden.

Nu is de vraag: is er een mogelijkheid om toch call en goto instructies te gebruiken wanneer mijn programmacode groter is dan 11bit (2048 regels)? Zijn er andere truckjes om toch langere programmeercode te kunnen schrijven?
Of moet ik een heel andere denkwijze in mijn programmeren gaan toepassen?

Hieronder de code zoals ik deze momenteel nog werkend heb, maar wanneer ik ga uitbreiden, loopt het vast.
Het is wel zo dat de code op sommige plaatsen eenvoudiger geschreven kan worden, daar bespaar ik denk ik wel een 100 tal regels, maar dat zal niet voldoende zijn naar het uiteindelijk doel dat ik geprogrammeerd wil krijgen.
De code splits ik even in verschillende posten omdat deze te lang is

code:

picasm:

#include <p16F690.inc>
     __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
     org 0

		cblock	0x20	;start of general purpose registers
			count	;used in looping routines
			count1	;used in delay routine
			counta	;used in delay routine
			countb	;used in delay routine
			tempLCD	; opslag van W voor deze op te splitsen in 2 x 4 bit data
			tmp1	; wordt gebruikt voor anti-dender 'inline vertraging' bij de drukknoppen
			tmp2	; wordt gebruikt voor anti-dender 'inline vertraging' bij de drukknoppen
			tmp4	; wordt gebruikt voor anti-dender 'inline vertraging' bij de drukknoppen
			tmp5	; wordt gebruikt voor anti-dender 'inline vertraging' bij de drukknoppen
		tmp6		; teller voor aantal errors
		tmp6_2		; wordt als inline vertraging gebruikt om blijvend detecteren te registreren
		tmp6_1		; wordt als inline vertraging gebruikt om blijvend detecteren te registreren
		tmp6_050	; wordt als inline vertraging gebruikt om blijvend detecteren te registreren
		tmp6_020	; wordt als inline vertraging gebruikt om blijvend detecteren te registreren
		tmp6_010	; wordt als inline vertraging gebruikt om blijvend detecteren te registreren
		tmp6_005	; wordt als inline vertraging gebruikt om blijvend detecteren te registreren

		tmp7		; gebruikt om een in-line delay te maken
		tmp8		; gebruikt om een in-line delay te maken
		tmp9		; gebruikt om errors op te slaan (8 errors = 1 byte)
		tmp10		; bit 0 voor stand van linkse of rechtse deel van een beeld
	buf1		; sla de opgehaalde data uit retlw op voor het scheiden van de counter en W
	beeld			; om op te slaan welk beeld weergegeven moet worden
	knopSTATUS
	sensorSTATUS
		temp10d	;############################################################ 
		temp1d	; 															# 
		temp100	; byte voor conversie van 16bit bin naar 5 digit decemalen	#
		temp10	; 															#
		temp1	;############################################################
		temp0X	; byte gebruikt voor conversie van de kommagetallen			#
		temp00X	;############################################################
			tempgetalL	; buffer voor 2 byte getal te converteren			#
			tempgetalH	;													#
			tempkomma	;####################################################
		shiftmerker	; wordt gebruikt om het display een aantal plaatsen te shiften (vb.: 20 plaatsen naar links om de overige karakters zichtbaar te maken)
			datateller	; houd de stand bij hoeveel er op een bepaalde knop is gedrukt (vb: om te schalen welke waarde op het LCD geprint moet worden)
	getal2EURL			;====================================
	getal2EURH			;									|
	aantal2EURL			;									|
	aantal2EURH			;									|
		getal1EURL		;									|
		getal1EURH		;									|
		aantal1EURL		;									|
		aantal1EURH		;									|
	getal0EUR50L		; deze bytes worden gebruikt om		|
	getal0EUR50H		; alle munten-aantallen en			|
		komma0EUR50		; bedragen te registreren.			|
	aantal0EUR50L		; 									|
	aantal0EUR50H		;									|
		getal0EUR20L	;									|
		getal0EUR20H	;									|
	komma0EUR20			;									|
		aantal0EUR20L	;									|
		aantal0EUR20H	;									|
	getal0EUR10L		;									|
	getal0EUR10H		;									|
		komma0EUR10		;									|
	aantal0EUR10L		;									|
	aantal0EUR10H		;									|
		getal0EUR05L	;									|
		getal0EUR05H	;									|
	komma0EUR05			;									|
		aantal0EUR05L	;									|
		aantal0EUR05H	;====================================
	totaal_L
	totaal_H
	aantal_L
	aantal_H
	totaal_komma

		endc
;=================================================================================================================
LCD_PORT	Equ	PORTC
LCD_TRIS	Equ	TRISC
LCD_RS		Equ	0x06	;LCD handshake lines uitgang C4 (4)
LCD_RW		Equ	0x05	; dit is uitgang C6 (6)
LCD_E		Equ	0x07	; dit is uitgang C7 (7)
;=================================================================================================================
; hier start de PCL en het programma in de PIC
	org	0x0000

SetPorts	bsf 	STATUS,	RP0		; select bank 1
			movlw	b'11110000'		; maak C0, C1, C2 en C3 als outputs
			movwf	TRISC			; C4, C5, C6 en C7 zijn ingangen
			clrf	TRISB			; poort B uitgangen
			movlw 	0xff
			movwf	TRISA			; maak alle poorten A ingangen
			movlw	0x10			; A2D clock Fosc/8
			movwf	ADCON1
			bcf 	STATUS,	RP0		;select bank 0

			bsf		STATUS, RP1		;selct bank 2
			movlw	0x00
			movwf	ANSEL			; poorten A instellen als analoge ingangen = 0xff, 0x00= digitaal
			movwf	ANSELH
			bcf		STATUS, RP1		; ga terug naar bank 0
			goto	Initialise
textMunt:	addwf	PCL,f
			retlw	'M'
			retlw	'u'
			retlw	'n'
			retlw	't'
			retlw	':'
			retlw	0xFF
;..........................
textTotaal:	addwf	PCL,f
			retlw	'T'
			retlw	'o'
			retlw	't'
			retlw	'a'
			retlw	'a'
			retlw	'l'
			retlw	':'
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	0x03
			retlw	0xFF
;..........................
textAantal:	addwf	PCL,f
			retlw	'A'
			retlw	'a'
			retlw	'n'
			retlw	't'
			retlw	'a'
			retlw	'l'
			retlw	':'
			retlw	0xFF
;..........................
textSubtot:	addwf	PCL,f
			retlw	'S'
			retlw	'u'
			retlw	'b'
			retlw	't'
			retlw	'o'
			retlw	't'
			retlw	'.'
			retlw	':'
			retlw	0xFF
;..........................
textAantalMunt:	addwf	PCL,f
			retlw	'A'
			retlw	'a'
			retlw	'n'
			retlw	't'
			retlw	'a'
			retlw	'l'
			retlw	' '
			retlw	'm'
			retlw	'u'
			retlw	'n'
			retlw	't'
			retlw	'e'
			retlw	'n'
			retlw	':'
			retlw	' '
			retlw	0x03	; pijl op/neer
			retlw	0xFF
;..........................
textError:	addwf	PCL,f
			retlw	'E'
			retlw	'r'
			retlw	'r'
			retlw	'o'
			retlw	'r'
			retlw	's'
			retlw	':'
			retlw	0xFF
;..........................
textReset:	addwf	PCL,f
			retlw	'R'
			retlw	'e'
			retlw	's'
			retlw	'e'
			retlw	't'
			retlw	':'
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	0x02		; enter teken
			retlw	0xFF
;..........................
textVaria1:	addwf	PCL,f
			retlw	'['
			retlw	'G'
			retlw	'e'
			retlw	'e'
			retlw	'n'
			retlw	' '
			retlw	'm'
			retlw	'e'
			retlw	'l'
			retlw	'd'
			retlw	'i'
			retlw	'n'
			retlw	'g'
			retlw	'e'
			retlw	'n'
			retlw	']'
			retlw	0xFF
;..........................
textVaria2:	addwf	PCL,f
			retlw	'S'			; sorteerschijf:
			retlw	'o'
			retlw	'r'
			retlw	't'
			retlw	'e'
			retlw	'e'
			retlw	'r'
			retlw	's'
			retlw	'c'
			retlw	'h'
			retlw	'i'
			retlw	'j'
			retlw	'f'
			retlw	':'
			retlw	' '
			retlw	0x02		; enter teken
			retlw	0xFF
;..........................
textVaria3:	addwf	PCL,f
			retlw	'D'
			retlw	'r'
			retlw	'u'
			retlw	'k'
			retlw	' '
			retlw	'1'
			retlw	'&'
			retlw	'3'
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	0xDB	; vakje 0x06 = afgevinkt vakje
			retlw	0xFF
;===================================================================================================================
CGRAM:
			addwf	PCL,f
			retlw	b'00000110'		;. . X X .
			retlw	b'00001001'		;. X . . X
			retlw	b'00011100'		;X X X . .
			retlw	b'00001000'		;. X . . .
			retlw	b'00011100'		;X X X . .
			retlw	b'00001001'		;. X . . .
			retlw	b'00000110'		;. . X X .
			retlw	b'00000000'		;. . . . .
;.......................................................
			retlw	b'00000100'		;. . X . .
			retlw	b'00001000'		;. X . . .
			retlw	b'00011111'		;X X X X X
			retlw	b'00001100'		;. X X . .
			retlw	b'00000110'		;. . X X .
			retlw	b'00011111'		;X X X X X
			retlw	b'00000010'		;. . . X .
			retlw	b'00000100'		;. . X . .
;.......................................................
			retlw	b'00000001'		;. . . . X
			retlw	b'00000001'		;. . . . X
			retlw	b'00000001'		;. . . . X
			retlw	b'00000101'		;. . X . X
			retlw	b'00001001'		;. X . . X
			retlw	b'00011111'		;X X X X X
			retlw	b'00001000'		;. X . . .
			retlw	b'00000100'		;. . X . .	
;.......................................................
			retlw	0X04			;. . X . .
			retlw	0X0E			;. X X X .	
			retlw	0X15			;X . X . X	
			retlw	0X04			;. . X . .
			retlw	0X04			;. . X . .
			retlw	0X15			;X . X . X
			retlw	0X0E			;. X X X .
			retlw	0X04			;. . X . .	
;.......................................................
			retlw	0X04			;. . X . .
			retlw	0X0A			;. X . X .	
			retlw	0X11			;X . . . X
			retlw	0X1B			;X X . X X
			retlw	0X0A			;. X . X .
			retlw	0X0A			;. X . X .
			retlw	0X0A			;. X . X .
			retlw	0X0E			;. X X X .	
;.......................................................
			retlw	0X0E			;. X X X .
			retlw	0X0E			;. X X X .	
			retlw	0X0E			;. X X X .	
			retlw	0X0E			;. X X X .
			retlw	0X1F			;X X X X X	
			retlw	0X1F			;X X X X X
			retlw	0X0E			;. X X X .
			retlw	0X04			;. . X . .
;.......................................................
			retlw	0x00			;. . . . . 
			retlw	0x1f			;X X X X X
			retlw	0x10			;X . . . .
			retlw	0x17			;X . X X X
			retlw	0x14			;X . X . .
			retlw	0x05			;. . X . X
			retlw	0x15			;X . X . X
			retlw	0x08			;. X . . .
;.......................................................
			retlw	0X0E			;. X X X . 
			retlw	0X11			;X . . . X
			retlw	0X01			;. . . . X	
			retlw	0X01			;. . . . X	
			retlw	0X02			;. . . X .
			retlw	0X04			;. . X . .
			retlw	0X08			;. X . . .
			retlw	0X10			;X . . . .
;.......................................................		
			retlw	0xff
		
;===================================================================================================================
Initialise:	clrf	PORTC
			clrf	PORTB
			clrf	beeld
			movlw	0x01
			movwf	tmp1
			movwf	tmp2
			movwf	tmp4
			movwf	tmp5
			clrf	tmp6
			clrf	tmp7
			clrf	tmp8
			clrf	tmp9
			clrf	tmp10
			clrf	knopSTATUS		; elke bit onthoud welke status de drukknop staat (voor contactdender tegen te gaan)
			clrf	sensorSTATUS	; elke bit onthoud welke status de sensoringang is
			clrf	tempgetalL
			clrf	tempgetalH
			clrf	tempkomma
			clrf		shiftmerker
			clrf	getal2EURL
			clrf	getal2EURH
			clrf	aantal2EURL
			clrf	aantal2EURH
			clrf		getal1EURL
			clrf		getal1EURH
			clrf		aantal1EURL
			clrf		aantal1EURH
			clrf	getal0EUR50L
			clrf	getal0EUR50H
			clrf	aantal0EUR50L
			clrf	aantal0EUR50H
			clrf		getal0EUR20L
			clrf		getal0EUR20H
			clrf		aantal0EUR20L
			clrf		aantal0EUR20H
			clrf	getal0EUR10L
			clrf	getal0EUR10H
			clrf	aantal0EUR10L
			clrf	aantal0EUR10H
			clrf		getal0EUR05L
			clrf		getal0EUR05H
			clrf		aantal0EUR05L
			clrf		aantal0EUR05H
			clrf	komma0EUR50
			clrf	komma0EUR20
			clrf	komma0EUR10
			clrf	komma0EUR05
			clrf		totaal_L
			clrf		totaal_H
			clrf		aantal_L
			clrf		aantal_H
			clrf		totaal_komma
			clrf	datateller
			clrf		tmp6_2		; wordt als inline vertraging gebruikt om blijvend detecteren te registreren
			clrf		tmp6_1		; wordt als inline vertraging gebruikt om blijvend detecteren te registreren
			clrf		tmp6_050	; wordt als inline vertraging gebruikt om blijvend detecteren te registreren
			clrf		tmp6_020	; wordt als inline vertraging gebruikt om blijvend detecteren te registreren
			clrf		tmp6_010	; wordt als inline vertraging gebruikt om blijvend detecteren te registreren
			clrf		tmp6_005	; wordt als inline vertraging gebruikt om blijvend detecteren te registreren

			movlw	0x01			;A2D kanaal 6 (RA5), links gerangschikt
			movwf	ADCON0			;configureer A2D kanaal 1 (RA0), left justified & turn on the A2D module
			bsf		PORTB,7			;enable signaal is actief laag, dus moet in rust hoog zijn
			bcf		PORTB,6			;LCD in instruktie mode zetten
			call	Delay255		;wait for LCD to settle
		
			movlw	b'00000010'
			movwf	PORTC
			call 	Delay2
			call	pulse_e		;LCD in 4 bit mode zetten

			movlw	b'00101000'
			call	prntLCD		;4 bit mode en 2 lijnen
			call	Delay2

			movlw	b'00000001'
			call	prntLCD		; clear display
			call 	Delay2
	
			movlw	b'00001110'
			call	prntLCD		; display aan met cursor
			call 	Delay2
;--------------------------------------;
;maak CG-ram code voor speciale tekens ;
;--------------------------------------;
			movlw	b'01000000'		;set CG-ram op adres 0 (van de 64)
			call	prntLCD
			bsf		PORTB,6			;ga naar data mode (let op, in deze data schrijf je regels in het CG ram)
									;omdat de karakters in CG-ram 5x8 groot zijn worden van de bits, de 5 minst beduidende	
									;gebruikt, 8 regels code vormen zo 1 karakter
			clrf	count
loopCGRAM:	movf	count,w			;zet inhoud teller in W-register
			call	CGRAM			;de tellerinhoud bepaald welke data uit de CGRAM-tabel geladen wordt
			movwf	buf1			;plaats de waarde uit het PCL register in buf1
			xorlw	0xFF			;als de waarde FF geladen is uit de 'retlw' betekend dit het einde,
			btfsc	STATUS,Z		;de uitkomst van xor = 0 ; als Z hoog wordt ga je uit deze loop
			goto	exitCGram
			movf	buf1,w			;haal de datawaarde terug op
			call	prntLCD			;plaats de data in het CG-RAM
			incf	count,f			;verhoog de teller met 1 om in de volgende loop een volgende waarde op te halen
			goto	loopCGRAM
exitCGram:							; EINDE VAN HET CG RAM PROGRAMMEREN

;===============================================================================================================================================
; begin hier text te schrijven op het LCD scherm	
;===============================================================================================================================================
			movlw	.3
			movwf	beeld 	; start bij beeld 4
			
	call	schrijfLCD

			call	shiftR	; ga na het schrijven naar het 2e deel van beeld 4	
							; hier staat dan of je de sorteerschijf wil starten

;=================================================================================================================
; Code voor alle ingangen af te scannen en daarna de call aktie uit te voeren.
; 								geschreven code is ANTI-CONTACT DENDER en 1 CYCLE AKTIE toegepast
;=================================================================================================================
loopknop:
			btfsc	knopSTATUS,0	; knop 1 met data 'shiftR'								|
			goto	verder1			;													**************
			btfss	PORTC,4			;													|knopstatus 0|
			goto	verder2			;													**************
			decfsz	tmp1,f			;													 1|    0|
			goto	verder3			;											********---		---********
			call	shiftR			; SHIFT RECHTS								|PORTC4|		   |PORTC4|
			bsf		knopSTATUS,0	;											********		   ********		
			goto	verder3			;											0|   1|			   0|   1|
verder1:	btfsc	PORTC,4			;								 		------	  ---------------	*************
			goto	verder2			;								 		| 				|			|decfsz tmp1|
			bcf		knopSTATUS,0	;								 		|			***********		*************
verder2:	movlw	0x01			;										|   		| LW 0x01 |		0|       1|
			movwf	tmp1			;						 		 **************		***********		 |		*********	
;............................................................		 | bcf 		  |      	|	 	     |      | AKTIE |
verder3:							;								 |knopstatus 0|			|			 |		*********
			btfsc	knopSTATUS,1	; knop 2 met data 'WAARDE'		 **************		************	 |			|
			goto	verder4			;										|			| mov tmp1 |	 |	  **************
			btfss	PORTC,5			;										|			************	 |	  | bsf 	   |
			goto	verder5			;										|				|			 |	  |knopstatus 0|
			decfsz	tmp2,f			;										|				|			 |	  **************
			goto	verder6			;										|				|			 |			|
			call	KNOP2			; WAARDE VAN MUNT VERANDEREN 			-----------------------------------------
			bsf		knopSTATUS,1	;															|
			goto	verder6
verder4:	btfsc	PORTC,5
			goto	verder5
			bcf		knopSTATUS,1
verder5:	movlw	0x01
			movwf	tmp2
;................................................................................................................
verder6:
			btfsc	knopSTATUS,2	; knop 3 met data 'ENTER'
			goto	verder7
			btfss	PORTC,6
			goto	verder8
			decfsz	tmp4,f
			goto	verder9
			call	ENTER			; ENTER
			bsf		knopSTATUS,2
			goto	verder9
verder7:	btfsc	PORTC,6
			goto	verder8
			bcf		knopSTATUS,2
verder8:	movlw	0x01
			movwf	tmp4
;................................................................................................................
verder9:
			btfsc	knopSTATUS,3	; knop 4 met data 'SHIFT_UPDOWN'
			goto	verder10
			btfss	PORTC,7
			goto	verder11
			decfsz	tmp5,f
			goto	verder12
			call	shift_up_down	; SHIFT_UP_DOWN	
			bsf		knopSTATUS,3
			goto	verder12
verder10:	btfsc	PORTC,7
			goto	verder11
			bcf		knopSTATUS,3
verder11:	movlw	0x01
			movwf	tmp5
verder12:
;................................................................................................................
;de sensors zijn niet voorzien van anti contactdender, de doorlooptijd van het programma is lang 
;genoeg om dit niet te moeten doen. Anders maak je kans dat een te korte puls niet gezien wordt
;door het programma.
;................................................................................................................
			btfsc	sensorSTATUS,0	; 5ENSOR VOOR 2€ TELLER
			goto	verder1_1
			btfss	PORTA,0
			goto	verder1_2
			btfsc	tmp9,2
			goto	verder1_2
			bsf		sensorSTATUS,0
			goto	verder1_3
verder1_1:	btfsc	PORTA,0
			goto	verder1_4
			call	tweeEURO		; ga naar bewerking voor 2€
			bcf		sensorSTATUS,0
			goto	verder1_3
verder1_2:	movlw	0x00
			movwf	tmp6_2
			;clrf	tmp6_2
			goto	verder1_3
verder1_4:	incfsz	tmp6_2			; inline tijd voor sensor
			goto	verder1_3
			bsf		tmp9,2			; errorbit 2€
			bcf		sensorSTATUS,0
verder1_3:
;...............................................................................................................
			btfsc	sensorSTATUS,1	; 5ENSOR VOOR 1€ TELLER
			goto	verder2_1
			btfss	PORTA,1
			goto	verder2_2
			btfsc	tmp9,3
			goto	verder2_2
			bsf		sensorSTATUS,1
			goto	verder2_3
verder2_1:	btfsc	PORTA,1
			goto	verder2_4
			call	eenEURO		; ga naar bewerking voor 1€
			bcf		sensorSTATUS,1
			goto	verder2_3
verder2_2:	movlw	0x00
			movwf	tmp6_1
			;clrf	tmp6_1
			goto	verder2_3
verder2_4:	incfsz	tmp6_1			; inline tijd voor sensor
			goto	verder2_3
			bsf		tmp9,3			; errorbit 1€
			bcf		sensorSTATUS,1
verder2_3:
;...............................................................................................................
			btfsc	sensorSTATUS,2	; 5ENSOR VOOR 0,50€ TELLER
			goto	verder3_1
			btfss	PORTA,2
			goto	verder3_2
			btfsc	tmp9,4
			goto	verder3_2
			bsf		sensorSTATUS,2
			goto	verder3_3
verder3_1:	btfsc	PORTA,2
			goto	verder3_4
			call	halveEURO		; ga naar bewerking voor 0,50€
			bcf		sensorSTATUS,2
			goto	verder3_3
verder3_2:	movlw	0x00
			movwf	tmp6_050
			;clrf	tmp6_050
			goto	verder3_3
verder3_4:	incfsz	tmp6_050		; inline tijd voor sensor
			goto	verder3_3
			bsf		tmp9,4			; errorbit 0,50€
			bcf		sensorSTATUS,2
verder3_3:
;................................................................................................................
			btfsc	sensorSTATUS,3	; 5ENSOR VOOR 0,20€ TELLER
			goto	verder4_1
			btfss	PORTA,3
			goto	verder4_2
			btfsc	tmp9,5
			goto	verder4_2
			bsf		sensorSTATUS,3
			goto	verder4_3
verder4_1:	btfsc	PORTA,3
			goto	verder4_4
			call	twintigEUROcent	; ga naar bewerking voor 0,20€
			bcf		sensorSTATUS,3
			goto	verder4_3
verder4_2:	movlw	0x00
			movwf	tmp6_020
			;clrf	tmp6_020
			goto	verder4_3
verder4_4:	incfsz	tmp6_020		; inline tijd voor sensor
			goto	verder4_3
			bsf		tmp9,5			; errorbit 0,20€
			bcf		sensorSTATUS,3
verder4_3:
;................................................................................................................
			btfsc	sensorSTATUS,4	; 5ENSOR VOOR 0,20€ TELLER
			goto	verder5_1
			btfss	PORTA,4
			goto	verder5_2
			btfsc	tmp9,6
			goto	verder5_2
			bsf		sensorSTATUS,4
			goto	verder5_3
verder5_1:	btfsc	PORTA,4
			goto	verder5_4
			call	tienEUROcent	; ga naar bewerking voor 0,10€
			bcf		sensorSTATUS,4
			goto	verder5_3
verder5_2:	movlw	0x00
			movwf	tmp6_010
			;clrf	tmp6_010
			goto	verder5_3
verder5_4:	incfsz	tmp6_010		; inline tijd voor sensor
			goto	verder5_3
			bsf		tmp9,6			; errorbit 0,10€
			bcf		sensorSTATUS,4
verder5_3:
;................................................................................................................
			btfsc	sensorSTATUS,5	; 5ENSOR VOOR 0,10€ TELLER
			goto	verder6_1
			btfss	PORTA,5
			goto	verder6_2
			btfsc	tmp9,7
			goto	verder6_2
			bsf		sensorSTATUS,5
			goto	verder6_3
verder6_1:	btfsc	PORTA,5
			goto	verder6_4
			call	vijfEUROcent	; ga naar bewerking voor 0,05€
			bcf		sensorSTATUS,5
			goto	verder6_3
verder6_2:	movlw	0x00
			movwf	tmp6_005
			;clrf	tmp6_005
			goto	verder6_3
verder6_4:	incfsz	tmp6_005		; inline tijd voor sensor
			goto	verder6_3
			bsf		tmp9,7			; errorbit 0,10€
			bcf		sensorSTATUS,5
verder6_3:

			; nu eerst de fout bits afvragen en daar aanhangende acties uitvoeren
		clrf	tmp6		; reset de fouten-teller
			btfsc	tmp9,0	; max bedrag bereikt
			call	ERROR_STOP
			btfsc	tmp9,1	; max aantal bereikt
			call	ERROR_STOP		
			btfsc	tmp9,2	; error 2€
			call	ERROR_STOP
			btfsc	tmp9,3	; error 1€
			call	ERROR_STOP
			btfsc	tmp9,4	; error 0,50€
			call	ERROR_STOP
			btfsc	tmp9,5	; error 0,20€
			call	ERROR_STOP
			btfsc	tmp9,6	; error 0,10€
			call	ERROR_STOP
			btfsc	tmp9,7	; error 0,05€
			call	ERROR_STOP

		call	herschrijf
	bsf	PORTB,4	
			goto	loopknop


zoeken tot het werkt en dan nog zoeken

De geposte code is ter indicatie van mijn programmeerlogica.
Tips en tricks zijn uiteraard ook welkom.
hier dus het aansluitend deel van mijn programma...

code:

picasm:
ERROR_STOP:
			bcf		tmp10,1		; de bit die weergeeft dat de motor gestopt is
			bcf		PORTB,5		; de uitgangn van de motor stoppen
			; deze kan je voor alle errors gebruiken, deze instructies worden iedere loop gecontroleerd
			; de verwijzing naar deze call kan je dan doen door de error-byte te controleren of deze
			; groter is dan '0', want dan is er een error
			incf	tmp6,f	; teller aantal fouten
			return
;................................................................................................................
;			de instructies/ acties van de drukknoppen en sensoren
;................................................................................................................
KNOP2:							; Deze drukknop bepaald de datateller en zo de waarde van de gekozen munt
			movfw	beeld
			sublw	.3
			btfss	STATUS,Z
			goto	$+4			; als je niet in beeld 4 bent, ga je verder bij AAA
			call	lijn2_14
			movlw	0xDB	; vierkantje, deze wordt geprint als je deze knop drukt en als je in beeld 4 bent
			call	prntLCD	; Als je niet in beeld 4 bent, wordt enkel onderstaande uitgevoerd

;AAA:		;movlw	.1
			;addwf	datateller,f
			incf	datateller,f
			movlw	.6
			subwf	datateller,w
			btfss	STATUS,Z
		return
			clrf	datateller
		return
;................................................................................................................
shiftL:		;DEZE WORDT VOORLOPIG NIET GEBRUIKT
			movlw	d'20'
			movwf	shiftmerker
			bcf		PORTB,6			;instuktie mode
shftlp1:	movlw	b'00011000'
			call	prntLCD	
			decfsz	shiftmerker,f
			goto	shftlp1
			bsf		PORTB,6			; data mode
			return
;................................................................................................................
shiftR:
			movlw	d'20'			; laad getal 20 in shiftmerker
			movwf	shiftmerker		; daarna ga je naar instruktie mode
			bcf		PORTB,6			;
shftlp2:	movlw	b'00011100'		; roep intruktie op, 'display shift', naar rechts
			call	prntLCD			;
			decfsz	shiftmerker,f	; tel 1 af en herhaal de loop tot deze 20x afgelopen is
			goto	shftlp2			; daarna ga je terug naar datamode en verder in het programma
			bsf		PORTB,6			; (data mode)
		;	bsf		tmp10,0			; set deze bit, dus, bit hoog is 2e deel van het beeld
									; deze bit moet je resetten als je de beeldteller laat veranderen
			movfw	tmp10			; EN EEN TOGGLE FUNCTIE OMDAT JE OOK IN HETZELFDE BEELD 2X KUNT WISSLEEN
			xorlw	b'00000001'		; toggle enkel bit 0
			movwf	tmp10
			return
;................................................................................................................
shift_up_down:		; herschrijf het volledige LCD tijdens deze loop, maar met inhoud van het volgende beeld
			movlw	.1
			addwf	beeld,f
			movlw	.4
			subwf	beeld,w
			btfss	STATUS,Z
		goto	VVV
			clrf	beeld
VVV:
;eerste het scherm clearen voor aleer je het herschrijft
			bcf		PORTB,6			;ga naar instructie mode
			movlw	b'00000001'
			call	prntLCD			; clear het display
			call	Delay2
			bsf		PORTB,6			; ga naar data mode	
		bcf		tmp10,0				; deze bit geeft weer in welk deel van het beeld je zit, 0 is het eerste deel
		call	schrijfLCD			; HERSCHRIJF HET VOLLEDIGE LCD DISPLAY
			retlw	0x00
;................................................................................................................
ENTER:
			movfw	beeld
			sublw	.3
			btfss	STATUS,Z
			goto	ENTER_beeld2
			;return	; ga terug zonder actie als je niet in beeld 4 bent
					; OF ZET EEN GOTO OM EEN RESET IN EEN ANDER SCHERM ERBIJ TE PROGRAMMEREN
		; data voor herschrijven
			btfsc	tmp10,0			; 0 indien eerste deel van beeld, 1 indien 2e deel van beeld
			goto	skipRST_5		; als je in het 2e deel van beeld 4 bent ga je naar deze label
			movfw	datateller
			sublw	.0				; schrijf "alle waarden?" resetten
			btfss	STATUS,Z
			goto	skipRST_0
		; wanneer "ALLE WAARDEN?" op het scherm staat
			; dan hier de voorwaarde van de actie
			; druk ENTER, dus moet deze code is dat sub-mapje staan
			call	bufGETAL
			call	bufAANTAL
			return

skipRST_0:	movfw	datateller
			sublw	.1				; schrijf "aantallen?" resetten
			btfss	STATUS,Z
			goto	skipRST_1
		; wanneer "AANTALLEN?" op het scherm staat.
			call	bufAANTAL
			return
skipRST_1:	movfw	datateller
			sublw	.2				; schrijf "aantallen?" resetten
			btfss	STATUS,Z
			goto	skipRST_2
		; wanneer "BEDRAGEN?" op het scherm staat.
			call	bufGETAL
			return

skipRST_2:	movfw	datateller
			sublw	.3				; idem reset ALLE WAARDEN
			btfss	STATUS,Z
			goto	skipRST_3
			
			call	bufGETAL
			call	bufAANTAL
			return

skipRST_3:	movfw	datateller
			sublw	.4				; idem reset AANTALLEN
			btfss	STATUS,Z
			goto	skipRST_4

			call	bufAANTAL
			return
			
skipRST_4:	movfw	datateller
			sublw	.5				; idem reset GETALLEN
			btfss	STATUS,Z
			return
		
			call	bufGETAL
			return

bufGETAL:	clrf	getal2EURL
			clrf	getal2EURH
			clrf	getal1EURL
			clrf	getal1EURH
			clrf	getal0EUR50L
			clrf	getal0EUR50H
			clrf	getal0EUR20L
			clrf	getal0EUR20H
			clrf	getal0EUR10L
			clrf	getal0EUR10H
			clrf	getal0EUR05L
			clrf	getal0EUR05H
			clrf	komma0EUR50
			clrf	komma0EUR20
			clrf	komma0EUR10
			clrf	komma0EUR05

			bcf		PORTB,6			;								|
			movlw	b'11001110'		; ga naar lijn2, karakter 14	|
			call	prntLCD			;								|
			bsf		PORTB,6			;								|

			movlw	0x06		; afgevinkt vakje
			call	prntLCD
			return

bufAANTAL:	clrf	aantal2EURL
			clrf	aantal2EURH
			clrf	aantal1EURL
			clrf	aantal1EURH
			clrf	aantal0EUR50L
			clrf	aantal0EUR50H
			clrf	aantal0EUR20L
			clrf	aantal0EUR20H
			clrf	aantal0EUR10L
			clrf	aantal0EUR10H
			clrf	aantal0EUR05L
			clrf	aantal0EUR05H

			bcf		PORTB,6			;								|
			movlw	b'11001110'		; ga naar lijn2, karakter 14	|
			call	prntLCD			;								|
			bsf		PORTB,6			;								|

			movlw	0x06		; afgevinkt vakje
			call	prntLCD
			return
skipRST_5:
			bcf		PORTB,6			;								|
			movlw	b'11100010'		; ga naar lijn2, karakter 34	|
			call	prntLCD			;								|
			bsf		PORTB,6			;								|
			movlw	0x06		; afgevinkt vakje
			call	prntLCD
			
			call	Delay255
	                call	Delay255

			movlw	b'00000010'		; toggle tmp10,1, deze bepaald of woord 'starten' of 'stoppen' geschreven wordt
			xorwf	tmp10,f	
			movlw	b'00100000'		;toggle PORTB,5
			xorwf	PORTB,f			; uitgang motor starten / stoppen
		

			call	shift_up_down
			return
;................................................................................................................
ENTER_beeld2:
			movfw	beeld
			sublw	.2
			btfss	STATUS,Z
			return	; ga terug zonder actie als je niet in beeld 3 bent
					; OF ZET EEN GOTO OM EEN RESET IN EEN ANDER SCHERM ERBIJ TE PROGRAMMEREN
			btfss	tmp10,0		; kijk of je in het eerste of 2e deel van het beeld bent
			return				; ga terug als je niet in het 2e deel van het beeld bent
		btfsc		tmp9,0
		goto		ERR_0
		btfsc		tmp9,1
		goto		ERR_1
		btfsc		tmp9,2
		goto		ERR_2
		btfsc		tmp9,3
		goto		ERR_3
		btfsc		tmp9,4
		goto		ERR_4
		btfsc		tmp9,5
		goto		ERR_5
		btfsc		tmp9,6
		goto		ERR_6
		btfsc		tmp9,7
		goto		ERR_7
			return

ERR_0:
			bcf		PORTB,6			;								|
			movlw	b'11100010'		; ga naar lijn2, karakter 34	|
			call	prntLCD			;								|
			bsf		PORTB,6			;								|
			movlw	0x06		; afgevinkt vakje
			call	prntLCD
			bcf		tmp9,0		; reset de fout max bedrag bereikt
			decf	tmp6,f		; tel 1 error af van de teller
		return

ERR_1:
			bcf		PORTB,6			;								|
			movlw	b'11100010'		; ga naar lijn2, karakter 34	|
			call	prntLCD			;								|
			bsf		PORTB,6			;								|
			movlw	0x06		; afgevinkt vakje
			call	prntLCD
			bcf		tmp9,1		; reset de fout max aantal bereikt
			decf	tmp6,f		; tel 1 error af van de teller
		return
		
ERR_2:
			bcf		PORTB,6			;								|
			movlw	b'11100010'		; ga naar lijn2, karakter 34	|
			call	prntLCD			;								|
			bsf		PORTB,6			;								|
			movlw	0x06		; afgevinkt vakje
			call	prntLCD
			bcf		tmp9,2		; reset de fout van 2€ sensor
			decf	tmp6,f		; tel 1 error af van de teller
		return

ERR_3:
			bcf		PORTB,6			;								|
			movlw	b'11100010'		; ga naar lijn2, karakter 34	|
			call	prntLCD			;								|
			bsf		PORTB,6			;								|
			movlw	0x06		; afgevinkt vakje
			call	prntLCD
			bcf		tmp9,3		; reset de fout van 1€ sensor
			decf	tmp6,f		; tel 1 error af van de teller
		return

ERR_4:
			bcf		PORTB,6			;								|
			movlw	b'11100010'		; ga naar lijn2, karakter 34	|
			call	prntLCD			;								|
			bsf		PORTB,6			;								|
			movlw	0x06		; afgevinkt vakje
			call	prntLCD
			bcf		tmp9,4		; reset de fout van 0,50€ sensor
			decf	tmp6,f		; tel 1 error af van de teller
		return

ERR_5:
			bcf		PORTB,6			;								|
			movlw	b'11100010'		; ga naar lijn2, karakter 34	|
			call	prntLCD			;								|
			bsf		PORTB,6			;								|
			movlw	0x06		; afgevinkt vakje
			call	prntLCD
			bcf		tmp9,5		; reset de fout van 0,20€ sensor
			decf	tmp6,f		; tel 1 error af van de teller
		return
ERR_6:
			bcf		PORTB,6			;								|
			movlw	b'11100010'		; ga naar lijn2, karakter 34	|
			call	prntLCD			;								|
			bsf		PORTB,6			;								|
			movlw	0x06		; afgevinkt vakje
			call	prntLCD
			bcf		tmp9,6		; reset de fout van 0,10€ sensor
			decf	tmp6,f		; tel 1 error af van de teller
		return
ERR_7:
			bcf		PORTB,6			;								|
			movlw	b'11100010'		; ga naar lijn2, karakter 34	|
			call	prntLCD			;								|
			bsf		PORTB,6			;								|
			movlw	0x06		; afgevinkt vakje
			call	prntLCD
			bcf		tmp9,7		; reset de fout van 0,05€ sensor
			decf	tmp6,f		; tel 1 error af van de teller
		return
;................................................................................................................
;.....................Akties van de sensoren.....................................................................
;.....................hier zitten geen 'beeld'-voorwaarde aan, dus werken deze in alle schermen..................
;................................................................................................................
tweeEURO:
			movlw	.2				; verhogen van de 16 bit teller "getal"
			addwf	getal2EURL,f	; hier wordt de getelde waarde onthouden
			btfss	STATUS,C
			goto	byte10
			clrf	getal2EURL
			incf	getal2EURH,f
byte10:
			movlw	.1				; verhogen van de 16 bit teller "aantal"
			addwf	aantal2EURL,f	; hier wordt de getelde aantal ontouden
			btfss	STATUS,C
			goto	byte11
			clrf	aantal2EURL
			incf	aantal2EURH,f
byte11:
			retlw	0x00			
;................................................................................................................
eenEURO:
			movlw	.1				; verhogen van de 16 bit teller "getal"
			addwf	getal1EURL,f	; hier wordt de getelde waarde onthouden
			btfss	STATUS,C
			goto	byte12
			clrf	getal1EURL
			incf	getal1EURH,f
byte12:
			movlw	.1				; verhogen van de 16 bit teller "aantal"
			addwf	aantal1EURL,f	; hier wordt de getelde aantal ontouden
			btfss	STATUS,C
			goto	byte13
			clrf	aantal1EURL
			incf	aantal1EURH,f
byte13:
			retlw	0x00			
;................................................................................................................
halveEURO:
;nieuwe code voor kommagetallen weer te geven
			movlw	.50
			addwf	komma0EUR50,f
			movfw	komma0EUR50
			addlw	.156		; carry out is 100 eenheden verwijdert als je 156 opteld bij W
			btfss	STATUS,C	; indien getal 100 of meer is, ga je verder, anders 'goto byte15'
			goto	byte14		; maak sprong om aantal munten 1 bij te tellen
			clrf	komma0EUR50

			movlw	.1
			addwf	getal0EUR50L,f
			btfss	STATUS,C
			goto	byte14
			clrf	getal0EUR50L
			incf	getal0EUR50H,f
byte14:
			movlw	.1
			addwf	aantal0EUR50L,f
			btfss	STATUS,C
			goto	byte15
			clrf	aantal0EUR50L
			incf	aantal0EUR50H,f
byte15:
			retlw	0x00
;................................................................................................................
twintigEUROcent:
			movlw	.20
			addwf	komma0EUR20,f
			movfw	komma0EUR20
			addlw	.156		; carry out is 100 eenheden verwijdert als je 156 opteld bij W
			btfss	STATUS,C	; indien getal 100 of meer is, ga je verder, anders 'goto byte15'
			goto	byte16		; maak sprong om aantal munten 1 bij te tellen		
			clrf	komma0EUR20

			movlw	.1
			addwf	getal0EUR20L,f
			btfss	STATUS,C
			goto	byte16
			clrf	getal0EUR20L
			incf	getal0EUR20H,f
byte16:
			movlw	.1
			addwf	aantal0EUR20L,f
			btfss	STATUS,C
			goto	byte17
			clrf	aantal0EUR20L
			incf	aantal0EUR20H,f
byte17:
			retlw	0x00
;................................................................................................................
tienEUROcent:
			movlw	.10
			addwf	komma0EUR10,f
			movfw	komma0EUR10
			addlw	.156		; carry out is 100 eenheden verwijdert als je 156 opteld bij W
			btfss	STATUS,C	; indien getal 100 of meer is, ga je verder, anders 'goto byte15'
			goto	byte18		; maak sprong om aantal munten 1 bij te tellen		
			clrf	komma0EUR10

			movlw	.1
			addwf	getal0EUR10L,f
			btfss	STATUS,C
			goto	byte18
			clrf	getal0EUR10L
			incf	getal0EUR10H,f
byte18:
			movlw	.1
			addwf	aantal0EUR10L,f
			btfss	STATUS,C
			goto	byte19
			clrf	aantal0EUR10L
			incf	aantal0EUR10H,f
byte19:
			retlw	0x00
;................................................................................................................
vijfEUROcent:
			movlw	.5
			addwf	komma0EUR05,f
			movfw	komma0EUR05
			addlw	.156		; carry out is 100 eenheden verwijdert als je 156 opteld bij W
			btfss	STATUS,C	; indien getal 100 of meer is, ga je verder, anders 'goto byte15'
			goto	byte20		; maak sprong om aantal munten 1 bij te tellen		
			clrf	komma0EUR05

			movlw	.1
			addwf	getal0EUR05L,f
			btfss	STATUS,C
			goto	byte20
			clrf	getal0EUR05L
			incf	getal0EUR05H,f
byte20:
			movlw	.1
			addwf	aantal0EUR05L,f
			btfss	STATUS,C
			goto	byte21
			clrf	aantal0EUR05L
			incf	aantal0EUR05H,f
byte21:
			retlw	0x00
;................................................................................................................
; ALLE AKTIES APART PROGRAMMEREN? DIT HOUDT ALLES WAT DUIDELIJKER
;................................................................................................................
;=================================================================================================================
; Herschrijf het scherm, enkel op de plaatsen waar data veranderd moet worden.
; om de cyclus zo snel mogelijk te houden word niet elke cyclus herschreven, maar om bepaalde tijdsintervallen.
;=================================================================================================================
herschrijf:	
;--------------------------------------------------------------------
;	herschrijf enkel de karater(s) die je wil aanpassen				|
;--------------------------------------------------------------------

		bcf	PORTB,4		;indicatie LED om te zien hoelang het schrijven duurt
		;------------------------------
;*****************************************************************************************************************
; hier wordt de code geschreven waar de data herschreven wordt bij het eerste beeld
; deze zou er als volgt moeten uitzien:
;
;			***LCD-DISPLAY*******karakters*buiten*beeld****
;			* Totaal:.........|....|Aantal munten:..|.... *
;			* ...........0,00€|....|.............0..|.... *
;			***********************************************
; 
; in beeld 0 worden data herschreven op de 2e lijn, als eerste de conversie van 16 bit getal "totaal_L + _H
;*****************************************************************************************************************

			movfw	beeld
			sublw	.0
			btfss	STATUS,Z
			goto	skip100		; Als beeld 0 niet 0 is
					; Als beeld 0 aangeroepen is 
					; hier gaan wel alle aantallen en getallen optellen 
					; en dan weer converteren om op het scherm te printen
			clrf	totaal_komma
			clrf	totaal_L
			clrf	totaal_H
			clrf	aantal_L
			clrf	aantal_H
;	eerst de komma getallen bij elkaar optellen
			movfw	komma0EUR50		;------------------------------------------------------
			addwf	totaal_komma,f	; tel de 4 getallen samen
			movfw	komma0EUR20		; er hoeft maar 1x naar de carry out gekeken te worden
			addwf	totaal_komma,f	; omdat het getal ervoor nooit hoger kan zijn
			movfw	komma0EUR10		; de max. zijn: 0,50€ --> 50
			addwf	totaal_komma,f	;				0,20€ --> 80
			movfw	komma0EUR05		;				0,10€ --> 90
			addwf	totaal_komma,f	;				0,05€ --> 95
			btfss	STATUS,C		;		totaal:		  -->315
			goto	skipA0			; Daarna de conversie maken om de C-out om te 
			incf	totaal_L,f		; rekenen naar een 100-tal
									;-----------------------------------------------------
			movfw	totaal_komma	;												|
			addlw	.212		;C wordt 1 indien 							   add's KOMMA,f
			btfss	STATUS,C	;totaal_komma >=44									|
			goto	skipB0			;										*****************
			movlw	.44				;										| STATUS,C		|
			subwf	totaal_komma,f	;										*****************
			movlw	.2			;3 carry's bijtellen bij totaal_L,			 1|			0|
			addwf	totaal_L,f	;maar er is er al eetje geteld				  |			 ---------|-----------------|
			goto	skipC0			;									*************		*************			|
skipB0:							; als het getal is <44					| incf		|		| KOMMA,w	|			|
			movlw	.56				; max getal kan						| totaal_L	|		| +156		|			|
			addwf	totaal_komma,f	; hier 99 zijn! (43+56)				*************		*************			|
			incf	totaal_L,f	; 2 carry's optellen, maar 1 				  |					  |					|
			goto	skipC0		;is al gebeurt in het eerste deel		*************		*************			|
skipA0:							; indien er geen carry is geweest		| KOMMA,w	|		| STATUS,C	|			|
			movlw	.156			;									| +212		|		*************			|
			addwf	totaal_komma,w	;									*************		   0|	 1|				|
			btfss	STATUS,C		;										  |					|	*************	|
			goto	skipC0			;									*************			|	| KOMMA,f	|	|
			movlw	.100			;									| STATUS,C	|			|	| -100		|	|
			subwf	totaal_komma,f	;									*************			|	*************	|
			incf	totaal_L,f		;									 0|		 1|				|		|			|
			goto	skipA0			;								  |----		  ----|			|	*************	|
skipC0:							; indien totaal_komma is <100	*************	*************	|	| incf		|	|
			movfw	totaal_komma	;							| KOMMA,f	|	| KOMMA,f	|	|	| totaal_L	|	|
			movwf	tempkomma		;							| +56		|	| -44		|	|	*************	|
			call	converterKOMMA	;							*************	*************	|		|-----------|
;	nu gaan we verder met de eenheden op te tellen					  |				  |			|
			movfw	getal2EURL		;							*************	*************	|
			addwf	totaal_L,f		;							| incf		|	| totaal_L	|	|
			movfw	getal1EURL		;							| totaal_L	|	| +2		|	|
			addwf	totaal_L,f		;							*************	*************	|
			btfss	STATUS,C		;								  |---------------|---------|
			goto	skipD0			;												  |
			incf	totaal_H,f		;											*************
skipD0:								;											| KOMMA,w	|
			movfw	getal0EUR50L	;											*************
			addwf	totaal_L,f		;												  |
			btfss	STATUS,C		;						  |					*************
			goto	skipE0			;					 'lage byte'			|tempkomma,f|
			incf	totaal_H,f		;	*************	*************			*************
skipE0:								;	|totaal_H	 |	|getal 2 €	|				  |
			movfw	getal0EUR20L	;	*************	*************			converter Komma
			addwf	totaal_L,f		;						+ |						  |
			btfss	STATUS,C		;	*************	*************
			goto	skipF0			;	|		+1	|	|getal 1 €	|
			incf	totaal_H,f		;	*************	*************
skipF0:								;			|_____________|STATUS,C
			movfw	getal0EUR10L	;	*************	*************
			addwf	totaal_L,f		;	|		+1	|	|getal 0,50€|
			btfss	STATUS,C		;	*************	*************
			goto	skipG0			;			|_____________|STATUS,C
			incf	totaal_H,f		;	*************	*************
skipG0:								;	|		+1	|	|getal 0,20€|
			movfw	getal0EUR05L	;	*************	*************
			addwf	totaal_L,f		;			|_____________|STATUS,C
			btfss	STATUS,C		;	*************	*************
			goto	skipH0			;	|		+1	|	|getal 0,10€|
			incf	totaal_H,f		;	*************	*************
skipH0:								;			|_____________|STATUS,C
; de hoge bytes optellen			;	*************	*************
			movfw	getal2EURH		;	|		+1	|	|getal 0,05€|
			addwf	totaal_H,f		;	*************	*************
			btfss	STATUS,C		;			|_____________|STATUS,C
			goto	skipI0			;						  |
		bsf	tmp9,0	;errorbit (max bereikt)				 'hoge byte'
skipI0:								;					*************
			movfw	getal1EURH		;					|getal 2€	|
			addwf	totaal_H,f		;					*************
			btfss	STATUS,C		;				STAUS,C	  |__________set error
			goto	skipJ0			;						+ |
		bsf	tmp9,0	;errorbit (max bereikt)				*************
skipJ0:								;					|getal 1€	|
			movfw	getal0EUR50H	;					*************
			addwf	totaal_H,f		;				STAUS,C	  |__________set error
			btfss	STATUS,C		;						+ |
			goto	skipK0			;				*************
		bsf	tmp9,0	;errorbit (max bereikt)			|getal 0,50€|
skipK0:								;					*************
			movfw	getal0EUR20H	;				STAUS,C	  |__________set error
			addwf	totaal_H,f		;						+ |
			btfss	STATUS,C		;					*************
			goto	skipL0			;					|getal 0,20€|
		bsf	tmp9,0	;errorbit (max bereikt)				*************
skipL0:								;				STAUS,C	  |__________set error
			movfw	getal0EUR10H	;						+ |
			addwf	totaal_H,f		;					*************
			btfss	STATUS,C		;					|getal 0,10€|
			goto	skipM0			;					*************
		bsf	tmp9,0	;errorbit (max bereikt)			STAUS,C	  |__________set error
skipM0:								;						+ |
			movfw	getal0EUR05H	;					*************
			addwf	totaal_H,f		;					|getal 0,05€|
			btfss	STATUS,C		;					*************
			goto	skipN0			;				STAUS,C	  |__________set error
		bsf	tmp9,0	;errorbit (max bereikt)					  |
skipN0:								;					converter 16-bit
			call	lijn2_7			;						  |
			movfw	totaal_L		;
			movwf	tempgetalL		;	***LCD-DISPLAY*******karakters*buiten*beeld****
			movfw	totaal_H		;	* ................|....|................|.... *
			movwf	tempgetalH		;	* .......X........|....|................|.... *
			call	converter		;	***********************************************
;.......................................................
; idem om de 2 byte's samen te tellen voor de aantallen
			movfw	aantal2EURL
			addwf	aantal_L,f
			movfw	aantal1EURL
			addwf	aantal_L,f
			btfss	STATUS,C
			goto	skipA1
			incf	aantal_H,f
skipA1:
			movfw	aantal0EUR50L
			addwf	aantal_L,f
			btfss	STATUS,C
			goto	skipB1
			incf	aantal_H,f
skipB1:
			movfw	aantal0EUR20L
			addwf	aantal_L,f
			btfss	STATUS,C
			goto	skipC1
			incf	aantal_H,f
skipC1:
			movfw	aantal0EUR10L
			addwf	aantal_L,f
			btfss	STATUS,C
			goto	skipD1
			incf	aantal_H,f
skipD1:
			movfw	aantal0EUR05L
			addwf	aantal_L,f
			btfss	STATUS,C
			goto	skipE1
			incf	aantal_H,f
skipE1:					;	nu zijn de lage aantal-bytes opgeteld en de Carry(s) zijn overgedragen
						;	naar de hoge aantal-byte
						;	hier gaan we verder de hoge aantal-bytes op te tellen
						;	wanneer er een carry out ontstaat, moet er gestopt worden omdat het max bereikt is
			movfw	aantal2EURH
			addwf	aantal_H,f
			btfss	STATUS,C
			goto	skipF1
		bsf	tmp9,1	;errorbit (max bereikt)
skipF1:
			movfw	aantal1EURH
			addwf	aantal_H,f
			btfss	STATUS,C
			goto	skipG1
		bsf	tmp9,1		;errorbit (max bereikt)
skipG1:
			movfw	aantal0EUR50H
			addwf	aantal_H,f
			btfss	STATUS,C
			goto	skipH1
		bsf	tmp9,1		;errorbit (max bereikt)
skipH1:
			movfw	aantal0EUR20H
			addwf	aantal_H,f
			btfss	STATUS,C
			goto	skipI1
		bsf	tmp9,1		;errorbit (max bereikt)
skipI1:
			movfw	aantal0EUR10H
			addwf	aantal_H,f
			btfss	STATUS,C
			goto	skipJ1
		bsf	tmp9,1		;errorbit (max bereikt)
skipJ1:
			movfw	aantal0EUR05H
			addwf	aantal_H,f
			btfss	STATUS,C
			goto	skipK1
		bsf	tmp9,1		;errorbit (max bereikt)
skipK1:
		call	lijn2_29			;	***LCD-DISPLAY*******karakters*buiten*beeld****
		movfw	aantal_L			;	* ................|....|................|.... *
		movwf	tempgetalL			;	* ................|....|..........X.....|.... *
		movfw	aantal_H			;	***********************************************
		movwf	tempgetalH
		call	converter
			return
;*****************************************************************************************************************
; hier staat de code waar de data herschreven wordt bij het 2e beeld
; deze zou er als volgt moeten uitzien:
;
;			***LCD-DISPLAY*******karakters*buiten*beeld****
;			* Munt:.....2,00€.|....|Munt:.....2,00€.|.... *
;			* Subtot.:......0€|....|Aantal:......0..|.... *
;			***********************************************
; 
; in beeld 1 worden data herschreven op de 1e lijn, als eerste via 'datateller' om de muntwaarde te selecteren
; daarna wordt de data op de 2e lijn aangepast, dit is de conversie van 16 bit getal "totaal_L + _H
;*****************************************************************************************************************
skip100:	movfw	beeld
			sublw	.1
			btfss	STATUS,Z
			goto	skip101		; Als beeld 1 niet 0 is

			call	BEELD1_2		; deze schrijft op de eerste regel het getal, afgeleid uit datamunt
									; de waarde van de munt wordt elke herschrijving bekeken en desnoods aangepast

			movfw	datateller
			sublw	.0				; schrijf 2,00€, aantal en bedrag
			btfss	STATUS,Z
			goto	skip10

			call	lijn2_7			;	***LCD-DISPLAY*******karakters*buiten*beeld****
			movfw	getal2EURL		;	* Munt:.....#,##€.|....|Munt:.....#,##€.|.... *
			movwf	tempgetalL		;	* Subtot.xxxXXXXX€|....|Aantal:.........|.... *
			movfw	getal2EURH		;	***********************************************
			movwf	tempgetalH
			movlw	':'				; print deze 3 karakters voor de conversie, dit omdat de getallen met
			call	prntLCD			; komma 3 plaatsen meer naar links geschreven worden, en als je dan
			movlw	' '				; terug naar gehele getallen gaat, blijven anders de 3 hoogste cijfers
			call	prntLCD			; op het LCD staan, wat kan leiden tot fout afleesbare bedragen
			movlw	' '
			call	prntLCD
			call	converter		; deze schrijft op de 2e regel het geconverteerd getal

			call	lijn2_29		;	***LCD-DISPLAY*******karakters*buiten*beeld****
			movfw	aantal2EURL		;	* Munt:.....#,##€.|....|Munt:.....#,##€.|.... *
			movwf	tempgetalL		;	* Subtot.:........|....|Aantal:..XXXXXX.|.... *
			movfw	aantal2EURH		;	***********************************************
			movwf	tempgetalH
			call	converter
			return
skip10:
			movfw	datateller
			sublw	.1				; schrijf 1,00€, aantal en bedrag
			btfss	STATUS,Z
			goto	skip11

		call	lijn2_10	
		movfw	getal1EURL
		movwf	tempgetalL
		movfw	getal1EURH
		movwf	tempgetalH
		call	converter
		
		call	lijn2_29
		movfw	aantal1EURL
		movwf	tempgetalL
		movfw	aantal1EURH
		movwf	tempgetalH
		call	converter
			return
skip11:
			movfw	datateller
			sublw	.2				; schrijf 0,50€, aantal en bedrag
			btfss	STATUS,Z
			goto	skip12

		call	lijn2_7	
		movfw	getal0EUR50L
		movwf	tempgetalL
		movfw	getal0EUR50H
		movwf	tempgetalH
		call	converter

			movfw	komma0EUR50
			movwf	tempkomma
			call	converterKOMMA

		call	lijn2_29
		movfw	aantal0EUR50L
		movwf	tempgetalL
		movfw	aantal0EUR50H
		movwf	tempgetalH
		call	converter
			return
skip12:			
			movfw	datateller
			sublw	.3				; schrijf 0,20€, aantal en bedrag
			btfss	STATUS,Z
			goto	skip13
	
		call	lijn2_7	
		movfw	getal0EUR20L
		movwf	tempgetalL
		movfw	getal0EUR20H
		movwf	tempgetalH
		call	converter

			movfw	komma0EUR20
			movwf	tempkomma
			call	converterKOMMA

		call	lijn2_29
		movfw	aantal0EUR20L
		movwf	tempgetalL
		movfw	aantal0EUR20H
		movwf	tempgetalH
		call	converter
			return
skip13:		
			movfw	datateller
			sublw	.4				; schrijf 0,10€, aantal en bedrag
			btfss	STATUS,Z
			goto	skip14

		call	lijn2_7	
		movfw	getal0EUR10L
		movwf	tempgetalL
		movfw	getal0EUR10H
		movwf	tempgetalH
		call	converter

			movfw	komma0EUR10
			movwf	tempkomma
			call	converterKOMMA
		
		call	lijn2_29
		movfw	aantal0EUR10L
		movwf	tempgetalL
		movfw	aantal0EUR10H
		movwf	tempgetalH
		call	converter
			return
skip14:
		call	lijn2_7				; schrijf 0,05€, aantal en bedrag
		movfw	getal0EUR05L
		movwf	tempgetalL
		movfw	getal0EUR05H
		movwf	tempgetalH
		call	converter
		
			movfw	komma0EUR05
			movwf	tempkomma
			call	converterKOMMA

		call	lijn2_29
		movfw	aantal0EUR05L
		movwf	tempgetalL
		movfw	aantal0EUR05H
		movwf	tempgetalH
		call	converter
			return	
;=================================================================================================================
BEELD1_2:
			bcf		PORTB,6			;	**********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
			movlw	b'10001010'		;	* . . . . . . . . . ._x , x x € .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			call	prntLCD			;	* . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			bsf		PORTB,6			;	***********************************************************************************
		call	SUBROTINE_1
			bcf		PORTB,6			;	**********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
			movlw	b'10011110'		;	* . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . _x , x x €.|. . . . *
			call	prntLCD			;	* . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			bsf		PORTB,6			;	***********************************************************************************
		call	SUBROTINE_1
			return
SUBROTINE_1:
			call	datamunt1		; maak de conversie welke muntwaarde weergegeven moet worden
			call	prntLCD			; zet variabele cijfer op het scherm
			movlw	','				;
			call	prntLCD			; zet vaste komma op het scherm
			call	datamunt2		;
			call	prntLCD			;
			call	datamunt3		;
			call	prntLCD			;
			movlw	0x00			; € teken
			call	prntLCD			;
			return					;
;=================================================================================================================
;*****************************************************************************************************************
; hier staat de code waar de data herschreven wordt bij het 3e beeld
; deze zou er als volgt moeten uitzien:
;
;			***LCD-DISPLAY*******karakters*buiten*beeld****
;			* Errors:..00.....|....|[Geen.meldingen]|.... *
;			* ................|....|..............#.|.... *
;			***********************************************
;
;			***LCD-DISPLAY*******karakters*buiten*beeld****
;			* Errors:..1......|....|fout sensor 2,00|.... *
;			* .Bekijk.&.reset>|....|Accept. & wis.#.|.... *
;			***********************************************
; 
;*****************************************************************************************************************
skip101:	movfw	beeld
			sublw	.2
			btfss	STATUS,Z
			goto	skip102		; Als beeld 2 niet 0 is
		; data voor herschrijven
;schrijf eerst het aantal fouten achter "errors"
			bcf		PORTB,6			;								|
			movlw	b'10001001'		; ga naar lijn1, karakter 9		|
			call	prntLCD			;								|
			bsf		PORTB,6			;								|

		movlw	0x30				; om ASCII getallen te maken plaats je 0x30
		movwf	temp0X				; in de merkers. Dit komt overeen met ASCII = 0
		movwf	temp00X				; 0X = tiendes, 00X = honderste
skip_C_2:							;
		movfw	tmp6			; aantal fouten - byte
		addlw	.246				; tel 246 op, indien het kommagetal >=10, zal de uitkomst in W >256 zijn
		btfss	STATUS,C			; wanneer de uitkomst in W >=256 is, zal C hoog zijn
		goto	skip_C_1			;
		movlw	.10					;
		subwf	tmp6,f			; F=f-w		:laad getal 10 in W, verminder het kommagetal met 10 en sla op
		incf	temp0X,f			;			 tel 1 op bij de 'tiendes'
		goto	skip_C_2			;			 en herhaal deze loop.
skip_C_1:							;
		movf	tmp6,w			; wanneer tempkomma <10 is geworden, laad je het overgebleven getal in W
		addwf	temp00X,f				; en tel deze op bij 'honderste' (dit is al ASCII compatible
	;	clrf	tmp6							
		movfw	temp0X	
		call	prntLCD	
		movfw	temp00X
		call	prntLCD
;------------------------
;scan alle mogelijke fouten en ga naar het subprogrammatje

			btfsc	tmp9,0
			goto	err_00
			btfsc	tmp9,1
			goto	err_01
			btfsc	tmp9,2
			goto	err_02	
			btfsc	tmp9,3
			goto	err_03
			btfsc	tmp9,4
			goto	err_04
			btfsc	tmp9,5
			goto	err_05
			btfsc	tmp9,6
			goto	err_06	
			btfsc	tmp9,7
			goto	err_07

			call	lijn1_20
			movlw	'['
			call	prntLCD
			movlw	'G'		;
			call	prntLCD
			movlw	'e'
			call	prntLCD
			movlw	'e'
			call	prntLCD
			movlw	'n'
			call	prntLCD
			movlw	' '
			call	prntLCD
			movlw	'm
			call	prntLCD
			movlw	'e'
			call	prntLCD
			movlw	'l'
			call	prntLCD
			movlw	'd'		;
			call	prntLCD
		;movlw	'i'
		;call	prntLCD
		;movlw	'n'
		;call	prntLCD
		;movlw	'g'
		;call	prntLCD
		;movlw	'e'		;
		;call	prntLCD
		;movlw	'n'
		;call	prntLCD
		;movlw	']'
		;call	prntLCD

	;	call	text_2
	;	call	text_4
			return				; ga terug als er geen error is

err_00:		call	lijn1_20
			movlw	'M'
			call	prntLCD
			movlw	'a'		;
			call	prntLCD
			movlw	'x'
			call	prntLCD
			movlw	'.'
			call	prntLCD
			movlw	'"'
			call	prntLCD
			movlw	0x00		;€ teken
			call	prntLCD
			movlw	'"'
			call	prntLCD
			movlw	' '
			call	prntLCD
			movlw	'b'
			call	prntLCD
			movlw	'e'		;
			call	prntLCD
			movlw	'r'
			call	prntLCD
			movlw	'e'
			call	prntLCD
			movlw	'i'
			call	prntLCD
			movlw	'k'		;
			call	prntLCD
			movlw	't'
			call	prntLCD
			movlw	' '
			call	prntLCD
			goto	err_verder

err_01:		call	lijn1_20
			movlw	'M'
			call	prntLCD
			movlw	'a'		;
			call	prntLCD
			movlw	'x'
			call	prntLCD
			movlw	'.'
			call	prntLCD
			movlw	'a'
			call	prntLCD
			movlw	'a'		;
			call	prntLCD
			movlw	'n'
			call	prntLCD
			movlw	't'
			call	prntLCD
			movlw	'a'
			call	prntLCD
			movlw	'l'		;
			call	prntLCD
			movlw	' '
			call	prntLCD
			movlw	'g'
			call	prntLCD
			movlw	'e'
			call	prntLCD
			movlw	't'		;
			call	prntLCD
			movlw	'e'
			call	prntLCD
			movlw	'l'
			call	prntLCD
			goto	err_verder
							
err_02:		call	F_SENS
			movlw	'2'
			call	prntLCD
			movlw	0x00		; €-teken
			call	prntLCD
			movlw	'0'
			call	prntLCD
			movlw	'0'
			call	prntLCD
			goto	err_verder

err_03:		call	F_SENS
			movlw	'1'
			call	prntLCD
			movlw	0x00		; €-teken
			call	prntLCD
			movlw	'0'
			call	prntLCD
			movlw	'0'
			call	prntLCD
			goto	err_verder

err_04:		call	F_SENS
			movlw	'0'
			call	prntLCD
			movlw	0x00		; €-teken
			call	prntLCD
			movlw	'5'
			call	prntLCD
			movlw	'0'
			call	prntLCD
			goto	err_verder

err_05:		call	F_SENS
			movlw	'0'
			call	prntLCD
			movlw	0x00		; €-teken
			call	prntLCD
			movlw	'2'
			call	prntLCD
			movlw	'0'
			call	prntLCD
			goto	err_verder

err_06:		call	F_SENS
			movlw	'0'
			call	prntLCD
			movlw	0x00		; €-teken
			call	prntLCD
			movlw	'1'
			call	prntLCD
			movlw	'0'
			call	prntLCD
			goto	err_verder

err_07:		call	F_SENS
			movlw	'0'
			call	prntLCD
			movlw	0x00		; €-teken
			call	prntLCD
			movlw	'0'
			call	prntLCD
			movlw	'5'
			call	prntLCD
err_verder:
;--------------------------------
			call	lijn2_1
			movlw	' '				; schrijf "Bekijk & reset" op het LCD
			call	prntLCD
			movlw	'B'
			call	prntLCD
			movlw	'e'
			call	prntLCD
			movlw	'k'
			call	prntLCD
			movlw	'i'
			call	prntLCD
			movlw	'j'
			call	prntLCD
			movlw	'k'
			call	prntLCD
			movlw	' '
			call	prntLCD
			movlw	'&'
			call	prntLCD
			movlw	' '
			call	prntLCD
			movlw	'r'
			call	prntLCD
			movlw	'e'
			call	prntLCD
			movlw	's'
			call	prntLCD
			movlw	'e'
			call	prntLCD
			movlw	't'
			call	prntLCD
			movlw	0x7E		;pijltje rechts
			call	prntLCD

			call	lijn2_20
			movlw	'A'				; schrijf "Accept. & wis #" op het LCD
			call	prntLCD
			movlw	'c'
			call	prntLCD
			movlw	'c'
			call	prntLCD
			movlw	'e'
			call	prntLCD
			movlw	'p'
			call	prntLCD
			movlw	't'
			call	prntLCD
			movlw	'.'
			call	prntLCD
			movlw	' '
			call	prntLCD
			movlw	'&'
			call	prntLCD
			movlw	' '
			call	prntLCD
			movlw	'w'
			call	prntLCD
			movlw	'i'
			call	prntLCD
			movlw	's'
			call	prntLCD
			movlw	' '
			call	prntLCD
			movlw	0xDB		; vierkantje
			call	prntLCD
		return

F_SENS:		call	lijn1_20
			movlw	'F'				; schrijf "Fout sensor 2,00" op het LCD
			call	prntLCD
			movlw	'o'
			call	prntLCD
			movlw	'u'
			call	prntLCD
			movlw	't'
			call	prntLCD
			movlw	' '
			call	prntLCD
			movlw	's'
			call	prntLCD
			movlw	'e'
			call	prntLCD
			movlw	'n'
			call	prntLCD
			movlw	's'
			call	prntLCD
			movlw	'o'
			call	prntLCD
			movlw	'r'
			call	prntLCD
			movlw	' '
			call	prntLCD
		return
;*****************************************************************************************************************
; hier staat de code waar de data herschreven wordt bij het 4e beeld
; deze zou er als volgt moeten uitzien:
;
;			***LCD-DISPLAY*******karakters*buiten*beeld****
;			* Reset:..........|....|Sorteerschijf:..|.... *
;			* Alle waarden?.#.|....|..Starten?....#.|.... *
;			***********************************************
; 
; in beeld 1 worden data herschreven op de 1e lijn, als eerste via 'datateller' om de muntwaarde te selecteren
; daarna wordt de data op de 2e lijn aangepast, dit is de conversie van 16 bit getal "totaal_L + _H
;*****************************************************************************************************************
skip102:
			movfw	beeld
			sublw	.3
			btfss	STATUS,Z
			return	; ga terug zonder herschrijven als beeldteller niet klopt
		; data voor herschrijven in beeld 4
			movfw	datateller
			sublw	.0				; schrijf "alle waarden?" resetten
			btfss	STATUS,Z
			goto	skipBLD4_0

BLD4_0:		call	lijn2_1
			movlw	'a'				; schrijf "alle waarden?" op het LCD
			call	prntLCD
			movlw	'l'
			call	prntLCD
			movlw	'l'
			call	prntLCD
			movlw	'e'
			call	prntLCD
			movlw	' '
			call	prntLCD
			movlw	'w'
			call	prntLCD
			movlw	'a'
			call	prntLCD
			movlw	'a'
			call	prntLCD
			movlw	'r'
			call	prntLCD
			movlw	'd'
			call	prntLCD
			movlw	'e'
			call	prntLCD
			movlw	'n'
			call	prntLCD
			movlw	'?'
			call	prntLCD
		;	movlw	' '
		;	call	prntLCD
		;	movlw	0xDB		;vierkant vakje
		;	call	prntLCD
		return
skipBLD4_0:
			movfw	datateller
			sublw	.1				; schrijf "aantallen?" resetten
			btfss	STATUS,Z
			goto	skipBLD4_1

BLD4_1:		call	lijn2_1
			movlw	'a'				; schrijf "aantallen?" op het LCD
			call	prntLCD
			movlw	'a'
			call	prntLCD
			movlw	'n'
			call	prntLCD
			movlw	't'
			call	prntLCD
			movlw	'a'
			call	prntLCD
			movlw	'l'
			call	prntLCD
			movlw	'l'
			call	prntLCD
			movlw	'e'
			call	prntLCD
			movlw	'n'
			call	prntLCD
			movlw	'?'
			call	prntLCD
			movlw	' '
			call	prntLCD
			movlw	' '
			call	prntLCD
			movlw	' '
			call	prntLCD
			movlw	' '
			call	prntLCD
		;	movlw	0xDB		;vierkant vakje
		;	call	prntLCD
		return

skipBLD4_1:
			movfw	datateller
			sublw	.2				; schrijf "bedragen?" resetten
			btfss	STATUS,Z
			goto	skipBLD4_2

BLD4_2:		call	lijn2_1
			movlw	'b'				; schrijf "bedragen?" op het LCD
			call	prntLCD
			movlw	'e'
			call	prntLCD
			movlw	'd'
			call	prntLCD
			movlw	'r'
			call	prntLCD
			movlw	'a'
			call	prntLCD
			movlw	'g'
			call	prntLCD
			movlw	'e'
			call	prntLCD
			movlw	'n'
			call	prntLCD
			movlw	'?'
			call	prntLCD
			movlw	' '
			call	prntLCD
			movlw	' '
			call	prntLCD
			movlw	' '
			call	prntLCD
			movlw	' '
			call	prntLCD
		;	movlw	' '
		;	call	prntLCD
		;	movlw	0xDB		;vierkant vakje
		;	call	prntLCD
		return

skipBLD4_2:
			movfw	datateller
			sublw	.3				; schrijf "alle waarden?" resetten
			btfss	STATUS,Z
			goto	skipBLD4_3

			goto	BLD4_0
skipBLD4_3:
			movfw	datateller
			sublw	.4				; schrijf "aantallen?" resetten
			btfss	STATUS,Z
			goto	skipBLD4_4
			
			goto	BLD4_1
skipBLD4_4:
			movfw	datateller
			sublw	.5				; schrijf "bedragen?" resetten
			btfss	STATUS,Z
			return				
			goto	BLD4_2
			return
;................................................................................................................
;=================================================================================================================
;................................................................................................................
;..................................................................................................
; 2 byte getal (16 bits) omzetten naar decimalen
; code afkomstig van internet, getest en werkt op 3 apr 2021
;..................................................................................................
converter:
			swapf	tempgetalH,w	;w  = A2*16+A3
			andlw   0x0F			;w  = A3		*** PERSONALLY, I'D REPLACE THESE 2
		    addlw   0xF0			;w  = A3-16	*** LINES WITH "IORLW b'11110000B' " -AW
			movwf   temp1d			;B3 = A3-16
			addwf   temp1d,f		;B3 = 2*(A3-16) = 2A3 - 32
			addlw   d'226'			;w  = A3-16 - 30 = A3-46
			movwf   temp100			;B2 = A3-46
			addlw   .50				;w  = A3-46 + 50 = A3+4
			movwf   temp1			;B0 = A3+4

			movf    tempgetalH,w	;w  = A3*16+A2
			andlw   0x0F			;w  = A2
			addwf   temp100,f		;B2 = A3-46 + A2 = A3+A2-46
			addwf   temp100,f		;B2 = A3+A2-46  + A2 = A3+2A2-46
			addwf   temp1,f			;B0 = A3+4 + A2 = A3+A2+4
			addlw   .233			;w  = A2 - 23
			movwf   temp10			;B1 = A2-23
			addwf   temp10,f		;B1 = 2*(A2-23)
			addwf   temp10,f		;B1 = 3*(A2-23) = 3A2-69 (Doh! thanks NG)

			swapf   tempgetalL,w	;w  = A0*16+A1
			andlw   0x0F			;w  = A1
			addwf   temp10,f		;B1 = 3A2-69 + A1 = 3A2+A1-69 range -69...-9
			addwf   temp1,f			;B0 = A3+A2+4 + A1 = A3+A2+A1+4 and Carry = 0 (thanks NG)

			rlf     temp10,f		;B1 = 2*(3A2+A1-69) + C = 6A2+2A1-138 and Carry is now 1 as tens register had to be negitive
			rlf     temp1,f			;B0 = 2*(A3+A2+A1+4) + C = 2A3+2A2+2A1+9 (+9 not +8 due to the carry from prev line, Thanks NG)
			comf    temp1,f			;B0 = ~(2A3+2A2+2A1+9) = -2A3-2A2-2A1-10 (ones complement plus 1 is twos complement. Thanks SD)

			rlf     temp1,f	;B0 = 2*(-2A3-2A2-2A1-10) = -4A3-4A2-4A1-20

			movf    tempgetalL,w	;w  = A1*16+A0
			andlw   0x0F			;w  = A0
			addwf   temp1,f			;B0 = -4A3-4A2-4A1-20 + A0 = A0-4(A3+A2+A1)-20 range -215...-5 Carry=0
			rlf     temp1d,f		;B3 = 2*(2A3 - 32) = 4A3 - 64

			movlw   0x07			;w  = 7
			movwf   temp10d			;B4 = 7

			movlw   .10				;w  = 10
Lb1:
			addwf   temp1,f			; B0 += 10
			decf    temp10,f		; B1 -= 1
			btfss   STATUS,C
			goto	Lb1				; while B0 < 0
Lb2:
			addwf   temp10,f		; B1 += 10
			decf    temp100,f		; B2 -= 1
			btfss   STATUS,C
			goto	Lb2				; while B1 < 0
Lb3:
			addwf   temp100,f		; B2 += 10
			decf    temp1d,f		; B3 -= 1
			btfss   STATUS,C
			goto	Lb3				; while B2 < 0
Lb4:
			addwf   temp1d,f		; B3 += 10
			decf    temp10d,f		; B4 -= 1
			btfss   STATUS,C
			goto	Lb4				; while B3 < 0


	movlw	0x00			; in dit stukje code
	addwf	temp10d,f		; verberg je de 0'en
	btfss	STATUS,Z		; voor het getal
	goto	jp1				; dit zorgt voor een 
	movlw	' '				; duidelijkere weergave
	call	prntLCD			; bij bv.: 12€ zou je
						; anders 00012€ tezien
	movlw	0x00			; krijgen, nu zie je    12€
	addwf	temp1d,f
	btfss	STATUS,Z
	goto	jp2
	movlw	' '
	call	prntLCD

	movlw	0x00
	addwf	temp100,f
	btfss	STATUS,Z
	goto	jp3
	movlw	' '
	call	prntLCD

	movlw	0x00
	addwf	temp10,f
	btfss	STATUS,Z
	goto	jp4
	movlw	' '
	call	prntLCD
	goto	jp5

jp1:		movf	temp10d,w		; zorg dat in de temp-
			addlw	0x30			; getallen 0x30
			call	prntLCD			; bijgeteld wordt, dit
jp2:		movf	temp1d,w		; om een overeenkomstig
			addlw	0x30			; getal in ASCII-code
			call	prntLCD			; weer te geven.
jp3:		movf	temp100,w
			addlw	0x30
			call	prntLCD
jp4:		movf	temp10,w
			addlw	0x30
			call	prntLCD
jp5:		movf	temp1,w
			addlw	0x30
			call	prntLCD
	return
;=================================================================================================================
;		; start hier de converter voor kommagetallen
;=================================================================================================================
converterKOMMA:
		movlw	0x30				; om ASCII getallen te maken plaats je 0x30
		movwf	temp0X				; in de merkers. Dit komt overeen met ASCII = 0
		movwf	temp00X				; 0X = tiendes, 00X = honderste
skip_K_2:							;
		movfw	tempkomma			; hier staat de waarde van het kommagetal
		addlw	.246				; tel 246 op, indien het kommagetal >=10, zal de uitkomst in W >256 zijn
		btfss	STATUS,C			; wanneer de uitkomst in W >=256 is, zal C hoog zijn
		goto	skip_K_1			;
		movlw	.10					;
		subwf	tempkomma,f			; F=f-w		:laad getal 10 in W, verminder het kommagetal met 10 en sla op
		incf	temp0X,f			;			 tel 1 op bij de 'tiendes'
		goto	skip_K_2			;			 en herhaal deze loop.
skip_K_1:							;
		movf	tempkomma,w			; wanneer tempkomma <10 is geworden, laad je het overgebleven getal in W
		addwf	temp00X,f				; en tel deze op bij 'honderste' (dit is al ASCII compatible
;-----------------------------------;
			bcf		PORTB,6			; Ga naar lijn2, karakter 12								
			movlw	b'11001100'		; 
			call	prntLCD			; Deze moet je opnieuw aanroepen omdat in de converter 
			bsf		PORTB,6			; ook terug naar lijn 1 gesprongen wordt.
		movlw	','
		call	prntLCD			;	**********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
		movfw	temp0X			;	* . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
		call	prntLCD			;	* . . . . . . . . . . . . ¦,x x €|. . . .|. . . . . . . . . . . . . . . .|. . . . *
		movfw	temp00X			;	***********************************************************************************
		call	prntLCD
			return
;=================================================================================================================
;-----------------------------------------
;data van MUNT aanpassen
;-----------------------------------------
datamunt1:	
			movfw	datateller
			sublw	.0			; W=k-w # subwf: W=f-w of F=f-w
			btfss	STATUS,Z	; doe de aktie enkel als datateller =0
			goto	skip1
			movlw	'2'
			return
skip1:
			movfw	datateller
			sublw	.1
			btfss	STATUS,Z
			goto	skip2
			movlw	'1'
			return
skip2:
			movlw	'0'
			return
;................................................................................................................
datamunt2:	
			movfw	datateller
			sublw	.2
			btfss	STATUS,Z
			goto	skip3
			movlw	'5'
			return
skip3:
			movfw	datateller
			sublw	.3
			btfss	STATUS,Z
			goto	skip4
			movlw	'2'
			return
skip4:
			movfw	datateller
			sublw	.4
			btfss	STATUS,Z
			goto	skip5
			movlw	'1'
			return
skip5:
			movlw	'0'
			return
;................................................................................................................
datamunt3:	
			movfw	datateller
			sublw	.5
			btfss	STATUS,Z
			goto	skip6
			movlw	'5'
			return
skip6:
			movlw	'0'
			return

;=================================================================================================================
;			-------------------------------------------------------------------------------------
;			8 bits omvormen naar 2 x 4 bit commando's, en zo het W-reg naar het LCD te schrijven.
;			-------------------------------------------------------------------------------------
;=================================================================================================================
prntLCD:	movwf	tempLCD			; als vb.: 0010 1000
			swapf	tempLCD,w		; resultaat wordt dan 1000 0010 in W
			andlw	0x0F			; resultaat wordt dan 0000 0010 in W
			movwf	PORTC			; plaats resultaat op poort C
			call	Delay2
			call	pulse_e			;----------------------------
									; hier begint het 2e deel	|
			movf	tempLCD,w		; vb.: 0010 1000
			andlw	0x0F			; vb.: 0000 1000
			movwf	PORTC			; zet de volgende 4 bits op poort C
			call	Delay2
			call	pulse_e
			return
;=================================================================================================================
; vertragingen instellen
;=================================================================================================================
Delay255	movlw	0xff			;delay 255 mS
			goto	d0
Delay5		movlw	0x05			; delay 5ms
			goto	d0
Delay2		movlw	0x02			;delay 2.000 ms (4 MHz clock)
d0			movwf	count1
d1			movlw	0x58			;delay 1mS = 0xC7 (d199= originele waarde) --- delay 500µS = 0x63 (d99)???
			movwf	counta			; d1 was 0x55
			movlw	0x01
			movwf	countb
Delay_0
			decfsz	counta, f
			goto	$+2
			decfsz	countb, f
			goto	Delay_0

			decfsz	count1	,f
			goto	d1
			return
		;	retlw	0x00
;=================================================================================================================
; Pulse geven op enable pin van LCD (E = pin 6)
;=================================================================================================================
pulse_e		bcf		PORTB, LCD_E
			nop
			bsf		PORTB, LCD_E
			return
;=================================================================================================================
; Call fuctie om cursor op een karakterpositie te zetten
;=================================================================================================================
lijn2_10:	bcf		PORTB,6			;								|
			movlw	b'11001010'		; ga naar lijn2, karakter 10	|
			call	prntLCD			;								|
			bsf		PORTB,6			;								|
			return
;=================================================================================================================
lijn2_14:	bcf		PORTB,6			;								|
			movlw	b'11001110'		; ga naar lijn2, karakter 14	|
			call	prntLCD			;								|
			bsf		PORTB,6			;								|
			return
;=================================================================================================================
lijn2_29:	bcf		PORTB,6			;								|
			movlw	b'11011101'		; ga naar lijn2, karakter 29	|
			call	prntLCD			;								|
			bsf		PORTB,6			;								|
			return
;=================================================================================================================
lijn2_7:	bcf		PORTB,6			;								|
			movlw	b'11000111'		; ga naar lijn2, karakter 7		|
			call	prntLCD			;								|
			bsf		PORTB,6			;								|
			return
;=================================================================================================================
lijn2_1:	bcf		PORTB,6			;								|
			movlw	b'11000000'		; ga naar lijn2, karakter 1		|
			call	prntLCD			;								|
			bsf		PORTB,6			;								|
			return
;=================================================================================================================
lijn2_20:	bcf		PORTB,6			;								|
			movlw	b'11010100'		; ga naar lijn2, karakter 20		|
			call	prntLCD			;								|
			bsf		PORTB,6			;								|
			return
;=================================================================================================================
lijn1_20:	bcf		PORTB,6			;								|
			movlw	b'10010100'		; ga naar lijn1, karakter 20		|
			call	prntLCD			;								|
			bsf		PORTB,6			;								|
			return
;=================================================================================================================
;####################################################################
; de tekst die hier geschreven wordt, word niet herschreven !!!
; dus hier mag je geen voorwaarden of wisselende teksten plaatsen.
;###################################################################
text_1:							; hier laad je enkel de tekst die op het 1e deel van het display moet komen
			;	**********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
			;	* X X X X X X X X X X X X X X X X|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			;	* . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			;	***********************************************************************************
			movfw	beeld
			sublw	.0
			btfss	STATUS,Z
			goto	skipbeeld00
		movf	count,w
		call	textTotaal
		movwf	buf1
		return
skipbeeld00:
			movfw	beeld
			sublw	.1
			btfss	STATUS,Z
			goto	skipbeeld01
		movf	count,w
		call	textMunt
		movwf	buf1
		return
skipbeeld01:
			movfw	beeld
			sublw	.2
			btfss	STATUS,Z
			goto	skipbeeld02
		movf	count,w
		call	textError
		movwf	buf1
		return
skipbeeld02:
			movfw	beeld
			sublw	.3
			btfss	STATUS,Z
			goto	skipbeeld03
		movf	count,w
		call	textReset
		movwf	buf1
		return
skipbeeld03:
	retlw	0xFF
;--------------------------------------
text_2:							; hier laad je enkel de tekst die op het 2e deel van het display moet komen
			;	**********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
			;	* . . . . . . . . . . . . . . . .|. . . .|X X X X X X X X X X X X X X X X|. . . . *
			;	* . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			;	***********************************************************************************
		
			movfw	beeld			; in beeld 1 schrijf je "Aantal munten:"
			sublw	.0
			btfss	STATUS,Z
			goto	skipbeeld10
		movf	count,w
		call	textAantalMunt
		movwf	buf1
		return
skipbeeld10:						
			movfw	beeld			; in beeld 2 schrijf je "Munt:"
			sublw	.1
			btfss	STATUS,Z
			goto	skipbeeld11
		movf	count,w
		call	textMunt
		movwf	buf1
		return
skipbeeld11:
			movfw	beeld			; in beeld 3 schrijf je "[geen meldingen]"
			sublw	.2
			btfss	STATUS,Z
			goto	skipbeeld12
	retlw	0xff
	;movf	count,w
	;call	textVaria1
	;movwf	buf1
	;return
skipbeeld12:
			movfw	beeld
			sublw	.3
			btfss	STATUS,Z
			goto	skipbeeld13
		movf	count,w
		call	textVaria2
		movwf	buf1
		return
skipbeeld13:
	retlw	0xFF
;--------------------------------------
text_3:							; hier laad je enkel de tekst die op het 3e deel van het display moet komen
			;	**********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
			;	* . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			;	* X X X X X X X X X X X X X X X X|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			;	***********************************************************************************
		
			movfw	beeld
			sublw	.0
			btfss	STATUS,Z
			goto	skipbeeld20

EUROteken:	bcf		PORTB,6			;	**********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
			movlw	b'11001111'		;	* . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			call	prntLCD			;	* . . . . . . . . . . . . . . . X|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			bsf		PORTB,6			;	***********************************************************************************
			movlw	0x00			; €-teken laden
			call	prntLCD
		retlw	0xFF
skipbeeld20:
			movfw	beeld
			sublw	.1
			btfss	STATUS,Z
			goto	skipbeeld21
		movf	count,w				;	**********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
		call	textSubtot			;	* . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
		movwf	buf1				;	* S u b t o t . : . . . . . . . €|. . . .|. . . . . . . . . . . . . . . .|. . . . *
		xorlw	0xFF				;	***********************************************************************************
		btfsc	STATUS,Z
		goto	EUROteken
		return
skipbeeld21:
			movfw	beeld
			sublw	.2
			btfss	STATUS,Z
			goto	skipbeeld22
			retlw	0xFF			; blanco
skipbeeld22:
			movfw	beeld
			sublw	.3
			btfss	STATUS,Z
			retlw	0xFF			; ga terug als beeldteller hoger zou zijn als "3"

			bcf		PORTB,6			;	**********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
			movlw	b'11001110'		;	* . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			call	prntLCD			;	* . . . . . . . . . . . . . . X .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			bsf		PORTB,6			;	***********************************************************************************
			movlw	0xDB			; ASCII vierkantje
			call	prntLCD
			retlw	0xFF

;-------------------------------------------
text_4:							; hier laad je enkel de tekst die op het 4e deel van het display moet komen
			;	**********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
			;	* . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			;	* . . . . . . . . . . . . . . . .|. . . .|X X X X X X X X X X X X X X X X|. . . . *
			;	***********************************************************************************
			movfw	beeld			; in beeld 1 is dit blanco
			sublw	.0
			btfss	STATUS,Z
			goto	skipbeeld30		;blanco
			retlw	0xFF
skipbeeld30:
			movfw	beeld			; in beeld 2 is dit 'Aantal:'
			sublw	.1
			btfss	STATUS,Z
			goto	skipbeeld31
		movf	count,w				;	**********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
		call	textAantal			;	* . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
		movwf	buf1				;	* . . . . . . . . . . . . . . . .|. . . .|A a n t a l : . . . . . . . . .|. . . . *
		return						;	***********************************************************************************
skipbeeld31:
			movfw	beeld
			sublw	.2
			btfss	STATUS,Z
			goto	skipbeeld32
		
			bcf		PORTB,6			;	**********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
			movlw	b'11100010'		;	* . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			call	prntLCD			;	* . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . X .|. . . . *
			bsf		PORTB,6			;	***********************************************************************************
		movlw	0xDB			; vierkantje laden
		call	prntLCD
		retlw	0xFF
skipbeeld32:
			movfw	beeld
			sublw	.3
			btfss	STATUS,Z
			goto	skipbeeld33

			bcf		PORTB,6			;	**********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
			movlw	b'11010110'		;	* . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			call	prntLCD			;	* . . . . . . . . . . . . . . . .|. . . .|. . S t a r t e n ? . . . . . .|. . . . *
			bsf		PORTB,6			;	***********************************************************************************

			btfsc	tmp10,1
			goto	skipbeeld34

		movlw	'S'				; laad woord "starten:"
		call	prntLCD
		movlw	't'				; ?-teken laden
		call	prntLCD
		movlw	'a'				; ?-teken laden
		call	prntLCD
		movlw	'r'				; ?-teken laden
		call	prntLCD
		movlw	't'				; ?-teken laden
		call	prntLCD
		movlw	'e'				; ?-teken laden
		call	prntLCD
		movlw	'n'				; ?-teken laden
		call	prntLCD
		movlw	'?'				; ?-teken laden
		call	prntLCD
		movlw	' '				; ?-teken laden
		call	prntLCD
		movlw	' '				; ?-teken laden
		call	prntLCD
		movlw	' '				; ?-teken laden
		call	prntLCD
		movlw	' '				; ?-teken laden
		call	prntLCD
		movlw	0xDB			; ?-teken laden
		call	prntLCD
		retlw	0xFF

skipbeeld34:
		movlw	'S'				; laad woord "stoppen:"
		call	prntLCD
		movlw	't'				; ?-teken laden
		call	prntLCD
		movlw	'o'				; ?-teken laden
		call	prntLCD
		movlw	'p'				; ?-teken laden
		call	prntLCD
		movlw	'p'				; ?-teken laden
		call	prntLCD
		movlw	'e'				; ?-teken laden
		call	prntLCD
		movlw	'n'				; ?-teken laden
		call	prntLCD
		movlw	'?'				; ?-teken laden
		call	prntLCD
		movlw	' '				; ?-teken laden
		call	prntLCD
		movlw	' '				; ?-teken laden
		call	prntLCD
		movlw	' '				; ?-teken laden
		call	prntLCD
		movlw	' '				; ?-teken laden
		call	prntLCD
		movlw	0xDB			; ?-teken laden
		call	prntLCD
		retlw	0xFF
skipbeeld33:
	retlw	0xFF
;######################################

;=======================================================================
; schrijf het LCD in 4 beelden, 2 op de eerste lijn en 2 op de 2e lijn
;=======================================================================
schrijfLCD:
			;	**********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
			;	* X . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			;	* . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			;	***********************************************************************************
			bcf		PORTB,6			;ga naar instructie mode
			movlw	b'00000010'
			call	prntLCD			; zet cursor naar home
			call	Delay2
			bsf		PORTB,6			; ga naar data mode

			clrf	count			;****************************************
loop_1:	;	movf	count,w			;haal data op uit het 'PCL' en 'retlw'	*
			call	text_1			;register om TEXT te schrijven op 		*
		;	movwf	buf1			;het LCD display.						*
			xorlw	0xFF			;****************************************
			btfsc	STATUS,Z
			goto	next_1
			movf	buf1,w
			call	prntLCD
			incf	count,f
			goto	loop_1
next_1:
			call	lijn1_20
			;bcf		PORTB,6			;	**********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
			;movlw	b'10010100'		;	* . . . . . . . . . . . . . . . .|. . . .|X . . . . . . . . . . . . . . .|. . . . *
			;call	prntLCD			;	* . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			;bsf		PORTB,6			;	***********************************************************************************

			clrf	count		
loop_2:	;	movf	count,w		
			call	text_2	
		;	movwf	buf1	
			xorlw	0xFF	
			btfsc	STATUS,Z
			goto	next_2
			movf	buf1,w
			call	prntLCD
			incf	count,f
			goto	loop_2
next_2:
			bcf		PORTB,6			;	**********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
			movlw	b'11000000'		;	* . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			call	prntLCD			;	* X . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			bsf		PORTB,6			;	***********************************************************************************

			clrf	count
loop_3:	;	movf	count,w
			call	text_3
		;	movwf	buf1
			xorlw	0xFF
			btfsc	STATUS,Z
			goto	next_3
			movf	buf1,w
			call	prntLCD
			incf	count,f
			goto	loop_3

next_3:		call	lijn2_20
			;bcf		PORTB,6			;	**********LCD-DISPLAY*******************alle*andere*karakters*buiten*beeld*********
			;movlw	b'11010100'		;	* . . . . . . . . . . . . . . . .|. . . .|. . . . . . . . . . . . . . . .|. . . . *
			;call	prntLCD			;	* . . . . . . . . . . . . . . . .|. . . .|X . . . . . . . . . . . . . . .|. . . . *
			;bsf		PORTB,6			;	***********************************************************************************

			clrf	count
loop_4:	;	movf	count,w
			call	text_4
		;	movwf	buf1
			xorlw	0xFF
			btfsc	STATUS,Z
			goto	next_4
			movf	buf1,w
			call	prntLCD
			incf	count,f
			goto	loop_4	
next_4:		
			return
	end
zoeken tot het werkt en dan nog zoeken
Hensz

Golden Member

Ik heb 0 ervaring met PICs, maar als je assembler simpelweg de source-regels telt, dan is er bij de datasectie heel eenvoudig veel winst te halen. Er staan daar nogal wat bytes en chars apart op een regel, dat moet handiger en dus met veel minder regels kunnen.

Don't Panic!
Arco

Special Member

Da's te veel om door te lezen... ;)

Maar het probleem is duidelijk en geheel zoals het hoort:
Het geheugen bestaat uit 2 pagina's: van 0x000 t/m 0x7FF en van 0x800 t/m 0xFFF

Als je ook de 2e pagina wilt gebruiken, heb je het PAGESEL directive nodig om de juiste page te kiezen.
(in een hogere programmeertaal doet de compiler dat voor je)

De bovenste bits van de program counter komen uit het PCLATH register en bepalen de page:

[Bericht gewijzigd door Arco op vrijdag 30 april 2021 22:15:08 (13%)

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

Ik heb geen verstand van PIC's, maar het is een verademing om eindelijk eens een keer commentaar in het Nederlands te zien.
Het programma wordt kleiner als je gebruik maakt van subroutines of functies.

Arco

Special Member

Daar kom je nog wel van terug als je code door een buitenlander bekeken moet worden en je alles eerst moet vertalen naar het Engels. ;)
Ik doe het altijd in het Engels: ik ga er vanuit dat een goede programmeur Engels kent.

Zo kun je bij vragen ook makkelijk op het Microchip forum posten.

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

Op 30 april 2021 22:35:40 schreef Arco:
Daar kom je nog wel van terug als je code door een buitenlander bekeken moet worden en je alles eerst moet vertalen naar het Engels. ;)

Als je voor de buitenlandse markt code schrijft dan begrijp ik het wel, maar in de hobbysfeer en voor de Nederlandse markt vind ik het onzin. Vaak is ook de kwaliteit van het Engelse commentaar belabberd.

Op 30 april 2021 22:32:23 schreef ohm pi:
Ik heb geen verstand van PIC's, maar het is een verademing om eindelijk eens een keer commentaar in het Nederlands te zien.

Dat is omdat ik de engelse taal ook niet echt machtig ben..
Het uitpluizen van de datasheet is dus een hele marteling voor mij ?

Op 30 april 2021 22:07:58 schreef Arco:
Da's te veel om door te lezen... ;)

Maar het probleem is duidelijk en geheel zoals het hoort:
Het geheugen bestaat uit 2 pagina's: van 0x000 t/m 0x7FF en van 0x800 t/m 0xFFF

Als je ook de 2e pagina wilt gebruiken, heb je het PAGESEL directive nodig om de juiste page te kiezen.
(in een hogere programmeertaal doet de compiler dat voor je)

[bijlage]

De bovenste bits van de program counter komen uit het PCLATH register en bepalen de page:

[bijlage]

Daar ben ik nog nie echt uit, hoe ik dat moet integreren in mijn code...
Ga er morgen eens proberen in te verdiepen.
Die PAGESEL is momenteel nog even nie helder voor mij.
De PC is toch 13bit groot, 1 page is 11bit. Dan heb je toch nog 2 bit over en zou je toch 4 pages hebben?

PS @ Arco:
Het is niet de bedoeling om de hele code door te lezen, het was maar ter indicatie wat mijn programeerlogica is.

zoeken tot het werkt en dan nog zoeken
JoWi

Special Member

Op 30 april 2021 21:42:21 schreef hobbyelektro:
Zo was ik in het begin ook erachter gekomen dat 'addwf PCL,f' en de nodige regels eronder om tekst op mijn LCD te schrijven, in het PCL moeten blijven. dit omdat de PCLATH niet geschreven of gelezen

Dat hoeft niet, mag alleen de 256 grens niet overschrijden in een enkele tekst.
Is dat de reden dat je een aantal teksten in het begin zet en de rest met heel veel printLCD doet ?
Dat kan veel slimmer.

Om te voorkomen dat je voor elke call een PAGESEL moet doen kan je beter je hoofdprogramma in page 0 zetten en dan wat subroutines in page1, weet je wanneer PAGESEL wel of niet nodig is (scheelt weer code)

code:

textMunt:	addwf	PCL,F
dt              "Munt:",0xFF

Is trouwens hetzelfde als

code:

textMunt:	addwf	PCL,f
			retlw	'M'
			retlw	'u'
			retlw	'n'
			retlw	't'
			retlw	':'
			retlw	0xFF

En leesbaarder.
[/code]

Ignorance is bliss
Arco

Special Member

De Program Counter is 13 bits, maar de bovenste 2 bits zijn vast (na 0x7FF is er een roll-over naar 0x000)
Met PAGESEL stel je die bovenste bits in...

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

Special Member

Als je voor de buitenlandse markt code schrijft dan begrijp ik het wel

Niet alleen dan, ook voor bijv. het Microchip forum is dat nodig. (Nederlands is voor de meeste buitenlanders even lastig als Chinees... ;) )
(en hoe wil je de datasheets lezen zonder kennis van Engelse taal?)

[Bericht gewijzigd door Arco op vrijdag 30 april 2021 23:52:31 (13%)

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

Op 30 april 2021 23:35:05 schreef Arco:
[...]
(en hoe wil je de datasheets lezen zonder kennis van Engelse taal?)

Het is niet dat ik totaal geen Engels begrijp, maar het is maar zeer beperkt... Lezen gaat nog wel een beetje, zeker met de hulp van google translate, Maar een heel gesprek voeren of engelstalige tv zonder ondertiteling lukt mij helaas niet :(

Nu ben ik even bezig geweest met een klein stukje code naar pagina 2 van de program-counter te plaatsen. Dit door voor de 'call' de bit PCLATH,3 te setten.
En dat werkt! Dus weer wat bijgeleerd.

code:

picasm:
;			-------------------------------------------------------------------------------------
;			8 bits omvormen naar 2 x 4 bit commando's, en zo het W-reg naar het LCD te schrijven.
;			-------------------------------------------------------------------------------------
prntLCD:	        movwf	tempLCD			; als vb.: 0010 1000
			swapf	tempLCD,w		; resultaat wordt dan 1000 0010 in W
			andlw	0x0F			; resultaat wordt dan 0000 0010 in W
			movwf	PORTC			; plaats resultaat op poort C
			call	Delay2
                    bsf	PCLATH,3
			call	pulse_e			;----------------------------

			movf	tempLCD,w		; vb.: 0010 1000
			andlw	0x0F			; vb.: 0000 1000
			movwf	PORTC			; zet de volgende 4 bits op poort C
			call	Delay2
                    bsf	PCLATH,3
			call	pulse_e
			return

...
...
...

	org	0x800 	        ; hier kun je verder gaan in de 2e pagina van de program-counter
				; doe je dit niet zo, dan ga je na 11 bit (2048) terug naar 0
				; let wel dat call en goto instrukties niet zomaar naar hier kunnen gaan
				; maar dat je eerst "bit 3" van PCLATH hoog zet
			
pulse_e:	bcf		PORTB, LCD_E
		nop
		bsf		PORTB, LCD_E
            bcf		PCLATH,3

			return	

	end  

Nu heb ik het ook geprobeerd door bit 4 van PCLATH te setten en dan over te springen naar "org 0x1000"
Dan krijg ik de melding dat ik out of range zit.
Dus dan heb je eigenlijk maar 12 bit (4096 regels) program-counter? Wat of wanneer set je dan PCLATH,4? Want dat is mij nog niet heel helder...

zoeken tot het werkt en dan nog zoeken
Arco

Special Member

Wat of wanneer set je dan PCLATH,4?

Niet... ;)
Alleen bij pics met 8k geheugen. Deze heeft maar 4k, dus krijg je terecht de mededeling dat je daar niets te zoeken hebt... (er bestaat geen 0x1000)
Gebruik het PAGESEL directive i.p.v. rommelen met de pclath bits. Veel overzichtelijker, en het is daar speciaal voor...
(en BANKSEL i.p.v. direct manipuleren van de STATUS.RPx bits)

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

Ik zou verwachten dat als je een call/goto doet naar een routine in een andere PAGE je een foutmelding krijgt. Maar dat als je PAGESEL doet niet. Het zelfde met variabelen in een andere bank Gebruik je BANKSEL dan weet de compiler wat je aan het doen bent, ga je zelf met de registers prutsen dan weet ie het niet en krijg je een foutmelding.

Maar goed, Ik heb 15 jaar geleden voor het laatst met PICs gewerkt...

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Arco

Special Member

Ik denk dat de code wel 80% korter kan. Alleen de tekststrings anders schrijven scheelt al enorm: (met DT table directive)

pic asm code:


textMunt:	addwf	PCL,f
			retlw	'M'
			retlw	'u'
			retlw	'n'
			retlw	't'
			retlw	':'
			retlw	0xFF
;..........................
textTotaal:	addwf	PCL,f
			retlw	'T'
			retlw	'o'
			retlw	't'
			retlw	'a'
			retlw	'a'
			retlw	'l'
			retlw	':'
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	0x03
			retlw	0xFF
;..........................
textAantal:	addwf	PCL,f
			retlw	'A'
			retlw	'a'
			retlw	'n'
			retlw	't'
			retlw	'a'
			retlw	'l'
			retlw	':'
			retlw	0xFF
;..........................
textSubtot:	addwf	PCL,f
			retlw	'S'
			retlw	'u'
			retlw	'b'
			retlw	't'
			retlw	'o'
			retlw	't'
			retlw	'.'
			retlw	':'
			retlw	0xFF
;..........................
textAantalMunt:	addwf	PCL,f
			retlw	'A'
			retlw	'a'
			retlw	'n'
			retlw	't'
			retlw	'a'
			retlw	'l'
			retlw	' '
			retlw	'm'
			retlw	'u'
			retlw	'n'
			retlw	't'
			retlw	'e'
			retlw	'n'
			retlw	':'
			retlw	' '
			retlw	0x03	; pijl op/neer
			retlw	0xFF
;..........................
textError:	addwf	PCL,f
			retlw	'E'
			retlw	'r'
			retlw	'r'
			retlw	'o'
			retlw	'r'
			retlw	's'
			retlw	':'
			retlw	0xFF
;..........................
textReset:	addwf	PCL,f
			retlw	'R'
			retlw	'e'
			retlw	's'
			retlw	'e'
			retlw	't'
			retlw	':'
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	0x02		; enter teken
			retlw	0xFF
;..........................
textVaria1:	addwf	PCL,f
			retlw	'['
			retlw	'G'
			retlw	'e'
			retlw	'e'
			retlw	'n'
			retlw	' '
			retlw	'm'
			retlw	'e'
			retlw	'l'
			retlw	'd'
			retlw	'i'
			retlw	'n'
			retlw	'g'
			retlw	'e'
			retlw	'n'
			retlw	']'
			retlw	0xFF
;..........................
textVaria2:	addwf	PCL,f
			retlw	'S'			; sorteerschijf:
			retlw	'o'
			retlw	'r'
			retlw	't'
			retlw	'e'
			retlw	'e'
			retlw	'r'
			retlw	's'
			retlw	'c'
			retlw	'h'
			retlw	'i'
			retlw	'j'
			retlw	'f'
			retlw	':'
			retlw	' '
			retlw	0x02		; enter teken
			retlw	0xFF
;..........................
textVaria3:	addwf	PCL,f
			retlw	'D'
			retlw	'r'
			retlw	'u'
			retlw	'k'
			retlw	' '
			retlw	'1'
			retlw	'&'
			retlw	'3'
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	' '
			retlw	0xDB	; vakje 0x06 = afgevinkt vakje
			retlw	0xFF

wordt:

pic asm code:


textMunt:	addwf	PCL,f
                dt      "Munt:", 0xFF

textTotaal:	addwf	PCL,f
		dt      "Totaal:        ", 0x03,0xFF

textAantal:	addwf	PCL,f
		dt      "Aantal:", 0xFF

textSubtot:	addwf	PCL,f
		dt      "Subtot.:", 0xFF

textAantalMunt:	addwf	PCL,f
		dt	"Aantal munten: ", 0x03,0xFF

textError:	addwf	PCL,f
		dt	"Errors:", 0xFF

textReset:	addwf	PCL,f
		dt	"Reset:         ", 0x02,0xFF

textVaria1:	addwf	PCL,f
		dt	"[Geen meldingen]", 0xFF

textVaria2:	addwf	PCL,f
		dt	"Sorteerschijf: ", 0x02,0xFF

textVaria3:	addwf	PCL,f
		dt	"Druk 1&3     ", 0xDB,0x06,0xFF

Het is trouwens gebruikelijk (standaard) om als string terminator geen 0xFF maar 0x00 te nemen

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

Zo'n 20+ jaar geleden heb ik een paar PIC 16F84 chipjes gekocht en daar een paar regels assembly voor geschreven.

Het was net genoeg om te ontdekken hoe hopeloos beperkt die 30 (ofzo) instrukties bij elkaar waren.

Toen kwamen de AVR processoren met ondersteuning van GCC als echte programmeertaal, en is die PIC rommel in een lade beland.

Programma's schrijven in ASM is een goede oefening voor studenten om een gevoel te krijgen wat zo'n microcontroller echt doet op het laagste nivo, en voor enkele erg specialistische toepassingen, maar verder wordt er alleen nog in assembly geschreven door retro-fanaten, masochisten, en mensen die niet beter weten.

Dus, als je in asm schijft omdat je het leuk vind, dan wil ik je niet tegenhouden (Ik geloof dat je boven 12 bit iets met "bank switching" moet doen), maar als het is omdat je nog nooit verder hebt gekeken, dan raad ik je aan om je horizon te verbreden en een andere programmeertaal te gebruiken.

BASIC doet geloof ik ook bijna niemand meer tegenwoodig. C & C++ wordt veel gebruik. C is een taal die goed bij microcontrollers past. Het is "hoog" genoeg om abstracte algoritmes op een begrijpelijke manier in een text editor te typen, en het is "laag" genoeg zodat je veel controle hebt over hoe de microprocessor dingen precies uitvoert.

Als je geen zin hebt in C / C++, dan is "micropython" misschien een goed alternatief. Je kunt compatible hadware gewoon in nederland kopen, b.v. bij https://www.antratek.nl/catalogsearch/result/?q=micropython

Of als je voor het stuivers jagen gaat, kijk dan eens naar de WeAct "Black Pill" STM32F411. Daarmee heb je voor < EUR5 een 32 bit uC die op 100MHz draait.

Er is veel veranderd de laatste 20 jaar op microcontroller gebied...

Arco

Special Member

Als je denkt dat Basic niet meer gebruikt wordt, dan heb je die laatste 20 jaar waarschijnlijk op een andere planeet gewoond...
(maar ja, je hebt altijd mensen die nogal kortzichtig en rechtlijnig zijn... :) )

'Pic rommel' is ook een ongefundeerde loze kreet, je kunt er net zo veel (of meer) mee als met andere controllers...

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

Op 4 mei 2021 20:27:05 schreef Kortsluiting_Online:
Het was net genoeg om te ontdekken hoe hopeloos beperkt die 30 (ofzo) instrukties bij elkaar waren.

Nou, dan denk ik dat je nog nooit iemand die kan lezen en schrijven met die dingen in assembler hebt ontmoet.
Op m'n werk loopt er zo één rond. Hij laat me nog wel eens de code zien van wat hij heeft gebouwd. Voor hem is een nummer ophalen uit het EEPROM en daar naar toe schrijven gesneden koek en hij denkt vaak dat ik dat ook wel allemaal begrijp ;)

Volgens mij is het grootste programma wat ik van hem heb gezien iets van 1600 regels code. Hij begrijpt die dingen blijkbaar geheel van binnen en buiten.
Voor mij zullen het altijd wat abstracte dingen blijven: een CMOS-bouwsteentje is geen probleem. Het datablad vertelt me precies wat ik moet doen. Maar zo'n PIC (of eender welke microcontroller) met al z'n registers, adressen en weet ik wat... dat zal nooit mijn ding worden.

M'n recente experimenten met het uitlezen en herprogrammeren van BQ20Z65 battery management chips, hebben me wel enige verlichting gebracht: registers hebben een adres en daar stuur je een waarde naar toe (als dat register dat toestaat dan)
Toen ik een datablad van een PIC opende en eens door ging lezen, vielen er wel wat dingen op hun plek.

Zodoende heb ik toch m'n PIC's recent weer uit de kast getrokken en m'n programmer onder het letterlijke stof vandaan gehaald.
Een 10F200 die ik nog had liggen stelde ik, naar mijn eigen weten, goed in, programmeerde er, puur om te weten of het werkt, een knipperLEDje in en warempel: het werkte. En dat vond ik voor mezelf heel wat.

Op 4 mei 2021 20:27:05 schreef Kortsluiting_Online:
Toen kwamen de AVR processoren met ondersteuning van GCC als echte programmeertaal, en is die PIC rommel in een lade beland.

Gelukkig kunnen PIC-programma's tegenwoordig (lees: vast al heel lang) ook gewoon in C geschreven worden.

Op 4 mei 2021 20:27:05 schreef Kortsluiting_Online:
Programma's schrijven in ASM is een goede oefening voor studenten om een gevoel te krijgen wat zo'n microcontroller echt doet op het laagste nivo, en voor enkele erg specialistische toepassingen, maar verder wordt er alleen nog in assembly geschreven door retro-fanaten, masochisten, en mensen die niet beter weten.

Je vergeet een categorie: mensen die geen C kennen, zoals ik. Ik zou het dolgraag willen, maar heb die computer al veel te vaak nodig. Punt twee is dat ik het met al m'n andere hobbies al druk genoeg heb, laat staan dat ik er nog even iets bij ga doen zoals een nieuwe programmeertaal leren.

Soms denk ik wel eens dat ik iets fantastisch kan maken, maar loopt het stuk op de programmering van een controller. Als ik C zou kennen zou ik vast hele mooie dingen kunnen maken. Maar daar wringt ook een beetje de schoen: ik voel weinig neiging om allerlei zaken met LCD's, encoders, USB en I2C en weet ik wat uit te rusten, dus het is ook niet zo nodig.

Op 4 mei 2021 20:27:05 schreef Kortsluiting_Online:
Of als je voor het stuivers jagen gaat, kijk dan eens naar de WeAct "Black Pill" STM32F411. Daarmee heb je voor < EUR5 een 32 bit uC die op 100MHz draait.

Tja, dat hoor je meer: neem gewoon zus of zo. Maar ik kies een controller voor hobbygebruik liever op mogelijkheden dan op prijs. Maar ook hierbij gaat op dat zo'n enorm geavanceerde controller voor mij alleen maar functionaliteiten bezit die ik dan toch niet zal gebruiken. Beetje zonde van het geld op die manier (en het kost mij nog extra uitzoekwerk ook om al die onnodige zaken eerst uit te zetten).

De discussie PIC versus AVR is al errug oud...

Om on-topic te blijven, een vraag van een niet zo sterke asm programmeerder:
Ik zie in de code dit staan:

code:


textMunt:	addwf	PCL,f
			retlw	'M'

maar ook dit:

code:

textMunt:	addwf	PCL,f
                dt      "Munt:", 0xFF

Het onderste is een (blijkbaar) vervanging van de vele retlw's daarboven (ik heb ze voor de duidelijkheid niet allemaal herhaald).
Maar, wordt 'Munt:' in een linkerfile of zo gedeclareerd? Hoe weet MPLAB (of welk programma je ook gebruikt) wat hij moet doen om 'Munt:' uit te sturen naar het LCD?
Deze vraagt geld eigenlijk voor beide voorbeelden, maar ik vermoed dat het antwoord hetzelfde is ;)

http://www.m-voorloop.nl --- Ik? Welnee! Ik zit nog lang niet achter de germaniums.
Arco

Special Member

Bij de tweede notatiewijze wordt het DT directive van de assembler gebruikt. Dat vergemakkelijkt en verkort de code.
(de assembler/compiler weet dat er voor elke waarde of teken in de tabel een RETLW moet komen, en zet die daar zelf voor)

Verder is het gewoon een tabel. Je maakt een routine om naar het lcd te schrijven en je geeft een pointer naar het te tonen karakter mee.
(zo vaak totdat de hele tabel is afgewerkt)

Grootste pic/asm programma wat ik heb gemaakt is 4000 regels. Was in een 16f648, en die is nog voor 33% leeg... ;)
Grootste asm proigramma was op een 68HC11, bijna 8000 regels...
Beide applicaties worden nog steeds veel gebruikt en verkocht...

Gebruik nu meestal basic, gewoon omdat het maken van de software veel sneller gaat, niet omdat 't beter is (gemak dient de mens...)
De hedendaagse compilers zijn veel beter als die van vroeger, de gegenereerde code doet niet veel onder voor assembly.

Voor de assembler/compiler is er niet zoiets als 'Munt:'. Het is gewoon een reeks van bytewaardes die opgeslagen zijn op een bepaalde plaats.

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

Special Member

Op 3 mei 2021 11:41:06 schreef Arco:
Ik denk dat de code wel 80% korter kan. Alleen de tekststrings anders schrijven scheelt al enorm: (met DT table directive)

De code wordt er niet korter van, de source file wel.
Wil je minder flash geheugen gebruiken en heb je veel teksten dan is het da directive een oplossing.
Zou dat alleen doen wanneer je de limiet van het flash geheugen bereikt (Is mij een keer gelukt, floating point rekenwerk vreet flink wat code en is ook niet leuk om in assembly te doen)

Ignorance is bliss

Die dt is zeer waarschijnlijk een afkorting van "Define Text", en daarmee een pseudo-instruktie die door de door jouw gebruikte macro-assembler wordt afgevangen en vertaald.

Dus als je wilt weten wat er echt gebeurt, lees de gebruiksaanwijzing van je assembler.

Ik ben ook al bekend met het PIC / AVR verhaal. Heb eigenlijk geen hoge pet op van bijde.

En ik heb ook al geschreven dat als je het gewoon leuk vind om met ASM op een PIC bezig te zijn dat je daar dan gewoon mee door moet gaan. Er zijn mensen die met ASM kunnen toveren, maar ik wil daar niet bij zijn. Ik had ook kunnen schijven dat ik wel respect heb voor de mensen die een werkbare instruktie set hebben geschreven met 30 instrukties, maar mijn hoofd wordt simpelweg niet blij met de kronkels waar ik hem in moet wringen om daarmee bezig te zijn. Het is niets voor **MIJ**.

Met een STM32F411 aan de slag gaan is geen eenvoudige zaak. Ik had hem er alleen bijgehaald als (financieel) goedkoop alternatief om met MicroPython iets te doen, maar daar betaal je voor in de tijd die nodig is om door documentatie heen te worstelen voor de nodige kennis.

Als je financieel niet zo krap zit is MicroPython veel geschikter. Heb ik ook al geschreven, met een link naar Antratek met klant en klaar voorgeprogrammeerde bordjes. Die gedragen zich als een USB disk, en als je er een python file naartoe sleept met de muis wordt het uitgevoerd. Je hebt alleen maar een text editor nodig (en wat python kennis).

En BASIC is echt een aflopende zaak. Het bestaat nog wel, maar je ziet het steeds minder. De dagen van de basic-stamp, tiger-basic en die andere modules is al heel lang z'n piek voorbij.

Een tijd terug heb ik even geprobeerd om https://www.mikroe.com/mikrobasic-avr aan de gang te krijgen voor een broer van mij die basic gewend was. En het kostte me ook meer energie dan ik er voor op kon brengen.

Rechtsboven in het hoeekje staat ook: $269.00 Dat zie je bij MicroPython niet. Je koopt een printje van EUR30 en kunt aan de slag.

Maar een discussie als deze ontaard snel in stellingen nemen en loopgraven graven...

Maar toch: Nieuwschierigheid. Wat is voor jou de reden om met ASM op een PIC bezig te zijn? Is het alleen omdat je die hebt liggen of er vroeger mee bezig was, of omdat je geen nieuwe taal wilt leren?

In Python is een text string iets als:

> TextAantalMunt = "Aantal Munten"

Dat lijkt me nog wel te doen om te leren.
Ook kun je python programma's op je pc uitproberen, en dan pas op een microcontroller zetten als het meeste werkt.

Zelf gebruik ik Linux. Python "werkt dan gewoon". Als je windows o.i.d. gebruikt moet je python eerst nog apart installeren, maar dat is ook niet echt moeilijk.

Arco

Special Member

Die dt is zeer waarschijnlijk een afkorting van "Define Text"

Ik denk eerder "data table", het hoeft tenslotte geen tekst te zijn, kan van alles zijn.
Zoals gezegd: een pic kan alles wat een vergelijkbere processor kan. (de pic24/32 en ook de enhanced 16f kunnen heel erg veel)

Kleine instructieset (RISC) is geen nadeel, bij goed gebruik werkt 't net zo goed (alleen minder te onthouden)
Fijnste instructieset vond ik tot nu toe de 68HCxxx processors hebben. (wel erg uitgebreid, soms vergat je van sommige instructies zelfs dat ze bestonden)

De assembly programma's die ik heb gemaakt stammen van 15...20 jaar geleden. Toen was er niet zoveel keuze als nu (alleen C maar dat vind ik een drama)

Basic is nog lang niet dood. Voor PC's heb ik onlangs nog voor diverse grote meldcentrales software geschreven.
Dient voor aannemen/opslaan/verwerken van alarmmeldingen via SIP lijnen.
Dit ter vervanging van software die in C geschreven was.

Die werkte onbetrouwbaar en liep soms meerdere malen per dag vast. (gewoon slecht geschreven software)
Software draait nu een paar jaar en loopt nooit vast (zo hoort het ook)

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

Op 3 mei 2021 11:41:06 schreef Arco:
Ik denk dat de code wel 80% korter kan. Alleen de tekststrings anders schrijven scheelt al enorm: (met DT table directive)

Die dt-lijst heb ik intussen ook ingevoegd in mijn programma, dat leest natuurlijk duidelijker.
Het verkort de regels in de program-memory natuurlijk niet.

Op 3 mei 2021 11:41:06 schreef Arco:
Het is trouwens gebruikelijk (standaard) om als string terminator geen 0xFF maar 0x00 te nemen

Maar 0x00 is de locatie waar het CG-ram van de LCD module begint, en deze is geprogammeert. Toevallig staat bij 0x00 het €-teken.
Dus als ik 0x00 gebruik om mijn 'string terminator' te maken, kan ik geen €-teken op mijn LCD krijgen.
Ik heb 0xFF genomen omdat dat karakter waarschijnlijk niet gebruikt gaat worden in mijn programma.

Offtoppic:

Het is zo dat ik heel het vak 'elektronica' geleerd heb door zelfstudie, en dit vanaf ik ongeveer 12 jaar was.
Op school heb ik elektrotechnieken gestudeerd en daar kreeg ik de basis over elektronica. (die ik toen al kende door zelfstudie voor ik de lessen op school erover kreeg)
Door de jaren heen heb ik me gefocust op vooral de analoge elektronica, en daar kan ik behoorlijk wat in.

Om toch niet stil in de tijd te willen staan ben ik een aantal jaren geleden begonnen met zelfstudie PIC controllers. het was voor mij niet simpel omdat ik geen enkele programmeertaal beheers, dus ga je vanuit de laagste taal beginnen. Ik heb asm aangehouden omdat ik deze redelijk goed begrijp.
Zoals ik al eerder zei is mijn engelse kennis vrij beperkt, dus kost het mij hopen energie om bepaalde dingen te begrijpen. Wat niet wegneemt dat ik niets kan bijleren.
Uiteindelijk is het veel proberen, vallen, nog eens vallen, niet weten waarom ik val, maar zeker terug opstaan en doorgaan..

Ik denk dat ik van mezelf mag zeggen dat als 'beginneling', mijn eerste LCD projectje en alles gebasseerd op zelfstudie, het bovenstaand programma netjes gelukt is!
Uiteindelijk heb ik in deze toppic antwoord op mijn oorspronkelijk probleem. Daarbuiten ook nog bijgeleerd om mijn codetekst te kunnen schrijven met 'dt tabellen', met dank daarvoor.

Dat het kan met minder regels, is zeer zeker. Dat is iets wat ik momenteel aan het uitzoeken ben, en wat ik ook moet doen voor ik er bepaalde functies bij programmeer.

Of ik ga afwijken van assembler betwijfel ik. Ik begrijp de code's relatief goed en ik snap de denkwijze van de 'taal'. Uiteindelijk moet je met eender welke taal hetzelfde geprogrammeerd kunnen krijgen.
Ook ik heb vele hobby's en niet enkel het elektronica gebeuren, dus om zo even alle moeite steken om een andere programmeertaal te leren omdat die actueler is of meer mensen gebruiken vind ik niet zo toepasselijk.

zoeken tot het werkt en dan nog zoeken