Mitt assembler-program funkar inte (PIC)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
PacMan
Inlägg: 94
Blev medlem: 3 oktober 2005, 16:12:24
Kontakt:

Mitt assembler-program funkar inte (PIC)

Inlägg 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! :)
Användarvisningsbild
JockeE
Inlägg: 330
Blev medlem: 4 augusti 2004, 08:46:50

Inlägg 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
Användarvisningsbild
PacMan
Inlägg: 94
Blev medlem: 3 oktober 2005, 16:12:24
Kontakt:

Inlägg av PacMan »

Det hade jag faktiskt inte tänkt på, men tyvärr hjälpte det inte. :(
Användarvisningsbild
Henrik
Inlägg: 661
Blev medlem: 26 maj 2003, 23:39:14
Ort: Göteborg
Kontakt:

Inlägg av Henrik »

Testa att innan END lägga till
loop: goto loop
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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
;*************************************************************
Användarvisningsbild
PacMan
Inlägg: 94
Blev medlem: 3 oktober 2005, 16:12:24
Kontakt:

Inlägg 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.
Användarvisningsbild
PacMan
Inlägg: 94
Blev medlem: 3 oktober 2005, 16:12:24
Kontakt:

Inlägg 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:
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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.
Användarvisningsbild
Henrik
Inlägg: 661
Blev medlem: 26 maj 2003, 23:39:14
Ort: Göteborg
Kontakt:

Inlägg 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?
Användarvisningsbild
PacMan
Inlägg: 94
Blev medlem: 3 oktober 2005, 16:12:24
Kontakt:

Inlägg 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:
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Användarvisningsbild
PacMan
Inlägg: 94
Blev medlem: 3 oktober 2005, 16:12:24
Kontakt:

Inlägg 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å.
Användarvisningsbild
bengt-re
EF Sponsor
Inlägg: 4829
Blev medlem: 4 april 2005, 16:18:59
Skype: bengt-re
Ort: Söder om söder
Kontakt:

Inlägg 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...
Skriv svar