mikrocontroller.net

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


Autor: Spitti (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
.include "m32def.inc"
rjmp Anfang

Anfang:
      sbi   DDRB,7  ;Datenrichtungsbit
Schleife:
      sbic  pinc,1
      sbi   portb,7
      sbis  pinc,1
      cbi   portb,7
      rjmp  Schleife

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

#include   <avr/io.h>
#include  "main.h"
void main(void)
{
  DDRB |= (1<<PB7);
  while(1)
  {
    if (PINC & (1 << PC1))
    {
      PORTB |= (1<<PB7);
    }

    if (!(PINC & (1 << PC1)))
    {
      PORTB &= ~(1<<PB7);
    }
  }
}

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.)

Autor: Timmo H. (masterfx)
Datum:

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

Autor: Spitti (Gast)
Datum:

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

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht 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:
void main(void)
{
  DDRB |= (1<<PB7);
  while(1)
  {
    if (PINC & (1 << PC1))    {
      PORTB |= (1<<PB7);
    }
    else {
      PORTB &= ~(1<<PB7);
    }
  }
}
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.