Hallo
Ik ben net begonnen met mijn pic 12F509 te programeren (eerste keer) Ik wil 2 ledjes laten branden. Nu heb ik op school wel assembler geleerd enzo alles op motorola 68 000. Het programmeren van zo'n pic zou parallel moeten zijn dachtik. Ik heb al zitten zoeken in de datasheets naar de juiste registers maar het klopt wss niet. Heb ook al tutorial hier op CO bekeken. Dit is dus men code. De bedoeling is dat er telkens een ledje brandt op GP1 en GP0.
Mijn code:
GPIO EQU 06h ;GPIO gelijkstellen
ORG 00h ;origine instellen
MOVLW 00h ; alles instellen als output =0 en naar W sturen
TRIS 6 ; W in het TRIS register laden
MOVLW 03h ; GP1 en GP0 hoog maken in W
MOVWF GPIO ; W in GPIO stoppen
NOP ; Einde
END
iemand een idee wat ik fout heb gedaan? Want al bij al is het voor mij nog zo duidelijk niet.
Ik mis de config.
Hierin wordt o.a. gekozen voor interne of externe oscillator. Zie de datasheet.
Welke software en hardware gebruik je om de PIC te proggen?
heu, ik gebruik interne oscillator. Moet dit meegeprogged worden of zo? ik maak gebruik van die ppwin programmer en het programma mplab en winpic 8000
mts plus
Life is waiting!
jah je moet aangeven waar hij zijn clock vandaan haalt.
net als of je wel of geen mclre gebruikt.
dit gebeurt altijd boven aan in een script.
bijvoorbeeld zo :
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF)
is wel voor een 16f690
er was idd een foutje met de clockpuls. Het probleem is dus verholpen. Ik heb nu een knipperlichtje gemaakt. Dit heb ik gedaan door
a)Lampje doen branden
b)wachtlus1 van 1seconde
c)Lampje uitdoen
d)wachtlus2 van 1seconde
e)naar stap a
Nu dit is nogal omslachtig. Ik zou graag 1 wachtlus hebben en daar dan telkens naar verwijzen en na het uitvoeren van de lus terug naar waar hij gekomen was. Een soort van Branch to subroutine. Ik vond de fucntie CALL maar de lampjes bleven gewoon branden. Ik veronderstel dat hij dus niet terugkeerd naar waar hij gestopt was. Heeft iemand een idee want in de datasheet staat enkel CALL en GOTO voor zover ik weet plaatst hij bij GOTO zijn terugkeeradres niet op stack. Bij CALL zou hij dit wel doen. Iemand idee?
roelvh
Master Industriële Wetenschappen: Elektronica-ICT
dat zal dan zo iets worden
main_loop:
call draai_lamp_om
goto main_loop
draai_lamp_om
not lamp (weet de juiste instructie hier niet voor)
call delay_1s
return
delay_1s
code....
return
voor die "not lamp" moet je eventjes een ander code vinden, het is lang geleden dat ik nog iets in ASM heb gedaan (leve JAL!)
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Ja, goed, het lag dus aan de return. Maar ik dacht ook al dat het zoiets was (ben RTS gewoon bij de Motorola) De andere oplossingen (behalve de laatste) had ik al aangedacht maar dan ging deze vraag toch vroeg of laat opduiken dus. Bedankt. Feitelijk is het allemaal simpeler dan ik gewoon ben.
nieuwe vraag. Mijn doelstelling is om nu 3 ingangen te hebben en 2 uitgangen. 1 ingang is reset en die hangt logischer wijs aan de MCLR.
Ok, aan pin 3 en 5 heb ik dus een knop gehangen. Aan pin 6 en 7 hangt een LED. Respectievelijk dus GP4 en GP2 voor de knoppen en GP1 en GP0 voor de LEDs
Nu de bedoeling is dus als men drukt op GP4 dat lampje GP1 brandt. Indien men drukt op GP2 brandt GP0.
Daarvoor heb ik volgende software ontworpen.
GPIO EQU 06h ;gelijkstellen van adressen
ADRESR EQU 10h
ADRESW EQU 12h
ORG 00h ;origine 00h
INIT MOVLW 1Ch ;initialisatie zodat GP4 t.o.m. GP2 Ingangen zijn (1) en GP1 en GP0 uitgangen zijn (0)
TRIS 6
MAIN MOVF GPIO,W ;inlezen van I/O register
MOVWF ADRESR ;plaatsen in adresR
CLRF ADRESW ;leegmaken van adresW
READ2 BTFSS ADRESR,2 ;Testen of bit 2 van I/O register een 1 is
BSF ADRESW,0 ;indien ja maak bit 0 van adresW hoog
READ4 BTFSS ADRESR,4 ;Testen of bit 4 van I/O register een 1 is
BSF ADRESW,1 ;indien ja maak bit 1 van adresW hoog
PLAATS MOVLW ADRESW ;plaats AdresW in W
MOVWF GPIO ;Plaats W in I/O register
GOTO MAIN ;Inf Loop
NOP
END
De bedoeling is dus dat op adresW xxxxxxpq komt te staan met p=waarde van GP4 en q= waarde van GP2.
Dit werkt dus niet. Enkel GP0 brandt. Maar deze blijft branden en gaat nooit uit (tenzij ik reset maar na reset brandt hij onmiddelijk)
Hoe heb je de druktoetden zitten, pull-up/pull-down, naar plus naar min?
Besef ook dat je in hwt progje gelijk weer naar main springt en de outputs weer laag maakt. Dat ledje gaat snel knipperen 
Druktoetsen zijn pull up. 5V indien open en 0 indien gesloten. Maar dat zou er alleen maar voor zorgen dat ze uitgaan indien je er op drukt...
Ja dat weetik wel maar als je erop blijft drukken maakt dit toch geen verschil en het ene LED brandt en het andere niet
Bij 'plaats'heb je staan movlw ADRESW.
Hij pakt dan de waarde 12h en zet die naar GPIO..
Dit moet zijn: movf ADRESW,w
Owkey, done. Nu branden beide LEDs maar ze reageren nog steeds niet op mijn drukknoppen. Heb er dan een wachtlus ingestoken maar dit helpt niet. Alvast bedankt. In principe moeten ze beide branden want beide knoppen staan standaard op 1.
Nee, je hebt de btfss-instructie gebruikt, dus ze moeten beide uit zijn als de toetsen niet ingedrukt worden....
ik heb een vraag ivm de instructie RETLW 0 (RETURN)
Mijn debugger raad aan om RETLW 0 te gebruiken waar ik RETURN gebruik.
Nuja het probleem is dat GP0 steeds blijft branden als RETLW 0 wordt gebruikt en indien ik RETURN gebruik blijft GP1 branden dit als ik de WDT afzet, indien ik hem aanzet branden beide lampjes bij het gebruik van RETLW 0
ik denk dat het aan deze functie ligt aangezien ik volgende code run
GPIO EQU 06h
...
ORG 00h
INIT MOVLW 1Ch ;init I/O
TRIS 6
MAIN MOVF 00h,W ;plaats 00h in W om zeker te zijn dat geen enkel lampje brandt
CALL SEND ;stuur naar I/O routine
CALL CHECKF ;roep checkF aan
GOTO MAIN ;oneindige lus
CHECKF ;CALL RECEIVE
;BTFSS ADRESR,2
;CALL MAIN
RETLW 0 ;keer terug naar main.
SEND MOVWF GPIO ;schrijf naar I/O
RETLW 0 ;terug naar main
...
END
indien ik CALL CHECKF weglaat uit de main brandt geen enkel lampje (hoewel ik daar ook RETLW 0 gebruik bij SEND) maar vanaf ik CALL CHECKF erbij typ (en alle andere verwijzingen comment) dan brandt er 1 lampje terwijl ik dit nergens aanbeveel.
Heeft iemand een idee?
Alvast bedankt
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
MOVF 00h,W plaatst niet 00h in W, maar de inhoud van indirect geadresseerd geheugen in FSR gaat naar W...
je bedoelt MOVLW 0x00
Wouter van Ooijen
Wouter van Ooijen: VOTI webwinkel, docent HvU (Technische Informatica); C++ on mictrocontrollers blog
algemene opmerking: een 12F509 is een 12-bit PIC, ik zou als beginner zeker een 14-bit chip nemen, als je een goedkope 8 pins wil bv een 12F629. ik denk dat je zeer snel in de knoop komt met bv de stack die maar 2 levels is.