www.mikrocontroller.net

Forum: Compiler & IDEs INT0 durch INT1 erstzen geht nicht


Autor: Mathias O. (m-obi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen,

ich habe einen Code geschrieben, zum dimmen einer Lampe (einige müssten 
wissen worum es geht). Ich nutze einen ATtiny2313 bei 8MHz. In dem Code 
nutze ich INT0, der wird ausgelöst durch die Nulldurchgangserkennung, 
bei einer fallenden Flanke. Nun möchte ich aber anstatt INT0, INT1 
benutzen. Aber wenn ich alles nötige dafür ersetze, funktioniert der 
Code nicht richtig, er compiliert zwar, aber in der Praxis funktioniert 
er nicht.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define Taster_1   (PIND&(1<<PD4))

volatile struct {
   unsigned _1:1;
   unsigned _2:1;
   unsigned _3:1;
   unsigned _4:1;
   unsigned _5:1;
   unsigned _6:1;
} Merker;

volatile uint8_t Dimmrichtung = 1;
volatile uint8_t Counter_1 = 0;
volatile uint8_t Counter_2 = 0;
volatile uint8_t Counter_3 = 0;
volatile uint16_t Zuendwert = 800;
volatile uint16_t Zuendpunkt_1 = 0;
volatile uint16_t Zuendpunkt_2 = 0;
volatile uint16_t Temp = 0;


ISR(INT0_vect)
{    
  TCNT1 = 0;
  
  Merker._1 = 1;
  
  if (Taster_1)
  {    
    Counter_1 = 0;
    Counter_2++;
    if (Merker._3 == 0)
    {
      Merker._2 = 1;
    }
  }
  else
  {
    Counter_1++;
    Counter_2 = 0;
    Merker._3 = 0;
    Merker._2 = 0;
  }
  
  if (Merker._2 == 1)
  {
    Counter_3++;
  }
  
  if ((Counter_3 <= 45) && (Counter_3 >= 4) && (Merker._2 == 0))
  {
    PORTD ^= (1<<6);
    Merker._4 = !Merker._4;
    if (Merker._4 == 1)
    {
      Dimmrichtung = !Dimmrichtung;
    }
    Counter_3 = 0;
    Merker._5 = 1;
  }
  
  if ((Merker._2 == 0) && (Merker._5 == 1))
  {
    Counter_3 = 0;
  }
  
  if ((Merker._4 == 0) && (Zuendwert != 0))
  {
    Temp = Zuendwert;
    Zuendwert = 0;
    Merker._6 = 1;
  }
  
  if ((Merker._6 == 1) && (Merker._4 == 1))
  {
    Zuendwert = Temp;
    Merker._6 = 0;
  }
  
  Zuendpunkt_1 = Zuendwert + 0;
  Zuendpunkt_2 = Zuendwert + 1250;  
}


int main(void)
{  
  DDRB = 0b11111111;
  DDRD = 0b11100000;
  
  MCUCR |= (1<<ISC01)|(1<<ISC11);
  MCUCR &= ~((1<<ISC00)|(1<<ISC10));    
  GIMSK |= (1<<INT0);
  
  TCCR1A = 0x00;
  TCCR1B |= (1<<CS10)|(1<<CS11);
  
  Merker._1 = 0;
  Merker._2 = 0;
  Merker._3 = 0;
  Merker._4 = 0;
  Merker._5 = 0;
  Merker._6 = 0;
  
  sei();

  while(1)
  {       
    if ((Counter_2 == 50) && (Merker._4 == 1))
    {
      Merker._3 = 1;  
    }
  
    if ((Counter_1 == 2) && (Merker._4 == 1))
    {
      Dimmrichtung = !Dimmrichtung;
      Counter_1++;
    }
  
    if (Merker._3 == 1 && Zuendwert <= 900 && Merker._1 == 1 && Dimmrichtung == 0)
    {
      Merker._1 = 0;
      Zuendwert+=5;
      Counter_3 = 0;
      Merker._2 = 0;
    }
  
    if (Merker._3 == 1 && Zuendwert >= 100 && Merker._1 == 1 && Dimmrichtung == 1)
    {
      Merker._1 = 0;
      Zuendwert-=5;
      Counter_3 = 0;
      Merker._2 = 0;
    }
  
    if  (((TCNT1 == Zuendpunkt_1) || (TCNT1 == Zuendpunkt_2)) && (Zuendwert != 0))
    {
      PORTD |= (1<<5);
      _delay_us(80);
      PORTD &= ~(1<<5);
    }
  }  
}

Im MCUCR hab ich alles schon eingefügt was benötigt wird.
Wenn ich jetzt aber beim GIMSK das
GIMSK |= (1<<INT0)|(1<<INT1);
anstatt
GIMSK |= (1<<INT0);
schreibe, funktioniert der Code wie beschrieben nicht mehr.

Dann muss ich ja auch nur noch anstatt
ISR(INT0_vect)
{  
ISR(INT1_vect)
{  
schreiben. Stimmt doch oder, fehlt dann noch etwas?


MfG
Mathias

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist mit dem Taster_1 define und den Pullups?

Autor: Mathias O. (m-obi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hat ja alles schon vorher geklappt, nur ich muss rein 
hardwaretechnisch, den Nulldurchgang auf INT1 setzen. Und der Taster is 
ja an PD4 und INT1 ist an PD3, alles eigentlich ganz ok.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Mathias O. wrote:
> Im MCUCR hab ich alles schon eingefügt was benötigt wird.
> Wenn ich jetzt aber beim GIMSK das
>
GIMSK |= (1<<INT0)|(1<<INT1);

Ich denke, Du willst INT0 durch INT1 ersetzen?
Warum willst Du dann BEIDE freigegen???

> Dann muss ich ja auch nur noch anstatt
>
ISR(INT0_vect)
> {  
>
>
ISR(INT1_vect)
> {  

Und wohin springt dann Dein oben freigegebener INT0, wenn es keine ISR 
mehr dafür gibt?

Gruß aus Berlin
Michael

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und was hängt jetzt statt dessen an Int0?
Schließlich ist der Interrupt ja auch immer noch enabled, aber ohne dass 
es eine ISR dafür gibt. Wenn der Eingang offen ist, wird dein µC munter 
laufend Software-Resets durchführen.

Autor: Mathias O. (m-obi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe es jetzt mal so geändert:
ISR(INT1_vect)
{
MCUCR |= (1<<ISC11);
  MCUCR &= ~(1<<ISC10);    
  GIMSK |= (1<<INT1);

Funktioniert immernoch nicht.

Autor: Mathias O. (m-obi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also wenn ich den Taster kurz betätige, geht sie an oder halt aus. Wenn 
ich den Taster länger gedrückt halte dimmt es entweder, hoch oder 
runter, je nachdem wie grad die Dimmrichtung ist. Aber jetzt ist es so. 
Auf langen drücken reagiert nix mehr, nur wenn ich kurz drücke, geht an 
oder aus, oder macht garnix.

Und das ganze nur weil ich einen ander INT-Pin nehme.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>#define Taster_1   (PIND&(1<<PD4))
>...
>Und der Taster is ja an PD4 und INT1 ist an PD3, alles eigentlich ganz ok.

??? Der Sinn erschliesst sich mir jetzt nicht ganz.

Aus dem ATTiny2313-Datenblatt (doc2543.pdf):

>• T0 – Port D, Bit 4
>T0: Timer/Counter0 External Counter Clock input is enabled by setting (one) the 
>bits
>CS02 and CS01 in the Timer/Counter0 Control Register (TCCR0).

>• INT1 – Port D, Bit 3
>INT1: External Interrupt Source 1. The PD3 pin can serve as an external interrupt
>source to the MCU.
>• INT0/XCK/CKOUT – Port D, Bit 2
>INT0: External Interrupt Source 0. The PD2 pin can serve as en external interrupt
>source to the MCU.

Was soll der Taster an PD4?? Aus meinem laienhaften Verständnis heraus 
würde ich, wenn ich per Taster den INT1 auslösen möchte, den Taster auch 
am Pin INT1 (=PD3) anschliessen. (und in der Version mit INT0 an PD2)

Oder gibt es verschiedene ATTiny2313?

Ich denke mal, du stellts die falsche Frage. Die richtige lautet:

Warum in aller Welt tut das Programm so, als ob es funktioniert, wenn du 
INT0 benutzt?

Oliver

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, und wenn du das geklärt hast, lies dir mal in der 
Artikelsammlung alles zum Thema "Schalterprellen" durch.

Oliver
P.S. Der INT0/1 reagiert nicht auf Nulldurchgang, sondern auf eine 
fallende Flanke.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@ Oliver (Gast): was hast Du nur mit seinem Taster???

INT0 bzw. INT1 ist seine Nulldurchgangserkennung,
das dürften vor ihm auch andere schon mit INT0 oder INT1 gemacht haben.

Gruß aus Berlin
Michael

Autor: Robert K. (molch) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver wrote:

> Was soll der Taster an PD4?? Aus meinem laienhaften Verständnis heraus
> würde ich, wenn ich per Taster den INT1 auslösen möchte, den Taster auch
> am Pin INT1 (=PD3) anschliessen. (und in der Version mit INT0 an PD2)

Soweit ich das verstehe soll nicht der Taster sondern der Nulldurchgang 
(einer Netzspannungperiode?) einen Int. auslösen.

Leider habe ich im Code selbst keinen Fehler finden können (heisst nicht 
es gibt keinen).
Vllt. nochmal die äußere Beschaltung überprüfen.

Desweiteren muss der "negative" Impuls bzw. die fallende Flanke länger 
anliegen als ein Clockcycle um sicher erkannt werden zu können.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Soweit ich das verstehe soll nicht der Taster sondern der Nulldurchgang
>(einer Netzspannungperiode?) einen Int. auslösen.

Ok, das hab ich falsch verstanden. So ist mein Beitrag oben natürlich 
sinnlos.

Oliver

Autor: Mathias O. (m-obi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

nun hab ich den Fehler nach langen Suchen gefunden. Ich habe mal vor 
längerer Zeit aus versehen den Controller falschherum in die Fassung 
gesteckt und da hat anscheinend der INT1-Pin einweg bekommen. Nun hab 
ich einfach einen anderen Controller genommen und voila, es 
funktioniert.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.