Sida 2 av 3
Postat: 10 januari 2008, 11:29:49
av JimmyAndersson
"men nu vet jag inte vilken port jag ska använda till lysdioden..."
*host*
En kommentar hämtad Sodjan's kod:
"Blinka med hela PORTA!"

Postat: 10 januari 2008, 11:34:28
av sodjan
Som Jimmy sa, vilken pinne som helst på PORTA kan användas.
Notera att jag (för att få lite mer kompakt kod) använder COMF
vilket ställer om hela PORTA...
Postat: 10 januari 2008, 19:10:27
av ElectricMan
hur skulle det se ut om man väljer en specifik port då?
Postat: 10 januari 2008, 19:38:32
av sodjan
Det verkar som om du rör ihop "port" och "pin"...
Postat: 10 januari 2008, 19:40:46
av ElectricMan
Aja, pinne då
EDIT: eller kan nån förklara lite?
Postat: 10 januari 2008, 22:08:55
av chrille112
PORTA = 0b00000001
sätter pinne 1 hög på PORTA
Postat: 10 januari 2008, 22:19:32
av sodjan
> PORTA = 0b00000001
> sätter pinne 1 hög på PORTA
Nej nej nej, det där kommer bara att ge ett felmeddelande !!
Kolla BCF/BSF instruktionerna. T.ex :
BCF PORTA, 0 ; Sätt RA0 = "0"
BSF PORTA, 0 ; Sätt RA0 = "1"
o.s.v...
(Sen, om du vill, kan du läsa lite om "Read-Modify-Write" (RMW) mot
port-pinnar, men det är lite överkurs just nu...)
Postat: 10 januari 2008, 22:32:47
av chrille112
Sorry, glömde att det var ASM som gällde. I C fungerar det utmärkt

Postat: 8 maj 2008, 22:34:16
av dechaine
sodjan skrev:Alltså, att *börja* sin resa i PIC världen genom att pilla med firmware
till programmeraren, låter väl kanske inte som riktigt rätt ände...
Och JAL är en väldigt udda konstruktion som det igentligen inte finns
mycket anledning att bry sig om alls.
> Någon som har någon bra exempelkod för att blinka en lysdiod med en 16F628?
Kod: Markera allt
;**********************************************************************
; Enkelt blink-a-led, 16F628A.
;
;**********************************************************************
; Other files required:
; 16F628A.LNK (lägg till i projektet som "Linker Script" !)
;
;**********************************************************************
list p=16f628A
#include <p16f628A.inc>
__CONFIG _DATA_CP_OFF & _CP_ON & _LVP_OFF & _BODEN_OFF & _BOREN_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _MCLRE_ON
RESET_VECTOR CODE 0x000 ; processor reset vector
goto start ; go to beginning of program
INT_VECTOR CODE 0x004 ; interrupt vector location
goto isr_routine ; goto main interrupt service routine.
;***************************************************************
MAIN CODE
start
banksel cmcon
movlw h'07'
movwf cmcon ; Stäng av ADC, se databladet om PORTA.
banksel trisa
clrf trisa
clrf trisb ; Alla pinnar = utgångar.
banksel t1con
movlw b'00110001'
movwf t1con ; Se databladet om Timer1.
banksel pie1
movlw b'00000001'
movwf pie1 ; Enable avbrott från TMR1.
banksel intcon
bsf intcon, peie ; Enable "peripheral interrupts".
bsf intcon, gie ; Enable "global interrupts".
loop
goto loop ; Vänta på avbrott (interrupt)...
;***************************************************************
ISR_ROUTINE CODE
isr_routine ; avbrott/interrupt rutin.
banksel porta
comf porta ; Blinka med hela PORTA!
banksel pir1
bcf pir1, tmr1if ; återställ avbrotts flagga.
retfie
end
Allt detta för att få en liten led att blinka??
Då känns JAL betydligt mer logiskt... och enklare..
http://www.voti.nl/blink/code/b628-1.jal Rimlig kodlängd för ett "blink a led" program...
Men det är väl bara att man inte ser logiken i det hela än..
Finns det någon "ordbok" över alla förkortningar någonstans??
Samt någon sida (helst på svenska) som förklarar logiken i det hela i detalj?
Postat: 8 maj 2008, 22:42:05
av sodjan
Vadå "allt detta" ??
Det som står mellan "start" och "loop" har igentligen inte så mycket med
blinkandet att göra, det är finns alltid med i någon form.
> Finns det någon "ordbok" över alla förkortningar någonstans??
Vilka "förkortningar" ?
Vad är det i "logiken" som ska förklaras ? Var lite mer
specifik så går det lättare att svara.
Det bör inte finnas något som inte förklaras i databladet
och/eller i MPASM manualen.
Postat: 8 maj 2008, 23:07:57
av dechaine
Okej. Ja i den manualen står det en hel del

Bara läst i User´s Guide till MPLAB än så länge.
Tänkte på de förkortningar som t.ex. banksel, movlw, movwf mm.. men det löste ju sig med MPASM.
Ang. logiken tänkte jag på till exempel detta program
http://www.voti.nl/stepbots/index.html
Här kan jag direkt förstå sambandet mellan variablarna och alla "anrop", IF etc. men det beror väl på att jag programmerat lite i windowsmiljö (delphi).
Ja ja.. ska läsa på ordentligt i manualen nu (i morgon)!
Är det mellan "main" och "loop" bara "konfigurering" av picen eller vad är det mer exakt?
Postat: 8 maj 2008, 23:25:36
av sodjan
BANKSEL är ett "assembler direktive", d.v.s något som styr hur MPASM
jobbar och som ibland (men inte alltid) även skapar kod. Alla direktiv
har ett eget kapitel i MPASM manualen. Det är bara att slå upp.
MOVLW, MOVWF o.s.v är "instructions" och finns bl.a i ett eget
kapitel i alla datablad där det berättas i detalj vad de gör.
Koden fram till "loop" körs bara en gång för att initiera propcessorn
för det som den sen ska göra. Allt "blinkande" görs sedan i ISR_ROUTINE.
Notera att i princip allt som står i MPASM/MPLINK manualen även
finns online i hjälpen i MPLAB...
Postat: 9 maj 2008, 08:00:56
av Icecap
dechaine: i alla µC program får man starta med att sätta portpinnar i rätt riktning, slå på/av funktioner, starta hårdvara (UART för seriell kommunikation t.ex.), slå på/av interrupt osv. Är man en seriös programmör förlitar man sig ALDRIG på "default" inställningerna.
Detta betyder att det som i sodjans prog. ligger mellan 'start' och 'loop' är just de inställningar och det prog. är till o med ett bra exempel på hur man använder interrupten.
Att man bytar språk betyder INTE att man kan strunta i dessa inställningar, det betyder bara att man ska göra det samma med en annan syntax.
Exempel där jag blandar ASM & C: (varje C-rad utför samma funktion som de ovanstående ASM-rader, '->' används som indikering av C-rad)
Kod: Markera allt
banksel cmcon
movlw h'07'
movwf cmcon ; Stäng av ADC, se databladet om PORTA.
-> CMCON = 0x07; // Samma fast i C
banksel trisa
clrf trisa
-> TRISA = 0x00;
clrf trisb ; Alla pinnar = utgångar.
-> TRISB = 0x00;
banksel t1con
movlw b'00110001'
movwf t1con ; Se databladet om Timer1.
-> T1CON = 0x31;
banksel pie1
movlw b'00000001'
movwf pie1 ; Enable avbrott från TMR1.
-> PIE1 = 0x01;
banksel intcon
bsf intcon, peie ; Enable "peripheral interrupts".
-> INTCON_PEIE = 1;
bsf intcon, gie ; Enable "global interrupts".
-> INTCON_GIE = 1;
Obs. att dessa C-rader utlöser samma antal (och oftast lite fler) ASM-kommandon, det är alltså bara ett annat sätt att skriva samma sak.
Postat: 9 maj 2008, 20:02:34
av dechaine
Nu börjar det klarna!
C verkar mycket lättare, så vad är det egentligen som gör att man bör börja med ASM? Är ASM "närmare" maskinkod, så att man kan skriva mer exakt i vissa saker?
Postat: 9 maj 2008, 20:17:49
av sodjan
> C verkar mycket lättare,
Beror på din definition av "lättare".
Om du bara vil korta ner tidehn att skriva kod, så kan det stämma.
Om du även vill förstå vad som händer och ha 100% kontroll
över vad som händer, så är det kanske inte helt rätt.
Notera att C bara är ett verktyg för att skriva assembler kod...
