AVR-Atmega 16 Input Problem

OP #2355948
Lesenswert?

Hallo,
Ich versuche zurzeit meinen Atmega16 ueber den Parallel Port meines 
Computers anzusteuern. Ich will (erstmal) eine LED ein- und ausschalten 
koennen.Das Programm auf dem Computer funktioniert auf jeden Fall, da am 
Input Pin (PinA1) bei Low 0,05 Volt anliegen und bei High 3,80 Volt.
Allerdings leuchtet die LED in beiden Faellen :(
Am Input Pin haengt ausserdem ein 1K Pullup Widerstand.
An PinC3 haengt die LED.
Hier der Code:
1
#include <avr/io.h>
2
int main()
3
{  
4
  
5
  DDRA=0x00;
6
  DDRC=0xFF;
7
  
8

9
  while(1)
10
  {  
11
    if(PINA&(1<<PINA1))
12
      {
13
      PORTC&=~(1<<PINC3);
14
      }
15
      else
16
      if(PINA|(1<<PINA1))
17
      {
18
      PORTC|=(1<<PINC3);
19
      }          
20
  }
21
  return 0;
22
}
Was mache ich falsch ?
#2356125
Lesenswert?

M. G. schrieb:
> Danke fuer die schnellen Antworten!
> Ich habe
>
1
if(PINA|(1<<PINA1))
> durch
>
1
if(!(PINA&(1<<PINA1)))
> ersetzt.

ersetze das 2-te if ganz einfach durch ein else

  if( Bedingung )
    tu das
  else
    tu was anderes

> Das Ergebnis ist das gleiche.
> Ich programmiere mit dem STK500 und habe JTAG noch nie benutzt , also
> liegt es daran warscheinlich auch nicht.

Doch, tut es. Denn das JTAG ist per Default eingeschaltet. Damit dein 
Pin C3 aber wie vorgesehen funktioniert, muss JTAG per Fuse abgeschaltet 
werden.
OP #2357818
Lesenswert?

Hallo nochmal,
Ich musste bei meinem Aufbau die Pins aendern und schon funktioniert es 
wieder der nicht :(
Woran kann das schon wieder liegen ?
JTAG ist diesmal ganz sicher nicht aktiviert und der Eingangspin hat 
immernoch einen 1K Pullupwiderstand.
1
#include <avr/io.h>
2

3
int main()
4
{  
5
  DDRB=0xFF;
6
  DDRD=0x00;
7
  
8
  while(1)
9
  {  
10
    if(PIND&(1<<PIND6))
11
      {
12
      PORTB|=(1<<PINB4);
13
      }
14
      else
15
      {
16
      PORTB&=~(1<<PINB4);
17
      }
18
  }
19
  return 0;
20
}
#2358311
Lesenswert?

ja dann ist es aber dauerhaft aus. In Software kann man es nach Bedarf 
ein und ausschalten. z.B. bei einer bestimmten 
Tastenkombination/Tastenfolge wieder für debugzwecke einschalten oder 
erst 5 Sekunden das µC-Start deaktivieren... außerdem ist das Risiko 
geringer wenn man einen nicht AVR-Studio kompatiblen Programmer nutzt 
sich den µC zu verfusen.

Man muss nur das JTD (JTAGDISABLE) Bit im MCUCCSR auf 1 setzen aber für 
C kann ich dir nicht helfen.

in ASM macht man es am besten so, damit man nichts an den anderen Bits 
verstellt ersmal das Register auslesen und nur das eine Bit ändern.
in temp, MCUCSR
sbr temp, 0b10000000
out MCUCSR, temp
OP #2358321
Lesenswert?

Ok, das hab ich jetzt auch geaendert.
In C muesste das so aussehen:
1
MCUCSR&=~(1<<JTD);
Aber daran lag es auch nicht.
Ich hab gerade durch einen Zufall bemerkt das der Atmega nicht richtig 
im Sockel sitzt , oder der Sockel kaputt ist. Auf jeden Fall klappt es 
nur wenn ich den Atmega waehrend er lauft in den Sockel Druecke.
Aber was solls, hauptsache es klappt.
Danke!
#2358364
Lesenswert?

Thomas O. schrieb:
> Man muss nur das JTD (JTAGDISABLE) Bit im MCUCCSR auf 1 setzen aber für
> C kann ich dir nicht helfen.

M. G. schrieb:
> In C muesste das so aussehen:MCUCSR&=~(1<<JTD);

Falsch, zum Setzen eines Bits muss man mit der Maske verodern. Ausserdem 
muss man das Bit zweimal innerhalb von 4 Zyklen auf den gewünschten Wert 
setzen.
"In order to avoid unintentional disabling
or enabling of the JTAG interface, a timed sequence must be followed 
when changing
this bit: The application software must write this bit to the desired 
value twice within four
cycles to change its value."
1
uint8_t mcucsr;
2
uint8_t sreg;
3
sreg = SREG;
4
cli();
5
mcucsr = MCUCSR | _BV(JTD);
6
MCUCSR = mcucsr;
7
MCUCSR = mcucsr;
8
SREG = sreg;

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