Pratar Assembler. Vill lära mig nytt språk..

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
kvaark
Inlägg: 256
Blev medlem: 1 september 2010, 22:19:39

Re: Pratar Assembler. Vill lära mig nytt språk..

Inlägg av kvaark »

Hittade detta
http://www.gooligum.com.au/tut_baseline_C.html

så nu har jag blinkat en led med koden skriven i C :D

och förstod till och med vad jag gjorde

känner mig faktiskt klokare nu så jag kommer kunna hänga med bättre i trådarna här på ef...

Men jag behöver läsa på betydligt mer innan jag kommer gå över till C helt..
Användarvisningsbild
adent
Inlägg: 4232
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Pratar Assembler. Vill lära mig nytt språk..

Inlägg av adent »

Vissa grejjer är ju lite jobbigare i C tyvärr, men man vänjer sig.

Kod: Markera allt

#define PB3  8

PORTB |= PB3;
eller:

Kod: Markera allt

#define PB3 3

PORTB |= (1 << PB3);
¨

Är i regel mycket lättare att skriva i assembler. All clear:a en bit är ännu meckligare.

Kod: Markera allt

#define PB3 3

PORTB &= ~(1 << PB3);
¨

Men de flesta beräkningar blir enklare, speciellt när man använder 16-bitars-tal på en 8-bit-MCU.


Skrev detta igår, men glömde posta...
Användarvisningsbild
psynoise
EF Sponsor
Inlägg: 7225
Blev medlem: 26 juni 2003, 19:23:36
Ort: Landvetter

Re: Pratar Assembler. Vill lära mig nytt språk..

Inlägg av psynoise »

Fast ska man ställa enstaka bitar tycker jag det finns all rätt att använda makron för att göra koden mer läsbar. I AVR-libc finns följande som exempel

Kod: Markera allt

#define GLUE(a, b)     a##b
#define SET_(what, p, m) GLUE(what, p) |= (1 << (m))
#define CLR_(what, p, m) GLUE(what, p) &= ~(1 << (m))
#define GET_(/* PIN, */ p, m) GLUE(PIN, p) & (1 << (m))
#define SET(what, x) SET_(what, x)
#define CLR(what, x) CLR_(what, x)
#define GET(/* PIN, */ x) GET_(x)

/* Utgång */
#define UT A, 3

/* Ettställa en bit */
SET(PORT, UT);

/* Nollställa en bit */
CLR(PORT, UT);
Användarvisningsbild
adent
Inlägg: 4232
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Pratar Assembler. Vill lära mig nytt språk..

Inlägg av adent »

Jo macrona är bra förstås, men man ska nog ha förstått vad den "egentligen" gör...
Fast i slutändan blir det förhoppningsvis nån form av bit set eller bit clear-maskinkod av
det hela iaf.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Pratar Assembler. Vill lära mig nytt språk..

Inlägg av sodjan »

I MPLAB XC8 gör man t.ex :

Kod: Markera allt

  PORTAbits.RA2 = 1;
  PORTAbits.RA2 = 0;
  if (PORTAbits.RA2 == 1);
för att hantera en enskild bit. Jag vet inte om något
macro skulle göra det så värst mycket tydligare.

Se: "MPLAB XC8 C Compiler User’s Guide":
http://ww1.microchip.com/downloads/en/D ... 52053B.pdf
Kapitel "5.3.6 Using SFRs From C Code" sidan 137.
kvaark
Inlägg: 256
Blev medlem: 1 september 2010, 22:19:39

Re: Pratar Assembler. Vill lära mig nytt språk..

Inlägg av kvaark »

Hur gör man sådana där rutor med kod i här på ef?
Användarvisningsbild
SeniorLemuren
Inlägg: 8332
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

Re: Pratar Assembler. Vill lära mig nytt språk..

Inlägg av SeniorLemuren »

Klicka på Code- rutan ovanför skrivarean du får då upp texten: "". Skriv eller kopiera in din kod mellan code blocken.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Pratar Assembler. Vill lära mig nytt språk..

Inlägg av sodjan »

Så här såg t.ex mitt förra inlägg ut när jag skrev det:

Kod: Markera allt

I MPLAB XC8 gör man t.ex :
[code]
  PORTAbits.RA2 = 1;
  PORTAbits.RA2 = 0;
  if (PORTAbits.RA2 == 1);
för att hantera en enskild bit. Jag vet inte om något
macro skulle göra det så värst mycket tydligare.

Se: "MPLAB XC8 C Compiler User’s Guide":
http://ww1.microchip.com/downloads/en/D ... 52053B.pdf
Kapitel "5.3.6 Using SFRs From C Code" sidan 137.[/code]
Notera de två "code" och "/code" taggarna...
kvaark
Inlägg: 256
Blev medlem: 1 september 2010, 22:19:39

Re: Pratar Assembler. Vill lära mig nytt språk..

Inlägg av kvaark »

Kod: Markera allt

Japp tror jag fattar nu.. 
kvaark
Inlägg: 256
Blev medlem: 1 september 2010, 22:19:39

Re: Pratar Assembler. Vill lära mig nytt språk..

Inlägg av kvaark »

Ok så jag bestämde mig för att prova något lite mer avancerat än att blinka en led..

Detta va vad jag kom fram till

Kod: Markera allt

#include <xc.h>
#include <stdint.h>


#pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FOSC = INTRCIO, FCMEN = OFF, MCLRE = OFF, WDTE = OFF, CP = OFF, PWRTE = OFF

#define	_XTAL_FREQ	8000000
#define	LED PORTAbits.RA2
#define	RX	PORTCbits.RC0

void main()
{
	uint8_t	count;
	uint24_t	adress;
	uint24_t	nyckelon = 4214805;
	uint24_t	nyckeloff = 4214804;

	TRISA =	0b11111011;
	TRISC =	0b11111111;
	OSCCON = 0b01110001;
	ANSEL = 0;
	ANSELH = 0;
	for	(;;)
	{
		//Vänta på att RX = 0 i 7mS
		for (count = 0; count <= 70;	count++)
		{
			__delay_us (100);
			if (RX == 1)
			count = 0;
		}
		//läs av in signaler spara i adress
		adress = 0;
		for (count = 0; count < 24;	count++)
		{
			adress = adress << 1 ;
			while (RX == 1)
			{
				;
			}
			while (RX == 0)
			{
				;
			}
			__delay_us(740);
			adress = adress ^ RX;
		}
			//Gämför adress med nyckel
			if (adress == nyckelon)
			LED = 1;
			if (adress == nyckeloff)
			LED = 0;			
	}	
}		
Denna kod läser av en NEXA fjärrkontroll och tänder släcker en lysdiod

Om ni vill komma med tips om sådant som ni ser jag kan förbättra så gör gärna det :)
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Pratar Assembler. Vill lära mig nytt språk..

Inlägg av sodjan »

> __delay_us(740)

Det är sådant som man som nybörjare lätt tar till för att det
är enkelt, men som man ganska snart upptäcker inte fungerar
alls när det börjar bli lite mer funktioner i programmet. Du kommer
att behöva studera bl.a "timers" och "interrupt".

Annars vet jag inte, fungerar det så fungerar det...
kvaark
Inlägg: 256
Blev medlem: 1 september 2010, 22:19:39

Re: Pratar Assembler. Vill lära mig nytt språk..

Inlägg av kvaark »

>Det är sådant som man som nybörjare lätt tar till för att det
är enkelt, men som man ganska snart upptäcker inte fungerar
alls när det börjar bli lite mer funktioner i programmet. Du kommer
att behöva studera bl.a "timers" och "interrupt".

Jo men vist är det onödigt att krångla till saker och ting när det inte behövs.. :vissla:

Interupt är dock svårt då RX signalen är så skräpig när ingen signal sänds..

Men en timer skulle jag kunna använda helt klat

VIDEO:http://www.youtube.com/watch?v=wvYHNEYu ... e=youtu.be

Detta projekt ska byggas på med en liten vinsch som ska veva ner persiennerna i vardagsrummet när jag slår på tv'n och det är ljust ute
samt hissa upp dom när tv'n stängs av

Inte så avancerat...

Men jag tänkte att det får bli mitt första projekt i C
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Pratar Assembler. Vill lära mig nytt språk..

Inlägg av sodjan »

> Interupt är dock svårt då RX signalen är så skräpig när ingen signal sänds..

Det var en generell kommentar kring programvaru-delayer, jag vet inte
ett smack om det som du försöker göra. Men som sagt, fungerar
det så fungerar det... :-)
kvaark
Inlägg: 256
Blev medlem: 1 september 2010, 22:19:39

Re: Pratar Assembler. Vill lära mig nytt språk..

Inlägg av kvaark »

>Det var en generell kommentar kring programvaru-delayer,

Ok förklara mer?

Som jag förstår det så är lite vitsen med en timer att man kan göra lite andra saker under tiden man väntar plus att det kanske tar mindre plats i programminnet.

:humm:
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Pratar Assembler. Vill lära mig nytt språk..

Inlägg av sodjan »

Exakt! :-)
Därför använder man inte delay-funktioner...
Skriv svar