Nicht dass ich wüsste, ich schau mal ob ich eine Lösung hinbekomme.btw: Tabs nach Text, sowohl innerhalb, als auch außerhalb von Codeboxen ist ein Krampf.
Gibt's da 'ne einfache Möglichkeit, die ich nicht gefunden habe?
Nicht dass ich wüsste, ich schau mal ob ich eine Lösung hinbekomme.btw: Tabs nach Text, sowohl innerhalb, als auch außerhalb von Codeboxen ist ein Krampf.
Gibt's da 'ne einfache Möglichkeit, die ich nicht gefunden habe?
Danke.Nicht dass ich wüsste, ich schau mal ob ich eine Lösung hinbekomme.
Richtig, ABER wie gesagt:Wenn Du C-Funktionen aufrufen willst, muß er vorher initialisiert sein.
Genau genommen ist der Stack in jedem AVR mit dem Reset bereits initialisiert. In ururalten AVR ohne SRAM über den 3-level-Stack; in allen AVR mit SRAM und Stackpointer (in den SRAM) wird der Stack während des Reset initialisiert. Immer. Bei den Dinosauriern auf 0x0000, bei "moderneren" auf RAMEND. Deswegen "meist". Dinos setz ich selten ein.Den Stack brauch ich meist nicht zu initialisieren
Naja, 'n bisschen lesen kann ich C auch (wegen TurboPascal und Delphi ? ) - jedenfalls hab ich irgendwie die .h vernachlässigt. Den Rest geh ich morgen nochmal durch...So, Schritt für Schritt. Erstmal die einfachere Version: Asm von C aus aufrufen.
Etwas C-Syntax mußt Du sowieso lernen, wenn Du C-Funktionen aufrufen willst und wenn Du den Präprozessor schon benutzt hast, wird Dir einiges bekannt vorkommen
Letztendlich ist es auch nicht komplizierter...Letztendlich ist die "kompliziertere Variante" natürlich mein Ziel...
#include <avr/io.h> #define INC uint8_t summe = 0; uint8_t summand = 0; uint8_t addiere(uint8_t var) { return summe += var; } void nacktfrosch(void) { #ifdef INC summand++; #else summand--; #endif }
.extern summe .extern summand .extern addiere .extern nacktfrosch .func main .global main main: lds r24, summe 0: rcall addiere rcall nacktfrosch rjmp 0b .endfunc
Danach war die "invalid reference to main" weg...File → Move test.S into _________ <Projektname>
Nö!Wenn die main im Assemblerquelltext steht, mußt Du Dich um fast alles selbst kümmern, Stack initialisieren, IRQ-Tabelle etc.
In C übernimmt das der CompilerWie komme ich an die IVT ran?
#include <avr/io.h> #include <avr/interrupt.h> uint8_t summe = 0; volatile uint8_t summand = 0; ISR(TIMER2_OVF_vect) { summand++; } void init(void) { sei(); TCCR2A = 0; TIMSK2 = (1 << TOIE2); TCCR2B = (1 << CS20); } uint8_t addiere(uint8_t var) { return var += summand; }test.S
.extern summe .extern summand .extern addiere .extern init .func main .global main main: rcall init lds r24, summe 0: rcall addiere sts summe, r24 rjmp 0b .endfunc
#include <avr/io.h> #include <avr/interrupt.h> uint8_t summe = 0; volatile uint8_t summand = 0; void init(void) { sei(); TCCR2A = 0; TIMSK2 = (1 << TOIE2); TCCR2B = (1 << CS20); } uint8_t addiere(uint8_t var) { return var += summand; }test.S
.nolist #include <avr/io.h> .list .global TIMER2_OVF_vect TIMER2_OVF_vect: lds r16, summand inc r16 sts summand, r16 reti .extern summe .extern summand .extern addiere .extern init .func main .global main main: rcall init lds r24, summe 0: rcall addiere sts summe, r24 rjmp 0b .endfunc
QuelleThe ATtiny816 PTC is supported by the Atmel QTouch Composer development tool (QTouch Library project builder and QTouch Analyzer).
Heute die Antwort vom Support:Hmm...
QuelleThe ATtiny816 PTC is supported by the Atmel QTouch Composer development tool (QTouch Library project builder and QTouch Analyzer).
"Start" ist irgendwie sowas wie ein Online-C-Code-Zusammenklick-Generator. (Womit wir mal wieder beim Online-Zwang wären)Please note that QTouch project builder support for ATtiny817/816/814 is available in Atmel START (not in Atmel Studio). The latest QTouch Modular Library is used for implementing QTouch support in ATtiny816. This modular library is part of Atmel START. Therefore, you need to use Atmel START (http://start.atmel.com/) for QTouch in ATtiny816.
ldi r17, lustigeBitmaske out PORTC, r17 ;landet in OCR0B out DDRC, r17 ;landet in OCR0A
Die Sache ist die, daß ich die Definitionsdatei unter ASM gar nicht (selbst) einbinde. Ich lege den zu verwendenden Controller als Device fest, dann wird beim Compilieren automatisch die zu verwendende Definitionsdatei eingebunden, und erscheint im Solution Explorer auch bei den Dependencies. Auf der Hauptprojektseite kann man den Controller dann auch mit Change Device ändern.empfiehlt es sich statt der .inc die .h Datei einzubinden. Das macht #include <avr/io.h> automatisch richtig.
Jain. Wie gehabt, nach dem compilieren erscheint unter anderem die iom88.h - die Vektoren stehen aber nicht da drin, sondern in der iomx8.h .Für den mega 88 heißt die Include-Datei iom88.h oder iom88a.h bzw. pa oder pb.
Da steht übrigens auch der USART_RX_vect
Eben. Eigentlich bei allen normalen 8bit-AVR. Bei den TPI und/oder UPDI-Tinies meine ich Abweichungen gesehen zu haben.Irgendwo im Datenblatt oder einer App-Note steht sinngemäß, daß die 32 Arbeits-Register (0x20) in Assembler vor den I/O-Registern stehen und in C ausgeblendet werden. Erkennt man im Register Summary daran, daß bei den ersten Adressen 0x00 - 0x3F und 0x20 - 0x5F nebeneinander stehen.
In den jeweiligen inkludierten ASM-Definitionsdateien sind für die konventionellen I/Os entsprechend die 0x00..0x3F-Adressen definiert, in den C-Definitionsdateien die von 0x20..0x5F.When using the I/O specific commands IN and OUT, the I/O addresses 0x00 - 0x3F must be used.
When addressing I/O Registers as data space using LD and ST instructions, 0x20 must be added
to these addresses. The ATmega48/V/ 88/V /168/V is a complex microcontroller with more
peripheral units than can be supported within the 64 location reserved in Opcode for the IN and
OUT instructions. For the Extended I/O space from 0x60 - 0xFF in SRAM, only the ST/STS/STD
and LD/LDS/LDD instructions can be used.
Eben. Wenn ich den 88pa auswähle (ältere benutze ich nicht), stimmt auch alles.Ich lege den zu verwendenden Controller als Device fest
Stimmt, teilweise. Daß die Header vom 88 und 88a schon so veraltet sind, ist mir noch gar nicht aufgefallen. Hätte auch gedacht, daß Atmel die gelegentlich auf dem Laufenden hält, da hab' ich wohl falsch gedacht.nach dem compilieren erscheint unter anderem die iom88.h - die Vektoren stehen aber nicht da drin, sondern in der iomx8.h
Du benutzt reine Assembler-Dateien innerhalb eines C-Projektes (auch wenn es überhaupt keinen C-Code enthält). Beim Inline-Assembler hingegen sind keinerlei Assembler-Dateien notwendig, da stehen die Assembleranweisungen direkt im C-Quelltext. Das sieht dann in etwa so aus:Genau genommen erstelle ich natürlich so ein C-Projekt mit Inline-Assembler
char data; asm volatile ( "ld __tmp_reg__, %a1+" "\n\t" "ld %0, %a1" "\n\t" "st %a1, __tmp_reg__" "\n\t" "st -%a1, %0" : "=&r" (data) : "e" (addr) : "memory" );