Autor |
ATMega 32 INT2 löst nicht aus Suche nach: atmega (406) |
|
|
|
|
BID = 389911
Licht aus! Stammposter
Beiträge: 420 Wohnort: Unterfranken
|
|
Hallo!
Ich habe hier eine Schaltung zusammengebaut mit der ich eine PC AT Tastatur an einen ATMega32 anschließen möchte. Jetzt wollte ich erstmal den INT2 einschalten und mir die Flanken des Taktsignals zählen lassen. Jedoch löst das Clock-Signal der Tastatur am INT2 keinen Interrupt aus.
Schaltung ist wie folgt:
Am Controller hängt ein LC-Display an Port A, das funktioniert soweit einwandfrei.
An PORT B hängt eine Lochrasterplatine mit der Anschlussbuchse für die Tastatur und 2 LEDs und zwar folgenderweise:
PB7 = LED rot
PB6 = LED grün
PB5 = NC
PB4 = NC
PB3 = NC
PB2 = KEYBOARD Clock = INT2
PB1 = NC
PB0 = KEYBOARD Data
Ich habe jehweils einen 10kOhm Pullupwiderstand an KEYBOARD Data und KEYBOARD Clock.
Schaut auch sehr gut aus auf dem Oszilloskop. Hab auch direkt am Controllerpin PIN3 gemessen, das Clocksignal kommt bis zum µC durch.
Jetzt wollte ich den INT2 einstellen, hab mich da auch soweit ans Datenblatt gehalten.
MCUCSR Bit6 = 0 -> INT2 löst bei fallender Flanke aus
GICR Bit5 = 1 -> INT2 aktiviert
SEI Befehl um I-Flag im SREG zu setzen hab ich verwendet.
In der Interrupttabelle steht rjmp EXT_INT2 die sprungmarke existiert auch und wird mir RETI beendet.
.CSEG hab ich am Anfang meines Programmes genauso wie .ORG 0000
Ja nun sollte es ja eigentlich funktionieren, aber anscheinend habe ich etwas falsch gemacht, vergessen oder nicht beachtet, denn es wird durch das Clocksignal der Tastatur kein Interrupt ausgelöst.
Ich häng das Programm mal an, vielleicht sieht ja jemand den fehler.
Code : |
.include "m32def.inc"
.def temp1 = r16
.def temp2 = r17
.def temp3 = r18
.CSEG ; Hier beginnt das Code-Segment
.ORG 0000 ; Die Adresse auf Null
rjmp RESET ; Reset Handler
reti; EXT_INT0 ; IRQ0 Handler
reti; EXT_INT1 ; IRQ1 Handler
rjmp EXT_INT2 ; IRQ2 Handler
reti; TIM2_COMP ; Timer2 Compare Handler
reti; TIM2_OVF ; Timer2 Overflow Handler
reti; TIM1_CAPT ; Timer1 Capture Handler
reti; TIM1_COMPA ; Timer1 CompareA Handler
reti; TIM1_COMPB ; Timer1 CompareB Handler
reti; TIM1_OVF ; Timer1 Overflow Handler
reti; TIM0_COMP ; Timer0 Compare Handler
reti; TIM0_OVF ; Timer0 Overflow Handler
reti; SPI_STC ; SPI Transfer Complete Handler
reti; USART_RXC ; USART RX Complete Handler
reti; USART_UDRE ; UDR Empty Handler
reti; USART_TXC ; USART TX Complete Handler
reti; ADC ; ADC Conversion Complete Handler
reti; EE_RDY ; EEPROM Ready Handler
reti; ANA_COMP ; Analog Comparator Handler
reti; TWI ; Two-wire Serial Interface Handler
reti; SPM_RDY ; Store Program Memory Ready Handler
;************************************INITIALISIERUNG*********************************** ;
RESET:
ldi r16,high(RAMEND)
out SPH,r16 ;Set Stack Pointer to top of RAM
ldi r16,low(RAMEND)
out SPL,r16
in r16, MCUCSR
andi r16, 0b10111111
out MCUCSR, r16 ;INT2 auf falling edge einstellen
in r16, GICR
ori r16, 0b00100000
out GICR, r16 ;INT2 aktivieren
sei ;Enable interrupts, I-Flag im SREG
ldi r16,0b11000000
out ddrb, r16 ;Datadirection für PORT B
ldi r16, 0b11000000 ;LEDs on
out portb, r16
ldi r16,0xff
out ddra, r16 ;Datadirection für PORT A nur ausgang
out ddrd, r16 ;Datadirection für PORT D nur ausgang
rcall lcd_init ;LC-Display initialisieren
ldi r20, 0x00 ;r20 vorsichtshalber löschen
rjmp MAIN
EXT_INT2:
ldi temp1, 0b00000000
out portb, temp1 ;LEDs ausschalten
inc r20
ldi temp1, 0b11000000 ;Cursor einstellen auf Dislpay 1 Zeile 1 Feld 0
rcall lcd_command
mov temp1, r20
ori temp1, 0b00110000
rcall lcd_data
reti
MAIN:
ldi ZL, LOW(text1*2)
ldi ZH, HIGH(text1*2) ;String ausgeben
rcall strout
; ldi temp1, 0b11000000 ;Cursor einstellen auf Dislpay 1 Zeile 2 Feld 0
; rcall lcd_command
; ldi ZL, LOW(text2*2)
; ldi ZH, HIGH(text2*2) ;String ausgeben
; rcall strout
loop:
in temp1, pinb ;Polling von PORT B
out pind, temp1
rjmp loop
text1:
.db "Servus!",0
text2:
.db "Villamos!",0
.include "lcd-routine.asm"
|
|
_________________
All hail to the carry bit! |
|
BID = 390039
Jornbyte Moderator
Beiträge: 7193
|
|
Der Simulator sagt alles OK, wenn nach
.def temp3 = r18
die Zeile
.include "m32def.inc"
steht
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten. |
|
BID = 390040
Jornbyte Moderator
Beiträge: 7193
|
Halt, nein, der Vector stimmt nicht!
Der Sprung geht nach ]ICP1addr
Überprüfe das nochmal.
[addsig
[ Diese Nachricht wurde geändert von: Jornbyte am 1 Dez 2006 21:05 ]
|
BID = 390042
Licht aus! Stammposter
Beiträge: 420 Wohnort: Unterfranken
|
Das mit dem .include hat leider nichts gebracht.
_________________
All hail to the carry bit!
[ Diese Nachricht wurde geändert von: Licht aus! am 1 Dez 2006 21:07 ]
|
BID = 390043
Licht aus! Stammposter
Beiträge: 420 Wohnort: Unterfranken
|
Sag bloß? Hab die Vektorrabelle mal mit der aus der .inc verglichen, die stimmen überein. Hab die übrigens aus dem Datenblatt kopiert...
_________________
All hail to the carry bit!
|
BID = 390044
Jornbyte Moderator
Beiträge: 7193
|
Da stimmt was im Proggi nicht, wobei der INT2 eine Sonderstellung hat. Für dein Projekt ist der INT1 besser.
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 390046
Licht aus! Stammposter
Beiträge: 420 Wohnort: Unterfranken
|
Hmm, aber warum springt der immer zum timer1 capture? Bin auch am überlegen ob ich den INT1 nehme. Werds denk ich erstmal umlöten und dann mit dem INT1 ausprobieren.
Magst du mal die Sonderstellung des INT2 kurz umreißen?
EDIT: Ich möchte bei dem Projekt noch eine Funkuhr anschließen und ggf das UART benutzen, drum hab ich mir die ersten beiden interrupts mal freigelassen...
_________________
All hail to the carry bit!
[ Diese Nachricht wurde geändert von: Licht aus! am 1 Dez 2006 21:18 ]
|
BID = 390047
Jornbyte Moderator
Beiträge: 7193
|
Zitat :
| Magst du mal die Sonderstellung des INT2 kurz umreißen |
Steht im Datenblatt ab Seite 64.
_________________
mfg Jornbyte
Es handelt sich bei dem Tipp nicht um eine Rechtsverbindliche Auskunft und
wer Tippfehler findet, kann sie behalten.
|
BID = 390049
Licht aus! Stammposter
Beiträge: 420 Wohnort: Unterfranken
|
Naja da steht ja nur das der INT2 nur bei Taktflanken auslöst und nicht auch bei Leveln wie INT0 und INT1. Das hab ich mir vorher alles duchgelesen.
Aber auf seite 65 Steht noch was, das hab ich anscheinend übersehen, erst das interrupt flag löschen und dann den interrupt einschalten. Mal sehen...
_________________
All hail to the carry bit!
|
BID = 390051
Licht aus! Stammposter
Beiträge: 420 Wohnort: Unterfranken
|
GIFR lässt sich net ändern
_________________
All hail to the carry bit!
|
BID = 390058
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Doch, die letzen drei Bits, aber wozu? Die werden beim Starten der Interruptsroutine automatsich gelöscht. (Sind ja die INT-Flags.)
Der Interruptvektor für INT2 steht bei mir auf 0x6.
Funktioniert vllt. Folgendes:
.org INT2addr
rjmp INT2_handler
....
Ist im Prinzip nix anderes als du oben schon gemacht hast, das finde ich eben so merkwürdig an der Geschichte. Ist bestimmt ein so billiger Fehler dass hier keiner draufkommt.
Edit: Wie lang ist denn der Impuls? Im Text steht was von mi. 50ns. Denke allerdings nicht, dass die Flanken bzw. die Impulse so extrem klein sind, zumindest nicht für eine Tastatur.
_________________
[ Diese Nachricht wurde geändert von: DonComi am 1 Dez 2006 22:53 ]
|
BID = 390059
Licht aus! Stammposter
Beiträge: 420 Wohnort: Unterfranken
|
Ja irgendwie muss das mit den Adressen zusammenhängen, wenn ich nämlich den int0 auslöse springt er zum int1 beim int1 springt er zum Timer2 compare usw.
Dann werd ich mal versuchen mit .org abhilfe zu schaffen
_________________
All hail to the carry bit!
|
BID = 390061
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
In der Simulation springt der immer nach Capture vom Timer1
Edit: Warum auch immer das so nicht klappt, werde ich noch rausbekommen, aber testweise kannst du einfach erzwingen, dass der Befehl rjmp blablabla an die Position 0x6 kommt:
.org 0x6 rjmp EXT2_handle
_________________
[ Diese Nachricht wurde geändert von: DonComi am 1 Dez 2006 23:01 ]
|
BID = 390063
Licht aus! Stammposter
Beiträge: 420 Wohnort: Unterfranken
|
Tadaa, sie sind der Held des Tages
Hatte vorher im programm .ORG 0000 und dann die Tabelle, sieht man ja im codebeispiel, jetzt hab ich
Code : |
.ORG 0000 ; Die Adresse auf Null
rjmp RESET ; Reset Handler
.org INT0addr ; External Interrupt0 Vector Address
reti
.org INT1addr ; External Interrupt1 Vector Address
reti
.org INT2addr ; External Interrupt2 Vector Address
reti
.org OC2addr ; Output Compare2 Interrupt Vector Address
reti
.org OVF2addr ; Overflow2 Interrupt Vector Address
reti
.org ICP1addr ; Input Capture1 Interrupt Vector Address
reti
.org OC1Aaddr ; Output Compare1A Interrupt Vector Address
reti
.org OC1Baddr ; Output Compare1B Interrupt Vector Address
reti
.org OC1Baddr ; Output Compare1B Interrupt Vector Address
reti
.org OVF1addr ; Overflow1 Interrupt Vector Address
reti
.org OC0addr ; Output Compare0 Interrupt Vector Address
reti
.org OVF0addr ; Overflow0 Interrupt Vector Address
reti
.org SPIaddr ; SPI Interrupt Vector Address
reti
.org URXCaddr ; USART Receive Complete Interrupt Vector Address
reti
.org UDREaddr ; USART Data Register Empty Interrupt Vector Address
reti
.org UTXCaddr ; USART Transmit Complete Interrupt Vector Address
reti
.org ADCCaddr ; ADC Interrupt Vector Address
reti
.org ERDYaddr ; EEPROM Interrupt Vector Address
reti
.org ACIaddr ; Analog Comparator Interrupt Vector Address
reti
.org TWSIaddr ; Irq. vector address for Two-Wire Interface
reti
.org SPMRaddr ; Store Program Memory Ready Interrupt Vector Address
reti |
|
und es funktioniert!
Sowas! Hab bisher immer mitm 90S2313 gespielt, da hat ich das problem nicht. Hier noch die Version vom AVRStudio, falls es dich interessiert:
AVR Studio 4.11.401
GUI Version 4, 11, 0, 401
AVR Simulator 1, 0, 0, 29
ATmega32 150
Operating System
Major 5
Minor 1
PlatformID 2
Build 2600
Service Pack 2
Plugins:
Stk500Dll 1, 0, 0, 43
_________________
All hail to the carry bit!
[ Diese Nachricht wurde geändert von: Licht aus! am 1 Dez 2006 23:06 ]
|
BID = 391914
Licht aus! Stammposter
Beiträge: 420 Wohnort: Unterfranken
|
So, nun da alles glatt läuft möcht ich mich nochmal für eure Hilfe bedanken und mach das Thema hier zu.
EDIT: Anscheinend doch nicht... Kann das Thema nicht selbst schließen.
_________________
All hail to the carry bit!
[ Diese Nachricht wurde geändert von: Licht aus! am 10 Dez 2006 22:20 ]
|