Gubbe

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Mutiaz
Inlägg: 295
Blev medlem: 3 april 2004, 17:29:53

Gubbe

Inlägg av Mutiaz »

Tjena! Håller på med en uppgift där jag ska göra en gubbe som vandrar på LCDn. Gubben har jag fixat. Men problemet är att den ska gå till slutet av displayen och sen stanna där. Jag kör PicBasic med en 16F877.

Såhär långt har jag kommit:

DEFINE LOADER_USED 1

' LCD registers and bits
DEFINE LCD_DREG PORTD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTE
DEFINE LCD_RSBIT 0
DEFINE LCD_EREG PORTE
DEFINE LCD_EBIT 1

ADCON1 = 7
Low PORTE.2


' custom characters

LCDOut $FE, 64, $8e, $8e, $84, $8e, $95, $84, $8a, $91


LCDOut $FE, 1



loop:

LCDOut $00
LCDOut $FE, $14
Pause 500

GoTo loop




End




Undrar om någon vänlig själ kan hjälpa mig med detta?

Mvh
//Mathias
Användarvisningsbild
Hedis
Inlägg: 2493
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

Räkna helt enkelt hur många steg gubben har tagit.

Ett värde som ökas varje gång du flyttar gubben ett steg. I början på rutinen som flyttar gubben gämnför du värdet med antalet rutor.
Om det stämmer så hoppa till stop eller return lr vad du nu vill göra och nolla räknaren.
Mutiaz
Inlägg: 295
Blev medlem: 3 april 2004, 17:29:53

Inlägg av Mutiaz »

Okej. Kan du kanske berätta hur man göra räknaren? Jag är bara på övn 4 hehe =)
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

Kanske inte är så här Hedis tänker men detta borde funka ändå.

Deklarera en variabel, sätt in den i loopen så att den plussas på med ett för varje loop, använd en vilkorssats för att kolla när variabeln nått något värde, avsluta då programmet.

T ex:

Kod: Markera allt


LOOP: 

IF kalle = 10 THEN
END
ENDIF

LCDOut $00 
LCDOut $FE, $14 
PAUSE 500 

kalle = kalle + 1

GoTo LOOP

Användarvisningsbild
Hedis
Inlägg: 2493
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

Nu kan jag inte basic´n men i asm så blir det ungefär såhär:

Kod: Markera allt

main:
ldi step,$00  ; laddar step med 0
right:
cpi step,20 (om du vill bryta efter 20 steg) ;Jämnför step med 20
inc step ; Ökar step med 1
breq main ; Om steg var 20 så hoppa till main
*rutinen som hoppar åt höger* ;Din rutin för att flytta gubben ett steg åt höger
rjmp loop
Mutiaz
Inlägg: 295
Blev medlem: 3 april 2004, 17:29:53

Inlägg av Mutiaz »

Har testat men problemet som blir är att gubben bakom syns. Gubben bakom måste alltså rensas så det inte blir femton gubbar utan bara en som flyttar sig.. Nån som vet?
Användarvisningsbild
Hedis
Inlägg: 2493
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

Det problemet måste du ju alltid ha haft eller?
Skicka en clear screen mellan varje steg så löser det sig.
Ett alternativ är ju att du shiftar hela displayen åt höger. Läs i databladet för HD44780 kontrollern för att se kommandona,
Användarvisningsbild
Noddan
Inlägg: 257
Blev medlem: 23 september 2004, 16:28:12
Ort: Göteborg
Kontakt:

Inlägg av Noddan »

Det finns oftast ett inbyggt kommando för att rensa lcd-skärmen på kontrollerchippet. Testa med det, borde avhjälpa problemet (rensa skärmen precis innan du ritar ut nästa gubbe).
Mutiaz
Inlägg: 295
Blev medlem: 3 april 2004, 17:29:53

Inlägg av Mutiaz »

jack skrev:Kanske inte är så här Hedis tänker men detta borde funka ändå.

Deklarera en variabel, sätt in den i loopen så att den plussas på med ett för varje loop, använd en vilkorssats för att kolla när variabeln nått något värde, avsluta då programmet.

T ex:

Kod: Markera allt


LOOP: 

IF kalle = 10 THEN
END
ENDIF

LCDOut $00 
LCDOut $FE, $14 
PAUSE 500 

kalle = kalle + 1

GoTo LOOP

Fan nu funkar inget.. Hur deklarerar man en variabel? typ såhär: "kalle VAR BYTE" ??
Användarvisningsbild
Hedis
Inlägg: 2493
Blev medlem: 8 december 2003, 15:10:44
Ort: Vänersborg
Kontakt:

Inlägg av Hedis »

Du måste nolla kalle först.
Dessutom så måste du ha ngt efter THEN. (Ahh! missade att du hade END på nästa rad...)

Typ den rutinen du vill hopps till när du har gått "slut" på raden.
Då måste du dessutom tömma "kalle" igen så den är klar att använda nästa gång.
Mutiaz
Inlägg: 295
Blev medlem: 3 april 2004, 17:29:53

Inlägg av Mutiaz »

Hur tömmer man det då?
Användarvisningsbild
jack
EF Sponsor
Inlägg: 2059
Blev medlem: 5 oktober 2004, 17:32:27

Inlägg av jack »

Tänkte inte på det.

kalle = 0
Lägg den någonstans i början av programmet. Inte i loopen.
Mutiaz
Inlägg: 295
Blev medlem: 3 april 2004, 17:29:53

Inlägg av Mutiaz »

Nu funkar det igen! Men om jag använder $14 att cursorn går ett steg åt höger så blir det ett mellanrum mellan två chars. Det finns ju ett $1C som scrollar gubben men det blir då en lång svans efter. Kan man få bort den? Jag har provat med clear display ($FE, 1) men det funkar inte...
Användarvisningsbild
karlstedt
EF Sponsor
Inlägg: 966
Blev medlem: 14 oktober 2003, 16:55:23
Ort: Lund
Kontakt:

Inlägg av karlstedt »

En vanlig HD44780(?) flyttar markören automatiskt ett steg åt höger när du skriver ett tecken så du ska inte behöva göra det. Det borde räcka att du skriver dina gubbar på raken och tömmer displayen mellan skrivningarna.
Mutiaz
Inlägg: 295
Blev medlem: 3 april 2004, 17:29:53

Inlägg av Mutiaz »

Såhär ser det ut nu:

Kod: Markera allt

DEFINE	LOADER_USED	1

' LCD registers and bits
DEFINE  LCD_DREG        PORTD
DEFINE  LCD_DBIT        4
DEFINE  LCD_RSREG       PORTE
DEFINE  LCD_RSBIT       0
DEFINE  LCD_EREG        PORTE
DEFINE  LCD_EBIT        1


gubbe     VAR     BYTE 


        ADCON1 = 7      
        Low PORTE.2     

        
' custom characters
        
        gubbe = 0
        
	    LCDOut $FE, 64, $8e, $8e, $84, $8e, $95, $84, $8a, $91 			
	   	
	    
	    LCDOut $FE, 1				

		



LOOP: 

		IF gubbe = 10 Then End
		
	
		LCDOut $00 
		
		LCDOut $FE, $14 
	
		Pause 500 
		
		gubbe = gubbe +1
		
	

GoTo LOOP 




        End
Var ska jag lägga rensningen?
Skriv svar