Ik wil graag 1 pin hoog maken, maar dat lukt me niet met de volgende code:

LIST p=16F628A
INCLUDE <p16F628A.inc>

cblock 0x20 ;userdefined space
cntr1
cntr2
cntr3
endc

movlw d'7' ;all pins are I/O
movwf CMCON

bsf STATUS, RP0 ;switch to bank1
movlw b'00000000' ;all A pins are outputs
movwf TRISA ;move this to trisa
bcf STATUS, RP0 ;switch to bank0

main bsf PORTA, 6 ;bit 6 of porta is on

end

Alle pins zijn hoog als ik dit uitvoer, ook de PORTB pins. Waar zit mijn fout? Ik weet dat de PIC werkt want ik heb een paar voorbeeld programmas erin geladen en die werkten zoals het moest.

[Bericht gewijzigd door Eurokiwi op ]

Om tussen banks te switchen vind ik het handiger om banksel te gebruiken, om naar de bank waar TRISB op zit te switchen zet je gewoon "banksel TRISB", dat maakt je code leesbaarder imho (dus minder fouten).

Je fout kan je voorkomen door de bijgeleverde header-files van bij MPLAB te gebruiken, je zoekt deze met de naam van je PIC gevolgd door ".ASM". Hierin staat alles al klaar, de list en include zijn ingevuld, de standaard configuratie staat al klaar (voor de fuses), de plaats voor de variabelen/interrupts/het programma zelf staan netjes aangeduid.

Dan zal je zien dat je een "org 0x00" moet gebruiken om aan te duiden waar je programma in het geheugen van de PIC start (zodat je bijvoorbeeld een bootloader kan maken die aan het einde van het geheugen staat), het adres 0x00 is de reset-locatie, daar start ie met uitvoeren, als je interrupts wil gebruiken moet je erna een jump naar het eigenlijke programma doen (doorgaans naar main) want interrupts starten op 0x04, en als je een ICD of bootloader wil gebruiken moet je doorgaans na de "org 0x00" een "NOP" zetten (zodat hier dan een jump naar de debug of bootload-routine kan geplaatst worden door de debugger of de bootloader).

Voordat je eigenlijke programma begint moet je initialiseren; een aantal instellingen maken.
In jouw geval moet je vooraf PortA clearen.

clrw
movwf PORTA

of korter


clrf PORTA

        LIST p=16F628A
        INCLUDE <p16F628A.inc>

        movlw d'7'         ;all pins are I/O
        movwf CMCON

        bsf STATUS, RP0    ;switch to bank1
        movlw b'00000000'  ;all A pins are outputs
        movwf TRISA        ;move this to trisa
        movwf TRISB
        bcf STATUS, RP0    ;switch to bank0

        clrf PORTA
        clrf PORTB

main    bsf PORTA, 6       ;bit 6 of porta is on
        goto main
  
        END

Dit zou moeten werken, ik dacht dat eens de END bereikt de pic in SLEEP gaat en weet niet van buiten wat er dan met de uitgangen gebeurd, daarom de main-loop

[Bericht gewijzigd door roelvh op ]

De PIC gaat alleen in slaap na de 'SLEEP' - instructie hoor!

Op 30 december 2006 15:48:07 schreef Zonnepaneeltje:
De PIC gaat alleen in slaap na de 'SLEEP' - instructie hoor!

Ik dacht dat MPASM de END instructie vervangde door een aantal andere instructies waaronder de SLEEP, maar zeker ben ik niet

Op 30 december 2006 15:56:05 schreef elektro_freak:
Ik dacht dat MPASM de END instructie vervangde door een aantal andere instructies waaronder de SLEEP, maar zeker ben ik niet

Het END directive vertelt de assembler dat ie aan het einde van de file is gekomen. Meer niet, dus altijd zorgen dat je in een loop zit in je programma, anders gebeuren er ongedefinieerde dingen.

Ja, de END instructie moet er altijd staan.
Maar als je de goto main weg zou laten stopt hij volgens mij gewoon op het laatste punt.
Maar dit komt normaal natuurlijk niet voor.

Op 30 december 2006 16:04:06 schreef Zonnepaneeltje:
Ja, de END instructie moet er altijd staan.
Maar als je de goto main weg zou laten stopt hij volgens mij gewoon op het laatste punt.

Nee hoor, hij loopt gewoon door. Hoogstwaarschijnlijk gaat ie dan een stukje van het programma wat ervoor in de pic zat uitvoeren.

Je hebt gelijk, de P.C. telt gewoon verder in het lege(?) stuk geheugen.

Ik heb de volgende code gebruikt:

 LIST	p=16F628A
	INCLUDE	<p16F628A.inc>
	
	movlw	d'7'		;all pins are I/O
	movwf	CMCON

	bsf	STATUS, RP0	;switch to bank1
	movlw	b'00000000'	;all A pins are outputs
	movwf	TRISA		;move this to trisa
	movwf	TRISB		;and to trisb
	bcf 	STATUS, RP0	;switch to bank0

	clrf PORTA			;portA is now 00000000
	clrf PORTB			;portB is now 00000000

main	bsf 	PORTA, 6	;bit 6 of porta is on
		goto main
	end

maar nog steeds zijn alle uitgangen hoog. Zou het dan te maken hebben met de header files?

Hoe heb je de fuses staan? Interne clock generator?

Probeer dit eens:



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

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

                CLRF        PORTA           
                CLRF        PORTB           

Main            BSF	    PORTA,1	    
	        GOTO	    Main	    

                end

Bedankt allemaal, nu werkt hij. Ik heb dit regel toegevoegd:

__CONFIG   B'11111101110000'

Weet je ook waarvoor die regel is ?

Ik denk voor de configuratie van de fuses en de oscillatortype. Het heeft ervoor gezorgd dat bij mij nu de interne oscillator wordt gebruikt, maar ik weet niet wat het met de fuses doet.

Op 2 januari 2007 15:24:06 schreef Eurokiwi:
Ik denk voor de configuratie van de fuses en de oscillatortype. Het heeft ervoor gezorgd dat bij mij nu de interne oscillator wordt gebruikt, maar ik weet niet wat het met de fuses doet.

Beter is de regel van uit de header-file, daarbij gebruiken ze de afkortingen die je ook in de datasheet vind ("_HS_OSC" bijvoorbeeld, om aan te geven dat een oscillator wordt gebruikt in de HS-range).

Er zijn meer mogelijkheden, zo pak ik het altijd aan.



;Code lees beveiliging     1111..........  Uit
;Niet gebruikt             ....1.........  - 
;Data Lees beveiliging     .....1........  Uit
;Low Voltage Programmering ......0.......  Uit
;Brow-out                  .......1......  Aan     
;Reset ingang              ........1.....  Aan
;Power-Up Timer -> Reset   ..........0...  Aan
;Watchdog Timer            ...........0..  Uit
;Oscillator keuze          .........1..00  Interne Oscillator, Geen 'Klok uit' signaal

              __CONFIG   B'11111101110000'

De gegevens vindt je in de datasheet !

Bedankt voor de heldere uitleg! Ik heb meteen in de datasheet gekeken en gelezen hoe het allemaal zit.