Forum: Mikrocontroller und Digitale Elektronik PinChangeInterrupt mit ATmega644PA


von Marius R. (xianahru)


Lesenswert?

Hallo!

Ich selbst bin relativ neu was Assembler angeht, da wir im Studium vor 
etwa 4~ Wochen damit angefangen haben. Nun stehe ich vor der Aufgabe, 
eine Bedarfsampel zu simulieren.
Dise kann entweder ausgeschaltet werden, sodass sie nur angeht wenn 
jemand den Bedarfsknopf drückt und dabei über die Straße gehen möchte, 
oder aber, bei ausgeschaltetem Nachtmodus, ständig grün für die Autos 
anzeigt.
Dabei sind in PORTA die Bits 7-5 wie folgt definiert:

- Bit 7 ist der Bedarfstaster
- Bit 6 soll den Nachtmodus ausschalten
- Bit 5 soll den Nachtmodus anschalten

Die restlichen Bits 4-0 sind die Ampellichter.

Nun scheitere ich leider daran, den PinChangeInterrupt für diese 3 Bits 
zu implementieren. Kann mich jemand auf den richtigen Pfad lenken?
1
;  ISR Pin Change Interrupt : PCINT7
2
PCINT0_isr:  
3
  ldi R28, bedarf
4
  reti      ; Return from Interrupt;
5
6
;  ISR Pin Change Interrupt : PCINT6
7
PCINT6_isr:
8
  ldi R27, nModusAus
9
  reti      ; Return from Interrupt;
10
11
;  ISR Pin Change Interrupt : PCINT5
12
PCINT5_isr:  
13
  ldi R27, nModusAn
14
  reti      ; Return from Interrupt;
15
16
; ----- Initialisierung der PCINT0 -----
17
InitPCINT0:
18
  sbi PCICR, 0x01
19
  sbi PCMSK0, 0x01
20
  //sbi PCMSK0, PCINT6
21
  //sbi PCMSK0, PCINT5
22
  
23
  /*sbi PCICR, PCINT0
24
  sbi PCMSK0, PCINT7
25
  sbi PCMSK0, PCINT6
26
  sbi PCMSK0, PCINT5*/

von H.Joachim S. (crazyhorse)


Lesenswert?

Lass die Interrupts ganz weg, machen in dem Fall nur Probleme.
Programmier dir einen Timer. Z.B. alle 10ms, frage dort die Eingänge ab, 
vergleiche mit dem vorigen Zustand und entscheide dann, was zu tun ist.

von c-hater (Gast)


Lesenswert?

H.Joachim Seifert schrieb:

> Lass die Interrupts ganz weg, machen in dem Fall nur Probleme.
> Programmier dir einen Timer. Z.B. alle 10ms, frage dort die Eingänge ab,
> vergleiche mit dem vorigen Zustand und entscheide dann, was zu tun ist.

Genau so sehe ich das auch. Für diese Anwendung ist die Verwendung von 
Interrupts absolut kontraproduktiv.

von Marius R. (xianahru)


Lesenswert?

Laut Aufgabe sind aber Interrupts vorgegeben. Und da unser lieber Herr 
Prof uns kein Beispiel gegeben hat, wie man dies nun anstellt, steh ich 
ein wenig auf dem Schlauch.

Und wie ich einen Timer programmiere weiß ich leider auch nicht.

von Dominic S. (Firma: Privat) (dominics)


Lesenswert?

Mal 2 kurze Fragen, sonst kann ich da eh nicht weiter helfen.

- Was ist ein Mega 655PA? Ich kann den nirgends finden, du meinst doch 
sicher den 644PA.

- Ist das dein bisher gesamter Code?

Ich bau mal darauf auf, dass das alles ist. Um Interrupte rein zu 
bekommen, muss du die auch zu lassen. Ein sehr beliebter Anfänger Fehler 
ist, dass man gerne mal das SREG Register vergisst.

Leider kann ich die jetzt so ohne weiteres auch nicht mehr sagen, dann 
bräuchte ich schon noch ein paar mehr Infos (Rest vom Code).

Mein Assembler ist leider auch nicht so gut, wobei ich schon lange was 
mit einem Z80 plane. In dem Zuge erledige ich das dann. ;)

Gruß Domi

von Marius R. (xianahru)


Lesenswert?

Danke für die Antwort. Nein, das ist nicht mein gesamter Code. Und ja, 
ich meine den 644PA, das ist wohl ein Tippfehler.^^
Ich poste meinen gesamten Code mal lieber in 
http://pastebin.com/bNGzqu8V.
Hilft das?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.