Tiny45 und PCINT0

Timo

Neues Mitglied
15. Juli 2008
19
0
0
Sprachen
Hallo zusammen,

ich arbeite gerade an einem RC5-ferngesteuerten Schalter der auch per Taster bedient werden kann.
Den Taster will ich per Interrupt (an PinB.0=PCINT0) auswerten. Leider funktioniert die Interruptfunktion überhaupt nicht, ich habe schon zahlreiche Varianten ausprobiert. Momentan bin ich beim angehängten Code (noch ohne RC5 und anderes).
Kann mir jemand sagen, was ich bei der Interruptauswertung falsch mache???

Code:
'
'  Name:       Audio-Switch
'  Rev:        1.0
'  Hardware:   'tr026-2009' ab R01
'
'  Date: 12.08.09
'
'  Description:
'  - Umschaltung von in Summe fünf Audioquellen
'  - Umschalten kann über Tastendruck oder per IR RC5-Code vorgenonmmen werden
'  - externer I²C-Bus kann ebenfalls Steuerung übernehmen
'
'  Belegung µC
'  PB0     Input  Taster   MOSI  Pin 5
'  PB1                     MISO  Pin 6
'  PB2     Input  IR-Sig   SCK   Pin 7
'  PB3     BI     SDA            Pin 2
'  PB4     Input  SCL            Pin 3
'  PB5                     RST   Pin 1


' -------------------------  µC-Setup ------------------------------------------
   $regfile = "ATtiny45.DAT"
   $crystal = 1000000
   $hwstack = 32
   $swstack = 8
   $framesize = 24
' -------------------------  µC-Setup Ende--------------------------------------


' -------------------------  Konfiguration -------------------------------------
   Config Pinb.0 = Input                                    ' Taster
   Config Pinb.2 = Input                                    ' IR-Empfänger (extern)


   Config Sda = Portb.3                                     ' I²C-Anschluss festlegen
   Config Scl = Portb.4

   Const Max4550_adr = 152

   Dim Kanal As Byte

   Config Int0 = Falling                                    'Interrupt konfigurieren und einstellen
  ' Gimsk = &B00100000
   Pcmsk = &B00000001
   On Int0 Isr_pcint0                                       ' wenn Taste gedückt wid, löst INT aus


' -------------------------  Konfiguration Ende --------------------------------
'
' -------------------------  Subroutinen Deklaration ---------------------------
   Declare Sub Schalten                                     ' (byval Kanal As Byte)

' -------------------------  Subroutinen Deklaration Ende ----------------------



' ------------------------------------------------------------------------------
' ------------------------- START ----------------------------------------------
   Kanal = 1
   Wait 1
   Call Schalten                                            ' Initialisierung auf Defaultwerte (Kanal und LED)

   Enable Int0

   Enable Interrupts



   Do                                                       'Endlosschleife Hauptprogramm

   Loop


End


 ' -------------------------  Subroutinen --------------------------------------

   Sub Schalten                                             ' (byval Kanal As Byte)

      Local Commandwort As Byte
      Local Datawort As Byte

      If Kanal > 4 Then Kanal = 0                           'auf den gültigen Bereich einschränken

      Commandwort = &B00000101                              ' , COM1B, COM1A sind ausgewählt
      Datawort = &B00000001
      Shift Datawort , Left , Kanal                         ' den richtigen Kanal durch Schiebbefehle auswählen

      I2cstart
      I2cwbyte Max4550_adr
      I2cwbyte Commandwort
      I2cwbyte Datawort
      I2cstop

      Commandwort = &B00010000
      Datawort = &HFF - Datawort                            ' weil LED mit inverser Logik arbeiten
      I2cstart
      I2cwbyte Max4550_adr
      I2cwbyte Commandwort
      I2cwbyte Datawort
      I2cstop



   End Sub

' ------------------------------------------------------------------------------


' ------------------------- Interrupt Service Routine --------------------------
Isr_pcint0:                                                 ' Interrupt da Taster an PB0 gedrückt wurde

   Kanal = Kanal + 1
   Call Schalten
   Waitms 500                                               ' um zu Entprellen

   Return

Ich habe mich zuletzt an diesem Thread orientiert http://www.avr-praxis.de/forum/showthread.php?t=304&highlight=pcint, was mich aber auch nicht wirklich weiterbringt.

Eigentlich kann es doch nicht schwierig sein...?


Danke
Timo
 
Hallo Timo!

Es ist auch nicht sooo schwierig. ;)

Allerdings bringst du scheinbar PCINT mit INT durcheinander!

Der PCINT ist ein PinChangeINTerrupt.... es werden also alle Pins des aktivierten Registers auf eine Änderung hin überwacht und dann in EINE ISR (InterruptServiceRoutine) verzweigt!

Den Thread, den du dir zur Hilfe genommen hast, sollte dir eigentlich schon weiter helfen.
OK, in dem Thread geht es um einen Tiny24v und nicht um einen Tiny45....
Da musst du im Datenblatt des Tiny45 noch mal nachschauen, welche Register du genau verwenden musst.

Im Code musst du anschließend z.B. auch mit dem Befehl:
Enable Pcint0

On Pcint0 ISR_xy

arbeiten... und NICHT mit Enable INT0 ! ;)


Wenn du gar nicht weiter kommen solltest, dann melde dich noch mal.
Im Zweifel muss ich mir das Datenblatt vom Tiny45 selber noch mal ansehen.

Bedenke auch, dass egal welcher Pin sich bei der Überwachung ändert, das Programm immer nur in die selbe ISR verwzeigen kann! :eek:


Ich hoffe, die Hinweise und Denkanstöße bringen dich zum Erfolg..... :)
von dem wir hier dann natürlich auch immer gerne lesen. :D

Schöne Grüße,
Cassio
 
Hallo Timo,

ich programmiere leider nicht mit Bascom, kann die aber vielleicht weiterhelfen.

Der externe Interrupt INT0 ist nicht gleich dem PinChangeInterrupt PCINT0.

Wenn du den externen Interrupt INT0 nutzen möchtest, musst du im Register MCUCR die beiden Bits ICS01 und ISC00 (Interrupt Sense Control) einstellen, danach im Register GIMSK (General Interrupt Flag Register) das Bit INT0 setzen, danach in Bascom die Interruptserviceroutine für INT0 definieren.

Möchtest du den Pin Change Interrupt PCINT0 nutzen, musst du im Register GIMSK das Bit PCIE (Pin Change Interrupt Enable) setzen, danach im Register PCMSK (Pin Change Mask Register) das Bit PCINT0 setzen. Dann in Bascom wieder die Interruptserviceroutine für PCINT0 definieren.

INT0 ist auf PB2, PCINT0 ist auf PB0.

Vielleicht hilft dir das weiter.

Grüße,
Dirk
 
Hallo,

ich dachte der INT0 ist den PCINTx übergeordnet.....falsch gedacht.

Nach meinem Verständnis wäre aber dann dieser Passus richrig

Code:
    Dim Kanal As Byte

  ' Config Int0 = Falling                                    'Interrupt konfigurieren und einstellen
   Gimsk = &B00100000                                       ' Pin Chane Int.Enable=1
   Pcmsk = &B00000001                                       'maskiere PCINT0
   On Pcint0 Isr_pcint0                                     ' wenn Taste gedückt wid, löst INT aus


' -------------------------  Konfiguration Ende --------------------------------
'
' -------------------------  Subroutinen Deklaration ---------------------------
   Declare Sub Schalten                                     ' (byval Kanal As Byte)

' -------------------------  Subroutinen Deklaration Ende ----------------------



' ------------------------------------------------------------------------------
' ------------------------- START ----------------------------------------------
   Kanal = 1
   Wait 1
   Call Schalten                                            ' Initialisierung auf Defaultwerte (Kanal und LED)

   Enable Pcint0

   Enable Interrupts



   Do                                                       'Endlosschleife
   '  Kanal = Kanal + 1
   ' Call Schalten
   ' Wait 1
   Loop

Leider ist darauf auch keine Reaktion zu sehen :(
 
Hi Timo!

Irgendwie komme ich mit deinem Programmcode auch nicht ganz klar....

Hast du da die wesentlichen Teile heraus genommen? :hmmmm:

Ob diese Anweisung stimmt, habe ich nicht überprüft!
Gimsk = &B00100000 ' Pin Chane Int.Enable=1
Pcmsk = &B00000001 'maskiere PCINT0

Dafür muss ich erst im Datenblatt nachschlagen! ;)


Diese Anweisung:
On Pcint0 Isr_pcint0 ' wenn Taste gedückt wid, löst INT aus

ist soweit OK!
Allerdings nur, wenn es in deinem Programm auch eine Subroutine namens Isr_pcint0 geben würde!



Dieses hier:
Enable Pcint0
Enable Interrupts

ist natürlich auch in Ordnung und muss im Programm enthalten sein!


Wie oben aber schon erwähnt, fehlt die Subroutine die aufgerufen werden soll, sobald ein PCINT aktiviert wird.

Theoretisch dürfte das Programm gar nicht kompiliert werden, sondern einfach nur eine Fehlermeldung produzieren.
Das ist auch der Grund warum ich der Meinung bin, dass einiges von deinem Beispielprogramm hier fehlt.

So wird eine Fehlersuche natürlich schwierig. :cool:

Sollte Dirk nicht schneller sein, werde ich im Datenblatt des Tiny45 noch mal nach den Registern und dessen Einstellung schauen.

Schöne Grüße,
Cassio
 
Sorry, wollte niemanden verwirren. Ich habe nur die Änderungen gegenüber dem ersten Beitrag als Code eingestellt. Natürlich gibt es die Routine zum anspringen; der Vollständigkeit halber hier nochmal alles
Code:
'
'  Name:       Audio-Switch
'  Rev:        1.0
'  Hardware:   'tr026-2009' ab R01
'
'  Date: 12.08.09
'
'  Description:
'  - Umschaltung von in Summe fünf Audioquellen
'  - Umschalten kann über Tastendruck oder per IR RC5-Code vorgenonmmen werden
'  - externer I²C-Bus kann ebenfalls Steuerung übernehmen
'
'  Belegung µC
'  PB0     Input  Taster   MOSI  Pin 5
'  PB1                     MISO  Pin 6
'  PB2     Input  IR-Sig   SCK   Pin 7
'  PB3     BI     SDA            Pin 2
'  PB4     Input  SCL            Pin 3
'  PB5                     RST   Pin 1


' -------------------------  µC-Setup ------------------------------------------
   $regfile = "ATtiny45.DAT"
   $crystal = 1000000
   $hwstack = 32
   $swstack = 8
   $framesize = 24
' -------------------------  µC-Setup Ende--------------------------------------


' -------------------------  Konfiguration -------------------------------------
   Config Pinb.0 = Input                                    ' Taster
   Config Pinb.2 = Input                                    ' IR-Empfänger (extern)


   Config Sda = Portb.3                                     ' I²C-Anschluss festlegen
   Config Scl = Portb.4

   'Portb = &B000011000                                      ' Pull-UP am I²C-Bus


   Taster Alias Pinb.0                                      ' Alias für bessere Lesbarkeit
   Rc Alias Pinb.2

   Const Max4550_adr = 152

   Dim Kanal As Byte

  ' Config Int0 = Falling                                    'Interrupt konfigurieren und einstellen
   Gimsk = &B00100000                                       ' Pin Chane Int.Enable=1
   Pcmsk = &B00000001                                       'maskiere PCINT0
   On Pcint0 Isr_pcint0                                     ' wenn Taste gedückt wid, löst INT aus


' -------------------------  Konfiguration Ende --------------------------------
'
' -------------------------  Subroutinen Deklaration ---------------------------
   Declare Sub Schalten                                     ' (byval Kanal As Byte)

' -------------------------  Subroutinen Deklaration Ende ----------------------



' ------------------------------------------------------------------------------
' ------------------------- START ----------------------------------------------
   Kanal = 1
   Wait 1
   Call Schalten                                            ' Initialisierung auf Defaultwerte (Kanal und LED)

   Enable Pcint0

   Enable Interrupts



   Do                                                       'Endlosschleife
   '  Kanal = Kanal + 1
   ' Call Schalten
   ' Wait 1
   Loop


End


 ' -------------------------  Subroutinen --------------------------------------

   Sub Schalten                                             ' (byval Kanal As Byte)

      Local Commandwort As Byte
      Local Datawort As Byte

      If Kanal > 4 Then Kanal = 0                           'auf den gültigen Bereich einschränken

      Commandwort = &B00000101                              ' , COM1B, COM1A sind ausgewählt
      Datawort = &B00000001
      Shift Datawort , Left , Kanal                         ' den richtigen Kanal durch Schiebbefehle auswählen

      I2cstart
      I2cwbyte Max4550_adr
      I2cwbyte Commandwort
      I2cwbyte Datawort
      I2cstop

      Commandwort = &B00010000
      Datawort = &HFF - Datawort                            ' weil LED mit inverser Logik arbeiten
      I2cstart
      I2cwbyte Max4550_adr
      I2cwbyte Commandwort
      I2cwbyte Datawort
      I2cstop



   End Sub

' ------------------------------------------------------------------------------


' ------------------------- Interrupt Service Routine --------------------------
Isr_pcint0:
   ' Interrupt da Taster an PB0 gedrückt wurde
   ' The INT0 interrupts can be triggered by a falling or rising edge or a low level. This is set up as
   ' indicated in the specification for the MCU Control Register – MCUCR.
   Kanal = Kanal + 1
   Call Schalten
   Waitms 500                                               ' um zu Entprellen

   Return
 
Hallo Timo!

Ich habe mir eben noch mal das Datenblatt zum Tiny45 durchgesehen....

Die Einstellungen zu GIMSK und PCMSK hätte ich auch so eingestellt:
GISMK = &B00100000
PCMSK = &B00000001 (wenn du nur PCINT0 benutzen möchtest)

Von daher sollten die Einstellungen richtig sein!

Auch hast du den Interrupt PCINT0, sowie die globale Einstellung mit "Enable" aktiviert.


So ganz verstehe ich nun aber dein Vorgehen mit der ISR für den PCINT0 nicht.....
weil du dann letztlich nur wieder eine weitere Sub mittels "Call" aufrufst.
Kannst du das nicht in die ISR_pcint0 zusammen setzten?

Vielleicht solltest du den PinChangeInterrupt erstmal "ganz allein" ausprobieren.... z.B. einfach nur eine LED ein und ausschalten.
Wenn das funktioniert und du damit sicher sein kannst dass dein PCINT richtig arbeitet, dann würde ich an die I2C-Ansteuerung testen.

Momentan leuchtet mir nicht ein, warum der PCINT bei dir nicht reagieren sollte. :hmmmm:


Ach so...
hier noch mal ein Zitat aus deinem vorherigen Posting:
ich dachte der INT0 ist den PCINTx übergeordnet.....falsch gedacht.

Nee nee.... da hast du zu Beginn schon richtig gelegen!
Der INT0 hat Vorang vor dem PCINT!!!
INT0 = Interruptvektor 2
PCINT = Interruptvektor 3
Passt also schon, wie du es zu erst gedacht hattest! ;)


Schöne Grüße,
Cassio
 
das mit der ISR ist leicht erklärt: es wird auch 'Kanal' inkrementiert.
Code:
Isr_pcint0:

   Kanal = Kanal + 1
   Call Schalten
   Waitms 500                                               ' um zu Entprellen

   Return
Durch den Aufruf der Sub 'Schalten' wird das ganze per I²C durchgeführt.
Die I²C Routine funktioniert, das sehe ich schon beim ersten Aufruf unmittelbar bevor die Interrupts scharf geschaltet werden.
Was meinst Du mit
Kannst du das nicht in die ISR_pcint0 zusammen setzten?

Und ja, mein Taster hängt an PB0 => PCINT0
 
Hi Timo!

Was mir gerade aufgefallen ist... :vollkommenauf:

Der Tiny45 hat ja nur ein PCMSK-Register! :cool:

Eigentlich müsstest du den Befehl "Enable PCINT0" weglassen können.

Es geht bei BASCOM dabei nämlich nicht um den einzelnen Pin PCINT0, sondern um das ganze erste Register PCINT0!
Da der Tiny45 aber keine zwei Register hat (PCINT0 und PCINT1) sondern eben nur ein "Gemeinsames", müsstest du (oder solltest du vielleicht besser) den Befehl einfach weglassen.


Gruß,
Cassio
 
Was meinst Du mit
Kannst du das nicht in die ISR_pcint0 zusammen setzten?

Hi Timo!

Nun ja...
du rufst bei einem PinChange die Sub Isr_pcint0 auf, in der lediglich die Variable Kanal um eins erhöht wird.
Danach rufst du mit Call die Sub Schalten auf....
und nach einer "unschönen" Pause von 500ms springst du zur Hauptschleife zurück.

Theoretisch kannst du doch das Inkrementieren und das Schalten via I2C in der selben Sub abarbeiten lassen.....
und springst dann wieder zurück zum Hauptprogramm.

Das war aber nur eine Frage von mir und sollte eigentlich nichts mit der Funktion des PinChange zu tun haben. ;)

Gruß,
Cassio
 
Es wäre zu einfach, wenn's nur das wäre.... bringt leider nichts.

was mir vorhin aufgefallen ist: Ich habe meinen Programmer an ein andern PC gesteckt und da ging es - Spannung weg und wieder hin, altes Spiel, nichts geht mehr. Ich glaube ich sollte jetzt mal in den Keller wackeln und den µC tauschen.....:confused:

Zurück aus dem Keller - das ist es auch nicht.....:mad:

Ich habe noch den Schaltplan als PDF angehängt; der Taster hängt mit 10k an VCC und ist mit 100R zum µC entkoppelt.
 

Anhänge

  • tr026-2009-R02.sch.pdf
    102,7 KB · Aufrufe: 2
Hallo zusammen,

also der PCINT0 beim Tiny45 liegt auf Interrupt-Vektor 3 (0x0002).
Im Register GIMSK muß muß Bit PCIE (5) gesetzt sein.

Im Register GIFR wird bei einem PinChangeInterrupt das Bit PCIF (5)
auf 1 gesetzt. Es wird entweder durch die Ausführung der ISR gelöscht
oder (so wie ich es mache) mit dem Schreiben einer 1 in das entsprechende
Bit. Ich schreibe sicherheitshalber in meiner ISR also eine 1 in das Bit
des ausgelösten PCINTs.

Im Register PCMSK wird durch setzen des Bit PCINT0 (0) der Pin PB0 auf
einen Pegelwechsel hin überwacht.

Der PCINT0 wird aber bei jedem Pegelwechsel ausgelöst ( also von H->L
oder L->H ) Beim Tastenprellen also bei jeder Flanke des Signals !
Man kann also mit dem PCINT0 nur erkennen das sich am Pin PB0 was
geändert hat. Wenn man wissen will was für ein Pegel anliegt muß
man dafür den Pin abfragen/einlesen.

Nur beim "normalen" INT0 kann man einstellen auf welche Änderung am
Pin INT0/PB2 man reagieren will.

Also wird deine Variable bei jeder Änderung des Pegels am Pin in der
ISR erhöht. Egal ob du den Taster gedrückt oder losgelassen hast.

Soviel zum grundlegenden Thema PinChangeInterrupt.

Denn man noch viel Erfolg ... :)

Gruß
Dino
 
Hi Timo!

Es wird zwar langsam etwas spät und ich muss bald mal in die Waagerechte, aber....

Warum hast du die Widerstände R21 und R22 an PB0 eingebaut?
Durch den Pullup (wenn aktiviert) im µC brauchst du den externen R21 nicht.
Den R22 verstehe ich gar nicht. :hmmmm:
Letztlich behindert er dich nur, weil du ein Potentialunterschied erzeugst.

Was mir gerade noch einfällt......
Möchtest du später denn mit dem Tiny45 auch IR-Signale (RC5 Code) senden?
Das wird nicht funktionieren.... weil der Tiny45 nur einen 8Bit Timer hat und keinen 16bit Timer! :eek:

Das war auch bei mir der Grund, warum ich bei meiner IR-Fernbedienung vom Tiny45 auf den Tiny24v gewechselt bin. ;)

So, ich werde mich schon mal langsam verabschieden.....
Muss einfach mal etwas Schlaf von der Woche nachholen.

Gruß,
Cassio
 
Hi Timo!

Ich bin wohl doch schon zu müde dafür....

Habe eben gerade gesehen, dass du nicht IR-Signale senden sondern empfangen möchtest!

OK; dann kannst du den Tiny45 ruhig verwenden! Das klappt mit dem ohne Probleme!


So, nun aber......
Guats Nächtle !

Cassio
 
Hi Timo,

ein Teil aus deinem Programm ...
Pcmsk = &B00000001 'maskiere PCINT0 On Pcint0 Isr_pcint0 ' wenn Taste gedückt wid, löst INT aus
NEIN! Eben grade nicht.

Wenn der Taster gedrückt oder losgelassen wird löst der Interrupt aus.

das ist ein PinChangeInterrupt.

Gruß
Dino
 
Hi Dino!

Einen noch zur guten Nacht... ;)

Du hast zwar Recht mit dem PinChange (wie der Name es schon sagt), allerdings macht Timo ja eine 500ms Pause vor dem Return.....

Theoretisch sollte das Loslassen des Tasters gar nicht mehr erfasst werden.

Gute Nacht,
Cassio
 
Ich habe so meine Befürchtung, dass die Ursache in Zusammenspiel mit meinem I²C-Bus liegt. Ich habe jetzt den ganzen Bus (incl. Init) abgehängt und einen einfachen Port draus gemacht. Statt Bus toggle ich nun eine LED an SDA und SCL.
Und plötzlich funktioniert zumindest der Interrup!!
Code:
' -------------------------  Konfiguration -------------------------------------
   Config Pinb.0 = Input                                    ' Taster
   Config Pinb.2 = Input                                    ' IR-Empfänger (extern)

   Config Portb.3 = Output
   Config Portb.4 = Output
'   Config Sda = Portb.3                                     ' I²C-Anschluss festlegen
'   Config Scl = Portb.4



   Taster Alias Pinb.0                                      ' Alias für bessere Lesbarkeit
   Rc Alias Pinb.2

   Const Max4550_adr = 152

   Dim Kanal As Byte

  ' Config Int0 = Falling                                    'Interrupt konfigurieren und einstellen
   Gimsk = &B00100000                                       ' Pin Chane Int.Enable=1
   Pcmsk = &B00000001                                       'maskiere PCINT0
   On Pcint0 Isr_pcint0                                     ' wenn Taste gedückt wid, löst INT aus


' -------------------------  Konfiguration Ende --------------------------------
'
' -------------------------  Subroutinen Deklaration ---------------------------
   Declare Sub Schalten                                     ' (byval Kanal As Byte)

' -------------------------  Subroutinen Deklaration Ende ----------------------



' ------------------------------------------------------------------------------
' ------------------------- START ----------------------------------------------
   Kanal = 1
   Wait 1
   Call Schalten                                            ' Initialisierung auf Defaultwerte (Kanal und LED)

   Enable Pcint0

   Enable Interrupts



   Do                                                       'Endlosschleife
   '  Kanal = Kanal + 1
   ' Call Schalten
   ' Wait 1
   Loop


End


 ' -------------------------  Subroutinen --------------------------------------

   Sub Schalten                                             ' (byval Kanal As Byte)
     Toggle Portb.3
     Toggle Portb.4

 '     Local Commandwort As Byte
'      Local Datawort As Byte

'      If Kanal > 4 Then Kanal = 0                           'auf den gültigen Bereich einschränken

'      Commandwort = &B00000101                              ' , COM1B, COM1A sind ausgewählt
'      Datawort = &B00000001
'      Shift Datawort , Left , Kanal                         ' den richtigen Kanal durch Schiebbefehle auswählen

'      I2cstart
'      I2cwbyte Max4550_adr
'      I2cwbyte Commandwort
'      I2cwbyte Datawort
'      I2cstop

'      Commandwort = &B00010000
'      Datawort = &HFF - Datawort                            ' weil LED mit inverser Logik arbeiten
'      I2cstart
'      I2cwbyte Max4550_adr
'      I2cwbyte Commandwort
'      I2cwbyte Datawort
'      I2cstop



   End Sub

' ------------------------------------------------------------------------------


' ------------------------- Interrupt Service Routine --------------------------
Isr_pcint0:

   Kanal = Kanal + 1
   Call Schalten
   Waitms 500                                               ' um zu Entprellen

   Return

Meine Vermutung: Aufgrund der Tatsache, dass ich blödreweise den Hardware-I2C nicht genutzt habe, muss Bascom einen softwareseitig nachbilden und verarbeitet damit irgendwie die Interrupts - wie gesagt, reine Vermutung, aber wäre irgendwo schlüssig.
Sagt mir bitte dass ich falsch liege ...:eek:

Nächster Schritt wird also sein, die Schaltung orderntlich umzubiegen..

@Cassio: werde nur RC5 empfangen
R21/22 machen Sinn: Bin ein Freund von HW-PullUp und die Entkopplung habe ich aus "Erfahrung" drin. Potentialmässig sollte der auch vernachlässigbar sein, sonst taugt der Rest nichts ;)

@Dino: Gedrückt/Loslassen-Thema wird noch eine weitere Optimierung
 
Hi Cassio,

Du hast zwar Recht mit dem PinChange (wie der Name es schon sagt), allerdings macht Timo ja eine 500ms Pause vor dem Return.....

Theoretisch sollte das Loslassen des Tasters gar nicht mehr erfasst werden.
theoretisch ;) :D auf die Theorie und das Loslassen des Tasters innerhalb
der 500ms (0,5s) in der ISR würde ich mich nicht verlassen :rolleyes: Ich
würde innerhalb der ISR sicherheitshalber den Pegel auf PB0 abfragen um
sicher zu gehen das der Taster gedrückt wurde. So ca 10ms nach dem
Eintritt in die ISR. Wenn ja, weiter in der ISR, wenn nein, raus aus der ISR.
Ein Taster prellt nach meinen Studien der Tasten-Datenblätter und Webseiten
so um die 3-7ms. Also sollten 10ms reichen. Wobei ich mir da bei Licht-Tastern
nicht so sicher bin :confused: da könnten es auch mehr sein.

Ach ja, wenn man den Pin PB0 zB als Ausgang setzt kann man mit einem
selbstgemachten Pegelwechsel selber einen Interrupt im Programm
auslösen. Also ein Out auf PortB0 (0 auf 1 oder 1 auf 0) löst dann den
PCINT0 aus ;)

Gruß
Dino

PS: Grandpa´s Bier hat geschmeckt, es wurde viel geredet, mein Bauch
beinhaltet einen Döner und der Tag war soweit ganz schön :D ich geh jetzt
auch schlafen. Gute Nacht :sleep: Mal sehen wann wir beide mal zu einem
Treffen kommen ;) oder wir drei :D
 
Hi Timo!

Na, wenigstens hätten wir geklärt, dass der PCINT ordnungsgemäß arbeitet! :)

Bei I2C muss ich aber leider die Segel streichen!
Da kenne ich mich nicht mit aus..... mangels Erfahrung!

Ich denke mal, da muss Markus oder Knickohr ran! ;)


Zumindest kannst du nun (und ich auch) teilweise beruhigt ins Bett gehen!

Viel Spaß noch beim tüfteln... :)
Cassio
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)