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... 
 