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 ]
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
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
roelvh
Master Industriële Wetenschappen: Elektronica-ICT
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 ]
roelvh
Master Industriële Wetenschappen: Elektronica-ICT
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.
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
endmaar nog steeds zijn alle uitgangen hoog. Zou het dan te maken hebben met de header files?
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
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.
Videomodulator
AKA Naftebakje @Tweakers.net --- Zonder dwarsliggers geen spoor
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.