Forum: Mikrocontroller und Digitale Elektronik Problem beim Schalten von Eingängen am Atiny13


von Stefan (Gast)


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

: Bearbeitet durch User
von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Stefan (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Oh Mann.
PB5 ist der Reset Pin.

Wenn du den schalten willst, dann musst du Reset per Fuse disablen. Hat 
allerdings den Nachteil, dass du den Tiny danach nicht mehr per ISP 
flashen kannst.

von Stefan (Gast)


Lesenswert?

Ups, der Blick aufs Datenblatt hilft :/ Danke!

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.