Rotationssensor (mikroC)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Den går hög via en sladd som jag petar ned i hålraden där

OK, det var det jag misstänkte (eller befarande)... :-)
Så du får antagligen 10'tals interrupt *varje gång* du stoppar i kabeln.
Det beror lite på hur "rent" kabeln glider ner i hålet.
Jäkligt svårt att så på en LED vad som händer...

> Så jag skall alltså läsa eller skriva tll PORTB innan jag nollar RBIF? Är jag på rätt spår?

YES !!
Läsa är väl det vanligaste, så att man inte av misstag ändrar något...
Notera att du inte behöver göra något med det du "läser"...
Lägg bara till en läsning direkt före nollningen av RBIF i din ISR.
Användarvisningsbild
Greve Hamilton
EF Sponsor
Inlägg: 544
Blev medlem: 4 september 2004, 15:03:35
Ort: GBG

Inlägg av Greve Hamilton »

Nu fick jag fyr på det! 8)

Det var ett ganska pinsamt fel... :oops:

'TRISB = 1;' är inte samma sak som 'TRISB = 0xFF;', till skillnad mot mBasic där 'TRISB = 1' är samma sak som 'TRISB = $FF' (eller, man får samma resultat). Detta medförde ju att enbart bit 0 blev ingång. Klantigt värre. Men nu kommer jag aldrig missa en sådan sak.

När jag petar min sladd mot något av benen, så märks studsandet ganska rejält, men det kvittar ju nu: bara ett test.

Postar det fungerande programmet:

Kod: Markera allt

  // PIC16F877A @ 20MHz

char a;

void interrupt () {
     a = ~a;
     asm { MOVF PORTB, F }       /* läs PORTB, så mismatch clearas */
     INTCON.RBIF = 0;           /* nolla interrupt-flaggan */
}

void main () {

TRISD = 0x00;
TRISB = 0xF0;

OPTION_REG = 0x7F;    /* internal pull-ups enable */
INTCON = 0x88;       /* slå på förändringsinterrupt på <RB7:RB4> & GIE = 1 */
a = 0xFF;

while (1) {
      PORTD = a;
      }
}


Det där med mismatch condition, det verkar ju fungera fint utan att cleara den. Det kanske fixas automatiskt av kompilatorn, eller något? :?

Tack för all hjälp! Pluspoäng till sodjan. :)

EDIT: Känns dumt att säga att ett program fungerar, när det inte gör det, så jag ändrade till det fungerade.
Senast redigerad av Greve Hamilton 7 juni 2006, 00:10:00, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> det verkar ju fungera fint utan att cleara den.

Du menar att om du låter tråden vara, så ligger LED'en kvar i samma
läge (tänt *eller* släkt) ?
Konstigt, man assembler listan från programmet borde tala om
vad som pågår.

> Pluspoäng till sodjan.

Nja jag vet inte det, jag borde ha reagerat på TRISx problemet... :-)

> mBasic där 'TRISB = 1' är samma sak som 'TRISB = $FF'

Ser snarast ut som en bugg... :-)
Borde vara att 'TRISB = 255' är samma sak som 'TRISB = $FF' och att
'TRISB = 1' är det samma som ''TRISB = $01'...
bearing
Inlägg: 11678
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Nu har du inte med någon läsning av PORTB i interruptet. Bara så du vet.
Användarvisningsbild
Greve Hamilton
EF Sponsor
Inlägg: 544
Blev medlem: 4 september 2004, 15:03:35
Ort: GBG

Inlägg av Greve Hamilton »

> Du menar att om du låter tråden vara, så ligger LED'en kvar i samma
läge (tänt *eller* släkt) ?

Ehm, när jag fixat avstudsningen såg jag att det inte alls fungerade som tänkt. Lade till 'b = PORTB;' precis innan nollningen av RBIF, och nu funkar det som det är tänkt. Uppgraderade även tråden till en liten knapp, och aktiverade de interna pull-upsen.

Finns det något smidigare sätt än 'b = PORTB;'? Så man slipper skapa en extra variabel. Kanske något ultrasnabbt assambler kommando? :D

> Borde vara att 'TRISB = 255' är samma sak som 'TRISB = $FF' och att
'TRISB = 1' är det samma som ''TRISB = $01'

Jo, man tycker ju det. Tror även att man kan skriva 'PORTX = 1', istället för 'PORTX = $FF'.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Finns det något smidigare sätt än 'b = PORTB;

Det är väl smidigt.
Och du kan ju använda b till annat, se bara upp med att
interruptet kan intäffa lite när som helst...

> Kanske något ultrasnabbt assambler kommando?

Det snabbaste är "MOVF PORTB, F", det kommer att läsa
PORTB och skriva tillbaka värdet till PORTB, utan att ta
några andra resurser i anspråk (inte ens W). Se bara
upp med read-modify-write effekter...

> Tror även att man kan skriva 'PORTX = 1', istället för 'PORTX = $FF'.

Fullständigt brain-dead, om det är så. Det ska ju naturligtsvis inte
bli olika resultat enbart för att man byter radix (bas) !!
Användarvisningsbild
grapetonix
Inlägg: 293
Blev medlem: 14 juli 2004, 17:20:50
Skype: grapetonix
Ort: Hägersten, Stockholm

Inlägg av grapetonix »

PORTX = 1 är inte samma sak som PORTX = 0xFF. Däremot vill jag minnas, att en specifik pinne (säg här någon på PORTB) kan kommanderas hög med antingen RB1=1 eller RB1=0xFF. Detta för att boolean variabler inte existerar i programspråket C, så kompilatorn sväljer helt enkelt en char och bryr sig bara om LSB:n i denna.
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Inlägg av Kaggen »

Ni menar inte "PORTX = -1"?

-1 brukar omvandlas till $ff, $ffff, $ffffffff beroende på vad för typ/längd av variabel eller register som används.
Skriv svar