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
voidmain(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?
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 ;-)
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?
>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.
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
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;-)
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
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