PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Eingabe über Taster geht nicht



BrunoF
30.01.2006, 21:03
Hallo,
ich bin gerade dabei mich in den ATMEGA8535 einzuarbeiten aber schon der erste Versuch ist ein Fehlschlag :-(
Ich habe das AVR Evalboard von Pollin gekauft aufgebaut und elektrisch funktioniert es auch. Nun möchte ich nur durch betätigen eines Tasters eine LED einschalten aber es geht nicht. Das Programm ist nun wirklich ziemlich simpel und im AVR Studio funktioniert es auch aber auf dem Board passiert nichts. End weder der Code ist falsch oder ich mache einen anderen Fehler.


;************************************************* *******
;* *
;* Testprogramm *
;* für das Pollin Evalboeard *
;* *
;************************************************* *******
.nolist
.include "C:\Programme\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8535def.inc"
.list

rjmp Initial ;Reset Handler
rjmp nofunc ;IRQ0 Handler
rjmp nofunc ;IRQ1 Handler
rjmp nofunc ;Timer2 Compare Handler
rjmp nofunc ;Timer2 Overflow Handler
rjmp nofunc ;Timer1 Capture Handler
rjmp nofunc ;Timer1 Compare A Handler
rjmp nofunc ;Timer1 Compare B Handler
rjmp nofunc ;Timer1 Overflow Handler
rjmp nofunc ;Timer0 Overflow Handler
rjmp nofunc ;SPI Transfer Complete Handler
rjmp nofunc ;USART RX Complete Handler
rjmp nofunc ;UDR Empty Handler
rjmp nofunc ;USART TX Complete Handler
rjmp nofunc ;ADC Conversion Complete Handler
rjmp nofunc ;EEPROM Ready Handler
rjmp nofunc ;Analog Comparator Handler
rjmp nofunc ;Two-wire Serial Interface Handler
rjmp nofunc ;IRQ2 Handler
rjmp nofunc ;Timer0 Compare Handler
rjmp nofunc ;Store Program Memory Ready Handler
;************************************************* ***************************
;
;Routine für den Fall das ein unerwarterter Interrupt eintritt
;
;************************************************* ***************************

nofunc:
nop
reti


Initial:
ldi R16,Low(RamEnd)
out spl, R16
ldi R17, $E3
out DDRD, R17


Haupt:
in R17, PIND2
sbic PORTD, 2
sbi PORTD, 6
rjmp Haupt


Vorab schon mal danke für eure Hilfe
Gruß Bruno

darwin.nuernberg
30.01.2006, 21:09
Ich lass mal dein Programm außer acht.
Mit Assembler kenne ich michnicht aus.

ABER:

Hast Du die Ports/Pins für den Taster als Input definiert?
Dann schalte über einen 10kR Widerstand VCC (+5V) an den Pin.
Der Taster schaltert dann bei betätigung gegen Masse (GND) also aktiv LOW.


Hat dein Chip auf dem verwendeten Port evt. eine zweitfunktion, welche erst duch Fusebit deakiviert werden muss?

Lektor
30.01.2006, 21:27
Haupt:
in R17, PIND2
sbic PORTD, 2
sbi PORTD, 6
rjmp Haupt

wäre schön wenn du die Interrupttabelle bei so leichten Programmen einfach wegläßt. Die rjmp Befehle vor jedem Interrupt würde ich auch gegen einen reti Befehl austauschen und nofunc: ganz weglassen.
Aber das ist nicht die Ursache des Problems.

Deute ich dein Programm richtig, dass du pind2 in r17 schreibst? Dann sollte die Abfrage unter sbic sich auch auf r17 beziehen( sbic r17,2). So wie es jetzt aussieht, fragt sbic Port D ab, ob pin 2 geschaltet ist.
Dann müßte es funktionieren.

izaseba
30.01.2006, 22:14
Routine für den Fall das ein unerwarterter Interrupt eintritt
Du hast die Interrupts garnicht eingeschaltet, damit ist das alles nicht nötig.


ldi R16,Low(RamEnd)
out spl, R16

und was ist mit dem SPH Register? oder hat ser 8535 nur 255 Bytes Ram ?


ldi R17, $E3
out DDRD, R17

sowas zu schreiben ist zwar kürzer, aber nicht unbedingt einfacher zu lesen,

schöner wäre es so:




ldi R17,(1<<PD7)|(1<<PD6)|(1<<PD5)|(1<<PD1)|(1<<PD0)
out DDRD,R17


naja, so sieht man zumindest sofort, welche Pins Du als Ausgang konfiguriert hast.



in R17, PIND2

Ergibt hier keinen Sinn (gibt es überhaupt Register PIND2, habe mir die .inc nicht angeguckt 8-[ )

Wogegen hängt Dein Taster, GND oder VCC?
Meistens soll er an GND und die internen Pullups sollen aktiviert werden, das hast Du auch nicht getan.



sbic PORTD, 2


Damit fragst Du nur den Zustand von den Pullups ab, und nicht den Pinzustand.

Dein Programm läßt sich so schreiben:




reset:
ldi R17,(1<<PD7)|(1<<PD6)|(1<<PD5)|(1<<PD1)|(1<<PD0)
out DDRD,R17
ldi R17,(1<<PD2)
out PORTD,R17
;oder besser
;sbi PORTD,PD2
;um den Pullup einzuschalten
loop:
sbis PIND,PD2
sbi PORTD,PD6
rjmp loop



So müßte es eigentlich klappen

Gruß Sebastian

BrunoF
31.01.2006, 23:02
Hallo,
vielen dank für die Antworten.
Ich habe mal den ganzen overhead entfernt und mal das Programm so einfach wie möglich gemacht.


;************************************************* *******
;* *
;* Testprogramm *
;* für das Pollin Evalboeard *
;* *
;************************************************* *******
.nolist
.include "C:\Programme\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8535def.inc"
.list


ldi R17, $E3
out DDRD, R17


Haupt:
sbic PIND, 2
sbi PORTD, 5
sbis PIND, 2
cbi PORTD, 5
rjmp Haupt




Der eigentliche Fehler lag darin das sbic PORTD, 2 so nicht funktioniert sonder dass man statt PORTD PIND angeben muss.
Vielleicht sollte ich erst überlegen und dann fragen.
Danke nochmals für eure Antworten.
Gruß Bruno