Assembler Programmierproblem in Workpad

stinakovits

Mitglied
22. Apr. 2013
90
6
8
Kottingbrunn
Sprachen
  1. Assembler
Hallo zusammen,

bin neu hier. Beschäftige mich seit einigen Tagen mit "AVR". Habe mir bei myAVR Workpad und mySmartUSB zum programmieren besorgt. So weit, so gut. An Controllern besorgte ich den ATtiny13 und den ATtiny45 um mal ein wenig zu experimentieren. Im Workpad sind einige Programmvorlagen enthalten, die ich doch glatt mal brennen und testen wollte. Mit dem ATtiny45 war das kein Problem. Alles lief wie gewünscht. Dann habe ich auf ATtiny13 umgestellt und mir ein Beispiel im Workpad geladen. Das sah eigentlich gut aus. Doch ein Brennen des Beispieles war nicht möglich weil der Compiler Fehlermeldungen ausgeworfen hatte. Die konnte ich mir nicht erklären. Zumal kein einziges der Beispiele auf Workpad für den ATtiny13 funktioniert. Immer die gleichen Fehlermeldungen.

Beispiel:
;+----------------------------------------------------------------------
;| Title : myAVR Beispiel "LED an" für den Tiny13
;+----------------------------------------------------------------------
;| Funktion : eine LED wir angeschalten
;| Schaltung : Port B.0=LED1
;+----------------------------------------------------------------------
;| Prozessor : ATtiny13
;| Takt : 1,2 MHz intern
;| Sprache : Assembler
;| Datum :
;| Version : 1.0
;| Autor :
;+-----------------------------------------------------------------------
.include "avr.h"
;------------------------------------------------------------------------
;Reset and Interruptvectoren ;VNr. Beschreibung
begin: rjmp main ; POWER ON RESET
reti ; External Interrupt 0
reti ; External Interrupt Request 0
reti ; Timer/Counter0 Overflow
reti ; EEPROM Ready
reti ; Analog Comparator
reti ; Timer/Counter Compare Match A
reti ; Timer/Counter Compare Match B
reti ; Watchdog Time-out
reti ; ADC Conversion Complete
;------------------------------------------------------------------------
; Start, Power ON, Reset
main: ldi r16,lo8(RAMEND)
out ioSPL,r16 ; init Stack
sbi ioDDRB,0
;------------------------------------------------------------------------
mainloop: ldi r16,0b00000001 ; LED On
out ioPORTB, r16
rjmp mainloop
;------------------------------------------------------------------------

Und die Fehlermeldungen dazu:
Hinweis: Es wird die im Quelltext angegebene Sprache verwendet: Assembler
Hinweis: Es wurde folgender Dialekt ermittelt: gnu
Hinweis: Es wird die im Quelltext angegebene Einstellung des Prozessors verwendet: ATtiny13
compilieren ... Assembler Meldungen:
ledon.s:31 31: Fehler: ein konstanter Wert wird erwartet:
Kontrollieren Sie bitte die Schreibweise dieser Zeile.
ledon.s:34 34: Fehler: ein konstanter Wert wird erwartet:
Kontrollieren Sie bitte die Schreibweise dieser Zeile.


Nun bin ich hergegangen und habe ioDDRB durch 0x17 und ioPORTB mit 0x18 ersetzt. Jetzt konnte ich erfolgreich brennen.

Warum ist das so? Was läuft da bei mir schief? Zumal Beispielprogramme mit dem ATtiny45 auch mit ioDDRB und ioPORTB erfolgreich zu brennen sind.

Viele Grüße
Manfred
 
Hi
Schau doch mal, ob du die "....inc" Datei eingebunden hast und wenn, ob die Definition IODDRx so gegeben oder nur DDRx dort steht. Ich kenn es nur ohne "io". Das es geht, wenn du die Adresse direkt einträgst ist klar. Die Def-Anweisung für den Compiler bedeutet ja nur, das er die Adresse symbolisch im Programm verwendet. Übrigends, der Hinweis auf den Fehler, nicht immer stimmt da die Zuordnung.
Gruß oldmax
 
Hallo
Nun bin ich hergegangen und habe ioDDRB durch 0x17 und ioPORTB mit 0x18 ersetzt. Jetzt konnte ich erfolgreich brennen.

Warum ist das so?

sicherleich weil die Definition von ioDDRB und ioPORTB fehlt. Du hast ja anstelle ioDDRB und ioPORTB die für den ATtiny13 richtigen Adressen verwendet, somit funktioniert es.

Warum nun ioDDRB und ioPORTB nicht definiert sind, weiß ich nicht, ich kenne auch diese Entwicklungsumgebung nicht. Wie Oldmax schon geschrieben hat, versuche es einfach mal mit DDRB und PORTB, vielleicht haben die von der myFirma vergessen das Includefile für den Tiny13 von Atmel umzuschreiben (oder versuche es mal mit myDDRB und myPORTB ;) .. nene Spaß beiseite ... hoffentlich habe ich die jetzt nicht auf eine Idee gebracht :eek:;)). Hmmm, oder verwende AVRStudio bzw. AtmelStudio, dann kannst du aber eventuell diesen myProgrammierer nicht weiter verwenden.

Dirk :ciao:
 
Ich würde dir wie Dirk auch stark einen "normalen" Assembler anraten. Allein schon wegen der komischen und nicht standardisierten Namen... Genau deswegen würdest du später auch bei späterer Beispielsuche im Netz einige Probleme bekommen ;)

Das AVR Studio 4 ist zwar optisch kein Highlight, aber ist noch recht schmal gegenüber den Nachfolgern :)

Und ein weiterer Vorteil ist solltest du dir den Drachen kaufen (den AVR Dragon) kannst du sogar debugWire nutzen ;)

Und noch ein Tipp: Sei beim Controllerwechsel sehr vorsichtig mit den Interrupt Vektoren. Weil Controller X hat vielleicht mehr Interrupts als Controller Y, oder hat diese an eine andere Position gelegt. Bei größeren Controllern, wie dem Mega168, kommt es sogar vor dass du 2 Befehle hast, also müsstest du in der "Tabelle" 2x RETI schreiben. Daher mach das lieber so wie ich es hier mal beschrieben habe. Da bist du beim Wechsel auch relativ sicher. Bissl was anpassen muss man ja aber trotzdem fast immer :)
 
Ich würde dir wie Dirk auch stark einen "normalen" Assembler anraten. Allein schon wegen der komischen und nicht standardisierten Namen... Genau deswegen würdest du später auch bei späterer Beispielsuche im Netz einige Probleme bekommen ;)
:yes4:
Das AVR Studio 4 ist zwar optisch kein Highlight, aber ist noch recht schmal gegenüber den Nachfolgern :)
:yes4:
Und ein weiterer Vorteil ist solltest du dir den Drachen kaufen (den AVR Dragon) kannst du sogar debugWire nutzen ;)
Mir reicht ein AVRISP MKII - ich verwende aber das dWire auch nicht
Und noch ein Tipp: Sei beim Controllerwechsel sehr vorsichtig mit den Interrupt Vektoren. Weil Controller X hat vielleicht mehr Interrupts als Controller Y, oder hat diese an eine andere Position gelegt. Bei größeren Controllern, wie dem Mega168, kommt es sogar vor dass du 2 Befehle hast, also müsstest du in der "Tabelle" 2x RETI schreiben. Daher mach das lieber so wie ich es hier mal beschrieben habe. Da bist du beim Wechsel auch relativ sicher. Bissl was anpassen muss man ja aber trotzdem fast immer :)
Das mit dem Makro ist nicht schlecht, allerdings benötigt der Zugriff über den SRAM einen Taktzyklus mehr, das berechnen von Laufzeiten wird also etwas(!) unübersichtlicher.
Zur IVT: ICH halte nicht viel von den RETIs in unbenutzten IRQs. Wenn die unbenutzt sind, können sie nicht eintreten, es sei denn, es liegt woanders ein Fehler vor. Dann ist das RETI aber nur Symtomlinderung, und keine echte Behandlung des Fehlers. Ich weiß, daß andere da anderer Meinung sind - muß also hier nicht diskutiert werden.
Im hier vorliegenden Beispiel werden durch die unnötige IVT und das unnötige einrichten des Stackpointers (abgesehen davon, daß SPL eh schon gleich RAMEND ist, wird der Stack gar nicht verwendet) bereits gut 2,3% des Flash verbraten. Ok, das Programm selbst ist auch winzig, spielt also keine Rolle.
Ist das eigentlich Absicht, daß die LED bei jedem Schleifendurchlauf angeschaltet wird (also ununterbrochen)? Und nie aus?

P.S.: Auf die einzelnen Bits des PORTB-Registers solltest Du auch direkten Zugriff haben (wie auch beim DDRB-Register)

Nachtrag: Willkommen hier im Forum!
 
Mir reicht ein AVRISP MKII - ich verwende aber das dWire auch nicht
Ich verwende das ausschließlich ^^
Mache mir garnicht mehr die Mühe den 6poligen ISP Stecker zu routen / löten. Das Erste was passiert ist Controller auf den Drachen (HVSP/HVPP) und Fuses setzen + dW an und denn gehts nur noch mit dem 3poligem Stecker (VCC, dW, GND) weiter. Darüber wird der denn ja auch programmiert :)

Mit den ISV: Hast ja Recht :)
Aber ich seh das als eine Art Airbag. Man sollte auch vorausschauend fahren und keine Unfälle bauen :)

Aber ok, ist jetzt etwas OffTopic :)


Nachtrag: Willkommen hier im Forum!
Achja, von mir natürlich auch ein herzliches Willkommen :)
 
Hallo zusammen,

danke für's Willkommen.
Verzeiht mir meine Anfängerfragen. Aber vieles von den Abkürzungen und Synonymen verstehe ich noch nicht :confused:

Hi
Schau doch mal, ob du die "....inc" Datei eingebunden hast und wenn, ob die Definition IODDRx so gegeben oder nur DDRx dort steht.

Ich finde keine "....inc" Datei. Stehen da die Definitionen drinnen? Oder was erwartet einem in dieser Datei?

Ich kenn es nur ohne "io". Das es geht, wenn du die Adresse direkt einträgst ist klar. Die Def-Anweisung für den Compiler bedeutet ja nur, das er die Adresse symbolisch im Programm verwendet. Übrigends, der Hinweis auf den Fehler, nicht immer stimmt da die Zuordnung.

Ob mit "io" oder ohne, macht keinen Unterschied. Es werden diese Variablen nicht erkannt.


Danke für die Empfehlung anderer Soft- und Hardware. Ich werde es im Hinterkopf behalten. Vorerst muss das Vorhandene reichen. Zumal ich es gerde erworben habe :cray:


Im hier vorliegenden Beispiel werden durch die unnötige IVT und das unnötige einrichten des Stackpointers (abgesehen davon, daß SPL eh schon gleich RAMEND ist, wird der Stack gar nicht verwendet) bereits gut 2,3% des Flash verbraten. Ok, das Programm selbst ist auch winzig, spielt also keine Rolle.
Ist das eigentlich Absicht, daß die LED bei jedem Schleifendurchlauf angeschaltet wird (also ununterbrochen)? Und nie aus?

P.S.: Auf die einzelnen Bits des PORTB-Registers solltest Du auch direkten Zugriff haben (wie auch beim DDRB-Register)

Ja, du hast natürlich Recht!
Das Beispiel ist ohne tieferen Sinn und diente nur dazu zu testen warum es mit dem ATtiny13 nicht funkt.

Habe mir jetzt mal die Variablen DDRB und PORTB mit .equ selbst definiert. Und, klarerweise jetzt funkts dann auch. Sogar mit myDDRB ;)

Ok, mit den Gründen warum und wieso kenn ich mich nun aus. Aber. Wo stehen solche Definitionen? Und kann ich die auch selber beeinflussen? In meinem Beispiel ist eine Datei "avr.h" eingebunden. Die gibt es aber auf meiner Festplatte gar nicht.

Gruß, Manfred
 
In den Prozessordefinitionsdateien. Zumindest im AVR-Studio gibt es für jeden unterstützten Controller so eine Datei, die man einbinden kann. Du kannst natürlich auch darauf verzichten, und alle Adressen direkt im Programm einbinden/definieren. Was anderes macht nämlich die Definitionsdatei auch nicht. Darin werden quasi Assemblervariablen erzeugt, und mit Werten beladen (.equ). Im Programm können diese dann als Register, Register-Bit, controllerspezifische Konstante (zB Ramend) verwendet werden. Statt der konkreten Adresse/Bitnummer/Zahl. Dadurch wird der Code natürlich deutlich besser lesbar (insbesondere, wenn die verwendeten Namen mit den Datenblättern konform gehen).

Du kannst Dir so'ne Definitionsdatei natürlich auch selbst erstellen. Der Assembler behandelt das mit dem include so, als wenn der Inhalt der includierten Datei an genau der Stelle des includes im Programm-Code stehen würde.

Wo sich in Deiner mysteriösen Entwicklungsumgebung diese Dateien verbergen, kann ich Dir nicht sagen - TommyB hat ja bereits die Verwendung eines "normalen" Assemblers angeraten...
Beim AVR-Studio lassen sich diese Dateien im Ordner \AVR Tools\AvrAssembler2\Appnotes finden.
 
Hi Manfred,

von mir auch erstmal nen herzliches Willkommen :flowers:

Tja ... und da steht mal wieder ein Anfänger mit einer "ach so einfachen All-Inclusive-Entwicklungs-Selbstbastellösung mit Selbstbastelprogger" und es geht nicht weiter.

Am besten läuft eigentlich immer noch der originale AVRISPmk2 mit AVR-Studio. Alle anderen Nachbauten hinken den Entwicklungen von Atmel hinterher oder unterstützen nicht alles oder laufen nicht vernünftig ... usw. Es gibt auch ein paar wenige Ausnahmen. Die als Anfänger aber zu finden ist nicht wirklich einfach. Ich hab mir die Suche erspart. ;)

Bei diesem myAVR-irgendwas hat man zusätzlich das Problem das die wirklichen Chips hinter irgendwelchen hochtrabenden Namen versteckt werden und der Anfänger dann im Nirvana steht wenn das vorgekaute Beispiel von myAVR nicht genau das macht was es soll. Das ist auch bei vielen anderen "Ach so einfachen Entwicklungsumgebungen" so. Am besten fährt man mit dem Original. Soviel dazu von mir :p

Gruß
Dino
 
Richtig.
Ich hatte mich eh gewundert dass da eine .h Datei eingebunden worden ist. Die kenn ich eigentlich nur aus C und C++.
Wenn du dir die Entwicklungsumgebung sogar gekauft hast (outch :/) denn würde ich an deiner Stelle da mal mit dem Support sprechen.
Zu den, ich nenne es jetzt mal Controller Definitionen, also wo die Adressen für DDRB, PORTC, ... drin stehen... Zur Not musst du die selber definieren. Vielleicht unterstützt die Umgebung den Chip einfach nicht (vollständig). Eigentlich müsste jeder Assembler auch mit den vom AVR Studio klar kommen. Die liegen, wie LotadaC schon sagte in "C:\Program Files (x86)\Atmel\AVR Tools\AvrAssembler2\Appnotes", natürlich erst nach der Installation :)

Das wäre z. B. die für den Tiny13:
Code:
;***** THIS IS A MACHINE GENERATED FILE - DO NOT EDIT ********************
;***** Created: 2011-08-25 21:00 ******* Source: ATtiny13.xml ************
;*************************************************************************
;* A P P L I C A T I O N   N O T E   F O R   T H E   A V R   F A M I L Y
;* 
;* Number            : AVR000
;* File Name         : "tn13def.inc"
;* Title             : Register/Bit Definitions for the ATtiny13
;* Date              : 2011-08-25
;* Version           : 2.35
;* Support E-mail    : avr@atmel.com
;* Target MCU        : ATtiny13
;* 
;* DESCRIPTION
;* When including this file in the assembly program file, all I/O register 
;* names and I/O register bit names appearing in the data book can be used.
;* In addition, the six registers forming the three data pointers X, Y and 
;* Z have been assigned names XL - ZH. Highest RAM address for Internal 
;* SRAM is also defined 
;* 
;* The Register names are represented by their hexadecimal address.
;* 
;* The Register Bit names are represented by their bit number (0-7).
;* 
;* Please observe the difference in using the bit names with instructions
;* such as "sbr"/"cbr" (set/clear bit in register) and "sbrs"/"sbrc"
;* (skip if bit in register set/cleared). The following example illustrates
;* this:
;* 
;* in    r16,PORTB             ;read PORTB latch
;* sbr   r16,(1<<PB6)+(1<<PB5) ;set PB6 and PB5 (use masks, not bit#)
;* out   PORTB,r16             ;output to PORTB
;* 
;* in    r16,TIFR              ;read the Timer Interrupt Flag Register
;* sbrc  r16,TOV0              ;test the overflow flag (use bit#)
;* rjmp  TOV0_is_set           ;jump if set
;* ...                         ;otherwise do something else
;*************************************************************************

#ifndef _TN13DEF_INC_
#define _TN13DEF_INC_


#pragma partinc 0

; ***** SPECIFY DEVICE ***************************************************
.device ATtiny13
#pragma AVRPART ADMIN PART_NAME ATtiny13
.equ	SIGNATURE_000	= 0x1e
.equ	SIGNATURE_001	= 0x90
.equ	SIGNATURE_002	= 0x07

#pragma AVRPART CORE CORE_VERSION V2
#pragma AVRPART CORE NEW_INSTRUCTIONS lpm rd,z+


; ***** I/O REGISTER DEFINITIONS *****************************************
; NOTE:
; Definitions marked "MEMORY MAPPED"are extended I/O ports
; and cannot be used with IN/OUT instructions
.equ	SREG	= 0x3f
.equ	SPL	= 0x3d
.equ	GIMSK	= 0x3b
.equ	GIFR	= 0x3a
.equ	TIMSK0	= 0x39
.equ	TIFR0	= 0x38
.equ	SPMCSR	= 0x37
.equ	OCR0A	= 0x36
.equ	MCUCR	= 0x35
.equ	MCUSR	= 0x34
.equ	TCCR0B	= 0x33
.equ	TCNT0	= 0x32
.equ	OSCCAL	= 0x31
.equ	TCCR0A	= 0x2f
.equ	DWDR	= 0x2e
.equ	OCR0B	= 0x29
.equ	GTCCR	= 0x28
.equ	CLKPR	= 0x26
.equ	WDTCR	= 0x21
.equ	EEAR	= 0x1e
.equ	EEDR	= 0x1d
.equ	EECR	= 0x1c
.equ	PORTB	= 0x18
.equ	DDRB	= 0x17
.equ	PINB	= 0x16
.equ	PCMSK	= 0x15
.equ	DIDR0	= 0x14
.equ	ACSR	= 0x08
.equ	ADMUX	= 0x07
.equ	ADCSRA	= 0x06
.equ	ADCH	= 0x05
.equ	ADCL	= 0x04
.equ	ADCSRB	= 0x03


; ***** BIT DEFINITIONS **************************************************

; ***** AD_CONVERTER *****************
; ADMUX - The ADC multiplexer Selection Register
.equ	MUX0	= 0	; Analog Channel and Gain Selection Bits
.equ	MUX1	= 1	; Analog Channel and Gain Selection Bits
.equ	ADLAR	= 5	; Left Adjust Result
.equ	REFS0	= 6	; Reference Selection Bit 0

; ADCSRA - The ADC Control and Status register
.equ	ADPS0	= 0	; ADC  Prescaler Select Bits
.equ	ADPS1	= 1	; ADC  Prescaler Select Bits
.equ	ADPS2	= 2	; ADC  Prescaler Select Bits
.equ	ADIE	= 3	; ADC Interrupt Enable
.equ	ADIF	= 4	; ADC Interrupt Flag
.equ	ADATE	= 5	; ADC Auto Trigger Enable
.equ	ADSC	= 6	; ADC Start Conversion
.equ	ADEN	= 7	; ADC Enable

; ADCH - ADC Data Register High Byte
.equ	ADCH0	= 0	; ADC Data Register High Byte Bit 0
.equ	ADCH1	= 1	; ADC Data Register High Byte Bit 1
.equ	ADCH2	= 2	; ADC Data Register High Byte Bit 2
.equ	ADCH3	= 3	; ADC Data Register High Byte Bit 3
.equ	ADCH4	= 4	; ADC Data Register High Byte Bit 4
.equ	ADCH5	= 5	; ADC Data Register High Byte Bit 5
.equ	ADCH6	= 6	; ADC Data Register High Byte Bit 6
.equ	ADCH7	= 7	; ADC Data Register High Byte Bit 7

; ADCL - ADC Data Register Low Byte
.equ	ADCL0	= 0	; ADC Data Register Low Byte Bit 0
.equ	ADCL1	= 1	; ADC Data Register Low Byte Bit 1
.equ	ADCL2	= 2	; ADC Data Register Low Byte Bit 2
.equ	ADCL3	= 3	; ADC Data Register Low Byte Bit 3
.equ	ADCL4	= 4	; ADC Data Register Low Byte Bit 4
.equ	ADCL5	= 5	; ADC Data Register Low Byte Bit 5
.equ	ADCL6	= 6	; ADC Data Register Low Byte Bit 6
.equ	ADCL7	= 7	; ADC Data Register Low Byte Bit 7

; ADCSRB - ADC Control and Status Register B
.equ	ADTS0	= 0	; ADC Auto Trigger Source 0
.equ	ADTS1	= 1	; ADC Auto Trigger Source 1
.equ	ADTS2	= 2	; ADC Auto Trigger Source 2

; DIDR0 - Digital Input Disable Register 0
.equ	ADC1D	= 2	; ADC2 Digital input Disable
.equ	ADC3D	= 3	; ADC3 Digital input Disable
.equ	ADC2D	= 4	; ADC2 Digital input Disable
.equ	ADC0D	= 5	; ADC0 Digital input Disable


; ***** ANALOG_COMPARATOR ************
; ADCSRB - ADC Control and Status Register B
.equ	ACME	= 6	; Analog Comparator Multiplexer Enable

; ACSR - Analog Comparator Control And Status Register
.equ	ACIS0	= 0	; Analog Comparator Interrupt Mode Select bit 0
.equ	ACIS1	= 1	; Analog Comparator Interrupt Mode Select bit 1
.equ	ACIE	= 3	; Analog Comparator Interrupt Enable
.equ	ACI	= 4	; Analog Comparator Interrupt Flag
.equ	ACO	= 5	; Analog Compare Output
.equ	ACBG	= 6	; Analog Comparator Bandgap Select
.equ	AINBG	= ACBG	; For compatibility
.equ	ACD	= 7	; Analog Comparator Disable

; DIDR0 - 
.equ	AIN0D	= 0	; AIN0 Digital Input Disable
.equ	AIN1D	= 1	; AIN1 Digital Input Disable


; ***** EEPROM ***********************
; EEAR - EEPROM Read/Write Access
.equ	EEARL	= EEAR	; For compatibility
.equ	EEAR0	= 0	; EEPROM Read/Write Access bit 0
.equ	EEAR1	= 1	; EEPROM Read/Write Access bit 1
.equ	EEAR2	= 2	; EEPROM Read/Write Access bit 2
.equ	EEAR3	= 3	; EEPROM Read/Write Access bit 3
.equ	EEAR4	= 4	; EEPROM Read/Write Access bit 4
.equ	EEAR5	= 5	; EEPROM Read/Write Access bit 5

; EEDR - EEPROM Data Register
.equ	EEDR0	= 0	; EEPROM Data Register bit 0
.equ	EEDR1	= 1	; EEPROM Data Register bit 1
.equ	EEDR2	= 2	; EEPROM Data Register bit 2
.equ	EEDR3	= 3	; EEPROM Data Register bit 3
.equ	EEDR4	= 4	; EEPROM Data Register bit 4
.equ	EEDR5	= 5	; EEPROM Data Register bit 5
.equ	EEDR6	= 6	; EEPROM Data Register bit 6
.equ	EEDR7	= 7	; EEPROM Data Register bit 7

; EECR - EEPROM Control Register
.equ	EERE	= 0	; EEPROM Read Enable
.equ	EEWE	= 1	; EEPROM Write Enable
.equ	EEPE	= EEWE	; For compatibility
.equ	EEMWE	= 2	; EEPROM Master Write Enable
.equ	EEMPE	= EEMWE	; For compatibility
.equ	EERIE	= 3	; EEProm Ready Interrupt Enable
.equ	EEPM0	= 4	; 
.equ	EEPM1	= 5	; 


; ***** CPU **************************
; SREG - Status Register
.equ	SREG_C	= 0	; Carry Flag
.equ	SREG_Z	= 1	; Zero Flag
.equ	SREG_N	= 2	; Negative Flag
.equ	SREG_V	= 3	; Two's Complement Overflow Flag
.equ	SREG_S	= 4	; Sign Bit
.equ	SREG_H	= 5	; Half Carry Flag
.equ	SREG_T	= 6	; Bit Copy Storage
.equ	SREG_I	= 7	; Global Interrupt Enable

; SPL - Stack Pointer Low Byte
.equ	SP0	= 0	; Stack Pointer Bit 0
.equ	SP1	= 1	; Stack Pointer Bit 1
.equ	SP2	= 2	; Stack Pointer Bit 2
.equ	SP3	= 3	; Stack Pointer Bit 3
.equ	SP4	= 4	; Stack Pointer Bit 4
.equ	SP5	= 5	; Stack Pointer Bit 5
.equ	SP6	= 6	; Stack Pointer Bit 6
.equ	SP7	= 7	; Stack Pointer Bit 7

; MCUCR - MCU Control Register
.equ	ISC00	= 0	; Interrupt Sense Control 0 bit 0
.equ	ISC01	= 1	; Interrupt Sense Control 0 bit 1
.equ	SM0	= 3	; Sleep Mode Select Bit 0
.equ	SM1	= 4	; Sleep Mode Select Bit 1
.equ	SE	= 5	; Sleep Enable
.equ	PUD	= 6	; Pull-up Disable

; MCUSR - MCU Status register
.equ	PORF	= 0	; Power-On Reset Flag
.equ	EXTRF	= 1	; External Reset Flag
.equ	BORF	= 2	; Brown-out Reset Flag
.equ	WDRF	= 3	; Watchdog Reset Flag

; OSCCAL - Oscillator Calibration Register
.equ	CAL0	= 0	; Oscillatro Calibration Value Bit 0
.equ	CAL1	= 1	; Oscillatro Calibration Value Bit 1
.equ	CAL2	= 2	; Oscillatro Calibration Value Bit 2
.equ	CAL3	= 3	; Oscillatro Calibration Value Bit 3
.equ	CAL4	= 4	; Oscillatro Calibration Value Bit 4
.equ	CAL5	= 5	; Oscillatro Calibration Value Bit 5
.equ	CAL6	= 6	; Oscillatro Calibration Value Bit 6

; CLKPR - Clock Prescale Register
.equ	CLKPS0	= 0	; Clock Prescaler Select Bit 0
.equ	CLKPS1	= 1	; Clock Prescaler Select Bit 1
.equ	CLKPS2	= 2	; Clock Prescaler Select Bit 2
.equ	CLKPS3	= 3	; Clock Prescaler Select Bit 3
.equ	CLKPCE	= 7	; Clock Prescaler Change Enable

; DWDR - Debug Wire Data Register
.equ	DWDR0	= 0	; Debug Wire Data Register Bit 0
.equ	DWDR1	= 1	; Debug Wire Data Register Bit 1
.equ	DWDR2	= 2	; Debug Wire Data Register Bit 2
.equ	DWDR3	= 3	; Debug Wire Data Register Bit 3
.equ	DWDR4	= 4	; Debug Wire Data Register Bit 4
.equ	DWDR5	= 5	; Debug Wire Data Register Bit 5
.equ	DWDR6	= 6	; Debug Wire Data Register Bit 6
.equ	DWDR7	= 7	; Debug Wire Data Register Bit 7

; SPMCSR - Store Program Memory Control and Status Register
.equ	SPMEN	= 0	; Store program Memory Enable
.equ	PGERS	= 1	; Page Erase
.equ	PGWRT	= 2	; Page Write
.equ	RFLB	= 3	; Read Fuse and Lock Bits
.equ	CTPB	= 4	; Clear Temporary Page Buffer


; ***** PORTB ************************
; PORTB - Data Register, Port B
.equ	PORTB0	= 0	; 
.equ	PB0	= 0	; For compatibility
.equ	PORTB1	= 1	; 
.equ	PB1	= 1	; For compatibility
.equ	PORTB2	= 2	; 
.equ	PB2	= 2	; For compatibility
.equ	PORTB3	= 3	; 
.equ	PB3	= 3	; For compatibility
.equ	PORTB4	= 4	; 
.equ	PB4	= 4	; For compatibility
.equ	PORTB5	= 5	; 
.equ	PB5	= 5	; For compatibility

; DDRB - Data Direction Register, Port B
.equ	DDB0	= 0	; 
.equ	DDB1	= 1	; 
.equ	DDB2	= 2	; 
.equ	DDB3	= 3	; 
.equ	DDB4	= 4	; 
.equ	DDB5	= 5	; 

; PINB - Input Pins, Port B
.equ	PINB0	= 0	; 
.equ	PINB1	= 1	; 
.equ	PINB2	= 2	; 
.equ	PINB3	= 3	; 
.equ	PINB4	= 4	; 
.equ	PINB5	= 5	; 


; ***** EXTERNAL_INTERRUPT ***********
; MCUCR - MCU Control Register
;.equ	ISC00	= 0	; Interrupt Sense Control 0 Bit 0
;.equ	ISC01	= 1	; Interrupt Sense Control 0 Bit 1

; GIMSK - General Interrupt Mask Register
.equ	GICR	= GIMSK	; For compatibility
.equ	PCIE	= 5	; Pin Change Interrupt Enable
.equ	INT0	= 6	; External Interrupt Request 0 Enable

; GIFR - General Interrupt Flag register
.equ	PCIF	= 5	; Pin Change Interrupt Flag
.equ	INTF0	= 6	; External Interrupt Flag 0

; PCMSK - Pin Change Enable Mask
.equ	PCINT0	= 0	; Pin Change Enable Mask Bit 0
.equ	PCINT1	= 1	; Pin Change Enable Mask Bit 1
.equ	PCINT2	= 2	; Pin Change Enable Mask Bit 2
.equ	PCINT3	= 3	; Pin Change Enable Mask Bit 3
.equ	PCINT4	= 4	; Pin Change Enable Mask Bit 4
.equ	PCINT5	= 5	; Pin Change Enable Mask Bit 5


; ***** TIMER_COUNTER_0 **************
; TIMSK0 - Timer/Counter0 Interrupt Mask Register
.equ	TOIE0	= 1	; Timer/Counter0 Overflow Interrupt Enable
.equ	OCIE0A	= 2	; Timer/Counter0 Output Compare Match A Interrupt Enable
.equ	OCIE0B	= 3	; Timer/Counter0 Output Compare Match B Interrupt Enable

; TIFR0 - Timer/Counter0 Interrupt Flag register
.equ	TOV0	= 1	; Timer/Counter0 Overflow Flag
.equ	OCF0A	= 2	; Timer/Counter0 Output Compare Flag 0A
.equ	OCF0B	= 3	; Timer/Counter0 Output Compare Flag 0B

; OCR0A - Timer/Counter0 Output Compare Register
.equ	OCR0A_0	= 0	; 
.equ	OCR0A_1	= 1	; 
.equ	OCR0A_2	= 2	; 
.equ	OCR0A_3	= 3	; 
.equ	OCR0A_4	= 4	; 
.equ	OCR0A_5	= 5	; 
.equ	OCR0A_6	= 6	; 
.equ	OCR0A_7	= 7	; 

; TCCR0A - Timer/Counter  Control Register A
.equ	WGM00	= 0	; Waveform Generation Mode
.equ	WGM01	= 1	; Waveform Generation Mode
.equ	COM0B0	= 4	; Compare Match Output B Mode
.equ	COM0B1	= 5	; Compare Match Output B Mode
.equ	COM0A0	= 6	; Compare Match Output A Mode
.equ	COM0A1	= 7	; Compare Match Output A Mode

; TCNT0 - Timer/Counter0
.equ	TCNT0_0	= 0	; 
.equ	TCNT0_1	= 1	; 
.equ	TCNT0_2	= 2	; 
.equ	TCNT0_3	= 3	; 
.equ	TCNT0_4	= 4	; 
.equ	TCNT0_5	= 5	; 
.equ	TCNT0_6	= 6	; 
.equ	TCNT0_7	= 7	; 

; TCCR0B - Timer/Counter Control Register B
.equ	CS00	= 0	; Clock Select
.equ	CS01	= 1	; Clock Select
.equ	CS02	= 2	; Clock Select
.equ	WGM02	= 3	; Waveform Generation Mode
.equ	FOC0B	= 6	; Force Output Compare B
.equ	FOC0A	= 7	; Force Output Compare A

; OCR0B - Timer/Counter0 Output Compare Register
.equ	OCR0B_0	= 0	; 
.equ	OCR0B_1	= 1	; 
.equ	OCR0B_2	= 2	; 
.equ	OCR0B_3	= 3	; 
.equ	OCR0B_4	= 4	; 
.equ	OCR0B_5	= 5	; 
.equ	OCR0B_6	= 6	; 
.equ	OCR0B_7	= 7	; 

; GTCCR - General Timer Conuter Register
.equ	PSR10	= 0	; Prescaler Reset Timer/Counter0
.equ	TSM	= 7	; Timer/Counter Synchronization Mode


; ***** WATCHDOG *********************
; WDTCR - Watchdog Timer Control Register
.equ	WDP0	= 0	; Watch Dog Timer Prescaler bit 0
.equ	WDP1	= 1	; Watch Dog Timer Prescaler bit 1
.equ	WDP2	= 2	; Watch Dog Timer Prescaler bit 2
.equ	WDE	= 3	; Watch Dog Enable
.equ	WDCE	= 4	; Watchdog Change Enable
.equ	WDP3	= 5	; Watchdog Timer Prescaler Bit 3
.equ	WDTIE	= 6	; Watchdog Timeout Interrupt Enable
.equ	WDTIF	= 7	; Watchdog Timeout Interrupt Flag



; ***** LOCKSBITS ********************************************************
.equ	LB1	= 0	; Lockbit
.equ	LB2	= 1	; Lockbit


; ***** FUSES ************************************************************
; LOW fuse bits
.equ	CKSEL0	= 0	; Select Clock Source
.equ	CKSEL1	= 1	; Select Clock Source
.equ	SUT0	= 2	; Select start-up time
.equ	SUT1	= 3	; Select start-up time
.equ	CKDIV8	= 4	; Start up with system clock divided by 8
.equ	WDTON	= 5	; Watch dog timer always on
.equ	EESAVE	= 6	; Keep EEprom contents during chip erase
.equ	SPIEN	= 7	; SPI programming enable

; HIGH fuse bits
.equ	RSTDISBL	= 0	; Disable external reset
.equ	BODLEVEL0	= 1	; Enable BOD and select level
.equ	BODLEVEL1	= 2	; Enable BOD and select level
.equ	DWEN	= 3	; DebugWire Enable
.equ	SELFPRGEN	= 4	; Self Programming Enable



; ***** CPU REGISTER DEFINITIONS *****************************************
.def	XH	= r27
.def	XL	= r26
.def	YH	= r29
.def	YL	= r28
.def	ZH	= r31
.def	ZL	= r30



; ***** DATA MEMORY DECLARATIONS *****************************************
.equ	FLASHEND	= 0x01ff	; Note: Word address
.equ	IOEND	= 0x003f
.equ	SRAM_START	= 0x0060
.equ	SRAM_SIZE	= 64
.equ	RAMEND	= 0x009f
.equ	XRAMEND	= 0x0000
.equ	E2END	= 0x003f
.equ	EEPROMEND	= 0x003f
.equ	EEADRBITS	= 6
#pragma AVRPART MEMORY PROG_FLASH 1024
#pragma AVRPART MEMORY EEPROM 64
#pragma AVRPART MEMORY INT_SRAM SIZE 64
#pragma AVRPART MEMORY INT_SRAM START_ADDR 0x60



; ***** BOOTLOADER DECLARATIONS ******************************************
.equ	PAGESIZE	= 16



; ***** INTERRUPT VECTORS ************************************************
.equ	INT0addr	= 0x0001	; External Interrupt 0
.equ	PCI0addr	= 0x0002	; External Interrupt Request 0
.equ	OVF0addr	= 0x0003	; Timer/Counter0 Overflow
.equ	ERDYaddr	= 0x0004	; EEPROM Ready
.equ	ACIaddr	= 0x0005	; Analog Comparator
.equ	OC0Aaddr	= 0x0006	; Timer/Counter Compare Match A
.equ	OC0Baddr	= 0x0007	; Timer/Counter Compare Match B
.equ	WDTaddr	= 0x0008	; Watchdog Time-out
.equ	ADCCaddr	= 0x0009	; ADC Conversion Complete

.equ	INT_VECTORS_SIZE	= 10	; size in words

#endif  /* _TN13DEF_INC_ */

; ***** END OF FILE ******************************************************

Vielleicht hilft es dir ja etwas. Wünsch dir auf jeden Fall viel Erfolg :)


p.S.: Was die Programmer angeht... Ich hab mir damals einfach ne D-Sub Buchse 25 Polig (Parralelport, aka LPT1) und n Kabel gekauft, mehr brauchte ich für ISP nicht ^^
 
Hallo zusammen,
...Eigentlich müsste jeder Assembler auch mit den vom AVR Studio klar kommen.

also ich vermute (ich weiß es nicht, ich kenne die Entwicklungsumgebung nicht :cool:), dass hier
  • einfach der Atmel Assembler2 verwendet wurde
  • die Definitionsfiles "angepasst"
  • und die Meldungen "eingedeutscht" wurden.

ich würde (wie Tommy schon geschrieben hat) einfach mal versuchen, das originale Includefile des Tiny13 einzubinden. Wenn das funktioniert, kann man sicherlich alle von Atmel gewohnten Definitionen verwenden.

Dirk :ciao:
 
Danke für eure Ausführungen.

Inzwischen habe ich diesbezüglich alles im Griff.

Allerdings, wie könnte man es anders erwarten, stehe ich vor der nächsten Hürde. Ich würde gerne das EEPROM mit Daten beladen, die das Programm dann verwendet. Wie bringe ich die Daten direkt ins EEPROM. Das Flash wird ja ganz normal mit dem Quellcode über den Brenner programmiert. Aber wie mache ich das beim EEPROM. Irgendwie stehe ich da momentan auf dem Schlauch. Das Datenblatt des ATtiny13 erklärt zwar grundsätzlich wie man das macht. Ich denke das müsste das Programm Workpad unterstützen. Oder liege ich da falsch? Eventuell kann Workpad das gar nicht.
Wie sollte das prinzipiell funktionieren bzw. ablaufen?

Gruß
Manfred
 
Hi Manfred,

Inzwischen habe ich diesbezüglich alles im Griff.
na wer sagts denn :cool:
Wo war denn der Fehler begraben? Evtl könnte die Info ja anderen weiterhelfen ...

Ich würde gerne das EEPROM mit Daten beladen, die das Programm dann verwendet. Wie bringe ich die Daten direkt ins EEPROM. Das Flash wird ja ganz normal mit dem Quellcode über den Brenner programmiert. Aber wie mache ich das beim EEPROM. Irgendwie stehe ich da momentan auf dem Schlauch. Das Datenblatt des ATtiny13 erklärt zwar grundsätzlich wie man das macht. Ich denke das müsste das Programm Workpad unterstützen. Oder liege ich da falsch? Eventuell kann Workpad das gar nicht.
Wie sollte das prinzipiell funktionieren bzw. ablaufen?
Das EEPROM kannst du normal mit Bascom-/Assembler-Befehlen beschreiben und lesen. Man kann es aber auch direkt mit nem Progger beschreiben/auslesen. Ob das dieses Workpad kann, das wird dir aber wohl nur jemand sagen können der es selber verwendet und da sind wir wieder bei diesen "alternativen" Entwicklungsumgebungen.

In Bascom oder AVR-Studio kannst du genau so wie die Hex-Datei für das Flash auch eine Hex-Datei in das EEPROM schreiben. Eventuell reicht der Tip ja schon um im Workpad die richtige Stelle zu finden.

Gruß
Dino
 
Hallo Dino,

Wo war denn der Fehler begraben? Evtl könnte die Info ja anderen weiterhelfen ...

na ja. Ich habe diese Dateien zum Einbinden, in denen die Variablen definiert sind, nicht gefunden. Da ich aber in erster Linie an meinem Projekt was weiter bringen möchte, habe ich nach kurzer Suche das mal sein lassen und mir die paar Variablen die fehlten einfach mit ".equ" selber definiert in meinem Programmcode. Funktioniert tadellos. :cool:

Danke für deine Hinweise bezüglich EEPROM. Habe bei Tante Google ähnliche Hinweise gefunden. Jedoch nichts konkretes. Daher fürchte ich, dass das mit Workpad wohl nichts wird. Natürlich könnte ich ein eigenes Programm brennen, welches mir dann den EEPROM beschreibt. Dann brenne ich mein ursprüngliches Programm drüber. Und gut ist. Aber das ist umständlich. Möchte ich vermeiden.
Ich denke ich werde mit Workpad nicht glücklich. Dachte, da ich ein Anfänger mit AVRs bin, das würde mal reichen. Aber ich stoße zu schnell an Grenzen. Zumal ich beim Programmieren an sich kein Neuling bin :)

Was ist die Wahl der Zeit? AVR Studio? Gibts wohl nur auf englisch. Naja, mal schauen .............

Gruß
Manfred
 
Zumal ich beim Programmieren an sich kein Neuling bin :)

Was ist die Wahl der Zeit? AVR Studio? Gibts wohl nur auf englisch. Naja, mal schauen .............

Angefangen hab ich mit Bascom (wie der Name schon erraten lässt Basic). Selbst mit der Demo kann man schon einiges machen, man ist aber auf 2KB (oder warens 4?) Codegröße begrenzt. Dafür kann man aber auch selbstgebaute Programmierkabel (ISP) nutzen. Hatte mir damals selber eins gebastelt. Einfach nur den 25poligen D-Sub Stecker, die 6polige Stiftleiste und ein Kabel dazwischen. Man schafft damit sehr viel in kurzer Zeit, aber mit Performance darf man es nicht so genau nehmen. Daher bin ich auch langsam immer mehr zu Assembler umgestiegen, erst Inline Assembler in Bascom und dann komplett im AVR Studio.

AVR Studio ist kostenlos (benötigt aber ne Registrierung mit E-Mail Adresse. Was du da sonst eingibst wie Name und Adresse überprüft eh keiner ;)) und damit kannst du in Assembler oder in C programmieren. Ich glaube aber dass das selbstgebaute ISP Kabel da nicht funktioniert (wobei, vielleicht gibt es Zusatz Tools?) andererseits kannst du damit auch debugWire nutzen wenn du dir den AVR Dragon oder JTAG ICE mkII leisten möchtest.

Welches du bevorzugst weiß ich natürlich nicht, auch nicht in welcher Sprache du sonst programmierst. Aber anschaun kannst du sie dir ja beide mal :)
Wobei ich noch anmerken möchte:
Solltest du mit dem Visual Studio 2008 arbeiten (für Web- oder PC Entwicklung), lass die Finger von den neueren AVR Studio Versionen. Diese basieren nämlich auf Visual Studio 2010. Hat man beide Versionen gleichzeitig installiert beißen die sich ganz kräftig. Nicht nur dass die Dateizuordnungen alle hops gehen, den Debugger vom 2008er zerlederts auch. Deswegen nutz ich noch die Version 4 :)
 
Eigentlich hat Thomas bereits alles wesentliche gesagt - inwiefern Dein Programmer sich vom AVR-Studio verwenden läßt, mußt Du ausprobieren (ich hatte mir damals 2 AVR-ISP-Klone nach einer Elektor-Anleitung gebaut, die dann als AVRisp (STK200/STK500?) erkannt wurden.)
Ansonsten würde ich zum echten AVR-ISP-MKII raten - Thomas zieht da den Drachen vor, ok.

Das mit den Studio-Versionen hat TommyB ja auch erwähnt, insbesondere mit den Versionskonflikten. Ich hab 'ne ältere Version wegen VisualBasic, Eclipse+Android-SDK drauf gehabt - nach der Installation vom Studio5 war dort der Simulator praktisch nicht mehr verwendbar. Allerdings fahr ich das auch auf'nem uralten CoreDuo.

Derzeit hab ich Version4.18 ohne jegliche Servicepacks am laufen - gestern hab ich gesehen, daß ich für TPI SP1 brauchen würde.
Außerdem gibt es noch 'ne 4.19-Version.
@Tommy: Es sind ja in den ReleaseNotes diverse Bugfixes gelistet welche Version hast Du problemlos am laufen? Zieh ich mir jetzt noch die 18er SP mit drauf? Kann ich V19 unabhängig neben V18 installieren (Studio5.? hab ich ja auch daneben)?

Nachtrag: zum Eeprom ist noch zu sagen, daß der Simulator des Studios das nicht korrekt unterstützt (zumindest in V4.18 und V5.?). Die erzeugten Dateien scheinen aber korrekt zu sein. Generell sind Fehler beim simulieren bei Verwendung der Hardware genauer unter die Lupe zu nehmen -> Bascom weist in der Hilfe sogar darauf hin. Fazit: beide Simulatoren sind in der Hinsicht nur bedingt benutzbar.
 
Hallo,

Selbst mit der Demo kann man schon einiges machen, man ist aber auf 2KB (oder warens 4?) Codegröße begrenzt.
Es sind 4k Codegröße bei der Demoversion.

AVR Studio ist kostenlos (benötigt aber ne Registrierung mit E-Mail Adresse. Was du da sonst eingibst wie Name und Adresse überprüft eh keiner ;)) und damit kannst du in Assembler oder in C programmieren. Ich glaube aber dass das selbstgebaute ISP Kabel da nicht funktioniert (wobei, vielleicht gibt es Zusatz Tools?)
Als Progger kann man PonyProg2000 nehmen. Läuft auf XP problemlos. Wie es bei Vista, Win7, ... aussieht kann ich nicht sagen.

Bei mir hat das mit dem AVR-Studio4 angefangen. Zum Code rüberschubsen hab ich PonyProg und nen selbstgebauten Parallelprogger verwendet. Der hatte bei mir nur nen paar Widerstände und Strippen mit Drahtstücken (für nen Steckboard) dran. Ich hab also mit Assembler angefangen. War eigentlich kein Problem nachdem ich auch schonmal Z80-Assembler programmiert hab.

AVR-Studio5 benötigt auf jeden Fall schon ne Menge mehr an Platz und Performance wegen diesem ganzen Runtime-Gelumpe von Microsoft. Ich hab bei mir mehrere Versionen von Bascom, AVR-Studio4+5 und PonyProg auf dem PC am laufen. Zuerst AVR-Studio (erst 4 dann 5) installieren, dann Bascom hinterher. Die Versionen jeweils in verschiedene Verzeichnisse, dann kann man es alles nutzen. Selbst der Jungo-Treiber für den AVRISPmk2 liegt bei mir in nem eigenen Verzeichnis.

Gruß
Dino
 
Warum der Drache statt dem mkII ist einfach. Der Drache kostet nur rund 50€ (kommt aber "nackt" daher und man braucht noch ein paar Stiftleisten und IC Sockel wenn man auch HVSP/HVPP verwenden will, sprich den IC einsetzen will wie bei EEPROM Programmiergeräten damals. Sehr Sinnvoll wenn man sich mal bei den Fuses vertan hat und aus Versehen SPI (und somit auch ISP) deaktiviert hat). Gehäuse, Lichtleiter, Stiftleisten und der IC Sockel kosten aber nicht die Welt. Der mkII kostet das 6fache und kann afaik keine parallele Programmierung. Dann lieber n bissl löten :)

Das mit den AVR Versionen. Ich hab nur das VisualStudio 2008 drauf (für Web- und PC Entwicklung) und das AVR Studio 4.19 (Build 730). Die beiden harmonieren gut zusammen, sobald jetzt ein AVR Studio > 5 dazu kommt wirds lustig. TPI sagt mir grade nichts, und ich hab auch keine 2 verschiedenen Versionen installiert. Ich weiß nur dass man, zumindest mit dem Drachen, nicht zu oft die Version wechseln sollte, da das AVR Studio ständig nach dem Wechsel wieder seine eigene Firmware drauf schreiben will (und muss)...
 
TPI ist das Programmier-Interface der neueren Tinies. Der AVRisp-MKII kann das nach einem(!) Firmwareupdate. Das war übrigens das einzige bisher. Laufen tut er unter Bascom, AVRstudio 4 und 5 problemlos. Den kriegste für 35-40€. Für Notfälle hab ich hier auch noch'n STK500 (welches aber von StudioV6 (V5?) nicht mehr unterstützt wird).
Wenn man sich bei den Clock-Fuses vertan hat, kann man dem µC ja auch die entsprechende Clock anbieten, und über ISP zurückfusen (bei Dinos Minimalbeschaltungen sind auch dazu Beispiele).
SPIEN kann man über ISP gar nicht manipulieren.
Eine etwaige RSTDSBL-Fuse kann natürlich zu einem Problem werden -> dann gehts ohne HV nicht mehr.
Bisher hab ich das aber noch nie verwendet/verwenden müssen.

Ok, dann werd ich mir demnächst mal 4.19 gönnen.
 
Hallo zusammen,

wenn Assembler oder C eingesetzt werden soll, ist sicherlich AVR Studio 4 oder Atmel Studio 6 in Verbindung mit AVRISPmkII eine gute Wahl. Den AVRISPmkII gibt es zum Beispiel bei uns im Shop. Diesen setze ich für Projekte mit AVR Mikrocontrollern am häufigsten ein (auch wenn mir alle anderen Tools von Atmel zur Verfügung stehen).

Dirk :ciao:
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)