Forum: Mikrocontroller und Digitale Elektronik Ausgang des Atmega32 definieren


von Sten (. (laurel)


Angehängte Dateien:

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:
1
$regfile = "m32def.dat"
2
$framesize = 32
3
$swstack = 32
4
$hwstack = 32
5
$crystal = 1000000
6
7
Config Portc.0 = Output                                     'Ein Pin wird als Ausgang konfiguriert PC0 (also Pin0 von Port C)
8
9
Config Pina.7 = Input                                       'Ein Pin (PA0) wird als Eingang definiert
10
Porta.7 = 1                                                 'Interner Pullup Widerstand ein
11
12
13
Do
14
  If Pina.7 = 1 Then
15
    Portc.0 = 1                                             'Pin wird auf High, also 5V geschaltet
16
  Else
17
    Portc.0 = 0                                             'Pin wird auf Low, also 0V geschaltet
18
  End If
19
Loop
20
21
22
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.
1
.include   "m32def.inc"    ; Atmega32 konfigurieren
2
3
         ldi r16, 0xFF
4
         out DDRC, r16       ; Port C ist Ausgang
5
                             
6
         ldi r16, 0x00
7
         out DDRA, r16       ; Port A ist Eingang              
8
 
9
         ldi r16, 0xFF
10
         out PORTC, r16      ; PORTC auf 0xFF setzen -> alle LEDs aus
11
 
12
loop:
13
         in r16, PINA      ; an Port A anliegende Werte (Taster) nach r16 einlesen
14
         out PORTC, r16    ; Inhalt von r16 an Port C ausgeben
15
         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:
1
#include <avr/io.h>
2
3
void main( void )
4
{   
5
  DDRC = 0xff;
6
  PORTC = 0;
7
    
8
  while( 1 )
9
  {
10
    if( PINA & (1<<PA4) )   // Taste gedrückt?
11
    {
12
      PORTC = 0xff;         //   Ja: Leds einschalten
13
    }
14
    else
15
    {
16
      PORTC = 0x00;         //   Nein: Leds wieder ausschalten
17
    }
18
  }
19
}

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?

von STK500-Besitzer (Gast)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

if( PINA & (1<<PA4) )   // Taste gedrückt?

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

Oliver

von Otto (Gast)


Lesenswert?

In Deiner Schaltung liegt der Taster auch nicht an PA4

von M. M. (miszou)


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

von Sten (Gast)


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
1
ldi r16, 0xFF
2
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?

von STK500-BEsitzer (Gast)


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.

von M. M. (miszou)


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?
1
loop:
2
         in r16, PINA      ; an Port A anliegende Werte (Taster) nach r16 
3
einlesen
4
         out PORTC, r16    ; Inhalt von r16 an Port C ausgeben
5
         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

von Hubert G. (hubertg)


Lesenswert?

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

von Sten (. (laurel)


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

von M. M. (miszou)


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

von Sten (. (laurel)


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

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.