Hallo Forum,
An einem ATMega 644P schaltet an PINC.5 ein Schalter gegen Masse.
In der Testroutine wird der Schalter im Pin-Change-Interrupt abgefragt.
Hier erhalte ich bei geschlossenem Schalter trotz aktiviertem internen
PullUps Einsprünge in die ISR.
im Anhang das Testprogramm:
Ich bin momentan etwas ratlos - JTAG ist disabled, die Ausgabe in der
ISR sieht so aus:
000000000000000Z
000000000000000000Z
00000000000000000Z
000000000000000000000Z
00000000000000000000000000Z
0000000000000000000000Z
000000000000000000000Z
000000000000000000000000000Z
Wie kann es hier zu Pin-Change-Interrupts kommen? Wenn der Eingang offen
wäre, müsste in der Ausgabe ja auch mal eine 1 auftauchen...
viele Dank im Vorraus
brat
brat schrieb:> Schalter gegen Masse ... bei geschlossenem Schalter
Das erklärt zwanglos die Nullen, eine 1 würde ich da auch nicht
erwarten.
> Wie kann es hier zu Pin-Change-Interrupts
Laut Datenblatt vom mega644 (und dem Kommentar) liegt an PC5 der
PCINT21.
Ich habe von BASIC keine Ahnung, aber es sieht mir eher danach aus, daß
du auf den falschen Interrupt reagierst (PCINT2)?
Der PCINT2 wiederum würde aber bei PA2 zu finden sein.
Wenn der auch offen ist, kann er ja herumdriften und vielleicht zufällig
zuschlagen (oder du hast etwas daran beschaltet).
Hallo Klaus,
ja, die "0" sind richtig - aber ein Change kann ja dann nur zu einer "1"
hin erfolgen - darum, wenn wirklich am Pin Changes auftreten, habe ich
dann auch mal ne 1 erwartet.
Ja, PC.5 entspricht PCint21
laut Datenblatt:
PCICR – Pin Change Interrupt Control Register
Bit 2 – PCIE2: Pin Change Interrupt Enable 2
When the PCIE2 bit is set (one) and the I-bit in the Status Register
(SREG) is set (one), pin change interrupt 2 is enabled. Any change on
any enabled PCINT23:16 pin will cause an interrupt.
The corresponding interrupt of Pin Change Interrupt Request is executed
from the PCI2 Interrupt Vector. PCINT23:16 pins are enabled individually
by the PCMSK2 Register.
PCMSK2 – Pin Change Mask Register 2
Bit 7:0 – PCINT23:16: Pin Change Enable Mask 23..16
Each PCINT23:16-bit selects whether pin change interrupt is enabled on
the corresponding I/O pin. If PCINT23:16 is set and the PCIE2 bit in
PCICR is set, pin change interrupt is enabled on the corresponding I/O
pin. If PCINT23:16 is cleared, pin change interrupt on the corresponding
I/O pin is disabled.
In der "M644pdef.dat" habe ich gesucht und ich denke die PCINT1 ...
PCINT4 sind die richtigen Interrupts. Die anderen heißen nur INTx. Von
daher hoffe ich, auf den richtigen Interrupt zu reagieren.
Ein Test an C.0 = PCint16 funktionierte tadellos.
Nichtsdestotrotz habe ich mal PA.2 als Eingang konfiguriert - da ängt
nur ein Summer. Der Fehler bleibt.
danke
Um der Sache mit einem eventuell falschen Interrupt-Vector aus dem Weg
zu gehen, gibt es denn in Bascom eine Anweisung, die dem
On Pcint2 Isr_pcint2
gleichkommt, wobei man aber die direkte Programm-Adresse des
Interrupt-Vectors ($000C) angeben kann?
On $000C ... funktioniert leider nicht
brat schrieb:> In der "M644pdef.dat" habe ich gesucht und ich denke die PCINT1 ...> PCINT4 sind die richtigen Interrupts.
das wäre aber etwas komisch...es gibt vier PCINT-Bereiche, 0-7 (=PORTA),
8-15 (=PORTB), 16-23 (=PORTC) und 24-31 (=PORTD), die eigentlich von
0..3 nummeriert sein sollten. Wenn sie aber von 1..4 nummeriert sind,
müsste die passende ISR die PCINT3 sein...
Zu der Ausgabe:
Pro Sekunde kommen vielleicht 5-10 Zeichen, daher stimmt wohl in den
meißten Durchläufen der Pegel (bzw. es gibt kein Change)
die 1 am jeweiligen Ende heißt, dass die Main-Loop einen High-Pegel
festgestellt hat, im Interrupt wird der Pegel immer auf 0 erkannt.
Hi Spess,
spess53 schrieb:> Hi>> PortC.5 ist PCINT13 und gehört daher zu PCIE1.>> MfG Spess
unter PCINT13 finde ich im Datenblatt den PORTB.5
Gruß
brat
Hallo,
vielleicht ist es ja doch ein Problem des ATMegas...
$regfile = "M644pdef.dat"
$crystal = 12288000
$hwstack = 128
$swstack = 128
$framesize = 128
$baud = 57600
Schalter Alias Pinc.5 : Config Schalter = Input : Portc.5 = 1
Print "Neustart"
Do
If Schalter = 1 Then Print "1";
Loop
End
selbst dieses Programm bringt sporadisch "1"er ins Terminal.
Widerstand im eingebauten Zustand zwischen PC.5 und GND = 1R5
brat schrieb:> In der Testroutine wird der Schalter im Pin-Change-Interrupt abgefragt.
Das ist mit Abstand die schlechteste Methode, einen Schalter einzulesen.
Sie ist sehr störempfindlich, wie Du ja prima sehen kannst.
Der beste Weg ist Abfragen und Entprellung im Timerinterrupt.
Peter
Hallo Peter,
Peter Dannegger schrieb:> brat schrieb:>> In der Testroutine wird der Schalter im Pin-Change-Interrupt abgefragt.>> Das ist mit Abstand die schlechteste Methode, einen Schalter einzulesen.> Sie ist sehr störempfindlich, wie Du ja prima sehen kannst.>> Der beste Weg ist Abfragen und Entprellung im Timerinterrupt.>>> Peter
damit hast du natürlich recht - in den Momenten wo geschalten wird,
bekomm ich viel zu viele Interrupte.
Mein Problem ist allerdings, dass ich Interrupte bekomme, wenn der
Schalter ruht, oder das ich selbst beim schnellen Polling alle paar
Sekunden einen falschen Wert einlese.
In diesem Fall besteht kein Problem mit Prellen, sondern der
Glaubwürdigkeit des Registers.
Morgen kann ich mal die Hardware tauschen - dann hoffe ich, hat es sich
erledigt
Gruß
Wie lang ist denn die Leitung zum Schalter?
Diese Leitung ist eine Antenne und der interne 50k ist zu hochohmig, um
die empfangenen Wechselspannungen genügend stark zu bedämpfen.
Eine Entprellung macht ja gleichzeitig auch eine Störunterdrückung.
In meiner Praxis hat sich eine 4-fach Abtastung mit der Entprellzeit
(5..50ms) als genügend störfest bewährt.
Peter
Hallo Peter,
Peter Dannegger schrieb:> Wie lang ist denn die Leitung zum Schalter?
ca. 40cm - bestehend aus 2 Leitungen (Schalter -> Platine 1 und Platine
1 -> Platine 2 mit µC) dazwischen Pfosten-Buchse/Stecker sowie
Platinensteckverbinder.
Diese Leitung führt auch an DC/DC Wandlern vorbei.
> Diese Leitung ist eine Antenne und der interne 50k ist zu hochohmig, um> die empfangenen Wechselspannungen genügend stark zu bedämpfen.
Auch dies kann ich nachvollziehen, jedoch funktioniert gerade dieser Weg
(Signal mit internem PullUp festlegen und pollen) offenbar fehlerfrei.
Probleme bereitet der andere Pfad (Signal mit Schalter auf GND-Potential
ziehen und pollen)
Der gemessene Widerstand zu GND beträgt 1,5 Ohm
>> Eine Entprellung macht ja gleichzeitig auch eine Störunterdrückung.> In meiner Praxis hat sich eine 4-fach Abtastung mit der Entprellzeit> (5..50ms) als genügend störfest bewährt.>>> Peter
brat schrieb:> Probleme bereitet der andere Pfad (Signal mit Schalter auf GND-Potential> ziehen und pollen)> Der gemessene Widerstand zu GND beträgt 1,5 Ohm
Das sollte niederohmig genug sein.
Und Du bist sicher, nur den Pullup eingeschaltet zu haben und nicht den
Pin als Ausgang?
Wie ist denn die Stromaufnahme des AVR?
Peter
Hallo,
Die Tests mit zweitem ATMega 644 und STK500 zeigten, dass der ATMega an
sich wohl nicht schuld ist.
Das Nachmessen der Verbindungen C.5 gegen Masse zeigte wieder unter 2
Ohm.
Durch die Leitungslöserei und das Zusammenstecken und den Ein- und
Ausbau des ATMega verringerte sich die Fehlerhäufigkeit.
Aktuell tritt bei maximal schnellen Polling bei 12 Mhz etwa minütlich
ein Fehler auf. Zufrieden keinen Fehler finden zu können bin ich zwar
nicht, aber diese Fehler werde ich dann herausfiltern.
Dennoch besten Dank
brat