Funderingar angående Blink-koden

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Variosboy
Inlägg: 834
Blev medlem: 5 september 2005, 17:10:03
Ort: kristinehamn

Funderingar angående Blink-koden

Inlägg av Variosboy »

Har nu fått igång å testat min wisp med blink-a-led-koden på sodjans hemsida. (dem som är skriven i abs_reloc-läge) programmet fungerar som det ska men jag får inte ihop en kodrad med hur det står i databladet över processorn att syntaxen är.

det står såhär i koden på ett ställe:

comf porta, f

men enligt databladet så ska det ju stå antingen en etta eller en nolla där f:et är.

sen undrar jag hur comf ska påverka värdet i ett register. innebär inte komplement att den byter nollor till ettor o vice versa??

Det måste ju vara jag som tänker galet efterssom programmet fungerar finfint både i MPLAB och i processorn jag skickat koden till.

Har min hjärna stannat?? borde jag se något helt uppenbart???
:?
(längesen man höll på med det här dagligen)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> men enligt databladet så ska det ju stå antingen en etta eller en nolla där f:et är.

Det gör det. Se definitionerna av "F" och "W" i INC filen för din processor.
Skriv *aldrig* "0" eller "1" där !

> innebär inte komplement att den byter nollor till ettor o vice versa??

Korrekt. D.v.s "blinkar"...
Användarvisningsbild
Variosboy
Inlägg: 834
Blev medlem: 5 september 2005, 17:10:03
Ort: kristinehamn

Inlägg av Variosboy »

okey, då har jag koll på den biten med f:et (tror jag)

men när kör programmet i MPLAB och kollar med watch så ändras bara de fem sista bitarna på PORTA varje gång COMF-raden körs, de första tre är och förblir nollor hela tiden, om den ska göra om så ska den väl göra om alla bitar eller?

testade att koppla lysdioden till andra pinnar och fick samma resultat då, blinkar bara om den är kopplad till RA0 upp till RA4
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Vilken kod är det ? Länk ?
Användarvisningsbild
Variosboy
Inlägg: 834
Blev medlem: 5 september 2005, 17:10:03
Ort: kristinehamn

Inlägg av Variosboy »

den här är det som jag plankat rakt av (högra koden på sidan)

http://www.jescab.se/abs_reloc.html

sen funderade jag på en sak till, du säger att man *aldrig* ska skriva ett eller noll där, funderade lite på det, men kunde inte komma på vitsen med att inte göra det!?

tack föresten för snabba svar!!
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg av Kaggen »

Du har inte nämnt vilken uC du kör på, men jag antar att du har en 16F628A eftersom koden är skriven för den?

Anledningen till att använda W istället för 0 och F istället för 1 är för att det är lättare att läsa koden då.

W = W - registret. Används för speciella/vissa beräkningar.
F = Filregister/Specialregister. D.v.s. RAM minnet eller speciella funktionsregister.

comf PORTA,f betyder att destinationen (och en av parametrarna i vissa fall) för resultatet av beräkningen är F-registret PORTA. Om det hade stått w istället för f hade resultatet hamnat i W-registret.

Med andra ord, står det ett F är det enklare att direkt i koden se att resultatet hamnar i filregister, står det 1 och man inte kommer ihåg om 1 betyder w-registret eller filregister så måste man bläddra i databladet.

För att förtydliga ytterligare:

comf PORTA,f motsvarar: PORTA = ~PORTA

comf PORTA,w motsvarar: W = ~PORTA

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

Inlägg av sodjan »

> du säger att man *aldrig* ska skriva ett eller noll där, funderade lite på
> det, men kunde inte komma på vitsen med att inte göra det!?

Av samma anledning som att man *aldrig* ska skriva t.ex "BCF STATUS, 2"
eller något liknande. "BCF STATUS, Z" ska det heta i just det fallet...

Använd *aldrig* numeriska parametrar när det finns definierade symboler !

Och anledningen/vitsen är alltså läsbarhet.
Användarvisningsbild
Variosboy
Inlägg: 834
Blev medlem: 5 september 2005, 17:10:03
Ort: kristinehamn

Inlägg av Variosboy »

Okey Sodjan och Kaggen! Köper det resonemanget helt och fullt!

(Använder för övrigt den processorn som programmet är skrivet för 16F628A)

Testade för skojs skull att lägga till dessa två rader innan comf i programet för att se vart felet blev:

movlw 0xff
movwf porta

Efter första operationen blir ju W-reg 1111 1111, men efter movwf blir porta likt förbannat "bara" 0001 1111

(testade detta med simuleringen i matlab)

Provade till och med att lägga upp ett helt nytt projekt och göra det från början. men får samma resultat ändå.. (tänkte om det blivit nån konstig bugg)
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Inlägg av Jeppsson »

Kör du med extern kristall och MCLR on så kan det stämma!

Prova använda portb istället!
bos
Inlägg: 2314
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Inlägg av bos »

Variosboy skrev:sen funderade jag på en sak till, du säger att man *aldrig* ska skriva ett eller noll där, funderade lite på det, men kunde inte komma på vitsen med att inte göra det!?
Koden blir mer svårläst.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> men efter movwf blir porta likt förbannat "bara" 0001 1111

**LÄS** databladet så har du svaret.
Speciellt den lilla gråa rutan på sidan 31 i kapitel "5.1 PORTA and TRISA Registers".
Frågan *sen* (om det fortfarande är något oklart)...
Användarvisningsbild
Variosboy
Inlägg: 834
Blev medlem: 5 september 2005, 17:10:03
Ort: kristinehamn

Inlägg av Variosboy »

Det var som jag skrev i mitt första inlägg i tråden - hjärnan som hade stannat! :D

Nu är jag på banan igen (en stund i alla fall)

Tackar för alla snabba och bra svar!
Skriv svar