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


von Milan29 (Gast)


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:
1
int main(void)
2
{
3
  setup();
4
  sei();
5
  while(1)
6
  {
7
    // do stuff
8
  }
9
  return 0;
10
}
11
12
void setup()
13
{
14
  cli();
15
  
16
  EIMSK &= 0b11110000;  //Disable INTs
17
  EICRA = 0b01010101;  //Trigger on LVL Change
18
  EIFR |= 0b00001111;  //Clear possible interrupt flags
19
  EIMSK = 0b00001111;  //Enable INT0, INT1, INT2, INT3, disable Rest
20
  
21
  DDRE |= 0b00111000;  // OC3A, OC3B, OC3C als Ausgang definieren
22
  
23
  DDRB |= 0b01010000;  // OC1B, OC2A (Timer) als Ausgang definieren
24
        DDRD &= 0b11110000;  // INT0, INT1, INT2, INT3 als Eingang definieren
25
26
        TCCR1A |= 0b00100001;
27
  TCCR1A &= 0b11101101;
28
  TCCR1B |= 0b00001001;
29
  TCCR1B &= 0b11101001;
30
  TCCR1C &= 0b00000000;
31
  
32
  TCCR3A |= 0b10101001; 
33
  TCCR3A &= 0b10101001;
34
  TCCR3B |= 0b00001001; 
35
  TCCR3B &= 0b11101001;
36
  TCCR3C &= 0b00000000;
37
38
  OCR1B = 0x00;
39
  OCR3A = 0x00; 
40
  OCR3B = 0x00;
41
  OCR3C = 0x00;
42
}
43
44
// hier folgen die 4 ISR
45
ISR(INT0_vect)
46
{
47
  //...
48
}
49
50
...

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

von Karl M. (Gast)


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.
1
EIMSK &= 0b11110000;  //Disable INTs
2
  EICRA = 0b01010101;  //Trigger on LVL Change
3
  EIFR |= 0b00001111;  //Clear possible interrupt flags
4
  EIMSK = 0b00001111;  //Enable INT0, INT1, INT2, INT3, disable Rest
5
  
6
  DDRE |= 0b00111000;  // OC3A, OC3B, OC3C als Ausgang definieren
7
  
8
  DDRB |= 0b01010000;  // OC1B, OC2A (Timer) als Ausgang definieren
9
  DDRD &= 0b11110000;  // INT0, INT1, INT2, INT3 als Eingang definieren
10
11
  TCCR1A |= 0b00100001;
12
  TCCR1A &= 0b11101101;
13
  TCCR1B |= 0b00001001;
14
  TCCR1B &= 0b11101001;
15
  TCCR1C &= 0b00000000;
16
  
17
  TCCR3A |= 0b10101001; 
18
  TCCR3A &= 0b10101001;
19
  TCCR3B |= 0b00001001; 
20
  TCCR3B &= 0b11101001;
21
  TCCR3C &= 0b00000000;

von spess53 (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

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

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

von Milan29 (Gast)


Lesenswert?

Hallo nochmal,

also ich habe die Zuweisungen mal umgeschrieben. Vielleicht nimmt sich 
ja jetzt eher jemand der Sache an.
1
int main(void)
2
{
3
  setup();
4
  sei();
5
  while(1)
6
  {
7
    // do stuff
8
  }
9
  return 0;
10
}
11
12
void setup()
13
{
14
  cli();
15
  EIMSK &= ~(1<<INT3) & ~(1<<INT2) & ~(1<<INT1) & ~(1<<INT0);    // Disable INT0 - INT3
16
  EICRA |= (1<<ISC30) | (1<<ISC20) | (1<<ISC10) | (1<<ISC00);    // ISR bei Flankenwechsel
17
  EICRA &= ~(1<<ISC31) & ~(1<<ISC21) & ~(1<<ISC11) & ~(1<<ISC01); //    -"-
18
  EIFR |= (1<<INTF3) | (1<<INTF2) | (1<<INTF1) | (1<<INTF0);  // Mögliche IR-flags löschen
19
  DDRE |= (1<<DDE5) | (1<<DDE4) | (1<<DDE3);          // PE3 - PE5 (OC3A, OC3B, OC3C) als Ausgang definieren
20
  DDRB |= (1<<DDB6);                      // PB6 (OC1B) als Ausgang definieren
21
  DDRD &= ~(1<<DDD3) & ~(1<<DDD2) & ~(1<<DDD1) & ~(1<<DDD0);  // INT0, INT1, INT2, INT3 als Eingang definieren
22
  EIMSK |= (1<<INT3) | (1<<INT2) | (1<<INT1) | (1<<INT0);    // Enable INT0 - INT3
23
}
24
25
// hier folgen die 4 ISR
26
ISR(INT0_vect)
27
{
28
  //...
29
}
30
31
...

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
1
TWCR &= ~(1<<TWEN);
2
UCSR1B &= ~(1<<RXEN1) & ~(1<<TXEN1);
versucht.
Weiß jemand woran es liegen könnte?

Grüße,
Milan

von spess53 (Gast)


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

von Rudolph (Gast)


Lesenswert?

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

von Milan29 (Gast)


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

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.