Sida 1 av 1

Mitt assembler-program funkar inte (PIC)

Postat: 9 oktober 2005, 13:29:21
av PacMan
Tjena!
Hoppas nån som har lite koll på PIC kan hjälpa mig med detta:
Jag har skrivit mitt allra första assemlbler-program (för PIC) i MPLAB:

;*************************************************************
list p=16f628A ; list directive to define processor
#include <p16f628A.inc> ; processor specific variable definitions

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _ER_OSC_CLKOUT & _MCLRE_ON & _LVP_ON

;*************************************************************

clrf PORTA
movlw 0x07
movwf CMCON ;CMCON är 0000 0111
bsf STATUS,5
bcf STATUS,6
movlw b'00010000' ;Tala om vad som är in- och utportar
movwf TRISA
bcf STATUS,5 ;Väljer bank0 igen
bsf PORTA,0 ;Tänder LED på port RA0
bsf PORTA,1 ;Tänder LED på port RA1


END
;*************************************************************

När jag simulerar i MPLAB SIM får jag mycket riktigt PORTA att bli 0x03, så bit 0 och 1 verkar sättas som jag vill. När jag skickar över detta till PIC:en, tänds dock inte mina lysdioder på RA0 och RA1. Jag har verifierat att PIC:en och lysdioderna är rätt inkopplade med ett annat program.

Simulatorn spottar ur sig nåt om Stack underflow, som jag tyvärr inte har en susning om vad det betyder. Jag vet vad stacken är, och overflow har jag hört talas om, men underflow...? Alla tips är välkomna! :)

Postat: 9 oktober 2005, 13:44:56
av JockeE
En sak jag tänker på direkt är "Read-Modify-Write"-problemet. Läs om det under avsnitt 5.3.2 i databladet för 628an.

Lägg in en NOP efter skrivningen till RA0.
Så här:

Kod: Markera allt

bsf PORTA,0 ;Tänder LED på port RA0
NOP
bsf PORTA,1 ;Tänder LED på port RA1

Postat: 9 oktober 2005, 14:16:35
av PacMan
Det hade jag faktiskt inte tänkt på, men tyvärr hjälpte det inte. :(

Postat: 9 oktober 2005, 14:42:09
av Henrik
Testa att innan END lägga till
loop: goto loop

Postat: 9 oktober 2005, 15:11:11
av Icecap
Den kör ju programmet 1 gång och försvinner sedan ut i de oskrivna minnesarea. Testa:

Kod: Markera allt

*************************************************************
 list p=16f628A ; list directive to define processor
#include <p16f628A.inc> ; processor specific variable definitions

 __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _ER_OSC_CLKOUT & _MCLRE_ON & _LVP_ON

;*************************************************************
 
 clrf PORTA
 movlw 0x07
 movwf CMCON ;CMCON är 0000 0111
 bsf STATUS,5
 bcf STATUS,6
 movlw b'00010000' ;Tala om vad som är in- och utportar
 movwf TRISA
 bcf STATUS,5 ;Väljer bank0 igen

Loop ; Hit hoppas det jämt....

 bsf PORTA,0 ;Tänder LED på port RA0
 bsf PORTA,1 ;Tänder LED på port RA1

goto Loop ; Repeterar den ovanstående snudd
END
;*************************************************************

Postat: 9 oktober 2005, 15:25:18
av PacMan
Tack för att ni tar er tid! :)

OK, var lite osäker på vad som händer när programmet tar slut. Har redan provat att loopa som du beskriver men det hjälper inte heller.

PORTA är alltså 0000 0011 efter att jag har kört simulatorn ett varv i loopen, men min lysdiod på port RA0 tänds fortfarande inte. Känns inte som det är så mycket som kan vara fel.

Är det nåt knas med den här raden kanske?

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _ER_OSC_CLKOUT & _MCLRE_ON & _LVP_ON

Vet nämligen inte exakt vad allt är här eftersom jag har plockat den från en mall för PIC16F628A.

Postat: 9 oktober 2005, 17:09:15
av PacMan
Nu har jag kollat upp vad raden i början betyder, och konstaterat att det är där man sätter "configuration bits". Har provat en massa olika kombinationer av dessa, men fortfarande inte ett liv i min lysdiod. Har även kollat på vilket HEX-format som används men problemet verkar inte ligga där heller. :x

EDIT: Tror nu att problemet har att göra med nåt som kallas reset vector, som det verkar som man måste ha med. Hoppas jag är på rätt spår...? :roll:

Postat: 9 oktober 2005, 19:46:01
av Icecap
Finns det A/D omvandlare på den CPU?

Om det gör måste man inaktivera den för att komma åt porten.

Reset-vektorn är adress 0000 så den är med redan!

Och interrupten använder du inte så den är inte i vägen heller.

Postat: 9 oktober 2005, 19:48:02
av Henrik
Det står i databladet om de olika konfigurationsbitarna. Kolla på kapitlet "Special features of the CPU".

_ER_OSC_CLKOUT förresten. Betyder inte det RC-klocka? Kör du med sån?

Postat: 9 oktober 2005, 20:39:03
av PacMan
Nu är det fixat! :D
Det visade sig att det hade med config-parametrarna att göra. Hittade en annan template som hade lite fler config-parametrar, och efter att ha ställt om till intern oscillator (tack Henrik) så funkar det. Tack ska ni ha för hjälpen! :tumupp:

Postat: 9 oktober 2005, 20:41:51
av sodjan
Jahaja, bäst att ta en sak i sänder. Du tycks inte *riktigt* veta vad du håller på med... :-)

Men först, hur är din F628A kopplad ????

> __CONFIG _CP_OFF & _WDT_OFF ...

Så långt är det OK.

> & _BODEN_ON ...

behöver du BOD ? Stäng av det annars.

> & _PWRTE_ON & _ER_OSC_CLKOUT ...

Kör du värkligen ER oscillator ?

> & _MCLRE_ON & _LVP_ON...

Stäng av LVP...

> bsf STATUS,5
> bcf STATUS,6

Använd symbolerna i INC filen (RP0, RP1), inte "5" och "6".
Och gör inte så alls, använd BANKSEL.

Din kod (som andra har sagt) rinner ut i tomma intet. Resten av programminnet kommer att exekveras som NOP, och efter ett tag kommer du tillbaka till h'0000' igen. Avsluta med loop, goto loop, eller något liknande. Dock, detta skulle *inte* hindra LED'arna att tändas !

> Finns det A/D omvandlare på den CPU?
Nej bara två komparatorer, och det är redan fixat...

Problemet är med största sannolikthet "_ER_OSC_CLKOUT" !

Justera CONFIG radan så att den stämmer med din fysiska koppling, så lär det fungera. Men å andra sidan, detta måste du väll redan ha kollat upp i databladet (eller hur ??), så jag vet inte riktigt...

Postat: 9 oktober 2005, 21:47:20
av PacMan
sodjan skrev: Justera CONFIG radan så att den stämmer med din fysiska koppling, så lär det fungera. Men å andra sidan, detta måste du väll redan ha kollat upp i databladet (eller hur ??), så jag vet inte riktigt...
Jepp, det var nog valet av oscillator som spökade. För mig var det inte HELT uppenbart vad _ER_OSC_CLKOUT stod för. 8)
Och nej, jag vet inte *riktigt* vad jag håller på med men man måste la få krypa innan man lär sig gå.

Postat: 9 oktober 2005, 22:23:17
av bengt-re
Configen är rätt bra beskriven i databladen, så noggrann läsning av dessa brukar lösa de flesta problem av den arten. Så trist att lägga en massa tid om man bara har missat en liten detalj i configen...