Forum: Mikrocontroller und Digitale Elektronik AVR-Atmega 16 Input Problem


von M. G. (elch)


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 ?

von spess53 (Gast)


Lesenswert?

Hi

>Was mache ich falsch ?

>PORTC|=(1<<PINC3);

JTAG nicht abgeschaltet?

MfG Spess

von Stefan E. (sternst)


Lesenswert?

M. G. schrieb:
> if(PINA|(1<<PINA1))

Das ist immer wahr.

Bitmanipulation

von M. G. (elch)


Lesenswert?

Danke fuer die schnellen Antworten!
Ich habe
1
if(PINA|(1<<PINA1))
durch
1
if(!(PINA&(1<<PINA1)))
ersetzt. Das Ergebnis ist das gleiche.
Ich programmiere mit dem STK500 und habe JTAG noch nie benutzt , also 
liegt es daran warscheinlich auch nicht.

von Karl H. (kbuchegg)


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.

von M. G. (elch)


Lesenswert?

Es lag wohl doch am JTAG FUSE und jetzt funktionierts.
Vielen Dank!

von M. G. (elch)


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
}

von M. G. (elch)


Lesenswert?

Ich hab jetzt auch nochmal das ankommende Signal ueberprueft , und auch 
das ist in Ordnung.
hat Jemand eine Idee was hier nicht stimmt ?

von Thomas (kosmos)


Lesenswert?

ps. JTAG kann man auch in der Software deaktivieren.

von M. G. (elch)


Lesenswert?

Ich hab es in AVR Studio 4 unter "Fuses" deaktiviert. Das muesste doch 
reichen, oder ?

von Thomas (kosmos)


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

von M. G. (elch)


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!

von Christopher G. (cbg)


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;

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.