Programmierinformationen zum Atmega8

Auslesen des Atmega8 mit dem mySmartUSB (z.B. auf dem myAVR Board):
avrdude -p m8 -c avr910 -P /dev/ttyUSB0 -v
avrdude -p m8 -c avr910 -P /dev/ttyUSB0 -U flash:r:flash.hex:i
avrdude -p m8 -c avr910 -P /dev/ttyUSB0 -U eeprom:r:eeprom.hex:i
Statt flash oder eeprom, geht auch noch lock, hfuse, lfuse und signature.

Lock-Bits: auf 0x3F lassen.

Fuse-Bits: (Zusammenfassung vom Datenblatt)

hfuse       Reset/PC6 WDTON SPIEN CKOPT EESAVE BOOTSZ1/SZ0 BOOTRST
  default:      1       1     0     1     1        0   0     1       = 0xD9
lfuse       BODLEVEL  BODEN SUT1  SUT0  CKSEL3 CKSEL2 CKSEL1 CKSEL0
  default:      1       1     1     0     0      0      0      1     = 0xE1
  CeramicOsz:   1       1     1     0     1      1      1      0     = 0xEE
  fuer Quarz:   1       1     1     1     1      1      1      1     = 0xFF
Bedeutung der Fuses:
Setzen der Fuses: avrdude -p m8 -c avr910 -P /dev/ttyUSB0 -U lfuse:w:0xFF:m
Weitere Informationen zu den AVR_Fuses auf mikrocontroller.net

Speicherbelegung:
Der Atmega8 hat 8KB Flash, 512Byte EEPROM und 1KB RAM.
Beim Ausschalten bleiben die Daten im Flash und EEPROM erhalten, Daten im RAM gehen verloren.
Programmbereich: Word-weise organisiert (16-Bit Worte)
0000: Application-Flash
0C00: Start Boot-Flash (siehe BOOTSZ)
0FFF: letztes Word im Boot-Flash

RAM-Bereich: Byte-weise organisiert
0000: r0
0001: r1
...
001F: r31
0020: IO-Bereich
005F: letztes Byte im IO-Bereich
0060: SRAM
045F: letztes Byte

EEPROM-Bereich: Byte-weise organisiert
0000:
01FF:


Timer des Atmega8

Timer0

TCCR0: - - - - - CS02 CS01 CS00
 Bits2-0: 000 = Timer gestoppt
	  001 = ohne Prescaler, direkt mit Quarzfrequenz gezaehlt
	  010 = Prescaler=8, Timertakt=Quarzfrequenz/8
	  011 = Prescaler=64
	  100 = Prescaler=256
	  101 = Prescaler=1024
	  110 = Externer Takt, fallende Flanke
	  111 = Externer Takt, steigende Flanke

TCNT0: Zaehler (8-Bit)

TIMSK: OCIE2  TOIE2  TICIE1  OCIE1A  OCIE1B  TOIE1  -  TOIE0
       Bit0: TOIE0 = Timer Overflow Interrupt Enable fuer timer0

TIFR:  OCF2  TOV2  ICF1  OCF1A  OCF1B TOV1  -  TOV0
       Bit0: TOV0 = Timer Overflow timer0
	     Wird automatisch gesetzt wenn der Zaehler von 0xFF auf 0 wechselt.
	     Wenn TOIE0 gesetzt auch automatisch rueckgesetzt wenn die
	     Interruptroutine ausgefuehrt wird.
	     Sonst ruecksetzen durch schreiben von 1 in dieses Bit.

Timer1

TIMSK: OCIE2  TOIE2  TICIE1  OCIE1A  OCIE1B  TOIE1  -  TOIE0
       Bit2: TOIE1 = Timer Overflow Interrupt Enable fuer timer1
       Bit3: OCIE1B = Output Compare Interrupt Enable fuer Vergleichsregister B
       Bit4: OCIE1A = Output Compare Interrupt Enable fuer Vergleichsregister A
       Bit5: TICIE1 = Timer1 Input Capture Interrupt Enable. Interrupt bei
		      entsprechendem Signal am ICP1-Pin, oder im WGM-Modus 12
		      wenn ICR1 erreicht wird.

TIFR:  OCF2  TOV2  ICF1  OCF1A  OCF1B TOV1  -  TOV0
       Bit2: TOV1 = Timer Overflow timer1
       Bit5: ICF1 = Input Capture Flag

SFIOR: -  -  -  -  ACME  PUD  PSR2  PSR10
       PSR10 = PreScaler Reset (fuer timer1 und timer0)

Verwirrende Definitionen im Manual:
  BOTTOM=0 MAX=0xFFFF (Maximaler Maximalwert) TOP=einstellbarer Maximalwert

TCNT1H:TCNT1L: Zaehler (16-Bit) 

TCCR1A: COM1A1  COM1A0  COM1B1  COM1B0  FOC1A  FOC1B  WGM11  WGM10
	COM1A1:0 = Ausgaenge fuer Vergleichsregister A
	COM1B1:0 = Ausgaenge fuer Vergleichsregister B
		 00 = keine Ausgaenge geschaltet (Normalfall)
		 01 = Ausgang wechselt wenn Vergleichswert erreicht wird
		 10 = Ausgang wird auf 0 gesetzt
		 11 = Ausgang wird auf 1 gesetzt

TCCR1B: ICNC1  ICES1  -  WGM13  WGM12  CS12  CS11  CS10
	ICNC1 = Input Capture Noise Canceler
	ICES1 = Input Caprure Edge Select
	CS12:CS11:CS10 = Clock Select, gleich wie CS02:CS01:CS00 in TCCR0

WGM13:WGM12:WGM11:WGM10 = Laufmodus des Timers
 0000 =  0 = Normal, TOP=0xFFFF, TOV1 wird bei MAX gesetzt
 0100 =	 4 = CTC,    TOP=OCR1A,  TOV1 wird bei MAX gesetzt
 1100 =	12 = CTC,    TOP=ICR1,   TOV1 wird bei MAX gesetzt
 1101 =	13 = Reserviert
 0101 =  5 = Fast-PWM, TOP=0x0FF, TOV1 wird bei TOP gesetzt
 0110 =  6 = Fast-PWM, TOP=0x1FF, TOV1 wird bei TOP gesetzt
 0111 =  7 = Fast-PWM, TOP=0x3FF, TOV1 wird bei TOP gesetzt
 1110 = 14 = Fast-PWM, TOP=ICR1,  TOV1 wird bei TOP gesetzt
 1111 = 15 = Fast-PWM, TOP=OCR1A, TOV1 wird bei TOP gesetzt

 Nachdem TOP erreicht wurde wird der Zaehler wieder bei 0 gestartet.
 (Also z.B. mit Modus 4 wird von 0 bis OCR1A gezaehlt, und somit
  also alle OCR1A+1 Takte ein Interrupt ausgeloest)

 In den Fast-PWM Moden wird jeweils der Pin OCnx (PB1 oder PB2 beim ATmega8)
 bei erreichen von 0 auf LOW gesetzt und bei erreichen von OCRnx wieder auf HIGH.
 (mit COMnx1:0 = 2, umgekehrt wenn COMnx1:0 = 3 ist).
 Beim ATmega8 ist nx gleich 1A oder 1B, Ausgabepins OC1A (PB1) oder OC1B (PB2).
 Diese Pins muessen noch in DDRB auf Ausgang gesetzt werden.

OCR1AH:OCR1AL: Output Compare Register A fuer timer1
OCR1BH:OCR1BL: Output Compare Register B fuer timer1
  Diese Register werden dauernd mit TCNT1 verglichen
  um entsprechende Interrupts auszuloesen.

ICR1H:ICR1L: Input Capture Register

ATMega8L im Wiki
Letzte Änderung: 24.Okt.2010 / Rolf                                                                                 Validator