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

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?

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!)

Je zet toch wel een 'return' aan het eind van je subroutine?

En een universele wachtlus routine.


Flash_Led:  movlw    0x03
            xorwf    gpio,f
            call     wait_1_sec
            goto     Flash_Led    

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 :P

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....

Problem solved, bedankt voor de tip zonnepaneeltje

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

MOVF 00h,W plaatst niet 00h in W, maar de inhoud van indirect geadresseerd geheugen in FSR gaat naar W...

je bedoelt MOVLW 0x00

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.