Atmel 8051, Portpin permanent überwachen!

Gast #783370
Lesenswert?

Hallo zusammen,
ich habe da mal ne Frage zum 8051 von Atmel.

Gibt es die Möglichkeit folgendes anders zu überwachen?:

  jnb P3.2,Knopf1
  mov P0, A
  jnb P3.2,Knopf1
  cpl A
  jnb P3.2,Knopf1
  mov A, #88  ;1.5 sec
  jnb P3.2,Knopf1
  lcall WAIT
  jnb P3.2,Knopf1
  jc Knopf
  ljmp Start

Knopf1:  setb c
  ret



Ist ein kleiner Auszug vom Quelltext aus einer Ampelsteuerung die wir im 
Unterricht Konstruieren.

Gedacht ist das ganze so, dass ich das Carry-bit setze sobald ich einen 
Taster (an P3.2 angeschlossen) drücke und das Programm dann an diesem 
Punkt halt an eine andere Stelle springt.
Das Problem bei dieser Lösung ist, dass ich wenn ich den Taster drücke, 
nicht immer den Augenblick treffe, wo er auch abgefragt wird.
Wollte daher wissen, ob ich einen Befehl einfügen kann, der den Portpin 
permanent überwacht und egal wann ich den Taster drücke das Programm 
reagiert.

Mfg
Gast #783397
Lesenswert?

Interrupt und IRQ ?
Ich versuchs mal zu googeln, aber könnte mir das mit dem Interrupt und 
der IRQ Routine an einen einfachen Beispiel erklären was da genau 
passiert ?

Alles was ich bei Google gefunden hab ist die Erklärung was ein 
Interrupt ist... :(
#783402
Lesenswert?

Hi,

habt ihr das noch nicht gelernt?


Im Prinzip funktioniert das genau so:

> Gedacht ist das ganze so, <snip...> sobald ich einen
> Taster (an P3.2 angeschlossen) drücke und das Programm dann an diesem
> Punkt halt an eine andere Stelle springt.

Dem Interruptcontroller sagen, er solle bitte P3.2 überwachen und dann 
die Interruptroutine ausführen, sobald sich am Zustand von P3.2 was 
ändert.

Je nach Prozessor können allerdings nicht alle Pins vom 
Interruptcontroller überwacht werden! Die Überwachungskriterien sind 
auch unterschiedlich (z.B. Überwachung auf alling edge/rising edge)

Gruß
Roland
Gast #783409
Lesenswert?

Nein, sonst würd ich ja auch nicht Fragen ;)
Ist auch gerade mehr so das ich einen Vorgriff auf die nächsten Stunden 
mache(denk ich mal)
Auf meinem IC steht die Bezeichnung

AT89S52
 24PU
 0620A

Habe auch einen zweiseitigen Befehlssatz zu dem µC, aber der einzige 
Befehl wo in der Befehlsbeschreibung das Wort Interrupt auftaucht ist 
bei "RETI" ([...]Interruptebene wird freigegeben)

Die Frage ist jetzt eigtl, wie genau sieht denn so ein Quelltext aus...

Könntest du mir nicht ein ganz einfaches,banales Beispiel geben, wie ich 
den Interrupt setze und in die IRQ Routine komme ?

Programieren tun wir mit einer 8051.h (falls es hilft)
und einem Programm, was einer unserer Lehrer selber mit Java 
Programmiert hat.
Das übersetzt den Quellcode direkt in Assembler und hat ne Funktion zum 
Speichern auf dem 8051
Gast #783442
Lesenswert?

schau dir mal das datenblatt von deinem controller an, damit du weisst 
welche externen pins als interrupt eingang benutzt werden können...
dann den benötigten interrupt im IE (Interrupt Enable) Register 
aktivieren.

den interrupt führt man in etwa so aus...
Beispiel kommt von dem interrupt Timer Überlauf.

org 0Bh ; Einsprungadresse in das Programm wenn der Interrupt ausgelöst
          wurde
inc a
mov p1,a

reti

RETI ist der Rücksprung aus einem Interrupt, ähnlich wie bei einem 
Rücksprung aus einem Unterprogramm mit RET.
#783478
Lesenswert?

Alternativ zu Pin-Interrupts:

- in der Implementierung der Wait-Subroutine die Pin-Abfrage einbauen. 
Das ist ja das einzige, was so lange dauert, dass man es merkt - alle 
anderen Befehle werden schnell genug abgearbeitet.

- einen Timer aufsetzen, der regelmäßig in kurzen Abständen einen 
Interrupt erzeugt, in dem der Pin abgefragt wird.

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