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?