www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ausgang des Atmega32 definieren


Autor: Sten (versuchsboard) (laurel)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Ich beschäfftige mich seit ca einer Woche mit dem Thema yC, speziell dem 
Atmega32. Dafür habe ich mir, um mich mit der h/w sowie der s/w vertraut 
zu machen eine Testplatine aufgebaut, an der ich den yC programmieren 
und testen kann. Die LED und den Taster habe ich wie im Anhang 
angeschlossen.
Ich wollte anhand des Tutorials mal in die Materie einsteigen. Also LED 
udn Taster dran und lernen wie es sich mit den Ein- und Ausgängen 
verhält.

Um das Testboard auszuprobieren habe ich einen fertigen Code für BASCOM 
aufgespielt, welcher die Abfrage des Taster macht und entsprechend mit 
der LED reagiert (Ein / Aus). Funktioniert super:
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 1000000

Config Portc.0 = Output                                     'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)

Config Pina.7 = Input                                       'Ein Pin (PA0) wird als Eingang definiert
Porta.7 = 1                                                 'Interner Pullup Widerstand ein


Do
  If Pina.7 = 1 Then
    Portc.0 = 1                                             'Pin wird auf High, also 5V geschaltet
  Else
    Portc.0 = 0                                             'Pin wird auf Low, also 0V geschaltet
  End If
Loop


End

Nun wollte ich das ganze in Assembler und AVRStudio probieren und habe 
dies mit dem Code aus dem Tutorial (entsprechend angepasst) auf den 
Controller aufgespielt.
.include   "m32def.inc"    ; Atmega32 konfigurieren

         ldi r16, 0xFF
         out DDRC, r16       ; Port C ist Ausgang
                             
         ldi r16, 0x00
         out DDRA, r16       ; Port A ist Eingang              
 
         ldi r16, 0xFF
         out PORTC, r16      ; PORTC auf 0xFF setzen -> alle LEDs aus
 
loop:
         in r16, PINA      ; an Port A anliegende Werte (Taster) nach r16 einlesen
         out PORTC, r16    ; Inhalt von r16 an Port C ausgeben
         rjmp loop 

Leider habe ich hier das problem, dass die LED ständig leuchtet und gar 
nicht reagiert.

Ich habe ein wenig hier im Forum herumgestöbert, aber für Assembler 
leider nichts passendes gefunden.
Ich bin zufällig auf einen C-Code gestoßen, welcher den selben Inhalt 
hat. Also neuer Versuch damit:
#include <avr/io.h>

void main( void )
{   
  DDRC = 0xff;
  PORTC = 0;
    
  while( 1 )
  {
    if( PINA & (1<<PA4) )   // Taste gedrückt?
    {
      PORTC = 0xff;         //   Ja: Leds einschalten
    }
    else
    {
      PORTC = 0x00;         //   Nein: Leds wieder ausschalten
    }
  }
}

Doch auch hier leider das gleiche Problem, keine Reaktion auf den Taster 
und ständig leuchtende LED.

Es kann doch nicht so schwierig sein eine einzige Tastenabfrage zu 
machen???

Ihr könnt mir dabei doch bestimmt weiter helfen?

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>  DDRC = 0xff;
>  PORTC = 0;
   PORTA |= (1<<PA4);   // Pullup einschalten

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if( PINA & (1<<PA4) )   // Taste gedrückt?

Wenn der Taster an Pin 7 hängt, bringt es nicht viel, Pin 4 abzufragen.

Oliver

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In Deiner Schaltung liegt der Taster auch nicht an PA4

Autor: M. M. (miszou)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

also bei deinem C Code fragst du nach PA4 aber im deinem Bild hängt dein 
Taster an PA7.

Außerdem ist deine LED so angeschlossen, dass sie leuchtet wenn eine 0 
an PC0 ausgegeben wird. Da du aber den falschen Pin Abfragst tritt immer 
das "else" ein. =>LED leuchtet immer.

Im asm fragst du nach den Zustanden von den PINA die sollen auf PORTC 
ausgegeben werden. Dein Taster hängt an PIN A7 deine LED an PIN C0.
Also solltest du deine Tasterzustand auch an PIN C7 ablesen können.

Gruß MISZOU


Edit: Hätte vielleicht schneller schreiben sollen ;-)

Autor: Sten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für die prompten Antworten.

Sorry, hatte micht im PIN vertan. Aber eigentlich geht es mir um den 
Assembler Code, da ich Ursprünglich damit arbeiten wollte.

Meine Frage noch mal kurz gestellt, warum leuchtet die LED, obwohl ich 
eigentlich nur den Tutorial Anweisungen gefolgt bin?

Laut Tutorial ist es doch so, dass Ein Ausgang mit
ldi r16, 0xFF
out DDRC, r16       

definiert wird?!

0xFF bedeutet so viel wie 11111111, womit alle Bits des entsprechenden 
Ports angesprochen werden. die 1 zieht den PIN auf ca. 5V. Somit sollte 
über der Diode kein Spannungsabfall sein und auch nicht leuchten. Wenn 
also der Code nur den Port definiert (wie oben) und nur die reine 
Schleife angetriggert wird (loop: rjmploop) dann dürfte die LED doch 
nicht leuchten, oder verstehe ich da was falsch?

Autor: STK500-BEsitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>0xFF bedeutet so viel wie 11111111, womit alle Bits des entsprechenden
>Ports angesprochen werden. die 1 zieht den PIN auf ca. 5V. Somit sollte
>über der Diode kein Spannungsabfall sein und auch nicht leuchten.

Wenn du dich bei der Beschreibung auf das DDR beziehst, liegst du 
falsch.
Das DDR ist für die Richtung des Ports (input/Output)zuständig, nicht 
für den ausgegebene Pegel.

Autor: M. M. (miszou)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

genau mit PORT werden Ausgänge gesetzt oder nicht gesetzt.
Deine Aussage über den Spannungsabfall und LED stimmt, schau dir mal 
meine 2 Beispiele an.
Und fällt was auf?
loop:
         in r16, PINA      ; an Port A anliegende Werte (Taster) nach r16 
einlesen
         out PORTC, r16    ; Inhalt von r16 an Port C ausgeben
         rjmp loop 


//Beispiel Taster unbetätigt
PINA  0b10000000 wird ausgegeben auf
PORTC 0b10000000
        ^      ^
     Taster   LED

//Beispiel Taster betätigt
PINA  0b00000000 wird ausgegeben auf
PORTC 0b00000000
        ^      ^
     Taster   LED


Gruß MISZOU

Autor: Hubert G. (hubertg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das auf PortC der JTAG liegt und du den für deine Zwecke ausschalten 
musst, ist aber schon klar.

Autor: Sten (versuchsboard) (laurel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, vom JTAG weiß ich jetzt, dass dieser zum dirketem programmieren etc. 
in der Schaltung benutzt werden kann. Auch wenn mir das noch nicht ganz 
klar ist warum.

Egal, ich habe mal mit dem gleichen ASM Programm das Jtagen 
deaktiviert... Unverändert auch nach reset. Hier bleibt mir aber Unklar, 
warum das mit dem BASCOM Code funktioniert.


MISZOU,

ich habe mir Dein Beispiel mal gründlich durch den Kopf gehen lassen und 
mir fällt auf, dss nichts passiert, zumindest nicht an der LED.

Ist das nun jetzt ein Programmierfehler, oder Einstellungssache? Ich 
weiß, das Problem liegt immer zwischen den Ohren, aber verstehen möchte 
ich es dennoch;-)

Autor: M. M. (miszou)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

stimmt JTAG ist auch auf PORTC, aber nur an den Pins PC2-PC5. Stört also 
die LED an PC0 (PC1, PC6 und PC7) nicht.

Deswegen tut auch der Bascom code, aber so wie ich das sehe stimmt der 
Code auch. Vor allem passt der Code zu deiner Schaltung

Hast du schon den C-Code mit den Hinweise auf die falsche Abfrage des 
Tasters nochmal ausprobiert?


LED in ASM:
Wenn JTAG aus ist und am gesamten Port A Taster und am gesamten Port C 
Leds wären würdest du den Tasterdrücke an den Leds sehen.

Du hast aber nur ein Taster und eine LED. Dann sollte dieser Taster wohl 
auch an der selben Stelle hängen wie die LED. Du hast ja schon richtig 
erkannt das in dem Beispiel nichts mit der LED passiert.

Der leichtere Weg wäre wohl die Hardware anzupassen.

Oder du änderst deine Software damit sie der Hardware entspricht.


Gruß MISZOU

Autor: Sten (versuchsboard) (laurel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

Ich habe jetzt mal eine 2. LED an Port 7 geklemmt. Jetzt tut es der 
Code. Beide LEDs gehen bei Tastendruck an.

Im weiteren habe ich einen weiteren Taster an Port PA0 geklemmt. Jetzt 
finde ich es nur noch komisch, dass bei drücken des Tasters PA7 beide 
LEDs und bei Taster PA0 nur LED PC7 angeht??? Da muss ich noch mal 
drüber knobeln...

Bis dahin,

Grüße

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.