portb.2 vom atmega32

Persönliche Seite #739982
Lesenswert?

Mit dem Datenblatt ist das manchmal so eine Sache...

Ich z.B. hatte gestern das Datenblatt zum Attiny2313 in den Fingern und 
richtig lange versucht genau das Thema Mehrfachbelegung nachzuschlagen.
(Ging um den Thread Beitrag "Interrupt beim AVR" 
und ich hatte AT90S2313 überlesen)

Ich habe es schäm nicht geschafft. Auch im AVR-GCC-Tutorial springt 
mir dazu ehrlich gesagt nichts ins Auge.
Persönliche Seite #740150
Lesenswert?

Das schäm kann ich jetzt streichen ;-) Die Einstellerei geht beim 
Atmega32 über die Special Function Register (SFR) MCUCSR und GICR.

Hier das Beispiel für Oilaf aus obigem Thread angepasst an den Atmega32:
1
; ################
2
; ### Includes ###
3
; ################
4
.include "m32def.inc"
5
; TARGET ATMEGA8
6

7
; ####################
8
; ### Definitionen ###
9
; ####################
10
.def    temp    =r16
11
.def    temp2   =r17
12

13
; #####################
14
; ### Vektortabelle ###
15
; #####################
16
; Hier verkürzt für Demozwecke.
17
; Komplette Vektortabelle ist sicher!
18
.org 0x0000
19
  rjmp  Reset
20
.org INT2addr
21
  rjmp  INT2_Handler
22

23
; #####################
24
; ### Hauptprogramm ###
25
; #####################
26
Reset:
27
    ; ########################
28
    ; ### Stack einrichten ###
29
    ; ########################
30
  ldi temp, high(RAMEND)
31
  out SPH, temp
32
  ldi temp, low(RAMEND)
33
  out SPL, temp
34

35
    ; ############################################
36
    ; ### LOW ACTIVE LED an PB0 initialisieren ###
37
    ; ############################################
38
    ; Toggelt später in INT2_Handler
39
  ldi temp, 0b00000000  ; PB0 LOW (LED_AN)
40
  out PORTB, temp
41
  ldi temp, 0b00000001  ; PB0 Ausgang
42
  out DDRB, temp
43
         
44
    ; #############################
45
    ; ### Interrupts einstellen ###
46
    ; #############################
47
    ; FALLENDE Flanke von INT2 soll Interrupt erzeugen
48
  in  temp, MCUCSR
49
  andi temp, 0b10111111  ; ISC2 löschen => fallende Flanke
50
  out MCUCSR, temp
51

52
  in  temp, GICR
53
  ori temp, 0b00100000  ; INT2 external interrupt request 2 enable
54
  out GICR, temp
55

56
  sei            ; Interrupts allgemein aktivieren
57
  
58
    ; #######################
59
    ; ### Arbeitsschleife ###
60
    ; #######################
61
loop:
62
  rjmp loop       ; loop forever
63

64
; ########################
65
; ### Interrupthandler ###
66
; ########################
67
    ; ############
68
    ; ### Int2 ###
69
    ; ############
70
INT2_Handler:
71
  push temp
72
  in   temp,sreg
73
  ; Anfang Nutzcode
74
  ; => PB0 toggeln
75
  push temp
76
  push temp2
77
  ldi  temp2, 0b00000001
78
  in   temp, PORTB
79
  eor  temp, temp2
80
  out  PORTB, temp
81
  pop  temp2
82
  pop  temp
83
  ; Ende Nutzcode
84
  out  sreg,temp
85
  pop  temp
86
  reti
87

88
; Simulation in AVR Studio
89
;
90
; !/ Keine Breakpoints
91
; 2/ Step (F11)
92
; 3/ PINB2 manipulieren und PORTB0 beobachten
93
;    PORTB0 toggelt, wenn PINB2 von HIGH => LOW wechselt
94
;.
95
; ENDE

Der komische Abschnitt Overriding Signals for Alternate Functions hat 
mich verwirrt, weil die dortigen Signale sonst im Datenblatt nicht 
vorkommen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren