een vraag over programmeertalen:
momenteel werk ik met bascom AVR. lukt vrij aardig maar deze is beperkt tot 4K. nu heb ik op de site van atmel AVR studio eens geprobeert (gratis en onbeperkt) maar dit is weer assembler natuurlijk. nu is mijn vraag wat ik best kan doen. investeren in bascom AVR of assembler aanleren. ik ken niet echt de verschillen (voor en nadelen) tegen over elkaar maar het lijkt mij logisch dat je meer bent met assembler. ik heb ondertussen al zo in de instructie set aan het kijken geweest en naar wat programmaatjes op het web. nu valt me op dat niet alle gebruikte commando's terug te vinden zijn in de instructie set. iemand een idee waar er op het web een (zeer) goede uitleg of cursus over assembler is te vinden? ik vind enkel beknopte documenten, waarvan ik persoonlijk vind dat deze niet genoeg info bevatten om te kunnen starten.
Belleblaas
BelleBlazer4Life
AVR Studio met geintegreerde WinAVR C compiler.
WinAVR los te installeren.
http://www.avrfreaks.net/index.php?module=Freaks%20Tools&func=view…
dan moet ik C leren?
zelfde vraag, waar kan ik info vinden om dit (C) zelfstandig te kunnen aanleren? (zo volledig mogelijk)
Bart Hiddink
Bart Hiddink is Ideetron; electronics and projects, http://www.ideetron.nl. LoRaWAN Nutcase.
Ehh.. www.bol.com?
Belleblaas
BelleBlazer4Life
Ja dan moet je C leren.
Even Goolgle dan kom je er wel uit.
Volgens mij ook eerder op dit forum besproken.
Voor de handleiding van de AVR library kun je hier terecht: http://www.nongnu.org/avr-libc/
Op 18 september 2007 16:41:57 schreef Bart Hiddink:
Ehh.. www.bol.com?
dat boek "AVR-microcontrollers" heb ik al, goed boek trouwens, wel nog niet helemaal uitgelezen. zal me daar wel wat verder in verdiepen. dit is wel weer assembler. over C heb ik geen boeken of info -> ik had me al een beetje gericht op assembler.
Op 18 september 2007 16:30:45 schreef bit:
dan moet ik C leren?zelfde vraag, waar kan ik info vinden om dit (C) zelfstandig te kunnen aanleren? (zo volledig mogelijk)
Koop GEEN boek van Ammeraal... Je zou eens bij de Slegte kunnen kijken. Grote kans dat je voor een paar euro een prima boek koopt. Je hebt een boek nodig dat ANSI C beschrijft en niet C++.
Belleblaas
BelleBlazer4Life
Zoek eens het verschil tussen C en C++. Die zijn er wel degelijk.
Het boek van meneer A is achteraf wel een GOED naslagwerk.
WinAVR...gebaseerd op de AVRGCC compiler ondersteund ook (steeds) meer C++ conventies.....blijf echter wel allert(..lees dan maar ook de printf docs bijv. das toch een pure C aangelegenheid)
Het blijft altijd raden of alle afspraken zijn/worden nageleefd.
[Bericht gewijzigd door Belleblaas op (19%)]
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Als je C wilt leren is "The C programming language" van Kernighan & Ritchie natuurlijk ultiem. Is Engels een probleem?
engels is geen probleem, ben momenteel "Beginners introduction to the assembly language of ATMEL-AVR-microprocessors" aan het leren. in de meeste documentatie staan de instructies wel uitgelegd maar hoe je nu moet starten (vb initialisatie van de in en uitgangen enzo) vindt je nergens. ik heb ook de indruk dat de meeste hier voorstander zijn van C, waarom? zoveel voordelen aan? ik dacht dat je best zo dicht mogelijk bij de controllertaal moest gaan.
Ik ben zelf sterk voorstander van assembly op dergelijke controllers. Enige voordeel van C is dat je over een aantal zaken niet na hoeft te denken. Zolang het doet wat jij wilt...
Ik snap overigens niet wat je bedoelt met 'initialisatie van in en uitgangen'. Wat zou een taal als Basic of C dan voor je initialiseren???
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Ik vind C vooral handig, omdat je er zowel programma's die op de PC moeten draaien, als programma's die op een µC moeten draaien, mee kan aanmaken.
Daarnaast leunt C sterk aan tegen assembler, terwijl het toch een boel werk uit je handen neemt.
@ marco: intialeren bedoel ik zoals bij vb bascom: config portb.1 = output. belangrijk om te kunnen starten lijkt mij maar over deze zaken vindt je steeds weinig terug.
@ pros: lijkt mij zeer interessant om inderdaad een taal te hebben waar je progjes voor op PC kan mee schrijven maar ik vrees dat dat nog wat hoog gegrepen is voor mij. is dat niet ingewikkeld? ik zie daar wel wat voordelen in natuurlijk, kleine progjes waarmee je je schakelingen kunt aansturen? ik had daar gedacht aan visual basic (wat ik toch ook nog moet aanleren trouwens).
In assembly (asembler is de tool om assembly te assembleren...) heb je daar een directe match op: je DDR. Feitelijk zet dat ding de juiste bit in DDRB. Het wordt dus gewoon een sbi op DDRB met de gewenste bit.
dat is nog steeds chinees voor mij.
klopt het dat het zo gaat:
.def temp = R16
ser temp
DDRB portb, temp (hier wordt de poort als volledige output voorzien)
out portb, temp (hier worden alle uitgangen hoog gezet.
klopt dit verhaal een beetje?
Op 19 september 2007 09:31:45 schreef bit:
@ pros: lijkt mij zeer interessant om inderdaad een taal te hebben waar je progjes voor op PC kan mee schrijven maar ik vrees dat dat nog wat hoog gegrepen is voor mij. is dat niet ingewikkeld? ik zie daar wel wat voordelen in natuurlijk, kleine progjes waarmee je je schakelingen kunt aansturen? ik had daar gedacht aan visual basic (wat ik toch ook nog moet aanleren trouwens).
Ik denk dat Pros bedoeld dat je je routines eerst op de PC schrijft en test en daarna compileerd voor de AVR (of een andere controller). Dat gaat met de taal C heel erg goed. De bibliotheken zijn gestandariseerd dus iets afdrukken met printf blijft altijd werken.
Een goede softwareontwikkelaar schrijft software in lagen. De onderste laag stuurt de hardware aan, de lagen daarboven hebben niets meer met de hardware te maken. De hogere lagen kun je dus eerst op de PC testen.
Er zijn voor sommige controllers ook simulators, maar de bruikbaarheid hangt af van de hoeveelheid geld die je wilt besteden.
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Op 19 september 2007 18:28:40 schreef Nico.c:
Ik denk dat Pros bedoeld dat je je routines eerst op de PC schrijft en test en daarna compileerd voor de AVR (of een andere controller).
Niet echt. Ik heb het wel degelijk over programma's die bedoeld zijn om op de PC te draaien. Om te communiceren met een AVR, bijvoorbeeld.
Wat simulators betreft: daar heb ik weinig vertrouwen in. Ze simuleren maar wat aan, is mijn indruk... 
Op 19 september 2007 12:27:47 schreef bit:
dat is nog steeds chinees voor mij.
klopt het dat het zo gaat:.def temp = R16
ser tempDDRB portb, temp (hier wordt de poort als volledige output voorzien)
out portb, temp (hier worden alle uitgangen hoog gezet.
klopt dit verhaal een beetje?
Een beetje ja 
Ik zou voor een
out DDRB, temp
out PORTB, temp
gaan.
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
Op 19 september 2007 20:44:06 schreef pros:
Wat simulators betreft: daar heb ik weinig vertrouwen in. Ze simuleren maar wat aan, is mijn indruk...
Zonder simulatoren zou er weinig soft-en hardware ontwikkeling plaatsvinden in de wereld. Maar er geld natuurlijk wel: garbage in, garbage out. Dus altijd uitkijken wat je aan het doen bent.
Ik vind assembly ook het mooist voor PIC, AVR etc. Gewoon de datasheet met instructieset erbij en typen.
[Bericht gewijzigd door flipflop op (12%)]
Ik heb deels een beetje voor assembler gekozen omdat ik ervan uit ging dat deze taal het meest overkoepelend was voor de controllers, daarmee bedoel ik voor 8051, avr en PIC (mocht ik ooit zo ver raken om me met verschillende types bezig te houden)
@ marco:
het klopt dus dat commando: "out DDRB, temp" de pinnen van een poort configureerd als in of uitgangen, 1 uitgang <-> 0 ingang. ik moet eerlijk zijn dat al die documentatie die te vinden is op het web niet echt duidelijk zijn. hier en daar blijf je steeds met vragen achter.
Ach, als je die Atmel documentatie al slecht vindt... Kun je je lol nog op als je met wat vager spul aan de gang gaat. Wat ik zoek, heb ik meestal toch wel met een paar minuten te pakken...
Datasheet van het chippie eens doorspitten. Uitzoeken waar de registertjes voor zijn. Volgens mij zit daar je probleem. In welke taal je het programmeert, maakt daarna niet zoveel meer uit.
Het is zeker aan te raden assembly te leren. De reden hiervoor is, dat je met assmbly de microcontroller rechstreeks bestuurt. Op die manier leer je niet alleen het taaltje, maar leer je ook hoe een AVR in elkaar steekt.
D'r zijn twee takken die je 'moet' leren.
-Welke instructies zijn er en wat doen ze
-Hoe manipuleer je de AVR met z'n IO registers.
Beiden kun je heel makkelijk met AVRstudio leren. Belangrijk is dat je de volledige datasheet van je gewenste ATmega controller download. Vervolgens alle belangrijke hoofstukjes redelijk vluchtig doorlezen:
-Reset mechanisme
-Clock mechanisme
-Geheugenbeheer
-Poorten beheer
-Poort speciale functies
Die datasheet heeft antwoord op alle vragen die je zou kunnen krijgen.
Het leren van de AVR assembler instructies doe je met de F1-help functie van AVRstudio. Die help beschrijft elke instructie tot in detail.
En dan nu een template voor je eerste AVR programma:
; =========================================================================================================
; Definitions
; =========================================================================================================
.include "m32def.inc" ;(voor ATmega32)
; =========================================================================================================
; RAM variabeles
; =========================================================================================================
.dseg
.org SRAM_START
MyVariabele .byte 1
; =========================================================================================================
; Interrupt vector table
; =========================================================================================================
.cseg
.org 0x0000
JMP HandleReset ;(Re)start the application.
.org INT_VECTORS_SIZE ;Start of application area.
; =========================================================================================================
; Application initialization
; =========================================================================================================
HandleReset: CLI
LDI R16, Low(RAMEND) ;Set up the stack pointer.
LDI R17, High(RAMEND)
OUT SPL, R16
OUT SPH, R17
MainLoop: <Hier komt je programma>
RJMP MainLoop
Wat initialisatie aangaat: Lees de datasheet, stukje over poorten. Dan zul je vinden dat alle poort control registes met 0 worden gevuld. Als je dan kijkt wat dat betekent, zul je zien dat een poort dan als ingang is gedefineerd zonder interne pull-ups.
@magicbox: ziet er knap uit. zal toch maar eerst mijn boekje en info van het net verder uitlezen omdat ik nog niet door alle instructies ben. het probleem is gewoon dat ik sommige dingen niet direct snap, ben nu op een punt gekomen waar dingen staan als dit:
MyTable:
.DW 0x1234,0x2345,0x3456,0x4568,0x5678 ; The table values, wordwise
.DW 0x6789,0x789A,0x89AB,0x9ABC,0xABCD ; organised
Read5: LDI ZH,HIGH(MyTable*2) ; Adress of table to pointer Z
LDI ZL,LOW(MyTable*2) ; multiplied by 2 for bytewise access
ADIW ZL,10 ; Point to fifth value in table
LPM ; Read least significant byte from program memory
MOV R24,R0 ; Copy LSB to 16-bit register
ADIW ZL,1 ; Point to MSB in program memory
LPM ; Read MSB of table value
MOV R25,R0 ; Copy MSB to 16-bit register
die zaken rond die 16-bit registers zijn zeer vaag, ik weet ook niet of je dat direct nodig hebt van het begin. ik ga ook mijn assembler leren met een attiny12. is dat goed om te beginnen of te klein?
Om te beginnen is niets te klein. Sterker nog, doordat die tiny's zo klein zijn krijg je extra mogelijkheden die je in de grotere niet hebt. Maar da's niet van belang.
Met de 16-bit registers, program memory en data memory is het van belang dat je gaat begrijpen hoe de geheugenstruktuur in elkaar zit. Dit is ook in de datasheet te vinden. Alvast een opzetje:
Het "program memory" waar je programma en je constanten in zitten is georganiseerd als 16-bit woorden, in plaats van 8-bit zoals je gewend bent.
Dit betekent dat alle labels wijzen naar 16-bit woorden. Voorbeeld:
Adres Inhoud
Label1: 0x0000 0x3412
Label2: 0x0001 0x7856
Nu kun je wel bytes uitlezen uit het programma geheugen, maar dan moet je het als 8-bit woorden addresseren. Om de 0x56 uit te lezen, moet je dan het adres met 2 vermenigvuldigen (= gelijk aan 1x schuiven naar links: Label2 << 1) Dus krijg je:
LDI ZH, High(Label2 << 1)
LDI ZL, Low(Label2 << 1)
LPM R0, Z
In R0 heb je nu de waarde 0x56 zitten
Beste is dit eens in de template gooien, en in AVR studio gaan simuleren. De simulator is niet gelimiteerd, wat die laat zien is zoals het zal gaan werken in de AVR uiteindelijk.
Dan kan je ook de memory schermpjes openen zodat je in het programma geheugen, datageheugen en IO geheugen kunt kijken en zien wat het ding nu eigenlijk aan het doen is. De simlator is je grootste vriend bij het leren begrijpen van dinge.
ik ben nu zowat van alles aan het lezen rond assembler is dit dom dit eerst te doen? beter eerst de datasheet en dat assembler? (of tegelijk ... ga ik helemaal flippen)