mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik High Level an PD0 (INT0/input) des AVR-CAN (AT90CAN128)


Autor: Milan29 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Leute,

ich habe eines dieser AVR-CAN boards von Olimex mit AT90CAN128.
Ich programmiere das Teil über die Pins PDI und PDO, da ich nur einen 
ISP (mySmartUSB MK2) besitze. Das klappt alles wunderbar.
Nun möchte ich über die 4 Eingänge INT0 bis INT3 Interrupts auslösen. 
Standardmäßig lege ich die Eingänge auf 0V und warte bis ein High Signal 
(5V) durch einen anderen µC oder eine Spannungsquelle drauf gegeben 
wird.
Die ISR sollen bei Flankenwechsel ausgelöst werden, also auch wenn der 
externe High Pegel wieder verschwindet. Im LOW-HIGH Fall soll an jeweils 
einem der OCRx-Ausgänge von Timer3, bzw Timer1 ein PWM-Signal ausgegeben 
werden. Das nur zum Hintergrund.
Mit dem u.a. Programmcode verhalten sich die PINS PD0, PD1 und PD2 
jedoch so, dass sie immer auf HIGH sind, wodurch natürlich nie ein IR 
ausgelöst wird während PD3 (INT3) standardmäßig auf LOW ist und durch 
diesen daher wunderbar bei Anlegen von 5V ein IR ausgelöst wird.
Mein Frage, wieso verhält sich INT3 anders als INT0 bis INT2:
int main(void)
{
  setup();
  sei();
  while(1)
  {
    // do stuff
  }
  return 0;
}

void setup()
{
  cli();
  
  EIMSK &= 0b11110000;  //Disable INTs
  EICRA = 0b01010101;  //Trigger on LVL Change
  EIFR |= 0b00001111;  //Clear possible interrupt flags
  EIMSK = 0b00001111;  //Enable INT0, INT1, INT2, INT3, disable Rest
  
  DDRE |= 0b00111000;  // OC3A, OC3B, OC3C als Ausgang definieren
  
  DDRB |= 0b01010000;  // OC1B, OC2A (Timer) als Ausgang definieren
        DDRD &= 0b11110000;  // INT0, INT1, INT2, INT3 als Eingang definieren

        TCCR1A |= 0b00100001;
  TCCR1A &= 0b11101101;
  TCCR1B |= 0b00001001;
  TCCR1B &= 0b11101001;
  TCCR1C &= 0b00000000;
  
  TCCR3A |= 0b10101001; 
  TCCR3A &= 0b10101001;
  TCCR3B |= 0b00001001; 
  TCCR3B &= 0b11101001;
  TCCR3C &= 0b00000000;

  OCR1B = 0x00;
  OCR3A = 0x00; 
  OCR3B = 0x00;
  OCR3C = 0x00;
}

// hier folgen die 4 ISR
ISR(INT0_vect)
{
  //...
}

...

Ich bitte den Englisch-Deutsch Mischmasch und die vielleicht nicht so 
gerne gesehenen binären Zuweisungen zu entschuldigen. Wäre für jeglichen 
Hinweis, was das Problem sein könnte dankbar.
Vielleicht ists auch banal, manchmal hat man halt das berühmte Brett vor 
dem Kopf.

Liebe Grüße,

Milan

Autor: Karl M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

genau, so kann das keiner kontrollieren und ich denke keiner wird dazu 
Lust haben.
Und ich verstehe nicht, warum Du von den Bit-Namen abgekommen bist.
EIMSK &= 0b11110000;  //Disable INTs
  EICRA = 0b01010101;  //Trigger on LVL Change
  EIFR |= 0b00001111;  //Clear possible interrupt flags
  EIMSK = 0b00001111;  //Enable INT0, INT1, INT2, INT3, disable Rest
  
  DDRE |= 0b00111000;  // OC3A, OC3B, OC3C als Ausgang definieren
  
  DDRB |= 0b01010000;  // OC1B, OC2A (Timer) als Ausgang definieren
  DDRD &= 0b11110000;  // INT0, INT1, INT2, INT3 als Eingang definieren

  TCCR1A |= 0b00100001;
  TCCR1A &= 0b11101101;
  TCCR1B |= 0b00001001;
  TCCR1B &= 0b11101001;
  TCCR1C &= 0b00000000;
  
  TCCR3A |= 0b10101001; 
  TCCR3A &= 0b10101001;
  TCCR3B |= 0b00001001; 
  TCCR3B &= 0b11101001;
  TCCR3C &= 0b00000000;

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Ich programmiere das Teil über die Pins PDI und PDO, da ich nur einen
>ISP (mySmartUSB MK2) besitze.

Wundert mich eigentlich. Lt. Datenblatt ist

MOSI (PDI) PE0 I Serial Data in
MISO (PDO) PE1 O Serial Data out

MfG spess

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Inoriere meine letzte Antwort. Ich hatte das als PD0/PD1 gelesen.

MfG Spess

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Autor: Milan29 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,

also ich habe die Zuweisungen mal umgeschrieben. Vielleicht nimmt sich 
ja jetzt eher jemand der Sache an.
int main(void)
{
  setup();
  sei();
  while(1)
  {
    // do stuff
  }
  return 0;
}

void setup()
{
  cli();
  EIMSK &= ~(1<<INT3) & ~(1<<INT2) & ~(1<<INT1) & ~(1<<INT0);    // Disable INT0 - INT3
  EICRA |= (1<<ISC30) | (1<<ISC20) | (1<<ISC10) | (1<<ISC00);    // ISR bei Flankenwechsel
  EICRA &= ~(1<<ISC31) & ~(1<<ISC21) & ~(1<<ISC11) & ~(1<<ISC01); //    -"-
  EIFR |= (1<<INTF3) | (1<<INTF2) | (1<<INTF1) | (1<<INTF0);  // Mögliche IR-flags löschen
  DDRE |= (1<<DDE5) | (1<<DDE4) | (1<<DDE3);          // PE3 - PE5 (OC3A, OC3B, OC3C) als Ausgang definieren
  DDRB |= (1<<DDB6);                      // PB6 (OC1B) als Ausgang definieren
  DDRD &= ~(1<<DDD3) & ~(1<<DDD2) & ~(1<<DDD1) & ~(1<<DDD0);  // INT0, INT1, INT2, INT3 als Eingang definieren
  EIMSK |= (1<<INT3) | (1<<INT2) | (1<<INT1) | (1<<INT0);    // Enable INT0 - INT3
}

// hier folgen die 4 ISR
ISR(INT0_vect)
{
  //...
}

...

Kann es mit den Pullups zusammenhängen, da die Spannung z.B. am Pin PD2 
bei Anlegen eines Low-Pegels von 4,8 nur auf ca. 4,2 absackt, wieso 
verhält es sich bei PD3 dann jedoch anders? Oder liegt es eventuell 
daran, dass ich die "Overriding Functions" an den Interrupt-Pins 
explizit deaktivieren muss?
Es sind ja folgende Dreifachbelegungen vorhanden:
(TXD1 / INT3) PD3
(RXD1 / INT2) PD2
(SDA / INT1) PD1
(SCL / INT0) PD0

Ich hatte jedoch ohne Erfolg bereits
TWCR &= ~(1<<TWEN);
UCSR1B &= ~(1<<RXEN1) & ~(1<<TXEN1);
versucht.
Weiß jemand woran es liegen könnte?

Grüße,
Milan

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Jetzt muss ich noch einmal hachhaken: Die ISP-Programmierung hat nichts 
mit PortD zu tun. Es werden

MOSI (PDI) PE0 (Pin 2)
MISO (PDO) PE1 (Pin 3)
SCK        PB1 (Pin 11)

verwendet.

MfG Spess

Autor: Rudolph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
An PD2 und PD3 hängt doch noch U4 dran.
Und an PD0 und PD1 sind 4k7 Pullups extern dran.

Autor: Milan29 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rudolph,

Danke für deinen entscheidenden Hinweis. Man sollte schon Schaltpläne 
(und dann auch die richtigen) ;-) lesen können. Naja meine Kollegen 
nennen mich nicht umsonst eher den Bitschieber.
Jedenfalls hab ich R4, R5 und R17 rausgelötet und nun hab ich meine 
gewünschten Pegel.

Mfg Milan

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.