Sida 2 av 2

Postat: 22 september 2005, 18:48:17
av JimmyAndersson
Här kommer asm-varianten på koden du skrev:

Kod: Markera allt

;// ADDRESS	OPCODE	ASM
; ----------------------------------------------
$0000	$EF04	F000	GOTO	Korttest_main
$0008	$	Korttest_main:
$0008	$	Korttest_main_main:
$0008	$0E03	MOVLW	3
$000A	$6E15	MOVWF	main_global_vilkenb, 0
$000C	$	Korttest_L_0:
$000C	$6A01	CLRF	STACK_1, 0
$000E	$80D8	BSF	STATUS, C, 0
$0010	$BE15	BTFSC	main_global_vilkenb, 7, 0
$0012	$D002	BRA	Korttest_L_3
$0014	$5015	MOVF	main_global_vilkenb, W, 0
$0016	$5C01	SUBWF	STACK_1, W, 0
$0018	$	Korttest_L_3:
$0018	$E30A	BNC	Korttest_L_2
$001A	$	Korttest_L_1:
$001A	$6A81	CLRF	PORTB, 0
$001C	$0EFF	MOVLW	255
$001E	$2615	ADDWF	main_global_vilkenb, F, 0
$0020	$0EFF	MOVLW	255
$0022	$6E15	MOVWF	main_global_vilkenb, 0
$0024	$0EFF	MOVLW	255
$0026	$B0D8	BTFSC	STATUS, C, 0
$0028	$0F01	ADDLW	1
$002A	$2615	ADDWF	main_global_vilkenb, F, 0
$002C	$D7EF	BRA	Korttest_L_0
$002E	$	Korttest_L_2:
$002E	$	Korttest_L_4:
$002E	$D7FF	BRA	Korttest_L_4
Betydligt med överskådlig. :)

Postat: 22 september 2005, 22:32:04
av sodjan
OK.
HAr du möjlighet att visa samma sak men med "for vilkenb = 0 to 3 step 1" ?

Postat: 22 september 2005, 23:49:37
av JimmyAndersson
Jepp, här kommer den koden:

Kod: Markera allt

;// ADDRESS	OPCODE	ASM
; ----------------------------------------------
$0000	$EF04	F000	GOTO	Korttest_main
$0008	$	Korttest_main:
$0008	$	Korttest_main_main:
$0008	$6A15	CLRF	main_global_vilkenb, 0
$000A	$	Korttest_L_0:
$000A	$0E03	MOVLW	3
$000C	$6E01	MOVWF	STACK_1, 0
$000E	$80D8	BSF	STATUS, C, 0
$0010	$BE15	BTFSC	main_global_vilkenb, 7, 0
$0012	$D002	BRA	Korttest_L_3
$0014	$5015	MOVF	main_global_vilkenb, W, 0
$0016	$5C01	SUBWF	STACK_1, W, 0
$0018	$	Korttest_L_3:
$0018	$E303	BNC	Korttest_L_2
$001A	$	Korttest_L_1:
$001A	$6A81	CLRF	PORTB, 0
$001C	$2A15	INCF	main_global_vilkenb, F, 0
$001E	$D7F5	BRA	Korttest_L_0
$0020	$	Korttest_L_2:
$0020	$	Korttest_L_4:
$0020	$D7FF	BRA	Korttest_L_4

Postat: 23 september 2005, 00:09:14
av sodjan
OK. Dels blev det kortare (speciellt efter "CLRF PORTB" instruktionen), dels så går det att förstå hur det fungerar. Versionen med "step -1" förstår jag inte, och det *ser ut* som om den inte fungerar...

Sedan kan man tycka att, eftersom MikroBasic vet att det är en PIC18 som används, så kunde de använda en CPFxxx ("Compare file with W...") instruktion istället för kombinationen MOVF->SUBWF->BNC. Men antagligen har de samma kodgenerator just här för PIC16 och PIC18...

Hur som helst, koden med "step 1" verkar OK, medans den med "step -1" är lite skum, så vitt jag kan se... Man skulle kunna köra asm koden som ett eget projekt i MPASM (alltså som ett vanligt asm program) och följa koden i SIM-ulatorn (MPSIM). Man får bara lägga till lite definitioner för variablerna...

Jag vet inte om det var till någon hjälp, men det visar i alla fall att det kan vara bra att kunna läsa den ASM kod som kompilatorn genererar, och det gäller inte bara för Basic utan alla högnivåspråk.

Postat: 23 september 2005, 01:34:23
av JimmyAndersson
Jo, det blev en intressant lektion. ASM är bra att kunna som sagt.
Får se om jag stöter på en lösning på varför det inte fungerar.

Men som sagt, koderna var bara lite test för att se lite hur det fungerade (och inte fungerade) i MikroBasic. När jag ska programmera något så brukar jag dela upp det i flera småtester för att sedan göra det slutgiltiga programmet när jag är nöjd med alla smådelar. Mycket smidigare än att modifiera massa grejjer i ett stort program tills man är nöjd...

Postat: 23 september 2005, 11:56:25
av sodjan
OK.
Det *jag* skulle göra nu, är att skicka ett mail till Mikroelektronics support och fråga om negativa "step" i for-loopar...

Postat: 23 september 2005, 20:29:46
av JimmyAndersson
Det ska jag också göra. :)

Postat: 5 oktober 2005, 19:42:06
av pcmper
det fungerar utmärkt i proton att skriva negativa loopar se exempel.

Device 16F877
XTAL = 20 ' Set Xtal Frequency

LCD_DTPIN = PORTD.4
LCD_RSPIN = PORTE.0
LCD_ENPIN = PORTE.1
LCD_INTERFACE = 4 ' 4-bit Interface
LCD_LINES = 2
LCD_TYPE = 0
ALL_DIGITAL = TRUE
DelayMS 500


Dim i As Byte


printas:
Print Cls , "hello"
For i = 3 To 0 Step -1
Print At 2,1, Dec i
DelayMS 2000
Next

GoTo printas
End :wink:

Postat: 11 oktober 2005, 03:13:16
av JimmyAndersson
Orättvist :lol:

Har aldrig programmerat i Proton, men koden för FOR-loopen är likadan. Enda skillnaden är att min inte vill fungera.
Ska se vad MikroBasic's support svarar på mitt mail, (om jag nu får det någon gång...) :)

Postat: 23 oktober 2005, 23:13:07
av Lonius
Mikroelektronikas Mikropascal funkar bätre tycker jag iaf, basicen var knepig. Bara mitt tycke :)

Postat: 23 oktober 2005, 23:42:03
av sodjan
Så länge som man kör gratisversionerna så är de väll precis lika prisvärda, antar jag... :-)