Atmel128 Microprozessor und externe Interrupts

meph!sto

Rear Admiral
Registriert
Nov. 2003
Beiträge
6.140
Hi,
ich denke mal dass die Frage an die Experten unter euch gestellt sein wird, denn es geht um Assemblerprogrammierung eines Atmel128 Microprozessors.
Ich soll durch betätigen externer Pins, einen Motor in dessen Eigenschaften einstellen.
Das soll alles durch Interrupts erfolgen.
Mir ist die Funktionsweise eines Interrupts klar, nur werde ich aus dem Handbuch absolut nicht schlau.

Ich drück' einen Pin, dann wird ein Interrupt ausgeführt, welcher mir das entsprechende Bit im entsprechenden Register für den Motor einstellt.

Die Frage ist nur, wie/wo stell' ich ein dass der Prozessor auf die externen Interrupts reagiert ?
Welche Vektoren(-nummern) aus der Interrupt-Vektor-Tabelle, befassen sich mit externen Interrupts von Port B ?

Das Handbuch habe ich verlinkt.

Blick' da nicht so ganz durch, danke.
 
hI Meph!sto

Ich bin hier jetzt nicht so der Experte, aber ich kann dir die Seite http://www.mikrocontroller.net empfehlen, die haben ein sehr gut geschriebenes Assembler Tutorial, in dem auch Interrupts behandelt werden. Sie zeigen das zwar an einem Mega8 aber es sollte sich eigentlich analog zum 128 verhalten

mfg memory_stick
 
Ich schau's mir mal an, danke !
 
Also soweit mir bekannt ist hat der Atmega128 keine externen interrupts am Port B sondern nur an den PortD ( int0-3 ) und PortE ( int4-7 ) um diese zu aktivieren musst du das global interrupt bit im Statusregister aktivieren sprich ( Sreg das i Flag )
Weiterhin musst du Im EIMSK register die bits setzten und du musst dir in den registern EICRA und EICRB aussuchen auf welche flanken die interrupts ausgelöst werden sollen. z.B wenn du nur am PortD am Pin PD0 einen interrupt haben willst.
SREG das i flag, ist das 7te bit also SREG=1000000 wie die anderen im sreg sein müssen weis ich nicht im EIMSK = 00000001 und EIKRA=00000011 entspicht bei steigender flanke.
Für PD1
SREG = 10000000
EIMSK = 00000010
EIKRA = 00001100
Für PD2
SREG = 10000000
EIMSK = 00000100
EIKRA = 00110000
Für PD3
SREG = 10000000
EIMSK = 00001000
EIKRA = 11000000
Für PE4
SREG = 10000000
EIMSK = 00010000
EIKRB = 00000011
Für PE5
SREG = 10000000
EIMSK = 00100000
EIKRB = 00001100
usw.........

Nur ich weis jetzt nicht wie man in Assambler nur das 7te bit im SREG setzt weil es hätte glaube ich böse folgen wenn du Bit 0-6 mit nullen überschreibst.

Ich hoffe mal das Hilft dir ein bischen weiter? Ich programiere den Atmega128 leider nur unter c und kann dir nicht sagen wie du die einzelnen bits unter assembler setzen kannst.
 
Hmm,
dann verstehe ich unsere Aufgabenstellung nicht.
Denn im Labor sind unsere Tasten über PortB mit dem Atmel verbunden. Und mit den Tasten (=Interrupts) sollen wir den Motor einstellen.
Nur wie soll das gehen wenn der PortB gar keine Interrupts auslösen kann ?
Dann müsste ich ja die Tasten immer ständig abfragen, was den Sinn von Interrupts ja entgegensprechen würde.
 
Hmm Bist du dir sicher das es Ein Atmega128 ist ( ne blöde frage ich weiß ist mir aber auch passiert) und nicht ein Atmega169 da würde das nehmlich an port B klappen nur das du da noch ne tastenabfrage hinterherschieben musst weil beim Atmega169 du nur PB0-7 global abfragen kannst also egal an welchen pin du einen interupt auslöst Pb0-7 steht dir da nur ein interruptvektor zu verfügung.
und um dann die entsprechnde taste rauszufinden brauchst du dann noch ne Tastenabfrage
Ne andere Frage ist was sich der Aufgabensteller Unter Interrupt vorstellt????
mit was für boards arbeitet ihr denn? stk500 stk501????
 
Boar,
da bin ich überfragt.
Ich weiß nur dass wir definitiv einen Atmel128 nutzen.
Habe auch eben erfahren dass wir nach einem Timerüberlauf die gedrückten Tasten einlesen sollen, also nicht direkt durch einen Tastendruck ausgelöster IR.
Die Aufgabenstellungen sind eh für die Katz, der Prof. weiß meist selbst nie was zu tun ist.
 
Hmm also du sollst einen Timerinterrupt auslösen und dann in der ISR die taste abfragen.
Ist zwar ne komische methode das Prellen einer Taste zu verhindern aber ok..... wie der Proff halt meint.

ALso zu deinem Problem

du brauchst
das Global interrupt bit im SREG
dann
TIMSK=00000010 // Sagt das Timer mit OCR vergleichen soll
OCR0 =00011111// hier jetzt 31 so das 8000000hz/31= 258064 hz
TCCR0=10001110//Preescaler auf 256 setzten so das 258064 hz /256 ca 1000 hz sind so das die ISR bei jeder 1000stel sekunde aufgerufen wird

Und dann in der ISR deine tastenabfrage.
 
Ja gut,
einen Timer haben wir schon in vorherigen Laboren geschrieben.
Der funktioniert auch und den sollen wir nutzen.
Wir haben ein Register definiert, in dem immer unsere aktuellen Tasten drin stehen (Key) (also welche gesetzt / gelöscht sind).
In der ISR kopier ich dieses Register in ein Hilfsregister. Im Hauptprogramm vergleiche ich dann jedes einzelne Bit mit dem, was in Key steht und reagiere dementsprechend auf Veränderungen.
Es ergeben sich aber nun Fragen bei denen mir hier leider keiner weiterhelfen kann :(
Ich versteh' leider absolut nicht was ich machen soll bzw. wie ich das umsetzen soll.

Edit: wenn man mich fragt, ist das alles extremst verwinkelt und unübersichtlich, aber das sollen wir wohl so machen. Gibt es da nicht einfachere Wege ?

Meine Vergleiche sehen so aus:

Code:
sbrs	  MyBits,Motor_On_Off_Bit
call	  Motor_On_Off
sbrs	  MyBits,Motor_RL_Bit
call	  Motor_RL
sbrc	  MyBits,Cont_Step_Bit
call	  Cont_Step
sbrs	  MyBits,ADC_Tast_Bit
 
Zuletzt bearbeitet:
Also in der ISR die alle 1000stel sekunde aufgerufen wird machst du eine tastenabfrage
und setzt dementsprechend deine Key Bits könntest eigendlich auch gleich die MyBits setzen
weil mit denen vergleicht du ja was dann geschehen soll
also wenn z.B
du bist in der ISR
fragst ist pin B0 gedrückt wenn ja dann MyBits=00000001 wenn nein MyBits=00000000
ist pin B1 gedrückt wenn ja dann MyBits=00000010 wenn nein MyBits=00000000
usw...

Motor_On_Off_Bit ist dann z.B auf 00000001 und dann vergleicht du das ja mit den
MyBits soll heißen wenn du die taste B0 drükst steht in
MyBits und Motor_On_Off_Bit
das selbe und du gehst dann in die call Motor_On_Off
wichtig hierbei ist das du nach call Motor_On_Off deine Mybits
wieder alle nullst sonnst würde er die immer wieder aufrufen.
usw.......
Ich kenn ja nicht das ganze Programm aber ich hab jetzt leider auch keine Zeit mehr ich muss Selber noch den Atmega128 mit Free RTOS einem Realzeit Betriebssystem für Microcontroller Programmieren und da Fliegt so richtig die Kuh weil das mit bitgeschubse nix mehr am hut hat und richtig richtig richtig zum Kotzen ist ;) Also ich schau Morgen noch mal wenn ich Zeit habe biss denn Viel spass mit deinem Prof ;)
 
Zurück
Oben