PIC-assember Nybörjarproblem med BSF/BCF [LÖST]

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
nablaman
Inlägg: 480
Blev medlem: 30 juli 2010, 17:43:07
Ort: Lund
Kontakt:

PIC-assember Nybörjarproblem med BSF/BCF [LÖST]

Inlägg av nablaman »

Jag pillar med en PIC16F877 som jag programmerar i assembler med MPASM, och jag tror jag gör någon korkad nybörjartabbe.

Nedan följer ett program, där den intressanta delen är längst ner.
Jag tänder bit 1 i PORT E, sedan bit 0, för att sedan släcka dem i omvänd ordning.
MEN när jag tänder bit 0 så släcks bit 1!
Detta verkar inte vara enligt spec för bcf/bsf-instruktionerna.
Jag har verifierat med logikanalysator, de tre tändningarna av bit 1 genererar en lång puls på PORTE-1,
men sen när efterföljande korta puls kommer för PORTE-0, så slutar pulsen från PORTE-1!

Jag gör säkert något fullkomligt uppenbart fel, men vad??? :cry:

Kod: Markera allt

STATUS         equ       03h                 ;Address of the STATUS register
TRISA           equ 85h                 ;Address of the tristate register for port A
TRISB    		equ 86h
TRISC			equ	87h
TRISD			equ 88h
TRISE			equ 89h
PORTA           equ       05h                 ;Address of Port A
PORTB    		equ 06h
PORTC			equ 07h
PORTD			equ 08h
PORTE			equ 09h

                        bsf                STATUS,5       ;Switch to Bank 1
						; Port A is the input port for control pins (688 etc). Make it input
                        movlw              0xFF                   
                        movwf              TRISA   
						; Port B is the input for the external data bus. Make it input
                        movlw              0xFF                  
                        movwf              TRISB
						; Port C and D drives the horizontal transistors. Make them output 
						movlw              00h           
						movwf				TRISC
						movlw              00h 
						movwf				TRISD
						; Port E sends control signals to power transistors and FP2800. Make it output
						movlw              00h 
						movwf				TRISE
                        bcf                 STATUS,5       ;Switch back to Bank 0 

Start           

			bsf     PORTE, 1 ; Do the same thing 3 times to get some delay
			bsf     PORTE, 1
			bsf     PORTE, 1
			bsf     PORTE, 0
			bcf     PORTE, 0
			bcf     PORTE, 1
                        goto Start
Senast redigerad av nablaman 10 mars 2011, 23:06:59, redigerad totalt 1 gång.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47008
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: PIC-assember Nybörjarproblem med bsf/bcf

Inlägg av TomasL »

Read Modify Write.

Vanligt nybörjarfel med PIC
Googla och du skall finna

http://www.cornerstonerobotics.org/curr ... roblem.pdf
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: PIC-assember Nybörjarproblem med bsf/bcf

Inlägg av v-g »

Sen en sak jag tycker du ska börja direkt med är att kolla upp includefilerna för din processor då slipper du hålla på med EQU (vilka jag inte anser att man ska använda alls förrutom till fasta värden).

Vidare bör du gör så att du i början av koden skriver:

Kod: Markera allt

#DEFINE BitNamn porta, 1
Detta av det enkla skälet att då du sen skriver BSF BitNamn på hundra ställen i koden ändrar du bara på din #DEFINE gör såhär för varenda bit du använder (i typ egna register) så kommer din kod att bli mycket överskådligare.

Sätt också relevant BitNamn tex LED_Belysning eller RED_LED gissa också vilket som är mest lättförståeligt av BSF PORTA,3 eller BSF RED_LED ;)
Användarvisningsbild
nablaman
Inlägg: 480
Blev medlem: 30 juli 2010, 17:43:07
Ort: Lund
Kontakt:

Re: PIC-assember Nybörjarproblem med bsf/bcf

Inlägg av nablaman »

Tack för tipset, det ser ju absolut ut som mitt problem.
Dock undrar jag för jag har både testat med att sätta in en ganska rejäl delay mellan varje bitoperation,
samt att jag nu kör pinnarna obelastade (lyfta från sockeln till och med :)) förutom logikanalysatorn (och den har ju inte särskilt mycket kapacitans)?
Inget av detta har hjälpt.
Användarvisningsbild
nablaman
Inlägg: 480
Blev medlem: 30 juli 2010, 17:43:07
Ort: Lund
Kontakt:

Re: PIC-assember Nybörjarproblem med bsf/bcf

Inlägg av nablaman »

v-g Helt klart bra tips!
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: PIC-assember Nybörjarproblem med bsf/bcf

Inlägg av v-g »

Jag hinner tyvärr inte analysera det hela då jag inte har tiden just nu tyvärr men du är säker på att logikanalysatorn hinner med?

Jag skulle skita i den och ta en vanlig LED (ja och ett motstånd) det kan mycket väl vara så att det blinkar snabbt eller nåt annat.

Kolla även på porten i datablade i slutet av kapitlet finns en översikt av _alla_ register som berör denna port (samma för timers också) se till att du har kolla på varenda en av dessa registers BIT:ar!
Användarvisningsbild
nablaman
Inlägg: 480
Blev medlem: 30 juli 2010, 17:43:07
Ort: Lund
Kontakt:

Re: PIC-assember Nybörjarproblem med bsf/bcf

Inlägg av nablaman »

En LED uppvisar exakt samma beteende (fast då krävs ju mer delay för att se något).
Logikanalysatorn verkar hinna med, sättandet av bit 1 genererar en puls som är exakt tre gånger så lång som sättandet av bit 0. När bit 0 sätts går bit 1 direkt ner till 0.
Har läst databladet 20 gånger känns det som. :(

Tänkte om nån annan kanske har sett nåt liknande beteende med denna eller liknande PIC?
Känns ju absolut som det kan ha något med RMW-problemet, men får inte riktigt ihop hur...
Användarvisningsbild
swesysmgr
Inlägg: 14961
Blev medlem: 28 mars 2009, 06:56:43
Ort: Göteborg

Re: PIC-assember Nybörjarproblem med bsf/bcf

Inlägg av swesysmgr »

Proöva att skriv till LAT registren istället för direkt till portarna eller lägg in några NOP emellan portskrivningarna så att de hinner stabilisera sig.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47008
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: PIC-assember Nybörjarproblem med bsf/bcf

Inlägg av TomasL »

Har för mig att PIC16 inte har LATx
Från PICList http://www.piclist.com/techref/microchip/portpins.htm
Now, if the pin is defined as an output, the output latch and the actual pin *ought* to be in the same state. In practice sometimes they aren't. If you are driving a capacitive load, the pin will take time to respond as it charges and discharges the capacitor. A common problem occurs when using the bit set (bsf) or bit clear (bcf) directly on a port.

bsf portb, 0 -- don't do this!
bsf portb, 1 -- don't do this!
bcf portb, 1 -- don't do this!
or
setb portb.0 -- don't do this!
setb portb.1 -- don't do this!
How do you avoid this issue? Well, it's bad practice to use RMW instructions directly on a port. So you use whats known as a shadow register. The shadow register is simply a ram location you reserve. All operations are performed on this register, and when you are finished, you copy it to the port register. It's a bit more trouble, and it can slow things down a tiny bit, but the effort is worth it for reliable operation.
Enkelt uttryckt, läs in porten till en temporär variabel, fixa till bitarna på denna variabel, skriv tillbaka allt till porten.
Senast redigerad av TomasL 10 mars 2011, 21:38:23, redigerad totalt 1 gång.
Användarvisningsbild
nablaman
Inlägg: 480
Blev medlem: 30 juli 2010, 17:43:07
Ort: Lund
Kontakt:

Re: PIC-assember Nybörjarproblem med bsf/bcf

Inlägg av nablaman »

Oki, testar detta! Tack :)
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: PIC-assember Nybörjarproblem med bsf/bcf

Inlägg av v-g »

Nej det ska inte ha något med RMW att göra det går så snabbt att du inte hinner se det inte med en LED iaf.

Kolla så du verkligen gör det du tror och att inga interrupt etc är aktiverat att TRIS registren står rätt osv.

Men fixa först till så du kör med INCLUDE filerna så du får alla saker rätt.

Ett annat bra tips kan vara att köra de färdiga templatefilerna som finns för varje sorts PIC de har det mesta rätt från början.

Vad jag minns så är det inget speciellt med portarna det ska vara nästan exakt samma på alla portar på 877, tyvärr har jag slut på batteriet nu så jag hinner inte leta upp databladet. Men se till att stänga alla funktioner du inte använder!
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: PIC-assember Nybörjarproblem med bsf/bcf

Inlägg av Marta »

Är de analoga funktionerna för de aktuella pinnarna avstängda? Annars läser den alltid pinnen som en nolla och det blir ett RMW-problem även utan att utgången lastas så hårt att den kroknar. Den fungerar inte alls som digital ingång då heller.
Användarvisningsbild
nablaman
Inlägg: 480
Blev medlem: 30 juli 2010, 17:43:07
Ort: Lund
Kontakt:

Re: PIC-assember Nybörjarproblem med bsf/bcf

Inlägg av nablaman »

Jag har fixat TRISE så att den ska agera digital utport,
och det verkar den göra också eftersom jag ju får ut de bitar som jag sätter/rensar.
Jag har även stängt av all configuration-dynga som jag inte använder.
Problemet är bara det att jag inte kan sätta mer än en bit med bsf efter vartannat.

Jag håller på att knåpa ihop lösningen med skuggregister nu, får se om det funkar nåt bättre...
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: PIC-assember Nybörjarproblem med bsf/bcf

Inlägg av Marta »

TRISx gör inget annat än styr utgångsbuffrarna mellan tristate och aktiv. Det Du troligen har konfigurerat fel är ADCON1. Skriv hexadecimalt 06 i detta register och se om det gör skillnad. Det finns på adress 1F i bank1.
Användarvisningsbild
nablaman
Inlägg: 480
Blev medlem: 30 juli 2010, 17:43:07
Ort: Lund
Kontakt:

Re: PIC-assember Nybörjarproblem med bsf/bcf

Inlägg av nablaman »

Skuggregister verkar lösa problemet! Två fina överlagrade pulser på logikanalysatorn nu! :tumupp: Tackar för tipsen! :)
Skriv svar