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:
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
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.
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
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
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
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