Problem beim Schalten von Eingängen am Atiny13

Gast #3686092
Lesenswert?

Hallo,
ich habe folgenden Code auf zwei verschiedene Atiny13 in zwei 
verschiedenen Schaltungen hochgeladen:
1
#define F_CPU 9000000UL
2
#include <avr/io.h>
3
#include <util/delay.h>
4
#include <avr/interrupt.h>
5

6
volatile int status=0;
7

8
int main(void)
9
{
10
  DDRB |= (1 << DDB5) | (1 << DDB3);
11
  DDRB &= ~(1 << DDB0);
12
  GIMSK  |= (1<<INT0);
13
  MCUCR |= (1<<ISC00);
14
  MCUCR &= ~(0<<ISC01);
15
  sei(); 
16
  PORTB &= ~(1<<PB5);
17

18
while(1)
19
  { _delay_ms(5);
20
PORTB &= ~(1<<PB5);}
21
}
22

23
ISR (INT0_vect) {
24
  if (PINB & (1<<PINB0))
25
  {status=1;}
26
  else
27
  {
28
    status=2;
29
  }
30
}


Wenn ich nun mit dem Multimeter den PB5 Pin gegen Masse messe, bekomme 
ich aber 4,7V, egal was ich mache, daher 1.
Wie kommt das? Ich habe meine PINs am ATMega bisher immer so angesteuert 
und es hat geklappt (was offenbar dann mehr zufällig war, denn 
irgendetwas ist wohl falsch...).
Bin für Tipps sehr dankbar,
Gruß
Stefan
#3686097
Lesenswert?

Was wolltest du eigentlich mit
1
  MCUCR &= ~(0<<ISC01);
bezwecken?

Jetzt muss ich direkt mal überlegen, was das eigentlich macht.
Ok, habs. Das ist eine No-Operation. MCUCR mit 0xFF zu verunden ändert 
nichts am MCUCR.

Lass halt mal den Interrupt weg. Wenn der die ganze Zeit feuert (welchen 
Modus hast du eigentlich eingestellt), dann kommt deine main-Loop nur 
sehr, sehr langsam vorran. So langsam, dass es eine halbe Ewigkeit 
dauert, bis dann  irgendwann PD5 mal auf Low geht.

Warum immer so komplizierte Testprogramme. Wenn du wissen willst, ob 
dein µC am PD5 einen Schaden hat oder nicht, dann reicht
1
#include <avr/io.h>
2

3
int main()
4
{
5
  DDRB |= ( 1 << PB5 );
6

7
  while( 1 )
8
    PORTB &= ~( 1 << PB5 );
9
}

um den Pin auf Low zu sehen und
1
#include <avr/io.h>
2

3
int main()
4
{
5
  DDRB |= ( 1 << PB5 );
6

7
  while( 1 )
8
    PORTB |= ( 1 << PB5 );
9
}

um den Pin auf High zu sehen.
Alles andere zusätzliche im Programm sind erst mal nur zusätzliche 
mögliche Fehlerquellen. Und das ist nicht besonders zielführend, wenn du 
nur wissen willst, was mit PB5 los ist.
Gast #3686109
Lesenswert?

MCUCR &= ~(0<<ISC01);  war ein typo, das soll nat.  MCUCR &= 
~(1<<ISC01); sein.
Ansonsten hängt der Eingang für den interrupt auf Masse, deswegen wollte 
ich das Programm nicht mehr als nötig veknappen, aber stimmt schon, da 
war ich nur zu faul zum auskommentieren.
Habe mal dein Testprogramm hochgeladen -> selbes Spiel, PB5 bleibt auf 
4,7V

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren