Ik ben in het bezit van een aantal at90s1200's in smd formaat. Nu heb ik ook een In-ciruit programmer, waar deze printjes ook geschikt voor zijn. Er is een ledje aangebracht op die print.

Nu wil ik eigelijk me echt gaan storten op het hoe en wat van microcontrollers en ben ik dus opzoek naar een simpel programma voor bijvoorbeeld het laten hoog en laag worden van een uitgang. (heel simpel prog dus)
Het gaat mij meer om de structuur en alles, gezien ik wel wat programmeer ervaring heb in oudere talen (Basic, Pascal)

Alvast dank voor reacties

Dit is de meest simpele structuur bij ASM.

.include "1200def.inc"

         rjmp RESET        ;reset handle


RESET:

Programma begint meteen vanaf het label RESET:, die .include duidt een bestandje aan genaamd 1200def.inc daarin zitten alle definities van de pinnen, timers, etc.
Dus je kan dan heel makkelijk bijv. dit doen.

sbi DDRB, 0
sbi PORTB, 0

De namen DDRB en PORTB staan in die 1200def.inc gedefineerd.

RES dit is niet om je onderuit te halen, dit is meer een aanvulling op wat jij poste.


.device		AT90S1200
.include	"1200def.inc"

.def	temp	= R16

;je opstart definitie zodat hij aan het begin van het geheugen begint

.CSEG				;codesigmentreheugenplaats 0
.ORG	0x00			;begin op geheugen plek 0

rjmp init			;spring naar plek main ,realjump
		
init:	ldi	temp,0xFF	;laad waarde 255 in temp 
	out	DDRB,temp	;datadirection port B
	ldi	temp,0x00	;laad waarde 0 in temp
	out	DDRD,temp	;data direction poort D in
	rjmp	main

main:
	in	PIND,temp	;laad de waarde die op PORTD staat in temp
	out	PORTB,temp	;laad de waarde die in temp staat in PORTB, dit is dus een output
		
	rjmp	main

Ik hoop dat het duidelijk voor je is wat het is en wat het doet. Anders vraag maar raak.

Hi captnoord,

Bedankt voor je reactie, ik hoop dat mijn inschatting van het programma voor een beginner al van voldoende niveau is:
.device AT90S1200 -> je compiler bekendmaken met instructieset
.include -> zoals RES beschreef

.def temp R=16 -> variabele declareren

.ORG 0x00-> je programmaregelteller op 0 zetten
.CSEG -> !help, geen idee!

rjmp init -> verwijzing naar subroutine

Ik hoop dat ik nu bij mezelf geen valse hoop creëer, maar denk dat ik het tot zover kan overzien.

Welke programmeertools zijn echt een aanrader. Ik heb ergenst ooit eens 'realizer' op een cdtje gehad, ik meen dat dit met logische poorten opgebouwd kon worden.
Nu ben ik niet direct opzoek naar een WYSIWYG, maar om gelijk hardcore met kladblok aan de slag te gaan is misschien wat heftig.

Nou vince_zld,


.def temp = R16

dit was goed
Je atmel heeft een aantal registers, deze hebben de namen R1..R32 als ik het goed heb. Asm voor atmels programeer je eigelijk met je de instrucion set naast je, dit is vooral in het begin. Download de datasheet maar eens van de Atmel site. Download dan ook de kleine datasheet die is handig voor erbij.

ASM programeer je niet zomaar, daar gaat wel een tijdje over heen om het echt te leren. De editor die vaak gebruikt wordt is AVR Studio, daar zit meteen ook een compiler in.

om e3ven trug te komen op je code

zoals ik eerder al zei is het dus
variablen declareren, let op deze zijn 8 bits.
.def temp = R16
.def temp1 = R17
.def temp2 = R18
enz

.ORG 0x00 heeft niks te maken met het verzetten van een programma regel teller. Deze instructie heeft te maken waar het programma begint in het geheugen. nu begint het programma op plaats 0. je kan b.v. een deel geheugen nemen en daar data in zetten. En dat dan voor je programma zetten.

rjmp is een "real jump" dit is geen subroutine, deze is meer te vergelijken met een goto.

ldi is load data in, dus laat de data in een variable.

het is ook mogelijk om met subroutines te werken, maar dit raad ik af in het begin.

een tip, lees nou niet de datasheet. Lees de instruction set. asm kan soms zeer ingewikkeld zijn, je moet je er gewoon in vast bijten. Het is iets wat je niet meteen door hebt. Het loopt allemaal logisch in asm. Dus je springt echt in je programma als een soort basic(basic is niet gelijk aan asm). Als je gewend bent C of C++ te programeren kan je van een kouwe kermis thuis komen.
voorbeeld.
if (temp == 1)
{
functie();
}
dit wordt in asm

ldi comparewaarde, 1
cpc temp, comparewaarde
breq functie
..... verdere programma

functie:
.....code van de functie

einde voorbeeld

een subroutine sprong is
RCALL

dit staat allemaal in de instruction set.

nogmaals houd moet want op een gegeven moment kan je het. Begin maar met mijn stukje programma, van de post hierboven. Dit doet ingelezen date direct op een uitgang zetten.
Van uit deze code kan je b.v. een loop licht maken, of logica aansturen ..... enz de mogelijkheiden zijn eindeloos.

Veel Succes toegewenst

[Bericht gewijzigd door Captnoord op ]

dus als ik een beetje opgelet heb (zal waarschijnlijk teveel naar mijn qbasic verleden wijzen)


.device		AT90S1200
.include	"1200def.inc"

.def	var	= R16

.CSEG				
.ORG	0x00

.rjmp start

start:	ldi	var1,0x00
	out	DBRB,var1
	NOP
	NOP
	NOP	;aantal keer afhankelijk van kloksnelheid
	ldi	var1,0x01
	out	DBRB,var1
	NOP
	NOP
	NOP
	ldi	var1,0x02
	out	DBRB,var1
	NOP
	NOP
	NOP
	ldi	var1,0x04
	out	DBRB,var1
	NOP
	NOP
	NOP
	ldi	var1,0x08
	out	DBRB,var1
	NOP
	NOP
	NOP
	ldi	var1,0x10
	out	DBRB,var1
	NOP
	NOP
	NOP
	ldi	var1,0x20
	out	DBRB,var1
	NOP
	NOP
	NOP
	ldi	var1,0x40
	out	DBRB,var1
	NOP
	NOP
	NOP
	ldi	var1,0x80
	out	DBRB,var1
	NOP
	NOP
	NOP
	rjmp 	start

Gelijk zal ik mezelf al aanvullen met het feit dat ik de variabele eigelijk zinloos vul. In plek van NOP te gebruiken, kan ik beter een for next loopje maken.

Maar als eerste programma een 4017 gemaakt:p

Graag uw commentaren

[EDIT] DDRB uiteraard [/EDIT]

*UPDATE*

In zeer hoge staat van jubelstemming kan ik mededelen dat mbv van AVR studio ik nog een paar kleine fouten uit mn routine heb kunnen halen. Er zit nog 1 fout in waar ik nog bezig ben, waardoor het niet zou opstarten (rjmp start) maar verder heb ik mn 8 kanaals 4017 virtueel draaiende..:)

okey hier komt mijn commetaar:P
het gaat goed, je hebt je code virtueel draaien. Dat wilt meestal niet zeggen dat ie werkt. Dat is uit ervaring gebleken. haha

tevens gebruik je je variable goed want je kan niet een constante naar de uitgang sturen. Je kan alleen een variable naar de uitgang sturen.


.device		AT90S1200
.include	"1200def.inc"

.def	var1	= R16

.CSEG				
.ORG	0x00

.rjmp unit

init:   ldi     var1, 0xFF     ;
        out     DDRD, var1     ; aangeven dat port D uitgangen zijn.
        rjmp    start

start:	ldi	var1,0x00
	out	PORTD,var1
	NOP
	NOP
	NOP	;aantal keer afhankelijk van kloksnelheid
	ldi	var1,0x01
	out	PORTD,var1
	NOP
	NOP
	NOP
	ldi	var1,0x02
	out	PORTD,var1
	NOP
	NOP
	NOP
	ldi	var1,0x04
	out	PORTD,var1
	NOP
	NOP
	NOP
	ldi	var1,0x08
	out	PORTD,var1
	NOP
	NOP
	NOP
	ldi	var1,0x10
	out	PORTD,var1
	NOP
	NOP
	NOP
	ldi	var1,0x20
	out	PORTD,var1
	NOP
	NOP
	NOP
	ldi	var1,0x40
	out	PORTD,var1
	NOP
	NOP
	NOP
	ldi	var1,0x80
	out	PORTD,var1
	NOP
	NOP
	NOP
	rjmp 	start

Ok, eindelijk een programmatje af(nog steeds hetzelfde, maar drukdrukdruk)
Overgeschoten in mn AVR, en uiteraard werkt dit niet.
in mn programma verwijs ik naar "1200def.inc" moet ik dit ook niet inladen?

Ik ken '.rjmp' niet. Verder ziet het er niet al te spannend uit.
Wat had je verwacht dat het zou doen en wat doet het?

het programma verliep eigelijk vrijwel helemaal ('t is ook zo groot) naar wens. Net wat wennen aan de simulatiesoftware.
Ook ben ik in bezit van een evaluatiebord ( heb de equinox Activ8r en Evalu8r) maar hier begon het programma niet op te lopen. dus ik steek het op die 1200def.inc

btw

rjmp is een "real jump" dit is geen subroutine, deze is meer te vergelijken met een goto

AVR assembly ken ik ook. Een rjmp dus ook. Maar in jouw source staat ergens een .jrmp.

Nog een keer: wat zou het moeten doen naar jou idee en wat doet het? Waar baseer je op dat er niets runt?

Ik kan de jrmp niet terugvinden in mn source, maar mocht ik hem gepost hebben in mn eerste versie, is dat waarschijnlijk een typfout in mn enthousiastme geweest.

De bedoeling van mn programma is buurtelings de 8 uitgangen van portD hoog te maken. Aantal NOP's zijn nog nader te bepalen. dit vervang ik misschien nog door een FOR NEXT loop.

Ik heb het vermoeden dat ik die 1200def.inc moet bijladen, het is mn eerste ervaring met asm, maar wil me er wel serieus in gaan verdiepen. Als ik mn AVR in mn evaluatieboard steek, heb ik geen activiteit. Ik heb nog geen meetpen erop gedrukt. Tijd is vaak een beslissende factor(helaas)

.CSEG				
.ORG	0x00

.rjmp unit

init:   ldi     var1, 0xFF     ;

Brilletje nodig???

Nou weet ik nog steeds niet waar je op baseert dat die 1200 niets doet... Hij zit in je evaluatie board... En dan??? Wat voor een board is dat en waar baseer je op dat het ding niets doet (3de en laatste keer dat ik het vraag hoor...)

zoals ik eerst al aangaf vermoed ik dat hij niets doet, ik heb nog niets gemeten. Slechts snel het programma overgeschoten en in het equinox Evalu8r bordje gestoken.
Echter bij inschakelen van voedingsspanning gebeurde niets.

Ik ben er nog niet aan toe gekomen om deze te controleren

en het spijt me zeer, maar je .jrmp zie ik niet staan.
.rjmp zou misschien zonder de . moeten, ik ben echt nog een leek hoor

Op 15 december 2005 19:44:02 schreef vince_zld:
zoals ik eerst al aangaf vermoed ik dat hij niets doet, ik heb nog niets gemeten. Slechts snel het programma overgeschoten en in het equinox Evalu8r bordje gestoken.
Echter bij inschakelen van voedingsspanning gebeurde niets.

Zucht Ik laat het hierbij. Ik weet nog steeds niet wat er zou moeten gebeuren... Er zal wel iets aan de pennen van die AVR hangen, maar ik weet nog steeds niet wat. Ben ook niet van plan om uit te gaan zoeken wat dat voor een bord is. Als je zelf niet de moeite neemt om dit soort simpele vragen te beantwoorden, kun je moeilijk van mij verwachten dat ik ze blijf stellen.

Ik ben er nog niet aan toe gekomen om deze te controleren

en het spijt me zeer, maar je .jrmp zie ik niet staan.
.rjmp zou misschien zonder de . moeten, ik ben echt nog een leek hoor

Zucht... Laaste code post, 9de regel van boven. Ben ik nou degene die tijd in dit soort bullshit moet steken of kun je zelf de moete nemen eens te kijken wat je gepost hebt???

het zal wel zijn dat we elkaar niet begrijpen, maar ik ben nog altijd niet mee. morgen de post's nog wel eens opnieuw lezen maar in ieder geval mijn excuuses voor je irritatie aan mij.

Weer even een nieuwe vraag,

Ik heb mijn programma geschreven, en overgestuurd naar mijn AVR. Ik heb een evalu8r testbord, waar ik de boel kan bekijken. Het rare is dat als ik de boel aansluit, ik geen klok heb, maar als ik de massa van mijn scope (welke niet aan aarde ligt) aansluit aan mn Xtal, deze wel begint te lopen...

Als je heel snel resultaat wil kan je ook in
BascomAVR ( basic alike )

Ballast condensatortjes vergeten / onjuiste waarde?

@electron:

Hoe bedoel je, als je snel resultaat wil? is het een simulatieprog ofzo?

Ik gebruik nu AVRstudio, en dat gaat me wel redelijk af

[edit] verduidelijking [edit]

[Bericht gewijzigd door vince_zld op ]

Elektron wijst jou op een hogere programmeer taal..

voorbeeldje ..

laat variabele aap oplopen van 1 tot 10..

ASM

opnieuw:

Inc Aap
cpi temp,$A
Brne Opnieuw

Bascom Avr.

For temp = 1 to 10
incr aap
next temp

Wanneer je AVR Studio en de daarbij behorende programmeertaal onder de knie hebt, moet je juist daarmee verder gaan.

Aangezien je ook kennis van Pascal en VB hebt, is het een relatief kleine stap naar Bascom.

Maar zoals gezegd, indien je met AVR Studio al uit de voeten kunt, raad ik je aan om daar mee verder te gaan.Bascom zal namelijk meer geheugen vreten van je Atmel..

Laat ik mn eigen blaadje maar blijven gebruiken.

Wederom een vraagje, waar ik al een paar uur op zit te hameren. Waarschijnlijk lees ik ergenst overheen.

Ik wil een routine maken, die simpel 1 bit hoog of laag maakt. De rest van de data op de poort moet ongewijzigd blijven.


ldi 	mask, 0x40		; pb6 selecteren
ldi	r17, 0xFF
and 	R17, mask		; clock hoog
out 	portd, bus		; op SCL zetten

Dit wou niet wat ik wou. Met wel commando selecteer ik puur PB6?