ATMega 32 INT2 löst nicht aus

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 31 12 2024  00:37:47      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Gehe zu Seite ( 1 | 2 Nächste Seite )      


Autor
ATMega 32 INT2 löst nicht aus
Suche nach: atmega (406)

    







BID = 389911

Licht aus!

Stammposter



Beiträge: 420
Wohnort: Unterfranken
Zur Homepage von Licht aus! ICQ Status  
 

  


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
Zur Homepage von Licht aus! ICQ Status  

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
Zur Homepage von Licht aus! ICQ Status  

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
Zur Homepage von Licht aus! ICQ Status  

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
Zur Homepage von Licht aus! ICQ Status  

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
Zur Homepage von Licht aus! ICQ Status  

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
Zur Homepage von Licht aus! ICQ Status  

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
Zur Homepage von Licht aus! ICQ Status  

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
Zur Homepage von Licht aus! ICQ Status  

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 ]


      Nächste Seite
Gehe zu Seite ( 1 | 2 Nächste Seite )
Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 22 Beiträge im Durchschnitt pro Tag       heute wurden bisher 1 Beiträge verfasst
© x sparkkelsputz        Besucher : 182631635   Heute : 144    Gestern : 7581    Online : 257        31.12.2024    0:37
4 Besucher in den letzten 60 Sekunden        alle 15.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0616939067841