ik ben wat aan het stoeien met assembler voor de pic nu heb ik een vrij simpel progje en dat wil maar niet werken


	list p=16F627A
	include	<P16F627A.inc>
	__config _BODEN_OFF &  _CP_OFF & _DATA_CP_OFF & _PWRTE_OFF &_WDT_OFF &_LVP_OFF &_MCLRE_OFF & _INTRC_OSC_NOCLKOUT

	errorlevel -302

	ORG 005h
	BCF	STATUS,	RP1
	bcf	STATUS,	RP0
	movlw	B'00100000'
	movwf	PORTB
	movlw	B'00000000'
	movwf	PORTA
	movlw	b'00000000'
	movwf	CCP1CON
	MOVLW	B'00000111'	;Disable Comparator module's
	mOVWF	CMCON
	BSF	STATUS,	RP0
	movlw	B'00000000'
	movwf	TRISB
	movlw	B'11111111'
	movwf	TRISA

main	btfss	PORTA,	1
		goto	led_aan
		btfsc	PORTA,	1
		bcf	PORTB,	1
		goto main

led_aan	BSF	PORTB,	1
		goto main
		end

en ik weet zeker dat het zou moeten werken

de pic draait er gaat namelijk een led branden(om te checken of de pic wel draait)
maar hij reageert niet op de drukknop en ik bevat neit waarom het niet wilt werken

Omdat wanner jij het prog aanzet hij direct naar led_aan gaat daarna gata ie naar main maar dan gaat ie direct weer naar led_aan dus je hebt een oneindige loop gemaakt volgens mij

nee hoor hij controleer eerst de poort kijk maar


main BTFSS
     goto led_aan

O naja was ook een gok hoor :) ik schrijf zelf namelijk niet in asm :( maar zo als jij het had zal het in picbasic wel een loop vormen :)

in basic gebruiken we gwoon netjes while wend lusjes he gerwin daar is het basic voor

Je schrijft eerst waarden naar poorten A en B en dan pas initialiseer je ze.

Dat capture compare register heb je voor deze toepassing niet nodig.

En ik dacht dat je bij gebruik van poort A het ADCON1 register ook moet instellen om te kiezen tussen analoge en digitale ingangen.
Initieel staan de bits op 0, dus zijn alle bits van poort A analoog. Ik geloof dat daar al één van de fouten zit.

De hoofdroutine ziet er OK uit, ook al hangt ze met haken en ogen aan elkaar.

Ben je zeker dat de drukknop aan poort a bit 1 hangt? De eerste bit van poort a is bit 0.

[Bericht gewijzigd door Peter Claus op ]

Als ik het goed begrijp wil je een ledje uit kunnen schaken door minddel van een knopje dat PORTA zit.Dit gebeurt ook wel.Maar het hooft prograam zet steeds weer het ledje aan.
en dat gaat zo snel dat je het niet ziet.Dus moet er een vertraging tussen programmeren.

hier
staat het uitgelegd hoe je een vertraging kan maken

Het zou moeten werken.
Zolang het signaal op A,1 laag is blijft de led aan.
Zolang het signaal op A,1 hoog is blijft de led uit.

Wat me opvalt dat je op een gegeven moment STATUS,RP0 1 maakt, om BANK 1 te selecteren om TRISA en TRISB te kunnen gaan laden. Vervolgens maak je STATUS,RP0 niet opnieuw 0 voordat je de main loop binnengaat. De PORTA en PORTB referenties in de main loop wijzen dus eigenlijk naar TRISA en TRISB, waardoor het niet werkt.

Wat ik je zou aanraden, is om het BANKSEL directive te gebruiken om de STATUS,RP0 en STATUS,RP1 bits te vullen in plaats van expliciete BCF en BSF. Dan zie je dat soort dingen gemakkelijker. Misschien moet je "errorlevel -302" ook nog eens heroverwegen! ;)

Vriendelijke groet,
Frans

@cosphi dat CPP register hangt daar in om het uit te zetten
en hoe bedoel je hang met haken en ogen aan elkaar?

@frans77 oke ik zal er eens naar kijken of het wel wekrt asl ik terug naar bank0 ga

@zonnepaneeltje dat zou inderdaad de bedoeling moetetn zijn

@allen dank u voor de medewerking hier heb ik wat aan ik laat mijn bevindingen nog wel horen

@cosphi de 627A heeft geen ADCON1 register

ORG 005h

Verander dat eens in:


ORG    00h  

stomme vraag mssn maar waarom zou het dan moeten werken?

De processor begint op adres h00.

Ik weet niet wat er gebeurd als de processor op h00 begint, en er geen instructies staan op de adressen t/m h05.

Beter nog is:


		ORG        00h	            
                GOTO       INIT               

		ORG        05h	            
INIT            Hier je code laten beginnen 

00h is toch de reset vector en moet daaromo vrij blijven
en 04 moet vrij blijven omdat dat de interupt vector is nou kan ik me ook vergissen hoor

Nee, zoals MMsoft het in z'n laatste post doet is een goede manier.

doen we het op die manier proberen

00h is toch de reset vector en moet daaromo vrij blijven
en 04 moet vrij blijven omdat dat de interupt vector is nou kan ik me ook vergissen hoor

Bij een normale Start gaat de processor naar adres h00.
Bij een Interupt gaat de processor naar adres h04.

Dus op die adressen moet dus juist wel iets staan !
Bijvoorbeeld een goto instruktie.

Wat zou er gebeuren als de processor op een adres komt waarop geen instructies staan ?

[Bericht gewijzigd door MMSoft op ]



	list P=16F627A
	include	<P16F627A.inc>
	__config _BODEN_OFF &  _CP_OFF & _DATA_CP_OFF & _PWRTE_OFF &_WDT_OFF &_LVP_OFF &_MCLRE_OFF & _INTRC_OSC_NOCLKOUT

	ORG 00h
	goto init

	ORG 005h
init	BCF	STATUS,	RP1
	bcf	STATUS,	RP0
	movlw	B'00100000'
	movwf	PORTB
	movlw	B'00000000'
	movwf	PORTA
	movlw	b'00000000'
	movwf	CCP1CON
	MOVLW	B'00000111'	;Disable Comparator module's
	mOVWF	CMCON
	BSF	STATUS,	RP0
	movlw	B'00000000'
	movwf	TRISB
	movlw	B'11111111'
	movwf	TRISA
	BCF	STATUS,	RP0

main    btfss	PORTA,	1
	bsf     PORTB,  1
	btfsc	PORTA,	1
	bcf	PORTB,	1
	goto main
        End

dit wordt dan de code en die zou het moeten doen

@mmsoft ik heb zon vermoeden van helemaal nix

Het begin ziet er nu in ieder geval goed uit !

Ik zou TRISA en TRISB wel eerder instellen in het Init deel.

Dit is code die ik heb die het dichts de 16F627A benaderd:


   LIST P=16F628A           
   include <P16F628A.INC>   
   __CONFIG   B'11111101010000'  

                ORG        00h	            
                GOTO       INIT             
                NOP                   
                NOP                       
                NOP                        
                GOTO       INTERR          


INTERR	        
                RETFIE                     


INIT            CLRF	    PORTA	       
                CLRF	    PORTB           

                BSF         STATUS, RP0    
                MOVLW       B'00100000'     
                MOVWF       TRISA           
                MOVLW       B'00000000'    
                MOVWF       TRISB              
                BCF         STATUS, RP0     
        
                MOVLW       B'00000111'    
                MOVWF       CMCON 

Loop	        BSF         PORTB,  1         
                GOTO        Loop 

                END

Probeer deze eens.

[Bericht gewijzigd door MMSoft op ]

       
                GOTO       INTERR          
INTERR	        
                RETFIE                     

Die code betekent wel dat ALS er een interrupt komt de processor gelijk hangt.

De desbetreffende interrupt flag moet natuurlijk wel gereset worden in deze code...
Maar omdat er geen interrupts vrijgegeven worden kunnen deze niet optreden in dit geval...

Wat zou er gebeurd als de processor op een adres komt waarop geen instructies staan ?

Omdat het geheugen gewist is staat er op deze adressen de waardes 0xFF welke instruktie wordt er dan uitgevoerd ?

[Bericht gewijzigd door MMSoft op ]

Omdat het geheugen gewist is staat er op deze adressen de waardes 0xFF welke instruktie wordt er dan uitgevoerd ?

ADDLW 0xFF

@cosphi de 627A heeft geen ADCON1 register

Inderdaad, ik heb het hier bij het foute eind. Sorry voor de misleiding
Deze PIC heeft geen analoge poorten.
Ik zit met die PIC16F874 in mijn hoofd waar ik op het moment aan't mee stoeien ben en die heeft analoge poorten en ook dit register.

en hoe bedoel je hang met haken en ogen aan elkaar?

Ik heb het wat over de layout wat zeker belangrijker wordt bij grotere programma's.
De woorden staan niet mooi onder elkaar wat het heel overzichtelijk maakt en sommige instructies zijn meer ingesprongen dan andere.
Ook maak je een subroutine met maar 1 instructie. Je kan net zo goed die instructie direct uitvoeren.

Dit bijvoorbeeld


main	btfss	PORTA,	1
		goto	led_aan
		btfsc	PORTA,	1
		bcf	PORTB,	1
		goto main

led_aan	BSF	PORTB,	1
		goto main
		end

Zou ik meer iets zoals hieronder van maken.


main	btfss	PORTA,1
	bsf     PORTB,1
	btfsc	PORTA,1
	bcf	PORTB,1
	goto    main
        end