Datenblätter & Whitepaper

Pollin-Programmer

ATtiny2313

Konsole & Befehle

Pollin-Programmer ansprechen/einfacher Test

Der Programmer ist vom Typ „siprog“: http://s-huehn.de/elektronik/avr-prog/avr-prog.htm

Einfache Abfrage mit avrdude

Gibt den Controllertyp zurück und liest die Fuse-Bits aus.

Parameter Funktion
-p Controller Type (z2313 = Attiny2313)
-c Programmer Typ (siprog, ganz einfaches Ding)
-P das Device an dem der Programmer hängt, hier erste Serielle Schnittstelle (/dev/ttyS0)
-n Nichts in den Controller schreiben - zur Sicherheit
-v Verbose
miq@apfeltasche:~$ avrdude -p t2313 -c siprog -P /dev/ttyS0 -n -v

avrdude: Version 5.5, compiled on Nov 10 2007 at 00:07:28
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/

         System wide configuration file is "/etc/avrdude.conf"
         User configuration file is "/home/miq/.avrduderc"
         User configuration file does not exist or is not a regular file, skipping

         Using Port            : /dev/ttyS0
         Using Programmer      : siprog
         AVR Part              : ATtiny2313
         Chip Erase delay      : 9000 us
         PAGEL                 : PD4
         BS2                   : PD6
         RESET disposition     : possible i/o
         RETRY pulse           : SCK
         serial program mode   : yes
         parallel program mode : yes
         Timeout               : 200
         StabDelay             : 100
         CmdexeDelay           : 25
         SyncLoops             : 32
         ByteDelay             : 0
         PollIndex             : 3
         PollValue             : 0x53
         Memory Detail         :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65     6     4    0 no        128    4      0  4000  4500 0xff 0xff
           flash         65     6    32    0 yes      2048   32     64  4500  4500 0xff 0xff
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00
           lock           0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           lfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  9000  9000 0x00 0x00
           calibration    0     0     0    0 no          2    0      0     0     0 0x00 0x00

         Programmer Type : SERBB
         Description     : Lancos SI-Prog <http://www.lancos.com/siprogsch.html>

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e910a
avrdude: safemode: lfuse reads as 64
avrdude: safemode: hfuse reads as DF
avrdude: safemode: efuse reads as FF

avrdude: safemode: lfuse reads as 64
avrdude: safemode: hfuse reads as DF
avrdude: safemode: efuse reads as FF
avrdude: safemode: Fuses OK

avrdude done.  Thank you.

Assembler

  • gavrasm (Mai 2009: Version 2.3)
  • avra (Novemper 2007: Version 1.2.3)

Avra

Einfaches Programm um eine der beiden LEDs auf dem Pollin Programmer leuchten zu lassen:

GeSHi fehlt ein Language-File für AVR-ASM. Vielleicht könnte man mal sowas schreiben?
Code hier wird als x86-ASM geparsed, klappt also nicht vollständig.

.include "tn2313def.inc"     ; Definitionsdatei für Prozessortyp einbinden (Tiny2313)
 
         ldi r16, 0xFF       ; lade Arbeitsregister r16 mit der Konstanten 0xFF
         out DDRD, r16       ; Inhalt von r16 in DDRB schreiben, alle PINs Ausgänge
 
         ldi r16, 0b01000000 ; 0b01000000 in r16 laden
         out PORTD, r16      ; r16 ins IO-Register PORTB ausgeben, PIN 6 (LED) High 
 
ende:    rjmp ende           ; Sprung zur Marke "ende" -> Endlosschleife
Programm von hier gemopst und angepasst: http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen \

  • oben gelistetes Programm als „led.asm“ abspeichern
  • tn2313inc.def (an verwendeten Controller anpassen) in gleiche Verzeichnis kopieren (Siehe Include Dateien)
  • Flashen

Include Dateien

Lassen sich auch einzeln hier herunterladen: http://avr.8b.cz/inc/

  • Avra kommt mit Compilerdirektiven (#ifdef, #pragma usw.) nicht klar, diese Zeilen löschen.

Flashen

Flasht „led.hex“ in den Controller und macht einen Reset. Programm läuft sofort los.

miq@apfeltasche:~$ avrdude -p t2313 -c siprog -P /dev/ttyS0 -v -U led.hex

AVR-Kompatible Befehle / Mnemonik

Atmel Assembler Seite: http://www.atmel.com/dyn/resources/prod_documents/doc1022.pdf Ist auf AVR Studio geschrieben, Befehlstabellen ab Seite 5.

Wichtige Befehle

Mnemonik Befehl Beschreibung
RJUMP <addr> Relative Jump Relativer Sprung ?? (auch auf Sprungmarke, nicht auf Adresse)
LDI <register>, <konstante> Load Immediate Register mit Wert laden
OUT <port>, <register> Out Port Schreibt auf einen Port. Immer nur ganzes Byte ??
INC <register> Increment Register um 1 hochzählen.
SEI Global Interrupt Enable Interrupt ????
CPI <register>, <konstante> ComPare with Immediate Vergleiche Register mit Konstante. Intern wird Parameter1 – Parameter2 gerechnet.
BRNE <sprungmarke> BRanch if Not Equal Verzweige, wenn nicht gleich. Springt an die angegebene Sprungmarke, wenn der (vorhergehende) Vergleichsbefehl einen Unterschied (!= 0)ergeben hat.
CLR <register> Clear Register „Lösche“ Register. Setze Register auf Null. Intern wird das Register mit sich selbst XOR gerechnet → ergibt immer Null.
CP <register>, <register> ComPare Vergleiche zwei Register. Intern wird Parameter1 – Parameter2 gerechnet.
BRLT <sprungmarke> Branch if Less Than, Signed Verzweige, wenn kleiner als. Springt an die angegebene Sprungmarke, wenn der (vorhergehende) Vergleichsbefehl „kleiner als“ ergeben hat.
ORI <register>, <konstante> Logical OR with Immediate Logisches ODER eines Registers mit einer Konstante. Ergebnis landet im Register.
RETI Interrupt Return Rückkehr von einer Interruptroutine. POPt Rücksprungadresse vom Stack und Springt dorthin.

Anmerkungen zur Tabelle: Sprungmarken werden vom Assembler in Adressen umgewandelt, daher ist der Parameter für Sprungbefehle eine Konstante. Dies wird in AVR-Dokumenten auch so angegeben.

Wichtige Konstanten, Definitionen und Funktionen

Funktion/Konstante/Definition Bedeutung Beschreibung
LOW() Low-Byte Gibt niederwertiges Byte eines 16Bit Wertes zurück.
HIGH() High-Byte Gibt das höherwertige Byte eines 16Bit Wertes zurück. z.B. HIGH(RAMEND) beim Atmega.
RAMEND RAM END Letztes Byte des verfügbaren RAM. Controllerabhängig, 8Bit für <255byte RAM, 16Bit bis 65k.
SPL Stack Pointer Low (-Byte) (Niederwertiges Byte des Stapelzeigers) Low-Byte des Stack-Pointer. Auf Attiny der komplette Pointer (8Bit Adressraum) Beispiel:
LDI r16, LOW(RAMEND)
OUT SPL, r16
→ Läd Register r16 mit dem Low-Byte der höchsten RAM-Adresse. Setzt das Low-Byte des Stack-Pointer auf den Wert in r16. Dieses Beispiel funktioniert auf Attiny µControllern.
SPH Stack Pointer High (-Byte) (Höherwertiges Byte des Stapelzeigers) High-Byte des Stack-Pointer. Wird auf dem Atmega gebraucht.
DDRD Data Direction Register port D (Datenflußrichtungsregister) Datenflußrichtungsregister für Port D. Legt fest, ob vom Port (PINs) gelesen oder geschrieben werden kann. 0XFF = 255 = Alle pins auf Ausgang. Beispiel:
LDI r16, 0xFF
OUT DDRD, r16
→ Läd Register r16 mit der Konstante 0xFF (=255). Setzt Datenrichtung an PORT D auf Ausgabe, Alle Pins 1.
TCCR0 Timer/ Counter Control Register (Zähler Kontroll Register) Timer 0 ist ein 8bit Timer. Wird ausgelöst durch einen Overflow. (Overflow Interrupt) TCCR0 Aktiviert den Timer-Interrupt und setzt den Vorteiler für den ITR (Prescaler). Beispiel:
LDI r16, 0b00000001
OUT TCCR0, r16
→ Lade Register r16 mit 1 (Binär 0000 0001) und schiebe diesen Wert auf das TCCR0. Dadurch wird der Vorteiler auf 1 gesetzt, d.h. Der ITR ist aktiv, und löst alle 256 Taktzyklen aus. Bei 1MHz Takt bedeutet das der ITR löst alle 1'000'000 / 256 = 3906x pro Sekunde (=3,9KHz) aus. Der Vorteiler wird nach folgender Tabelle gesetzt:
+------+------+------+------+------+------+------+------+
|      |      |      |      |      | CS02 | CS01 | CS00 |
+------+------+------+------+------+------+------+------+
CS02 CS01 CS00  Bedeutung
0    0    0     keine (Timer ist angehalten)
0    0    1     Teiler: 1
0    1    0     Teiler: 8
0    1    1     Teiler: 64
1    0    0     Teiler: 256
1    0    1     Teiler: 1024
1    1    0     Ext. Takt vom Pin T0, fallende Flanke
1    1    1     Ext. Takt vom Pin T0, steigende Flanke
(Quelle: [http://www.mikrocontroller.net/ www.mikrocontroller.net]) Anderes Beispiel:
LDI r16, 0b00000101
OUT TCCR0, r16
→ Setzt einen Vorteiler von 1024. Das bedeutet: Bei 1MHz Takt löst der Timer alle 1'000'000 / 1024 / 256 = 3,81x pro Sekunde (= 3,8Hz) einen Interrupt aus. (Nachrechnen!)
TIMSK Timer/Counter Interrupt Mask Register
PORTD Port D
avr/avr_sammler.txt · Zuletzt geändert: 2011/03/08 16:37 von miq
Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht: CC Attribution-Noncommercial-Share Alike 3.0 Unported