Detektera stack overflow i PIC18F442?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
nanopile
Inlägg: 312
Blev medlem: 9 april 2006, 17:06:50
Ort: Stockholm

Detektera stack overflow i PIC18F442?

Inlägg av nanopile »

Får vad jag uppfattar som reset på PIC18F442 och tror det har att göra med att stacken går över de 32 nivåerna den kan ha.
Kan jag på något vis se om det är just det som händer?
(det händer inte under simuleringen eftersom jag inte kan skicka data till simuleringen)

Provade med att skriva ut STKPTR till PortB där jag har lysdioder för att se nivån på stacken.
Men det verkade inte fungera för jag får värdet 10000001 på lysdioderna när det blir en reset.

Detekterar att det blir en reset genom att PICen sänder ut ett startmeddelande genom seriekabeln till datorn när den har gjort klart alla inställningar och den börjar köra det riktiga programmet.
Användarvisningsbild
ahlsten
Inlägg: 659
Blev medlem: 12 november 2005, 00:24:14
Ort: Uppsala

Inlägg av ahlsten »

Kan det inte vara så att -1 betyder att den inte har nått värde ännu då (att det har återställts)?
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Nu är 10000001 ju knappast -1, det är -127...

Men om du når "taket" bör du se över din mjukvara väldigt mycket.

Och efter vad jag vet kan man skicka signaler under simuleringen, jag har iaf. gjort det i sin tid. Det är dock ganska besvärligt då man ska definiera i antal CPU-klock när det ska hända osv. men jag lyckades "ta emot" en seriell sträng då.
Användarvisningsbild
ahlsten
Inlägg: 659
Blev medlem: 12 november 2005, 00:24:14
Ort: Uppsala

Inlägg av ahlsten »

Felkod som felkod tänker jag. Och nu ska vi väl inte diktera absoluta sanningar utan vara ödmjuka... om det blir -1 eller -127 beror väl på vilket system som används (teckenbit/enkomplement/tvåkomplement)
nanopile
Inlägg: 312
Blev medlem: 9 april 2006, 17:06:50
Ort: Stockholm

Inlägg av nanopile »

Hmm, så skumt.
Kollade för några månader sedan i hjälpfilen och klickade på MPLAB SIM/limitations/general limitations och där stod:
For devices with the listed peripherals, these peripherals are not supported:
...
...
Serial I/O...
...
...

Därför har jag inte ens försökt, å andra sidan testade jag bara lite med simulation och det gick åt skogen o hittade sedan info om att seriekommunikation inte fungerade och struntade i simuleringsdelen ganska fort och simulerade manuellt.

Hur gjorde du för o lära dig MPLAB SIM?
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Lärde mig???.... testade, läste felmeddelanden, testade "lite mer", läste felmeddelanden <repeat many days>... oj, den biten fungerade... nu är det bara resten...

Jag minns att jag lät den "motta" vid att ge RCREG (PIC16F...) ett värde och sätta interrupt-biten, vänta ett antal CPU-klock och upprepa.

Går självklart inte att "sända" men fuska kan man ju... Allt detta var dock några år sedan så det är inte färskt i minnet, numera har jag lämnar simuleringen och klarar mig med ett oscilloskop samt ett par LED, det räcker långt.

Jag har lärt mig att simuleringen kan man inte hitta mer än hälften av felen med och då jag iaf. ska debugga hårdvaran IRL kan jag likaväl starta direkt där.
nanopile
Inlägg: 312
Blev medlem: 9 april 2006, 17:06:50
Ort: Stockholm

Inlägg av nanopile »

Hmm, som jag brukar göra.
Fast det händer att folk klagar på mig o säger läs innantill men jag läser så långsamt.
Bilder och diagram är jag tydligen ruskigt snabb på att förstå :)
Där får jag oftast motsatt reaktion om det uppmärksammas.

Jo LEDs är bra :)

Inte sända?
Altså påverkas inga register menar du eller menar du att det inte landar på serieporten?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Låt oss ta de viktiga frågorna här...

> Får vad jag uppfattar som reset

Vad är det du "uppfattar" ? Och varför tolkar du det som en reset ?
Är det kanske :

> Detekterar att det blir en reset genom att PICen sänder ut ett startmeddelande...

Det betyder bara att processorn har kört om samma kod igen.
Inte nödvändigtsvis att det har skett en reset. Du kan ha kommit
till h'0000' på annat sätt. Det finns bitar i något register (STATUS tror jag)
som talar om ifall det har skett en riktig reset eller om det är något annat.

När händer detta ?
Sker det av sig själv eller när du gör något speciellt ?

> och tror det har att göra med att stacken går över de 32 nivåerna den kan ha.

Varför tror du just det ? Har du några kända fel i koden ?

> Kan jag på något vis se om det är just det som händer?

Inte som jag känner till på rak arm, men det kan få
väldigt konstiga effekter. Å andra sidan så betyder det
att du har någon väldigt stort fel i koden. CALL utan RETURN
eller liknande...
pheer
EF Sponsor
Inlägg: 1283
Blev medlem: 16 januari 2005, 18:05:21

Inlägg av pheer »

Har du läs avsnitt 7.7.3-7.7.74 i pic18 reference manual? Där finns lite nyttig information.
nanopile
Inlägg: 312
Blev medlem: 9 april 2006, 17:06:50
Ort: Stockholm

Inlägg av nanopile »

sodjan,,,, det är bra att du finns, jag är ganska säker på att jag har hittat orsaken nu.

> ...Du kan ha kommit till h'0000' på annat sätt.

Det verkar vara precis vad som hänt, jag kom på att jag har andvänt exempelkoden för interupts som microchip har på sid 85 i:
http://ww1.microchip.com/downloads/en/D ... 39564c.pdf
Men den skriver ju över de första värdena om man lyckas göra en interupt igen och det är nog det som händer.
Blir ju alldeles förstört om värdena skrivs över om man ska ha dem senare.

Bah, visst blir man glad av att hitta en felkälla som bara är att rätta till men jobbigt att ha gått förbi den och inte märkt något.
Nåja man har ju iaf lärt sig något oavsett om det är det som är orsaken eller inte.
Nu ska jag ta en promenad innan jag fortsätter :)

Oj vad jag jobbat med detta.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Men den skriver ju över de första värdena om man lyckas göra en interupt igen och det är nog det som händer.

Kan bara hända om du kör med dubbla interrupt nivåer (nästan alltid onödigt)
eller om du enablar interrupt på annat sätt än genom RETFIE (helt fel).

> Blir ju alldeles förstört om värdena skrivs över om man ska ha dem senare.

Dek kan bara hända om du har gjort en riktig tabbe.
nanopile
Inlägg: 312
Blev medlem: 9 april 2006, 17:06:50
Ort: Stockholm

Inlägg av nanopile »

Fast jag har ju flera saker som kan generera interupts.
Japp, har high och low priority interupts.
Skickar allt utom timer0 till low prio.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Fast jag har ju flera saker som kan generera interupts.

Spelar absolut ingen roll !

De andra kommer att "vänta" till det pågående gör RETFIE.
Ett interrupt ska *aldrig* avbryta en pågående ISR !
(Utom om man kör low/high, men det behövs som sagt väldigt sällan...)

> Japp, har high och low priority interupts.
> Skickar allt utom timer0 till low prio.

Har du gjort en riktig analys av att du verkligen behöver det ?

D.v.s måste du "svara" på ett tmr0 interrupt snabbare än tiden för
den längsta ISR'en av de övriga ?

Notera att det bara finns "schadow registers" för en interrupt nivå.
Har du fler (d.v.s två) nivåer, så måste du använda koden som du
hänvisade till. Bara det är en god anledning att fundera en andra
gång om man verkligen ska ha två nivåer.
nanopile
Inlägg: 312
Blev medlem: 9 april 2006, 17:06:50
Ort: Stockholm

Inlägg av nanopile »

Visste inte ens att det fanns någon automatik för att spara undan detta vid interupts.

Katten nu har jag tydligen gjort något tokigt igen, timer0 fungerar i simulatorn men absolut inte i chippet.
Kanske ska se på det utan trötta ögon, har suttit hela natten och försökt få ordning på det med tanken att "det ska gå".
Vilken röra.

Sovdax.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Visste inte ens att det fanns någon automatik för att spara undan detta vid interupts.

Databladet, sidan 85, stycket "8.9 Context Saving During Interrupts".

Men notera att det bara finns en uppsättning "shadow registers" !
De kan inte användas både för high och low prio interrupts, eller
både för interrupt/RETFIE *och* för CALL/RETURN.
Skriv svar