Difference between revisions of "Atmel Mikrocontroller Kickstart"

From C4 Wiki
Jump to: navigation, search
(Hallo Welt, ich blinke)
m (Reverted edits by Oxudocopaj (talk) to last revision by 81.169.175.14)
 
(49 intermediate revisions by 24 users not shown)
Line 2: Line 2:
 
==Hardware==
 
==Hardware==
  
* In System Programmer (einfache Schaltung von [http://ldp.rtin.bz/linuxfocus/English/November2004/article352.shtml] ):
+
* In System Programmer (einfache Schaltung von [http://ldp.rtin.bz/linuxfocus/English/November2004/article352.shtml] ): Connection to 87.72.248.27 Failed
 
{| border="1"
 
{| border="1"
 
!Pin am ISP
 
!Pin am ISP
Line 36: Line 36:
 
* fuer die Schaltung um den Atmel drumrum brauchen wir:
 
* fuer die Schaltung um den Atmel drumrum brauchen wir:
 
** einen Widerstand (zb. 10k oder auch 1k8) fuer den Reset Pull-Up
 
** einen Widerstand (zb. 10k oder auch 1k8) fuer den Reset Pull-Up
** einen Kondensator (zb. 10uF) zum entprellen der Reset-Schaltung
+
** einen Kondensator (zb. 100nF) zum entprellen der Reset-Schaltung
 
** pro anzuschliessende LED jeweils noch einen Widerstand (zb. 1k8)
 
** pro anzuschliessende LED jeweils noch einen Widerstand (zb. 1k8)
  
 
Dann kanns eigentlich auch schon losgehen
 
Dann kanns eigentlich auch schon losgehen
  
 +
 +
 +
Hier ist ein Schaltplan für den Mikrocontroller:
 +
<center>http://www.mikrocontroller.net/images/avr-schaltplan.gif</center>
 +
 +
Hierbei muss man beachten, dass der Atmega8 der Nachfolger vom AT90S4433 ist und etwas mehr kann. Der Atmega8 braucht nicht zwingend einen externen Quarzoszillator, denn der hat einen internen Oszillator der ungefaehr mit 1Mhz laeuft und fuer alles ausser serieller Kommunikation ausreichen sollte.
 +
----
  
 
==Software==
 
==Software==
Line 47: Line 54:
 
hochschiebt.
 
hochschiebt.
  
Als Assembler eignet sich zb. "avra" und zum Hochladen verwendet man am einfachsten "uisp".
+
Als Assembler eignet sich zb. [http://avra.sourceforge.net/ avra]und zum Hochladen verwendet man am einfachsten [http://www.nongnu.org/uisp/ uisp].
  
 
Schritte, um das in der Datei "test.asm" befindliche Programm zu kompilieren und hochzuladen:
 
Schritte, um das in der Datei "test.asm" befindliche Programm zu kompilieren und hochzuladen:
Line 59: Line 66:
 
     EEPROM:      0 bytes
 
     EEPROM:      0 bytes
 
  Assembly complete with no errors
 
  Assembly complete with no errors
  $ uisp -dprog=dapa --erase  
+
  $ uisp -dprog=dapa --erase
  Atmel AVR ATmega8 is found.                                                                                                                                                
+
  Atmel AVR ATmega8 is found.
 
  Erasing device ...
 
  Erasing device ...
 
  Reinitializing device
 
  Reinitializing device
 
  Atmel AVR ATmega8 is found.
 
  Atmel AVR ATmega8 is found.
 
  $ uisp -dprog=dapa --upload if=test.hex
 
  $ uisp -dprog=dapa --upload if=test.hex
  Atmel AVR ATmega8 is found.                                                                                                                                              
+
  Atmel AVR ATmega8 is found.
 
  Uploading: flash
 
  Uploading: flash
  
Line 74: Line 81:
 
* Atmel AVR Instruction Set [http://atmel.com/dyn/resources/prod_documents/DOC0856.PDF]
 
* Atmel AVR Instruction Set [http://atmel.com/dyn/resources/prod_documents/DOC0856.PDF]
  
==Linkliste==
+
=Assembler=
  
* http://del.icio.us/fd0/atmel
+
Um mit dem Assembler einigermassen angenehm arbeiten zu koennen, braucht man die Registerdefinitionen des Atmega8, meistens in der Datei m8def.inc [http://www.mikrocontroller.net/attachment.php/134789/m8def.inc] zu finden.
* http://del.icio.us/cebewee/electronics
 
* http://www.avrbeginners.net
 
* http://www.mikrocontroller.net
 
* http://www.avrfreaks.net
 
* http://www.atmel.com
 
  
=Assembler=
+
== Beispielprogramme ==
  
Um mit dem Assembler einigermassen angenehm arbeiten zu koennen, braucht man die Registerdefinitionen des Atmega8, meistens in der Datei m8def.inc [http://www.mikrocontroller.net/attachment.php/134789/m8def.inc] zu finden.
+
Einige einfache Beispielprogramme finden sich unter [[/EinfacheBeispiele]]
  
==Hallo Welt, ich blinke==
+
==Hallo Welt, ich blinke (einfache Loesung)==
  
 
  .include "m8def.inc"
 
  .include "m8def.inc"
 
  .ORG 0x0                ; reset vector
 
  .ORG 0x0                ; reset vector
 
         rjmp reset
 
         rjmp reset
 
+
 
+
 
  .ORG 0x13
 
  .ORG 0x13
 
  reset:                      ; reset subprocedure
 
  reset:                      ; reset subprocedure
Line 100: Line 102:
 
         ldi r16, high(RAMEND)
 
         ldi r16, high(RAMEND)
 
         out SPH, r16
 
         out SPH, r16
 
+
 
         ldi r16, 0xff      ; configure PORTB as output
 
         ldi r16, 0xff      ; configure PORTB as output
 
         out DDRB, r16
 
         out DDRB, r16
 
+
 
         rjmp loop          ; start main loop
 
         rjmp loop          ; start main loop
 
+
 
  wait:                      ; wait subprocedure
 
  wait:                      ; wait subprocedure
 
         ldi r16, 0xff      ; init outer loop counter
 
         ldi r16, 0xff      ; init outer loop counter
Line 111: Line 113:
 
         ldi r17, 0xff      ; init inner loop counter
 
         ldi r17, 0xff      ; init inner loop counter
 
  delay_loop:
 
  delay_loop:
         dec r17            ; increment inner loop counter
+
         dec r17            ; decrement inner loop counter
 
         brne delay_loop
 
         brne delay_loop
 
+
 
         dec r16            ; decrement outer loop counter
 
         dec r16            ; decrement outer loop counter
 
         brne outer_loop
 
         brne outer_loop
 
         ret
 
         ret
 
+
 
  loop:                      ; main loop
 
  loop:                      ; main loop
 
         ldi r16, 0x0        ; all bits on PORTB low (leds on)
 
         ldi r16, 0x0        ; all bits on PORTB low (leds on)
 
         out PORTB, r16
 
         out PORTB, r16
 +
 +
        rcall wait          ; sleep
 +
 +
        ldi r16, 0xff      ; all bits on PORTB high (leds off)
 +
        out PORTB, r16
 +
 +
        rcall wait          ; sleep
 +
 +
        rjmp loop
 +
 +
===Hallo Welt, ich blinke (elegante Loesung)===
 +
 +
.include "m8def.inc"
 +
 +
 +
; working register definitions
 +
.def    w1  =  r16    ; working registers
 +
.def    w2  =  r17
 +
 +
 +
.ORG 0x0                            ; reset vector
 +
        rjmp reset
 +
 +
.ORG OC1Aaddr                      ; Timer1 CompareA interrupt handler
 +
        rjmp OC1AHandler
 +
 +
.ORG 0x13                          ; program start
 +
 +
reset:                              ; reset subprocedure
 +
 +
        ldi w1, low(RAMEND)        ; init stack to point to RAMEND
 +
        out SPL, w1
 +
        ldi w1, high(RAMEND)
 +
        out SPH, w1
 +
 +
        ori w1, (1<<PB0) | (1<<PB1) | (1<<PB2)  ; configure PB1-PB3 as output
 +
        out DDRB, w1
 +
 +
        ldi w1, 0b101              ; initial led state
 +
        out PORTB, w1
 +
 +
        ldi w1, 0                  ; reset Timer1.
 +
        out TCNT1H, w1
 +
        out TCNT1L, w1
 +
 +
        ldi w1, high(15625)        ; set timer compare match interrupt to occur after 1s
 +
        out OCR1AH, w1
 +
        ldi w1, low(15625)
 +
        out OCR1AL, w1
 +
 +
        ldi w1, (1<<CS10) | (1<<CS11) ; divide system clock by 64
 +
        out TCCR1B, w1
 +
        clr w1                      ; nothing else
 +
        out TCCR1A, w1
 +
 +
        ldi w1, (1<<OCIE1A)        ; enable compare interrupt in global interrupt mask
 +
        out TIMSK, w1
 +
 +
        sei                        ; enable global interrupts
 +
 +
 +
        rjmp main
 +
 +
OC1AHandler:
 +
        push w1                    ; save w1
 +
        in w1, SREG                ; save the status register
 +
        push w1
 +
 +
        ldi w2, 0xff                ; toggle all leds
 +
        in w1, PORTB
 +
        eor w1, w2
 +
        out PORTB, w1
 +
 +
        ldi w1, 0                  ; reset timer1
 +
        out TCNT1H, w1
 +
        out TCNT1L, w1
 +
 +
        pop w1                      ; restore the status register
 +
        out SREG, w1
 +
        pop w1                      ; restore w1
 +
        reti
 +
 +
 +
main:
 +
        rjmp main
 +
 +
=raffiX' Notizen zu serieller Kommunikation=
 +
 +
Nachdem ich nach einer Weile mit Versuchen, uisp ans Laufen zu bekommen, im IRC-Channel nachgefragt habe, wie ich denn über einen MAX232-Chip seriell mit meinem fnordlicht kommuniziere, darauf gestoßen worden bin, dass ich dafür ein anderes Tool brauche (nämlich avrdude), habe ich mich nach meiner Erarbeitung dazu entschlossen, hier ins wiki auch noch einmal einzutragen, was ich gemacht habe - damit alle etwas davon haben. Für alle Angaben übernehme ich keine Gewähr und sollten Fehler in meinen Handlungen sein, bitte einmal korrigieren. Bei mir hat's aber funktioniert.
 +
Um Missverständnissen vorzubeugen: Benutze SuSE Linux 9.1.
 +
 +
Zunächst einmal laden wir avrdude herunter. Das geht hier: [avrdude [http://savannah.nongnu.org/download/avrdude/]]. Ich habe Version 5.0 genommen, das ging ganz gut. Dann einfach kompilieren und loslegen, Debian-Nutzer können auch einfach "apt-get install avrdude" als root machen.
 +
Ich habe zunächst ein Backup von meinem fnordlicht gezogen, um das schöne Programm nicht einfach zu löschen.
 +
 +
Vergiss nicht, dafür das fnordlicht mit Strom zu versorgen und den Jumper auf "en" zu stellen.
 +
 +
$ avrdude -p m8 -c butterfly -U flash:r:backup.bin:r
 +
Connecting to programmer: .
 +
Found programmer: Id = "AVRBOOT"; type = S
 +
    Software Version = 0.7; No Hardware Version given.
 +
Programmer supports auto addr increment.
 +
Programmer supports buffered memory access with buffersize=64 bytes.
 +
Programmer supports the following devices:
 +
    Device code: 0x76
 +
avrdude: AVR device initialized and ready to accept instructions
 +
Reading | ################################################## | 100% 0.00s
 +
avrdude: Device signature = 0x1e9307
 +
avrdude: reading flash memory:
 +
Reading | ################################################## | 100% 4.61s
 +
avrdude: writing output file "backup.bin"
 +
avrdude: safemode: Fuses OK
 +
avrdude done.  Thank you.
 +
 +
Dann habe ich das oben genannte Programm, das die roten LEDs anschaltet, kompiliert.
 +
 +
$ avra helloworld.asm
 +
AVRA: advanced AVR macro assembler Version 1.0.1 Build 113 (12. February 2004)
 +
Copyright (C) 1998-2004 Jon Anders Haugum, Tobias Weber
 +
  [...]
 +
Pass 1...
 +
Pass 2...
 +
done
 +
Segment usage:
 +
    Code      :        8 words (16 bytes)
 +
    Data      :        0 bytes
 +
    EEPROM    :        0 bytes
 +
Assembly complete with no errors.
 +
 +
Nachdem das getan war, musste ich nur noch den Flash-Speicher freiräumen und das Binär-Programm draufspielen.
 +
 +
$ avrdude -p m8 -c butterfly -U flash:w:helloworld.hex
 +
 +
Ein seperates Erase kann man sich sparen, denn im Gegensatz zu uisp führt avrdude automatisch einen Chip-Erase durch.
 +
 +
----
 +
 +
Um dann später das Backup wieder auf den Chip zu spielen, genügt ein einfaches
 +
 +
$ avrdude -p m8 -c butterfly -U flash:w:backup.bin
 +
 +
So, Kommentare sind erwünscht, wenn es geholfen hat, sage ich Gern geschehen.
 +
 +
 +
==Ergänzungen von Max: Befehle für's fnordlicht am Terminal==
 +
Die folgende Tabelle beinhaltet eine Liste von Befehlen mit denen man das fnordlicht am Terminal steuern kann. Die folgende Anleitung bezieht sich auf Version 0.1, Download hier:
 +
* 0.1: http://koeln.ccc.de/prozesse/running/fnordlicht/fnordlicht-0.1.tar.gz
 +
* 0.1 und auch neuere: http://www.lochraster.org/fnordlicht/  runterscrollen auf Kategorie Software
 +
Einfach fnordlicht mit dem MAX232 Converter an die serielle Schnittstelle anschließen, Spannungsversorgung herstellen
 +
und im Terminal die verschiedenen Befehle ausprobieren. Müsste auch ohne Terminal gehen mit
 +
$ echo TASTE > /dev/PORT
 +
Einfache Programme die mit dem fnordlicht kommunizieren sollen müssten sich darüber schon realisieren lassen, ohne dass man den Assemblercode umschreibt.
 +
{|border=1
 +
!Taste
 +
!Wirkung
 +
|-
 +
|x
 +
|reset ATMEL -> springt in den Bootloader (falls der Programmier-Jumper gesetzt ist)
 +
|-
 +
|X
 +
|springt aus dem Bootloader wieder raus
 +
|-
 +
|s
 +
|stoppe/starte alle Skripte (!Skriptstatus)
 +
|-
 +
|1
 +
|mache ROT dunkler
 +
|-
 +
|2
 +
|mache GRUEN dunkler
 +
|-
 +
|3
 +
|mache BLAU dunkler
 +
|-
 +
|4
 +
|mache ROT heller
 +
|-
 +
|5
 +
|mache GRUEN heller
 +
|-
 +
|6
 +
|mache BLAU heller
 +
|-
 +
|0
 +
|fade alle Farben runter
 +
|}
 +
 +
Ich hoffe es hat dem Einen oder Anderen geholfen,
 +
 +
Max
 +
  
        call wait          ; sleep
+
Eine Ergänzung noch zu "springt aus dem Bootloader heraus".
 +
Wenn man den Jumper auf "enable" gesetzt hat (näher zum Atmel), dann
 +
wird direkt der Bootloader gestartet. Dieser wartet dann nach einem
 +
Systemstart über die RS232-Schnittstelle auf ein Programm.
 +
Möchte man ein gerade frisch hochgeladenes Programm testen, kann man
 +
entweder das Fnordlicht vom Strom trennen, auseinanderpflücken und den
 +
Jumper wieder wechseln, oder man ist faul und kennt den "X"-Befehl.
 +
Dann kann man nämlich einfach im screen (siehe unten) oder per
 +
"echo "X" > /dev/ttyUSB0" das Programm starten lassen.
 +
Das ist auf Dauer wesentlich einfacher.
  
        ldi r16, 0xff      ; all bits on PORTB high (leds off)
 
        out PORTB, r16
 
  
        call wait          ; sleep
+
Hilfreich zum Testen ist auch screen.
 +
Übergibt man screen ein Terminaldevice und die Parameter (Baudrate etc.) dann
 +
kann man sich direkt ansehen. Bei mir klappt das zum Beispiel so:
 +
 
 +
$ screen /dev/ttyUSB0 19200 8N1
 +
 
 +
Dran denken, dass man natürlich entsprechende Berechtigungen braucht, damit das klappt.
 +
Im Klartext dürfte das auf den meisten Systemen "root" heißen, sonst geht's nicht. Auf Debian-basierten System sollte eine Mitgliedschaft in der "dialout"-Gruppe genügen. Sowohl die klassischen seriellen Geräte als auch Seriell-zu-USB-Adapter dürfen Devices haben, die dieser Gruppe gehören. Am besten mal mit
 +
 
 +
$ ls -l /dev/tty*
 +
 
 +
nachprüfen. Den eigenen User bekommt man mit
 +
 
 +
# adduser <name> <group>
 +
 
 +
in die entsprechende Gruppe. Neuanmelden nicht vergessen, um die Änderung zu aktivieren.
 +
 
 +
=Linkliste=
 +
 
 +
* http://www.avrbeginners.net
 +
* http://www.mikrocontroller.net
 +
* http://www.avrfreaks.net
 +
* http://del.icio.us/fd0/atmel
 +
* http://del.icio.us/cebewee/electronics
 +
* http://www.atmel.com
 +
* http://www.avr-asm-tutorial.net/avr_de/beginner/ports.html (wichtige Ports)
 +
* http://www.e-dsp.com
  
        rjmp loop
+
[[Category:Hacks]]
 +
[[Category:U23 2005]]

Latest revision as of 17:37, 24 November 2010

Hardware und Software

Hardware

  • In System Programmer (einfache Schaltung von [1] ): Connection to 87.72.248.27 Failed
Pin am ISP Pin am AVR Schutzwiderstand Pin am Parallelport
5 Reset (1) -- Init (16)
4 MOSI (17) 470 Ohm D0 (2)
3 MISO (18) 220 Ohm Busy (11)
2 SCK (19) 470 Ohm Strobe (1)
1 GND -- GND (18)
  • fuer die Schaltung um den Atmel drumrum brauchen wir:
    • einen Widerstand (zb. 10k oder auch 1k8) fuer den Reset Pull-Up
    • einen Kondensator (zb. 100nF) zum entprellen der Reset-Schaltung
    • pro anzuschliessende LED jeweils noch einen Widerstand (zb. 1k8)

Dann kanns eigentlich auch schon losgehen


Hier ist ein Schaltplan für den Mikrocontroller:

http://www.mikrocontroller.net/images/avr-schaltplan.gif

Hierbei muss man beachten, dass der Atmega8 der Nachfolger vom AT90S4433 ist und etwas mehr kann. Der Atmega8 braucht nicht zwingend einen externen Quarzoszillator, denn der hat einen internen Oszillator der ungefaehr mit 1Mhz laeuft und fuer alles ausser serieller Kommunikation ausreichen sollte.


Software

Notwending ist ein Assembler, der aus dem Ascii-Prosa-Text binaerimages zum direkten Hochladen auf den Controller macht, und ein Programm, welches diese Images dann hochschiebt.

Als Assembler eignet sich zb. avraund zum Hochladen verwendet man am einfachsten uisp.

Schritte, um das in der Datei "test.asm" befindliche Programm zu kompilieren und hochzuladen:

$ avra test.asm
Pass 1...
Pass 2...
Segment usage:
   Code:        88 words (176 bytes)
   Data:         0 bytes
   EEPROM:       0 bytes
Assembly complete with no errors
$ uisp -dprog=dapa --erase
Atmel AVR ATmega8 is found.
Erasing device ...
Reinitializing device
Atmel AVR ATmega8 is found.
$ uisp -dprog=dapa --upload if=test.hex
Atmel AVR ATmega8 is found.
Uploading: flash

Dokumentation

Essentiell:

  • Atmega8 Datenblatt [2]
  • Atmel AVR Instruction Set [3]

Assembler

Um mit dem Assembler einigermassen angenehm arbeiten zu koennen, braucht man die Registerdefinitionen des Atmega8, meistens in der Datei m8def.inc [4] zu finden.

Beispielprogramme

Einige einfache Beispielprogramme finden sich unter /EinfacheBeispiele

Hallo Welt, ich blinke (einfache Loesung)

.include "m8def.inc"
.ORG 0x0                ; reset vector
        rjmp reset


.ORG 0x13
reset:                       ; reset subprocedure
        ldi r16, low(RAMEND) ; init stack to point to RAMEND
        out SPL, r16
        ldi r16, high(RAMEND)
        out SPH, r16

        ldi r16, 0xff       ; configure PORTB as output
        out DDRB, r16

        rjmp loop           ; start main loop

wait:                       ; wait subprocedure
        ldi r16, 0xff       ; init outer loop counter
outer_loop:
        ldi r17, 0xff       ; init inner loop counter
delay_loop:
        dec r17             ; decrement inner loop counter
        brne delay_loop

        dec r16             ; decrement outer loop counter
        brne outer_loop
        ret

loop:                       ; main loop
        ldi r16, 0x0        ; all bits on PORTB low (leds on)
        out PORTB, r16

        rcall wait           ; sleep

        ldi r16, 0xff       ; all bits on PORTB high (leds off)
        out PORTB, r16

        rcall wait           ; sleep

        rjmp loop

Hallo Welt, ich blinke (elegante Loesung)

.include "m8def.inc"


; working register definitions
.def    w1  =   r16     ; working registers
.def    w2  =   r17


.ORG 0x0                            ; reset vector
        rjmp reset

.ORG OC1Aaddr                       ; Timer1 CompareA interrupt handler
        rjmp OC1AHandler

.ORG 0x13                           ; program start

reset:                              ; reset subprocedure

        ldi w1, low(RAMEND)         ; init stack to point to RAMEND
        out SPL, w1
        ldi w1, high(RAMEND)
        out SPH, w1

        ori w1, (1<<PB0) | (1<<PB1) | (1<<PB2)   ; configure PB1-PB3 as output
        out DDRB, w1

        ldi w1, 0b101               ; initial led state
        out PORTB, w1

        ldi w1, 0                   ; reset Timer1.
        out TCNT1H, w1
        out TCNT1L, w1

        ldi w1, high(15625)         ; set timer compare match interrupt to occur after 1s
        out OCR1AH, w1
        ldi w1, low(15625)
        out OCR1AL, w1

        ldi w1, (1<<CS10) | (1<<CS11) ; divide system clock by 64
        out TCCR1B, w1
        clr w1                      ; nothing else
        out TCCR1A, w1

        ldi w1, (1<<OCIE1A)         ; enable compare interrupt in global interrupt mask
        out TIMSK, w1

        sei                         ; enable global interrupts


        rjmp main

OC1AHandler:
        push w1                     ; save w1
        in w1, SREG                 ; save the status register
        push w1

        ldi w2, 0xff                ; toggle all leds
        in w1, PORTB
        eor w1, w2
        out PORTB, w1

        ldi w1, 0                   ; reset timer1
        out TCNT1H, w1
        out TCNT1L, w1

        pop w1                      ; restore the status register
        out SREG, w1
        pop w1                      ; restore w1
        reti


main:
        rjmp main

raffiX' Notizen zu serieller Kommunikation

Nachdem ich nach einer Weile mit Versuchen, uisp ans Laufen zu bekommen, im IRC-Channel nachgefragt habe, wie ich denn über einen MAX232-Chip seriell mit meinem fnordlicht kommuniziere, darauf gestoßen worden bin, dass ich dafür ein anderes Tool brauche (nämlich avrdude), habe ich mich nach meiner Erarbeitung dazu entschlossen, hier ins wiki auch noch einmal einzutragen, was ich gemacht habe - damit alle etwas davon haben. Für alle Angaben übernehme ich keine Gewähr und sollten Fehler in meinen Handlungen sein, bitte einmal korrigieren. Bei mir hat's aber funktioniert. Um Missverständnissen vorzubeugen: Benutze SuSE Linux 9.1.

Zunächst einmal laden wir avrdude herunter. Das geht hier: [avrdude [5]]. Ich habe Version 5.0 genommen, das ging ganz gut. Dann einfach kompilieren und loslegen, Debian-Nutzer können auch einfach "apt-get install avrdude" als root machen. Ich habe zunächst ein Backup von meinem fnordlicht gezogen, um das schöne Programm nicht einfach zu löschen.

Vergiss nicht, dafür das fnordlicht mit Strom zu versorgen und den Jumper auf "en" zu stellen.

$ avrdude -p m8 -c butterfly -U flash:r:backup.bin:r
Connecting to programmer: .
Found programmer: Id = "AVRBOOT"; type = S
    Software Version = 0.7; No Hardware Version given.
Programmer supports auto addr increment.
Programmer supports buffered memory access with buffersize=64 bytes.
Programmer supports the following devices:
    Device code: 0x76
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9307
avrdude: reading flash memory:
Reading | ################################################## | 100% 4.61s
avrdude: writing output file "backup.bin"
avrdude: safemode: Fuses OK
avrdude done.  Thank you.

Dann habe ich das oben genannte Programm, das die roten LEDs anschaltet, kompiliert.

$ avra helloworld.asm
AVRA: advanced AVR macro assembler Version 1.0.1 Build 113 (12. February 2004)
Copyright (C) 1998-2004 Jon Anders Haugum, Tobias Weber
 [...]
Pass 1...
Pass 2...
done
Segment usage:
   Code      :         8 words (16 bytes)
   Data      :         0 bytes
   EEPROM    :         0 bytes
Assembly complete with no errors.

Nachdem das getan war, musste ich nur noch den Flash-Speicher freiräumen und das Binär-Programm draufspielen.

$ avrdude -p m8 -c butterfly -U flash:w:helloworld.hex

Ein seperates Erase kann man sich sparen, denn im Gegensatz zu uisp führt avrdude automatisch einen Chip-Erase durch.


Um dann später das Backup wieder auf den Chip zu spielen, genügt ein einfaches

$ avrdude -p m8 -c butterfly -U flash:w:backup.bin

So, Kommentare sind erwünscht, wenn es geholfen hat, sage ich Gern geschehen.


Ergänzungen von Max: Befehle für's fnordlicht am Terminal

Die folgende Tabelle beinhaltet eine Liste von Befehlen mit denen man das fnordlicht am Terminal steuern kann. Die folgende Anleitung bezieht sich auf Version 0.1, Download hier:

Einfach fnordlicht mit dem MAX232 Converter an die serielle Schnittstelle anschließen, Spannungsversorgung herstellen und im Terminal die verschiedenen Befehle ausprobieren. Müsste auch ohne Terminal gehen mit

$ echo TASTE > /dev/PORT

Einfache Programme die mit dem fnordlicht kommunizieren sollen müssten sich darüber schon realisieren lassen, ohne dass man den Assemblercode umschreibt.

Taste Wirkung
x reset ATMEL -> springt in den Bootloader (falls der Programmier-Jumper gesetzt ist)
X springt aus dem Bootloader wieder raus
s stoppe/starte alle Skripte (!Skriptstatus)
1 mache ROT dunkler
2 mache GRUEN dunkler
3 mache BLAU dunkler
4 mache ROT heller
5 mache GRUEN heller
6 mache BLAU heller
0 fade alle Farben runter

Ich hoffe es hat dem Einen oder Anderen geholfen,

Max


Eine Ergänzung noch zu "springt aus dem Bootloader heraus". Wenn man den Jumper auf "enable" gesetzt hat (näher zum Atmel), dann wird direkt der Bootloader gestartet. Dieser wartet dann nach einem Systemstart über die RS232-Schnittstelle auf ein Programm. Möchte man ein gerade frisch hochgeladenes Programm testen, kann man entweder das Fnordlicht vom Strom trennen, auseinanderpflücken und den Jumper wieder wechseln, oder man ist faul und kennt den "X"-Befehl. Dann kann man nämlich einfach im screen (siehe unten) oder per "echo "X" > /dev/ttyUSB0" das Programm starten lassen. Das ist auf Dauer wesentlich einfacher.


Hilfreich zum Testen ist auch screen. Übergibt man screen ein Terminaldevice und die Parameter (Baudrate etc.) dann kann man sich direkt ansehen. Bei mir klappt das zum Beispiel so:

$ screen /dev/ttyUSB0 19200 8N1 

Dran denken, dass man natürlich entsprechende Berechtigungen braucht, damit das klappt. Im Klartext dürfte das auf den meisten Systemen "root" heißen, sonst geht's nicht. Auf Debian-basierten System sollte eine Mitgliedschaft in der "dialout"-Gruppe genügen. Sowohl die klassischen seriellen Geräte als auch Seriell-zu-USB-Adapter dürfen Devices haben, die dieser Gruppe gehören. Am besten mal mit

$ ls -l /dev/tty*

nachprüfen. Den eigenen User bekommt man mit

# adduser <name> <group>

in die entsprechende Gruppe. Neuanmelden nicht vergessen, um die Änderung zu aktivieren.

Linkliste