Forum: Compiler & IDEs Taster Programmier Anfänger Problem Atmega32


von Spitti (Gast)


Lesenswert?

Ich habe ein Problem mit der Programmierung einer Abfrage für einen 
Taster, der An PORTC1 angeschlossen mit 100kOhm Pulldown Widerstand 
angeschlossen ist. Desweiteren ist eine LED an PortB7 angeschlossen. 
Mein Controller ist ein atMega32.

Hier ist ein Assembler-Programm, welches den Bei gedrücktem Taster das 
LED leuchten lässt und bei nicht gedrücktem bleibt es aus.
1
.include "m32def.inc"
2
rjmp Anfang
3
4
Anfang:
5
      sbi   DDRB,7  ;Datenrichtungsbit
6
Schleife:
7
      sbic  pinc,1
8
      sbi   portb,7
9
      sbis  pinc,1
10
      cbi   portb,7
11
      rjmp  Schleife

Nun will ich das ganze in gcc realisieren. Dazu habe ich folgendes 
geschrieben:

#include   <avr/io.h>
#include  "main.h"
1
void main(void)
2
{
3
  DDRB |= (1<<PB7);
4
  while(1)
5
  {
6
    if (PINC & (1 << PC1))
7
    {
8
      PORTB |= (1<<PB7);
9
    }
10
11
    if (!(PINC & (1 << PC1)))
12
    {
13
      PORTB &= ~(1<<PB7);
14
    }
15
  }
16
}

Bei diesem Programm drücke ich den Taster, dann geht die LED an, aber 
aus geht sie leider nicht mehr, wenn ich den Taster loslasse. Meine 
Frage: Woran kann das liegen?
An der Hardware auf jeden fall nicht, denn bei dem Assembler Programm 
geht es ja.
Danke für Antworten. ( Ich bin ein Neuling.Bitte um Verständnis.)

von Timmo H. (masterfx)


Lesenswert?

Sollte meiner Meinung nach gehen. Kannst ja mal so testen, ist 
eigentlich das gleiche :-)
1
  while(1)
2
  {
3
    PORTB = (PORTB & ~(1<<PB7)) | ((PINC & (1 << PC1))<< PB7 - PC1);
4
  }

von Spitti (Gast)


Lesenswert?

@Timmo:
Dein Code funktioniert! Danke man!
Kannst du mir erklären warum dein Code nun funktioniert und meiner 
nicht?
Wäre nett.

von Timmo H. (masterfx)


Lesenswert?

Würde ich gerne, aber wie gesagt, imho müsste deiner auch gehen. Mein 
AVR Debugger denkt das auch...
Gut ich hätte es jetzt eher so gemacht:
1
void main(void)
2
{
3
  DDRB |= (1<<PB7);
4
  while(1)
5
  {
6
    if (PINC & (1 << PC1))    {
7
      PORTB |= (1<<PB7);
8
    }
9
    else {
10
      PORTB &= ~(1<<PB7);
11
    }
12
  }
13
}
Aber das dürfte eigentlich nichts ändern. Das mein Code geht freut mich 
natürlich, ob er letzen Endes auch effektiver ist (also von den 
resultierenden Assembler-Anweisungen weiß ich nicht, aber das ist in 
diesem Fall ja eh nicht so kritisch.

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.