Appotus skrev:Hur kan MOVLW 0Ch sätta 3 och 2 som input? 3 och 2 nämns ju inte.
"0Ch" (hexadecimalt) är 12 decimalt och 00001100 binärt. Om du läser det binära talet från höger till vänster så är det, i ordning, bit 0, bit 1, bit 2, bit 3, osv. De båda ettorna står på bit 2 och 3, vilket innebär att PORTC[2:3] blir input, precis som det står.
Det är av denna anledning det är att föredra att ha configbitarna i binär form, det är lätt att se vad som avses och det är lika enkelt att ändra om något är fel.
Och, som sodjan skrev, även om du hade skrivit koden i C så hade du fått samma fel när det gäller registret ANSEL. Assembler och läsa datablad är skitsvårt i början, men genom att tvinga dig att lära dig det gör att du kommer lära dig alla de vanligaste fallgroparna. Som i detta fall då dina pinnar är inställda att vara analoga, och orsakar dina problem.
Databladet får du absolut inte snabb- eller fuskläsa! Informationen där är ytterst vital och du kommer stjälpa mer än hjälpa om du bara kopierar kod från databladen utan att veta exakt vad som avses. Är det något som är svårt ellet obegripligt, fråga. Folk hjälper dig gärna, men du måste i samma veva ge sken av att du är intresserad av att lära dig hur det fungerar, inte att du enbart är intressad av att få LED:en att lysa.
Slutligen, istället för att köra "bsf STATUS, RP0" osv för att hoppa mellan banker så kan du använda makrot "banksel <register>". Exempel:
Kod: Markera allt
banksel TRISB
movlw 0b11110001
movwf TRISB
banksel PORTB
movlw 0b00001110
movwf PORTB
Det snor lite extra (2 bytes OJMR) minne, men det är inget du behöver bekymra dig om för stunden. Fokusera på det väsentliga.